上半年面试盛大的一道面试题,心存疑惑,不是笔试,是CTO面试时问的,题目大意如下
用递归遍历1亿个节点(或无限个,意识是足够大的)的二叉树,会不会有问题?
因为是口述的,后面做了些说明,可以不考虑这些节点所占的空间,题目主要问递归这一块,其实就是内存
在他的提示下,我算了回答正确了,大致是,递归函数体是存在堆上的,而递归调用时,在栈上存放函数地址,由于要遍历一亿个节点,也就是要存放一亿个函数指针,会把栈爆掉!他的意思也是这个意思!
但我回来后网上查了下,.net实现递归的方式好像是用栈(stack,先入后出)来实现的(递归可以用栈实现的,代码网上找去),如果这样的话,这个stack最大的长度只可能是二叉树的深度!也就是,不可能出现一亿个函数指针同时出现在栈上(内存中堆栈的栈),所以栈是不会爆掉的!
由于数据量太大,不容易验证!有清楚的来讨论下!
用递归遍历1亿个节点(或无限个,意识是足够大的)的二叉树,会不会有问题?
因为是口述的,后面做了些说明,可以不考虑这些节点所占的空间,题目主要问递归这一块,其实就是内存
在他的提示下,我算了回答正确了,大致是,递归函数体是存在堆上的,而递归调用时,在栈上存放函数地址,由于要遍历一亿个节点,也就是要存放一亿个函数指针,会把栈爆掉!他的意思也是这个意思!
但我回来后网上查了下,.net实现递归的方式好像是用栈(stack,先入后出)来实现的(递归可以用栈实现的,代码网上找去),如果这样的话,这个stack最大的长度只可能是二叉树的深度!也就是,不可能出现一亿个函数指针同时出现在栈上(内存中堆栈的栈),所以栈是不会爆掉的!
由于数据量太大,不容易验证!有清楚的来讨论下!
解决方案 »
- 新手求指导:字符集怎么改?C# 将xml文件里的数据插入到mysql中 显示?
- 急!下面这题咋做?
- 散分贴 happy birthday to me
- 找不到资源文件
- System.BitConverter
- listBox获取access数据库上的表 小弟在线等~~
- 什么是控建的并发处理?
- DevxPress DateNavigator控件EditDateModified事件,单击的时候执行两次事件,怎么做到只要第二次执行的事件?
- 请教.NET几个关于前台数据绑定和调用后台方法的问题
- 请问怎么改一下注册表,IE开始时打开的页面就不会被人修改了!
- 跪求visual studio 2008 简体中文版 下载
- StaticLogFileName参数的疑问
{
if( node.IsLeaf() )
{
node.Print();
}
else
{
Visit( node.LeftChild );
Visit( node.RightChild );
}
}1 *
2 * *
3 * * * *
4 * * * * * * * *
5 * * * * * * * * * * * * * * * *
上面是递归遍历的伪代码,我们可以看到递归的深度就是到达叶节点的深度。n层的完全二叉树可以存放2^n-1个节点。
1亿个节点只要ceiling( ln(10000*10000) )=19层就放的下了,递归遍历的深度也就是19。也就是说1亿亿个节点,也只要37层左右,递归本身也不会有问题。当然要假设这里的二叉树是指完全二叉树。
谁能说说.net的递归内部实现啊
平衡树(红黑树,AVL树等)的深度也是Log(N)级别的。二叉树实际实现大部分都是平衡树,或接近平衡树的搜索效率。
错了,
应该是Log以2为底的1亿,等于26点多层,ln是e为底的指数
这个递归最大的问题,主要在数据项的大小会超过,机器的内存,可能需要,这会导致处理过程中,需要将一些数据,存储到硬盘中。在需要用到的时候,再取来了
5位的随机数向数据库中添加,如果数据库中有就在次执行本函数,
没有就加入到数据库中,
执行到6千多的时候,就报错了,大概意思就是堆栈溢出了,
大概的代码就是
public void zj()
{
int count=selece count(*)....;//查询是否有
if(count>0)
{
zj();
}
else
{
add...//加入数据库
}
}