二进制搜索- c++按照特定的顺序将名字列表写入文件,而不将它们全部加载到内存中

binary search - C++ writing a list of names to a file in a specific order without loading them all in memory

本文关键字:文件 内存 加载 全部 列表 c++ 搜索 顺序 二进制      更新时间:2023-10-16

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

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

这可能是最简单的方法

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


(指name_1。
-read next name .
If name_1 <Name_2,然后Name_2>2)再逐行读取文件,找到第二个名字。即仍然高于名字的最低的名字。
3)把名字写进一个文件。
4)现在逐行读取第三个名称
5)将第二个名称添加到文件中等等…

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

一些方法:

1)你可以把数据分成多个临时文件;对每个文件分别进行排序;合并文件

2)调用操作系统对文件进行排序,例如
 system ("sort input>output")

好吧,我不知道我是否在我的评论中使用了术语"词汇树",但我想做一个树,就像二叉树一样,但不是只有两个可能的节点,而是可能的整个字母表。我相信这叫做"Trie"。

在节点中保存一个计数器,显示在该特定节点上结束的条目数。您可以根据需要动态创建节点,因此空间消耗保持在较低水平。

则可以遍历整个树并按顺序检索所有元素。这就是非平凡排序,对于有共同前缀的条目,它会很好地工作。它会很快,因为所有的插入都是线性的,行程也是线性的。所以取O(2*N),其中N是要排序的字符集的个数。如果数据集有共同的前缀,那么内存消耗将会很好。