C++ C++;以特定顺序将名称列表写入文件,而不将其全部加载到内存中

C++ C++;以特定顺序将名称列表写入文件,而不将其全部加载到内存中,c++,binary-search,C++,Binary Search,我有一项学校任务,在排序时将一个名字列表从一个文本文件加载到另一个文本文件,但不允许同时将它们全部保存在内存中(例如数组)。最好的方法是什么。之后我必须对它们进行二进制搜索 我的第一个想法是为它们中的每一个生成一个散列键,然后将它们写入一个相对于它们的键的位置,但事实上,我必须在之后进行二进制搜索,这让我觉得这是多余的。 问题是事先不知道所有的名字(这意味着我必须以某种方式把一些名字放在中间)。有些方法: 1) 您可以将数据拆分为多个临时文件;分别对每个文件进行排序;合并文件 2) 调用操作系统

我有一项学校任务,在排序时将一个名字列表从一个文本文件加载到另一个文本文件,但不允许同时将它们全部保存在内存中(例如数组)。最好的方法是什么。之后我必须对它们进行二进制搜索

我的第一个想法是为它们中的每一个生成一个散列键,然后将它们写入一个相对于它们的键的位置,但事实上,我必须在之后进行二进制搜索,这让我觉得这是多余的。 问题是事先不知道所有的名字(这意味着我必须以某种方式把一些名字放在中间)。

有些方法:

1) 您可以将数据拆分为多个临时文件;分别对每个文件进行排序;合并文件

2) 调用操作系统对文件进行排序,如

 system ("sort input>output")

好的,我不知道我是否在我的评论中使用了术语“词汇树”,但是我会制作一个树,像一个二进制,但不是只有两个可能的节点,而是整个字母表。我相信这就是所谓的

在节点中,您会保留一个计数器,指示在该特定节点上结束的条目数。您可以根据需要动态地创建节点,从而保持较低的空间消耗


然后可以遍历整个树并按顺序检索所有元素。这将是一种非平凡的排序,对于具有公共前缀的条目,这将非常有效。这会很快,因为所有插入都是线性的,travesal也是线性的。因此需要
O(2*N)
,其中
N
是整个集合中要排序的字符数。如果数据集有共同的前缀,内存消耗也会很好。

这可能是最简单的方法

1) 逐行读取文件,并在排序方法中找到第一个名称

e、 g.
-读取名称。\u 1.
-阅读下一个名字。\u 2.
如果name_1 2) 再次逐行读取文件并找到第二个名称。 i、 e.仍然高于名的最低名称。
3) 将名字写入文件。
4) 现在逐行阅读第三个名字
5) 将第二个名称添加到文件中 等等


这不会很快,但它将没有虚拟内存开销。内存中存储的名称永远不会超过3个。

可以使用词法树。那时他们将共享空间。您可以在preferred中重建所有字符串。但从技术上讲,所有这些都会在记忆中,所以我不确定这是否是作弊。有什么具体的限制吗?你能保留
N-1
名称吗?不,它不是那么具体,只是“禁止在内存中复制整个文件”,但保留N-1名称可能会被视为“黑客行为”。你可能需要先对文件进行文件合并排序。如果保留
N-1
记录会被称为“黑客行为”,我认为2会被称为“肮脏黑客行为”=)。更典型的排序是N/M记录,其中M是临时文件的数量。速度慢,但我想如果我没有想出更好的方法,这将是最容易实现的。谢谢:)