共同祖先算法
1. 人猿的“共同祖先说”内容是什么
人和现生的猿确实有着共同的祖先。现生的猿类共有四种:小型的猿类只有一种,即生活在亚洲的长臂猿;大型的猿类有三种,即生活在非洲的黑猩猩、大猩猩和生活在亚洲的猩猩。这些猿在动物分类上都属不同的种属。那么,人和猿的共同祖先究竟是什么样子?哪一种现生的猿最接近于这种共同祖先的形象和结构呢?
长期以来,根据形态学和生理学的研究,一般认为非洲的黑猩猩比其他的猿更接近于人。特别是20世纪70年代后期的研究表明,黑猩猩中的矮小种——卑格米黑猩猩最与人相近。例如齐尔曼等指出,卑格米黑猩猩的身体较小,与人科早期的代表南方古猿类的身材大约相等。这种黑猩猩的解剖性状很一般化,有着相对较小的脑颅和面部,它们的行为在某些方面也更和人相像。因此,科学家们认为它们很接近于人类和非洲大猿的共同祖先。可以将它们作为人和猿的共同祖先的活样板。
在70年代前期,人类学界一般认为,化石是人类起源的直接证据,是可靠的;而分子人类学研究所根据的是现生人类和猿类,是间接证据,是不可靠的。人类不是从现生的猿、而是从古猿进化来的;现生人类与现生猿类不是直系亲属,而是堂房兄弟的关系。因此,对分子人类学的结果不予置理。可是到70年代后期,特别是近几年来,由于一方面分子人类学的研究结果有所改进,表示人和猿开始分离的时间比原先得出的要早一些;另一方面,人们对腊玛古猿以及与之密切相关的西瓦古猿的化石有了更多的了解,从而使这一看法有所改变。例如,在非洲的肯尼亚,欧洲的匈牙利和希腊,亚洲的土耳其、印度、巴基斯坦和中国,都有这类化石发现,特别是在1980年底在中国云南禄丰县发现了腊玛古猿的头骨。腊玛古猿,特别是西瓦古猿显示出不少与现代猩猩相似的性状,因此近几年来,不少人类学家对腊玛古猿以及西瓦古猿是否人科的最早成员以及它们是否在人的进化系统上,均表示了怀疑。相反地,他们认为,腊玛古猿和西瓦古猿更可能是猩猩的早期祖先。如果确是这样,那么,人类起源的时间距今不到1000万年,这与分子人类学得出的结果是相接近的。另外,人类起源的地点可能是在非洲。
然而,在近期又出现了一种相反的意见,认为现生大猿中与人最相近的不是非洲的黑猩猩,而是亚洲的猩猩。例如,美国匹兹堡大学的施瓦茨在1984年提出,人的怀孕期、内分泌类型、性行为以及十多种解剖性状都更像猩猩而不像黑猩猩。这表示出人与猩猩是由一种共同的祖先遗传下来的。
1983年底,肯尼亚国家博物馆的理乍得·利基和美国约翰·霍普金斯大学的沃克共同宣布,他们不久前在肯尼亚北部发现了大约1700万年前的一种古猿的上、下颌骨,其形态与西瓦古猿和猩猩相似。他们认为,西瓦古猿的粗壮颌骨和釉质厚的臼齿与非洲大猿不同,而更像现代的猩猩和早期人科成员的南方古猿。于是,他们提出现生的猩猩不是一种很特化的猿类,而好比是一种活的化石。从它身上反映出人、猿共同祖先的许多性状,因此可用来作为人和猿的共同祖先的活样板。基于此,他们认为:西瓦古猿以及腊玛古猿可能是所有大猿和人类的共同祖先。而在这之前,即1965年,当时美国耶鲁大学的西蒙斯和皮尔比姆把庞杂的全部28属50多种的森林古猿化石加以整理,分类为猿类和人类两大类。
当时所有这些类型的化石代表只是上、下颌骨破片、牙齿和一些肢骨残段。经他们复原后,认为一些古猿很像它们现生的后裔。尽管那时腊玛古猿的标本只有十多件上下颌骨破片和一些单个牙齿,但也同样认为它们很像人的形态,因为腊玛古猿具有像人那样的抛物线形的齿弓(即齿弓前部圆钝,两侧向后逐渐张开),也有的像人而不是像猿那样小的犬齿和臼齿。
据此在60年代末他们提出了一套理论,基本论点是:人和猿是在第三纪的中新世开始分化的。腊玛古猿是最早的人科(人的分类系统)代表,而森林古猿属里的几个种则是各种现生猿类的祖先。他们认为过去的古猿也像现生的那样,种类很少。现生的人猿科的种只有长臂猿、普通黑猩猩、矮小黑猩猩、大猩猩和猩猩,而我们的近亲——猴子的现生种则有几十个之多,各种古猿化石和现生的各种猿类或人类有着明显的相似处,有着明显的祖先和后裔的亲缘关系。这些古猿在大约1000万~1500万年前,分布于亚洲大陆各地,化石最丰富的地区是印巴次大陆。另一组森林古猿年代较早,在大约2000万年前生活在非洲,被认为是较晚的森林古猿各个种和腊玛古猿的祖先。腊玛古猿是大约1500万年前由一种森林古猿演化而来的,以后再由腊玛古猿演化成200万年前的南方古猿,进一步再发展成现代人。
这个观点60年代末在人类学界有很大影响,被世界人类学家广泛接受。于是,此后不少科学家把腊玛古猿看作人类的嫡系祖先。
如果以上这种看法是正确的,那么,人类起源的时间至少在距今1700万年以前或更早的时期;而人类起源的地点不仅有可能在非洲,也有可能在亚洲。
2. 求二叉树中指定两个结点的共同祖先
#include <stdio.h>
#define null 0
int counter=0;
typedef struct btreenode
{int data;
struct btreenode *lchild;
struct btreenode *rchild;
}bnode;
bnode *creat(int x,bnode *lbt,bnode *rbt) //生成一棵以x为结点,以lbt和rbt为左右子树的二叉树
{bnode *p;
p=(bnode*)malloc(sizeof(bnode));
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
return(p);
}
bnode *ins_lchild(bnode *p, int x) //x作为左孩子插到二叉树中
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->lchild!=null) //若p有左孩子,则将原来的左孩子作为结点x的右孩子
q->rchild=p->lchild;
p->lchild=q;
}
return(p);
}
bnode *ins_rchild(bnode *p, int x) //x作为右孩子插入到二叉树
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->rchild!=null) //若x有右孩子,则将原来的右孩子作为结点x的的左孩子
q->lchild=p->rchild;
p->rchild=q;
}
return(p);
}
void prorder(bnode *p)
{if(p==null)
return;
printf("%d\t%u\t%d\t%u\t%u\n",++counter,p,p->data,p->lchild,p->rchild);
if(p->lchild!=null)
prorder(p->lchild);
if(p->rchild!=null)
prorder(p->rchild);
}
void print(bnode *p) //嵌套括号表示二叉树,输出左子树前打印左括号,
{ //输出右子树后打印右括号。
if(p!=null)
{printf("%d",p->data);
if(p->lchild!=null||p->rchild!=null)
{printf("(");
print(p->lchild);
if(p->rchild!=null)
printf(",");
print(p->rchild);
printf(")");
}
}
}
int FindLowestCommonAncestor(bnode *root, int value1, int value2)
{
bnode *curnode = root;
while(1)
{
if (curnode->data>value1&&curnode->data>value2)
curnode = curnode->lchild;
else if(curnode->data<value1&&curnode->data<value2)
curnode = curnode->rchild;
else
return curnode->data;
}
}
main()
{
bnode *bt,*p,*q;
int x,y,v1,v2;
printf("输入根结点:");
scanf("%d",&x);
p=creat(x,null,null);
bt=p; //使bt p都指向根结点
printf("输入新的结点值:");
scanf("%d",&x);
while(x!=-1)
{p=bt;
q=p;
while(x!=p->data&&q!=null) //q记录当前根结点
{p=q;
if(x<p->data)
q=p->lchild;
else
q=p->rchild;
}
if(x==p->data)
{printf("元素%d已经插入二叉树中!\n",x);
}
else
if(x<p->data) ins_lchild(p,x);
else ins_rchild(p,x);
scanf("%d",&x);
}
p=bt;
printf("struct of the binary tree:\n");
printf("number\taddress\tdata\tlchild\trchild\n");
prorder(p);
printf("\n");
printf("用括号形式输出二叉树:");
print(p);
printf("\n请任意输入树中存在的两个结点:");
scanf("%d,%d",&v1,&v2);
y = FindLowestCommonAncestor(p, v1, v2);
printf("输出%d和%d的最低公共祖先:",v1,v2);
printf("%d\n",y);
}
3. 共同祖先是什么意思
这是生物进化中常说的一个词,意思就是有一个共同的起源。
地球上的生物,不管是动物植物还是微生物都有共同祖先,这是在生物体能找到依据的。那么我们可以从哪些方面说明地球上的生物起源是相同的呢?
1、生物的遗传物质是都是核酸:地球上目前存在的生物的遗传物质都是核酸,其中具有细胞结构的生物的遗传物质都是DNA,只有极个别的病毒的遗传物质是RNA。而这些RNA病毒也起源于DNA为遗传物质的生物,归根到底,地球上最原始的生物的遗传物质应该是DNA。在千万年的进化过程中,生物的遗传物质在遗传的过程同时在朝不同方向变异。而不同的自然环境保留下了不同变异基因,才导致今天纷繁万象的自然界。
2、地球上生物遗传信息传递都遵循中心法则:DNA上遗传信息通过复制传到子细胞或子代生物体,并通过转录传到RNA,RNA上信息通过翻译通过翻译指导蛋白质的合成。这些信息传递过程不管是在真核生物还是在原核生物都存在,如果生物不是具有共同起源,两类生物不会这么巧合都遵循中心法则。
3、地球上生物遗传信息传递过程都遵循碱基互补配对原则。在生物界通用的中心法则中,都遵循碱基互补配对,比如DNA复制时有A—T,G—C配对,在转录过程中,有A—T、A—U、G—C配对,在翻译过程中mRNA上密码子和tRNA反密码子存在A—U、G—C配对。
4、地球上生物都公用同一套遗传密码子:生物体内RNA指导蛋白质合成,都是mRNA上三个相邻碱基决定一个氨基酸,故而生物有64种密码子,而且不管是动物植物微生物,特定密码子对应编码的氨基酸都是相同的。终止密码子都是UAA,UAG,UGA。这也充分说明了地球上生物油共同起源。
5、生物体有共同起源的其他证据:地球上生物有共同起源在别的方面我们也能找到一些证据。比如地球上的具有生命系统的细胞都具有生物膜系统(比如细胞膜),而且不管是原核细胞还是真核细胞的生物膜都是以磷脂双分子层为基本骨架。
4. 二叉树指定两个结点共同的祖先
已知二叉收索树上两个结点的值,请找出它们的最低公共祖先。你可以假设这两个值肯定存在。
int FindLowestCommonAncestor(node *root, int value1, int value2)
{
int larger, smaller;
larger = (value1 > value2)? value1:value2;
smaller = (value1 > value2)? value2:value1;
node *curNode = root;
node *curFather = root;
while(curNode){
if(curNode->data == larger || curNode->data == smaller)
return curFather->data;
else if(curNode->data > larger){
curFather = curNode;
curNode = curNode->left;
}
else if(curNode->data < smaller){
curFather = curNode;
curNode = curNode->right;
}
else return curNode->data;
}
}//
/
/
/
/
/
/
C语言实现:
/*二叉排序树的生成及树,任意两结点的最低公共祖先 Amirural设计*/
#include <stdio.h>
#define null 0
int counter=0;
typedef struct btreenode
{int data;
struct btreenode *lchild;
struct btreenode *rchild;
}bnode;
bnode *creat(int x,bnode *lbt,bnode *rbt) //生成一棵以x为结点,以lbt和rbt为左右子树的二叉树
{bnode *p;
p=(bnode*)malloc(sizeof(bnode));
p->data=x;
p->lchild=lbt;
p->rchild=rbt;
return(p);
}
bnode *ins_lchild(bnode *p, int x) //x作为左孩子插到二叉树中
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->lchild!=null) //若p有左孩子,则将原来的左孩子作为结点x的右孩子
q->rchild=p->lchild;
p->lchild=q;
}
return(p);
}
bnode *ins_rchild(bnode *p, int x) //x作为右孩子插入到二叉树
{bnode *q;
if(p==null)
printf("Illegal insert.");
else
{q=(bnode*)malloc(sizeof(bnode));
q->data=x;
q->lchild=null;
q->rchild=null;
if(p->rchild!=null) //若x有右孩子,则将原来的右孩子作为结点x的的左孩子
q->lchild=p->rchild;
p->rchild=q;
}
return(p);
}
void prorder(bnode *p)
{if(p==null)
return;
printf("%d\t%u\t%d\t%u\t%u\n",++counter,p,p->data,p->lchild,p->rchild);
if(p->lchild!=null)
prorder(p->lchild);
if(p->rchild!=null)
prorder(p->rchild);
}
void print(bnode *p) //嵌套括号表示二叉树,输出左子树前打印左括号,
{ //输出右子树后打印右括号。
if(p!=null)
{printf("%d",p->data);
if(p->lchild!=null||p->rchild!=null)
{printf("(");
print(p->lchild);
if(p->rchild!=null)
printf(",");
print(p->rchild);
printf(")");
}
}
}
int FindLowestCommonAncestor(bnode *root, int value1, int value2)
{
bnode *curnode = root;
while(1)
{
if (curnode->data>value1&&curnode->data>value2)
curnode = curnode->lchild;
else if(curnode->data<value1&&curnode->data<value2)
curnode = curnode->rchild;
else
return curnode->data;
}
}
main()
{
bnode *bt,*p,*q;
int x,y,v1,v2;
printf("输入根结点:");
scanf("%d",&x);
p=creat(x,null,null);
bt=p; //使bt p都指向根结点
printf("输入新的结点值:");
scanf("%d",&x);
while(x!=-1)
{p=bt;
q=p;
while(x!=p->data&&q!=null) //q记录当前根结点
{p=q;
if(x<p->data)
q=p->lchild;
else
q=p->rchild;
}
if(x==p->data)
{printf("元素%d已经插入二叉树中!\n",x);
}
else
if(x<p->data) ins_lchild(p,x);
else ins_rchild(p,x);
scanf("%d",&x);
}
p=bt;
printf("struct of the binary tree:\n");
printf("number\taddress\tdata\tlchild\trchild\n");
prorder(p);
printf("\n");
printf("用括号形式输出二叉树:");
print(p);
printf("\n请任意输入树中存在的两个结点:");
scanf("%d,%d",&v1,&v2);
y = FindLowestCommonAncestor(p, v1, v2);
printf("输出%d和%d的最低公共祖先:",v1,v2);
printf("%d\n",y);
}
运行结果:
输入根结点:20
输入新的结点值:8 22 4 12 10 14 -1 (以-1结束结点的输入)
struct of the binary tree:
number addresss data lchild rchild
1 4391168 20 4391104 4391040
2 4391104 8 4390976 4399072
3 4390976 4 0 0
4 4399072 12 4399008 4398944
5 4399008 10 0 0
6 4398644 14 0 0
7 4391040 22 0 0
用括号形式输出:20(8(4,12(10,14)),22) (输出左子树打印左括号,输出右子树后打印括号)
请任意输入树中存在的两个结点:4,14
输出4和14的最低祖先:8
5. 现代类人袁和人类的共同祖先答案
人是上帝造的。这个可以肯定。以进化论为首的异端邪说拼命想否定这一事实。于是上演了一幕幕认猪作父、认猴作父(所谓北京人,无非是几个人在山洞里凿猴脑吃)的闹剧……
进化论者说,宇宙源于大爆炸,没有缘故的大爆炸,所有物质集合在一个点里,不断旋转,突然爆炸,天哪!只是我想问问,既然物质是在一个点里旋转,那么因为惯性爆炸后它们应该以相同的方向自转,可为什么已知的行星里有80多个是反方向自转呢?为什么?因为上帝早已知道会有这么愚蠢的人,故意留下证据讽刺他们。
同时,物质从何而来?能量从何而来?热力学第一定律告诉我们,自然界不能创造、也不能消灭能量。那只有一个答案:有一位超自然的创造者。
用高倍显微镜观察一个细胞,看看里面成千上万的组织有条不紊的工作,您能相信这是偶然进化来的?进化论用氮14-碳14衰变法测算化石的年龄,他们从来不敢说这种测算方法的前提:1,动物死的的时候就完全不存在C14;2,至少地球磁场不能改变(事实上,过去150年地球磁场就减弱了10%);3,外界环境不能有任何改变。事实上,明眼人一看就知道这些条件哪怕一个都不可能满足,况且氮14衰变到碳14的周期仅仅是5720年,他们是怎么测出几百万年的?其实他们为何要从化石做文章,因为死无对证啊。难道活着的植物测算不出年龄吗?当然能。也有过测算,但进化论者只字不提,因为地球现存活着的植物,有1000年的,2000年的,4000年的,就是没有超过4500年的,因为那之前有一场大洪水。
还有,进化论者说地球的年龄是46亿年,或更多。我们今天都知道地球自转速度在逐渐变慢,最保守的算法每10年慢一秒,圣经说地球只有6000多岁,这当然没问题,但如果您相信地球有46亿年,那么算一下46亿年前的自转速度吧,没错,负数!
进化论所谓的化石,没有一具是介乎两个物种之间的化石,这是他们的致命伤。以前他们将始祖鸟奉为至宝,直到近些年人们发现活着的翼端有爪、嘴里有牙的鸟以后,他们便销声匿迹了,以至于今天他们再也不敢大肆宣扬他们的化石证据了。他们把物种之间的进化解释为基因突变,但他们穷尽所能的试验最终证明,基因突变只能给生物带来灾难。他们荒谬的推理假说实在没有必要再罗列下去了……
不妨看看上帝借圣经告诉我们什么:4000多年前,上帝对约伯说:”你能发出闪电,叫它行去,使它对你说:‘我们在这里’?”直到19世纪一个叫富兰克林的不要命的科学家捕捉到了闪电,200多年后的今天,我们发短信、打电话的时候才晓得上帝的奇妙。2700年前,上帝皆先知以赛亚的口告诉人们地球是圆的:“神坐在地球大圈之上”;3000多年前大卫王的诗歌里就告诉人们空气有重量:“下流人真是虚空,上流人也是虚假;放在天平里就必浮起,他们一共比空气还轻”,直到3000年后科学发现了分子,才追赶上这一处圣经的脚步;挪亚大洪水的时候,圣经记载:大渊的泉源都裂开了,科学家直到1977年才在海底发现有泉源…………
关于考古,不得不说圣经里的预言。以赛亚提前150年准确预言波斯王居鲁士,不信的人曾毁谤说这预言是人为后补的,直到《死海古卷》的出土就都哑口无言;再看看以西结预言推罗的下场,居然一字不差。这样一本圣经,我找不出理由不相信它而去相信进化论。
比较一下就知道,什么是真理,什么是愚妄。
6. 】试编写算法,求二叉树T中结点a和b的最近共同祖先。
后序遍历即可,在访问结点的时候判定A和B是否都被访问了即可。
bool getCommonParent(TreeNode *root, TreeNode *A, TreeNode *B, TreeNode **p)
{
if (root == NULL)
return false;
bool leftHasAorB = getCommonParent(root->left, A, B, p);
bool rightHasAorB = getCommonParent(root->right, A, B, p);
if ((leftHasAorB && rightHasAorB) ||
((leftHasAorB || rightHasAorB) && (root == A || root == B)))
*p = root;
if (leftHasAorB || rightHasAorB)
return true;
if (root == A || root == B)
return true;
return false;
}
7. 基因测序人类共同祖先
亲缘关系越近,遗传物质的相似程度越高.
A、黑猩猩与人类在基因上的相似程度达到96%以上,只能表明人类和黑猩猩的较近的亲缘关系,不能表明共同祖先是森林古猿.故该选项不符合题意;
B、人类和黑猩猩都是由森林古猿经过漫长的年代进化而来的,人类不是由黑猩猩进化而来的.故该选项不符合题意;
C、黑猩猩与人类在基因上的相似程度达到96%以上.表明人类和黑猩猩有较近的亲缘关系,有共同的祖先.故该选项符合题意;
D、黑猩猩与人类非同类生物,不能表明生物具有遗传和变异的特性.故该选项不符合题意.
故选:C.
8. 如何计算两个物种的最近共同祖先
主要体现几面:
1.物类证据
直观显示各物类关系类家直尝试画关系图表关系图画越、越细支越棵树我看棵树知道由树根断、支;我看株类树自应该想物都同祖先传断进化形各物种
2.比较解剖证据
贝伦发现鸟尽管外形极相同骨骼组却非相似说明鸟亲戚都祖先代外脊椎物前肢比手、马蹄、鲸鱼鳍等外形相差功能相同骨架却相似解释:自同祖先由于适应环境需要改变外形功能实际骨架却没改变
3.比较胚胎证据
鱼、青蛙、鸡、猪、兔各期胚胎放起我发现存同程度相似性且关系越密切相似程度越高说明些物自共同祖先祖先特征胚胎发育程重演
4.比较免疫证据
每种物血清都系类独特蛋白质若两种物亲缘关系越接近则抗原——抗体反应越强反则越弱利用种与古物化石或形态比较绘亲缘关系树符合更加证明物自共同祖先
5.物证据
① 所物都由细胞组(病毒除外);② 组物核酸、蛋白质、糖、脂类四种些物所物都致:核酸都由嘌呤嘧啶组蛋白质都由氨基酸组糖都由单糖组脂类则由甘油脂肪酸组; ③所物都用20种氨基酸几乎所物都共享套遗传密码
9. 生物学中哪些实例支持生命的共同祖先假说
主要体现在以下几个方面:
1.生物分类学的证据
为了直观显示各生物在分类上的关系,分类学家一直在尝试画出关系图表。关系图画得越多、越细,分支也就越多,最后就成为一棵树。我们看到一棵树,就知道它是由树根长出,不断生长、分支的;我们看到一株分类树,很自然就应该想到生物都是从同一祖先传下来,不断地进化,形成各个物种的。
2.比较解剖学的证据
贝伦发现人和鸟尽管在外形上极不相同,但骨骼组成却非常相似。这说明人和鸟是亲戚,都是一个祖先的后代。此外,脊椎动物的前肢,比如人的手、马蹄、鲸鱼的鳍等,它们的外形相差很大,功能也不相同,但它们的骨架却是如此的相似。对此最好的解释就是:他们来自同一祖先,由于适应环境的需要,改变了外形和功能,但实际的骨架却没有改变。
3.比较胚胎学的证据
如果把鱼、青蛙、鸡、猪、兔和人的各个时期的胚胎放在一起,我们就会发现它们存在不同程度的相似性。而且关系越密切,相似的程度越高。这说明这些生物来自共同的祖先,它们祖先的特征在胚胎发育过程中重演了。
4.比较免疫学的证据
每种动物的血清中都有一系类独特的蛋白质,若两种动物的亲缘关系越接近,则抗原——抗体反应就越强,反之则越弱。利用这种方法与古生物化石或形态比较绘出的亲缘关系树符合得很好,这也更加证明了生物来自共同的祖先。
5.分子生物学的证据
① 所有的生物都是由细胞组成的(病毒除外);② 组成生物的大分子有核酸、蛋白质、多糖、和脂类四种,这些生物大分子的成分在所有生物中都是一致的:核酸都是由嘌呤和嘧啶组成,蛋白质都是由氨基酸组成,多糖都由单糖组成,脂类则是由甘油和脂肪酸组成; ③所有的生物都只用20种氨基酸,几乎所有的生物都共享一套遗传密码。
10. 已知a是一棵顺序存储的完全二叉树,如何求出a和a的最近的共同祖先
(a+1)(a+2)(a+3)(a+4)+M
= [(a+1)(a+4)]*[(a+2)(a+3)]+M
=(a²+5a+4)(a²+5a+6)+M
=[(a²+5a+5)-1]*[(a²+5a+5)+1]+M
=(a²+5a+5)²-1+M
且题目要求是完全平方式,
所以M-1=0
M=1