在文件中查找前n个数字

时间:2012-02-02 07:48:28

标签: algorithm

我试图找到一个算法,在包含数千个数字的文件中找到前n个数字。 在此之前,我检查了在数组中找到前n个数字,但无法得到具体的解决方案。 排序是一个明显的选择,但还有其他方法吗?也许相同的逻辑可以应用于文件

3 个答案:

答案 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中的最后一项将从阵列中删除。