【问题标题】:How to sort big file without using the disk,network or virtual memory?如何在不使用磁盘、网络或虚拟内存的情况下对大文件进行排序?
【发布时间】:2016-07-26 18:20:48
【问题描述】:

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

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

我尝试了许多我能想到的不同方法,提出了外部排序,但面试官说这不是正确的方法。采访结束时,我礼貌地问他问题的方法和算法是什么,但他拒绝说这是某种大秘密。

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

【问题讨论】:

  • 您在问题中遗漏的一件事(也许您应该问):如果有的话,文件中数字的界限是什么?
  • 其他问题是:“最佳”算法的指标是什么?真的只是速度吗?如果是速度,最佳算法将取决于磁盘存储和 RAM 之间的速度关系。
  • 重点是,根据您所掌握的信息,没有单一的“正确”方法。面试官测试了你运用枯燥的理论知识和识别问题以及在给定问题的范围内讨论解决方案的能力。
  • 好吧,我想是因为这个问题,他们决定不选择我。 gb 和 GB 键盘错误上限关闭。
  • 在我看来,“这是一个愚蠢的、误导性的问题。”如果要对任何东西进行排序,则必须有一些存储池,并且有三个选项:磁盘、(虚拟)内存和网络附加存储。如果对方说排除了所有三个选项,我不知道答案会是什么,而这正是我会回答这个问题的方式。

标签: algorithm


【解决方案1】:

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

您的算法需要包含……

  1. 通读光盘上的列表,查找文件中的最大数字(并在通读列表后跟踪它)
  2. 读完整个列表后,将此数字放入 RAM 中的列表中,然后重复此过程(每次查找小于上一个的最大数字),直到所有或大部分 RAM 用完。
  3. 现在将该列表重新添加到光盘上,并带有一个表示其顺序的索引,在本例中为 1,并清理 RAM 以进行更多处理
  4. 每次在 RAM 上构建排序数字列表时重复第 3 步 10 次或更多次,直到所有数字都添加到光盘上的单独列表中。
  5. 最后,检查每个列表开头的索引并(一次一个列表)将它们按正确的顺序放置在光盘上

更新: 我正在添加我的答案以反映@JimMischel 提出的一些观点

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

更新:关于提问者的问题

OP 发布的问题指出“您不能将光盘用于排序”。这个问题并没有说明磁盘不能用于存储。我相信大多数阅读该问题的人都以错误的方式解释了这一点,因此,在没有地方存储任何数据的情况下,假定分配的任务是不可能的。

【讨论】:

  • 我不相信面试官说根本无法访问光盘,因为显然这会使从光盘中检索数据变得不可能。只是光盘不能用于处理排序。
  • (这个想法几乎完美:在每次运行中,不要保留 一个 最高优先级数字,但 RAM 可以容纳多少(使用一个合适的数据结构)。输入范围很小,但仍然没有足够的 RAM 来容纳计数排序的所有计数器,方法是类似的。)
  • 您还需要小心重复。使用该算法处理重复项增加了一个有趣的小转折。
  • 当我说应该在列表顶部添加一个数字时,它是一个代表最终合并列表中子列表顺序的索引,添加多个将是多余的.
  • @Luke:仅当您可以修改原始文件时才有效。通常,这不是排序程序所做的。不过,这不是必需的:只需跟踪最后一个值在文件中找到它的位置。因此,如果您在后续传递中找到相同的项目,则仅在其位置更大时才选择。另一种方法是维护当前最小项目的计数。因此,如果文件中有 7 个 3,则在 3 最小的通道结束时,您会将 7 个 3 写入输出。而不是通过文件 7 次,每 3 次。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 2021-09-24
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
相关资源
最近更新 更多