递归的效率为什么这么低?

NewJerryj 2009-08-04 03:11:45
我用递归做了一个文件搜索程序,在遍历某个路径树时,如果路径下文件过多,树的深度大,则效率太低,很长时间才能搜索完。
有没有其他效率高的好办法?
...全文
789 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey301 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fireseed 的回复:]
给楼主介绍一个本地文件搜索软件:Everything。

它不是“强大”,也不是“超级”……

我只能用一个很普通的词来形容:光速!

http://xbeta.info/everything/index.htm
[/Quote]
试了一下,的确超级快速,就是不知道怎么选择要搜索的路径,默认只能搜索C:盘
wizard2215 2009-08-05
  • 打赏
  • 举报
回复
类似于fireseed 发的那款软件,如果加上文件夹大小的功能,用什么算法效率最高?
NewJerryj 2009-08-05
  • 打赏
  • 举报
回复
我现在改进了一下,使用多线程进行搜索: 当每次搜索到文件夹目录的时候,则创建一个新的线程去搜索这个子目录......直到最后搜索完成。
这样确实提高了速度,但是出现了一个问题:每次创建一个新线程后,我必须得加个sleep延时一下,否则会出现某个线程参数被丢弃的情况。这是为什么?
JavaerRobertLi 2009-08-05
  • 打赏
  • 举报
回复
速递慢和递归没关系吧。递归会消耗更多的内存是真的,至于速度慢,应该是算法的问题。
就算改成循环解决了,速度也好不到哪里去。时间和你文件的数量成正比
fire_woods 2009-08-05
  • 打赏
  • 举报
回复
整个硬盘文件索引的话,应该直接读取文件分配表和目录分配表是最快的方式.
kingork 2009-08-05
  • 打赏
  • 举报
回复
递归是因为要存储很多临时变量,不断地读取栈内容,,

所以慢吧
fire_woods 2009-08-05
  • 打赏
  • 举报
回复
用tree命令导出所有目录, 顺发,无法测试时间.
fire_woods 2009-08-05
  • 打赏
  • 举报
回复
用dir命令花了将近30s, 一共70000+文件.
NewJerryj 2009-08-05
  • 打赏
  • 举报
回复
恩,不过它遍历整个磁盘的速度令人惊叹,不知如何做到的?

[Quote=引用 26 楼 fireseed 的回复:]
引用 25 楼 NewJerryj 的回复:
刚才试用了一下,我的观点是:
Everything 在启动的时候就遍历了磁盘上所有的文件,所以当我们再进行搜索时速度就超级快了。
这个家伙运行时占用了十几M的内存空间,可见很多用于存放文件列表了。



很显然它是基于索引数据库的。在我的机子上,他一共占了15M的物理内存。对于目前的主流内存来说,毛毛雨。
[/Quote]
fireseed 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 NewJerryj 的回复:]
刚才试用了一下,我的观点是:
Everything 在启动的时候就遍历了磁盘上所有的文件,所以当我们再进行搜索时速度就超级快了。
这个家伙运行时占用了十几M的内存空间,可见很多用于存放文件列表了。
[/Quote]

很显然它是基于索引数据库的。在我的机子上,他一共占了15M的物理内存。对于目前的主流内存来说,毛毛雨。
NewJerryj 2009-08-05
  • 打赏
  • 举报
回复
刚才试用了一下,我的观点是:
Everything 在启动的时候就遍历了磁盘上所有的文件,所以当我们再进行搜索时速度就超级快了。
这个家伙运行时占用了十几M的内存空间,可见很多用于存放文件列表了。

[Quote=引用 11 楼 fireseed 的回复:]
给楼主介绍一个本地文件搜索软件:Everything。

它不是“强大”,也不是“超级”……

我只能用一个很普通的词来形容:光速!

http://xbeta.info/everything/index.htm
[/Quote]
sailortobeno1 2009-08-05
  • 打赏
  • 举报
回复

你可真有意思啊!不过我支持!用循环都能执行啊!
ckc 2009-08-05
  • 打赏
  • 举报
回复
感觉你的问题并不是递归的问题
多半是你的算法问题
或者是读目录用了不适当的方法
Victor_Dinho 2009-08-05
  • 打赏
  • 举报
回复
感觉广度搜索比深度搜索效率会高些~~~
bacel5902 2009-08-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhangchaokun 的回复:]
用广搜还是好些,毕竟一般用户需要查找的文件都在不足3层的文件夹中
[/Quote]

深度不行就广度
ahjoe 2009-08-04
  • 打赏
  • 举报
回复
磁盘文件搜索你别想能有多快。
leizhe 2009-08-04
  • 打赏
  • 举报
回复
递归慢是应为 循环的调用函数本身,
函数调用的时候 ,每次调用都在内存中会分配空间
局部变量,形参 调用函数地址 返回值。
递归调用N次 就要分配N*局部变量,N*形参 N*调用函数地址 N*返回值

fireseed 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 superspring 的回复:]
引用 1 楼 fireseed 的回复:
递归本来就很慢,但任何的递归都可以用循环来实现,认为不可以的我愿意在这里奉陪口水战。

有得必须跟栈配合吧
[/Quote]

没错

对于程序来讲,就算没有循环也可以递归,只要有goto就行了
fireseed 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 superspring 的回复:]
这个是不是类似于google desktop之类东西?
不是你做的吧?
[/Quote]

和google desktop完全不一样,它是基于文件名查寻的。它非常小,绝对轻量级,免费软件,有官方zip版,就一个可执行文件。
当然不是我写的,我要有这本事,我也不在中国混了
superspring 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fireseed 的回复:]
给楼主介绍一个本地文件搜索软件:Everything。

它不是“强大”,也不是“超级”……

我只能用一个很普通的词来形容:光速!

http://xbeta.info/everything/index.htm
[/Quote]

这个是不是类似于google desktop之类东西?
不是你做的吧?
加载更多回复(11)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧