当前位置: 首页 > 面试题库 >

我该如何对一百万个数字进行排序,并且仅在Python中打印前十个数字?

晏卓君
2023-03-14
问题内容

我有一个包含一百万个数字的文件。我需要知道如何有效地对其进行排序,以免使计算机停滞不前,并且仅打印前十名。

#!/usr/bin/python3

#Find the 10 largest integers
#Don't store the whole list

import sys

def fOpen(fname):
        try:
                fd = open(fname,"r")
        except:
                print("Couldn't open file.")
                sys.exit(0)
        all = fd.read().splitlines()
        fd.close()
        return all

words = fOpen(sys.argv[1])

big = 0
g = len(words)
count = 10

for i in range(0,g-1):
        pos = i
        for j in range(i+1,g):
                if words[j] > words[pos]:
                        pos = j
                if pos != i:
                        words[i],words[pos] = words[pos],words[i]
                count -= 1
                if count == 0:
                        print(words[0:10])

我知道这是选择排序,我不确定什么是最好的排序。


问题答案:

如果只需要前10个值,则浪费大量时间对每个数字进行排序。

只需浏览数字列表,并跟踪到目前为止看到的前10个最大值。在浏览列表时更新前十名,并在到达末尾时将其打印出来。

这意味着您只需要对文件进行一次遍历(即theta(n)的时间复杂度)

一个更简单的问题

您可以将您的问题看成是在数字列表中找到最大值的概括。如果被给予{2,32,33,55,13, ...}并被要求寻找最大的价值,您会怎么做?典型的解决方案是浏览列表,同时记住迄今为止遇到的最大数字,并将其与下一个数字进行比较。

为了简单起见,让我们假设我们正在处理正数。

Initialize max to 0
0 < 2, so max = 2
2 < 32, so max = 32
32 < 33, so max = 33
33 < 55, so max = 55
55 > 13, so max = 55
...
return max

因此,您看到,我们可以在列表的单个遍历中找到最大值,这与任何类型的比较排序相反。

泛化

在列表中查找 前10个 值非常相似。唯一的区别是我们需要跟踪前10名,而不只是最大值(前1名)。

底线是您需要一些容纳10个值的容器。当您遍历庞大的数字列表时,在大小为10的容器中关心的唯一值是最小值。这是因为,如果您发现了一个新号码,该号码应该排在前十名之内,那么它将被替换。

无论如何,事实证明最适合快速查找分钟的数据结构是一个最小堆。但是我不确定您是否了解堆,而将堆用于10个元素的开销可能会超过其好处。

任何容纳10个元素并可以在合理的时间内获得最小值的容器都是一个好的开始。



 类似资料:
  • 因此,我试图学习如何为类项目排序数组。我想知道如何对一个数组进行排序,从而对另一个数组进行排序。在下面的代码中,我可以对年份数组进行排序,但我如何才能使更改这一数组将名称和艺术家数组都更改为它们排列的数组呢?此外,如果你有任何建议,让代码对眼睛不那么苛刻,请告诉我,我正在努力掌握这个概念。

  • 问题内容: 我正在尝试获得一个函数,如果您对它进行排序(列表名),它将对该列表中的所有数字进行从最小到最大的排序。 我不确定我的问题是什么,但是我需要一些帮助,因为输出实际上并不是最小到最大,对于输出的前两个数字来说,它最小到最大。 范例: 如果list中有23、212、44个,而不是我对它进行排序,则输出将是这样。 输出: 212,23,44 它 应该是 23、44、212。 码: 更多代码:

  • 本文向大家介绍在MongoDB 4中如何对文档进行排序并仅显示一个字段,包括了在MongoDB 4中如何对文档进行排序并仅显示一个字段的使用技巧和注意事项,需要的朋友参考一下 要在MongoDB 4中对文档进行排序,请使用sort()。要仅显示已排序的单个字段,请将其设置为1。 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 以下是使用MongoDB 4对文档进行

  • 问题内容: 考虑这种字典格式。 我希望字典首先按下载进行排序,然后对所有没有下载的项目按日期进行排序。显然,字典无法排序,我只需要列出可以迭代的键即可。 我已经可以使用来按任一值对列表进行排序,但是如何也按第二个值对列表进行排序? 问题答案: 将参数用于。它允许您指定一个函数,给定要排序的实际项目,该函数将返回一个应作为排序依据的值。如果此值为元组,则其排序方式类似于元组排序- 按第一个值,然后按

  • 问题内容: 我正在使用Python进行一些数据分析。我有两个表,第一个(叫它“ A”)有1000万行和10列,第二个(“ B”)有7300万行和2列。他们有1个具有共同ID的列,我想根据该列将两个表相交。特别是我想要表的内部联接。 我无法将表B作为pandas数据框加载到内存中,以在pandas上使用常规合并功能。我尝试通过读取表B上的文件的块,将每个块与A相交,并将这些交集连接起来(内部联接的输

  • 我想根据数字字段对搜索结果进行排序。在下面的示例代码中,我希望基于'Age'字段进行排序。我从以下答案开始: [如何在Lucene 6中对IntPont或LongPoint字段进行排序 [在Lucene中根据数字字段对搜索结果进行排序 我在搜索函数中将sortfield.type.score更改为sortfield.type.long。但我得到: 意外的docvalues为字段“年龄”键入NONE