我试图找到一个算法,在包含数千个数字的文件中找到前n个数字。 在此之前,我检查了在数组中找到前n个数字,但无法得到具体的解决方案。 排序是一个明显的选择,但还有其他方法吗?也许相同的逻辑可以应用于文件
答案 0 :(得分:3)
如果f
是文件中的数字,而n
是您需要提取的数字,则可以在O(n + f lg n)
(实际为O(f lg n)
中执行此操作},如n <= f
)如下:
n
数字的(二进制)min-heap。 (O(n)
)O(f)
次O(lg n)
次操作。n
个数字。答案 1 :(得分:0)
假设您的文件看起来像这样。
123 448 28239
1299 23729 71829
18283 75723 817
93993 1791 9
使用标准的Unix工具,我会做这样的事情。
$ tr " " "\n" < in.txt | sort -n -r | head -5
93993
75723
71829
28239
23729
说明:
tr
将每个空格转换为换行符\n
sort -n -r
对行进行排序,现在每行包含一个数字,数字和反转head -5
占据这些排序行的前五位当然,这不能回答你的算法问题。
编辑:2008年的Comparison of Internal Sorting Algorithms提供了有关各种工具使用的算法的一些详细信息。
答案 2 :(得分:0)
您可以保留一个长度为topN[n]
的数组(例如n
),并为文件中的每个数字检查它是否小于n
中的所有topN
个数字。<登记/>
如果没有,请将其替换为topTen
中的最小值。
如果您的n
不是很大,这是一个很好的解决方案,因为此算法的复杂性为O(n*k)
,其中K
是我们文件中的数字数。
实际上复杂度为O(n*(k+1))
,因为每次都应该向topN
添加一个新号码,以使其保持排序状态(在添加下一个号码时会有所帮助。)
1。获取下一个号码
2。在topN
数组中使用二进制搜索搜索它并找到它
放置(数组中最大的项目小于nextNumber
)
3. 将nextNumber
插入该位置,然后移动所有下一个项目
topN
在右边。
4. topN
中的最后一项将从阵列中删除。