Algorithm 如何在不使用磁盘、网络或虚拟内存的情况下对大文件进行排序?

Algorithm 如何在不使用磁盘、网络或虚拟内存的情况下对大文件进行排序?,algorithm,Algorithm,昨天,我参加了一个网络安全职位的面试,有人问我这个问题: 假设你有一台1GB内存的电脑,这台电脑的磁盘上有一个10GB的包含随机数的文件。您将使用什么技术对文件进行排序并提出算法。您不能使用磁盘、网络或虚拟内存进行排序吗 我尝试了很多我能想到的不同方法,建议进行外部排序,但面试官说这不是正确的方法。面试结束时,我礼貌地问他,他问我这个问题的方式和算法是什么,但他拒绝说,好像这是什么大秘密 我的问题是,有人会如何处理此类问题,因为我无法停止思考,但仍然没有明确的答案?要对文件进行排序,您需要在RA

昨天,我参加了一个网络安全职位的面试,有人问我这个问题:

假设你有一台1GB内存的电脑,这台电脑的磁盘上有一个10GB的包含随机数的文件。您将使用什么技术对文件进行排序并提出算法。您不能使用磁盘、网络或虚拟内存进行排序吗

我尝试了很多我能想到的不同方法,建议进行外部排序,但面试官说这不是正确的方法。面试结束时,我礼貌地问他,他问我这个问题的方式和算法是什么,但他拒绝说,好像这是什么大秘密


我的问题是,有人会如何处理此类问题,因为我无法停止思考,但仍然没有明确的答案?

要对文件进行排序,您需要在RAM中运行算法。由于该文件比可用RAM量大10倍,因此需要将该文件分成10个或更多单独的块,并在最后重新组合它们

您的算法需要包括

通读光盘上的列表,查找文件中的最大数字,并在通读列表后跟踪它 在阅读完整个列表后,将该数字放入RAM上的列表中,并在每次查找比最后一个小的最大数字时重复此过程,直到全部或大部分RAM用完。 现在将该列表添加回光盘,索引表示其顺序,在本例中为1,并清除RAM以进行更多处理 每次在RAM上建立已排序的数字列表时,重复步骤3 10倍或更多,直到所有数字都添加到光盘上的单独列表中。 最后,检查每个列表开头的索引,一次检查一个列表,然后将它们按正确的顺序放在光盘上 更新: 我在回答中加入了@JimMischel的一些观点

RAM中的算法不仅要跟踪最大的数字,还要维护一个单独的整数计数,该计数会随着文件中随后出现的数字而递增。然后,无论该数字出现多少次,它都会被放入RAM中的子列表中

更新:关于提问者的问题


OP发布的问题说明您不能使用光盘进行排序。这个问题并没有暗示光盘不能用于存储。我相信大多数阅读问题的人对此的解释都是错误的,因此,在没有存储任何数据的地方的情况下,他们认为分配的任务是不可能完成的。

你在问题中遗漏了一件事,也许你应该问:如果有的话,文件中数字的界限是什么?其他问题是:最佳算法的度量是什么?真的只是速度吗?如果是速度,那么最佳算法将取决于磁盘存储和RAM之间的速度关系。问题是,根据您获得的信息,没有单一正确的方法。面试官测试了你运用枯燥的理论知识和认识问题的能力,以及在给定问题的范围内讨论解决方案的能力。我认为,由于这个问题,他们决定不选择我。gb和gb键盘错误的上限关闭。在我看来,这是一个愚蠢的,误导性的问题。如果要对任何内容进行排序,必须有一些存储池,并且有三个选项:磁盘、虚拟内存和网络连接存储。如果这个人说这三个选项都被排除在外,我不知道答案是什么,而这正是我对这个问题的回答。我不相信面试官说光盘根本无法访问,因为这显然会使从光盘检索数据变得不可能。这个想法几乎完美:在每次运行中,不要保留一个最高优先级的数字,而是使用合适的数据结构,尽可能多地保留RAM。由于输入范围很小,但仍然没有足够的RAM来容纳计数排序的所有计数器,这种方法与此类似。您还需要小心重复。用这种算法处理重复项增加了一个有趣的小变化。当我说应该在列表顶部添加一个数字时,它是用来表示最终合并列表中子列表顺序的索引,添加多个将是多余的。@Luke:只有在可以修改原始文件的情况下,这才有效。通常,排序程序不是这样做的。不过,没有必要这样做:只需跟踪最后一个值以及在文件中找到它的位置。因此,如果在后续过程中发现一个相等的项目,则仅当其位置更大时才进行选择。另一种方法是维护当前最小项目的计数。因此,如果文件中有7个3,在传递的末尾,3是最小的,那么您将7个3写入 输出而不是浏览文件7次,每3次一次。