二进制搜索- c++按照特定的顺序将名字列表写入文件,而不将它们全部加载到内存中
binary search - C++ writing a list of names to a file in a specific order without loading them all in memory
我有一个学校任务,从一个文本文件加载名称列表到另一个,同时排序它们,但我不允许将它们全部保存在内存中(例如数组)。最好的方法是什么?之后我必须对它们进行二分查找。
我的第一个想法是为他们每个人生成一个哈希键,然后把他们写在一个相对于他们的键的位置,但事实是我必须做一个二进制搜索之后,我认为这是多余的。问题是事先不知道所有的名字(这意味着我必须以某种方式将一些名字放在中间)。
这可能是最简单的方法
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
是要排序的字符集的个数。如果数据集有共同的前缀,那么内存消耗将会很好。
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- WinVerifyTrust 仅在使用文件而不是内存 blob 时才有效
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 内存映射文件访问非常慢
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 这些结构在文件中的大小不同,但在程序内存中的大小相同
- 在嵌入式系统中读取文件的内存碎片
- 如何从文件中读取 100x24 矩阵并将其作为浮点矩阵保存在内存中?
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 提升进程间共享内存删除、权限和输出文件
- 将内存文件添加到 clang 编译器实例
- 为什么我的 C++ 程序在执行 TCMALLOC 堆检查器或堆配置文件时使用大量内存
- C++ 从磁盘读取文件并将其写入共享内存
- 为什么在编译时需要知道对象的内存配置文件以进行堆栈放置?
- 为什么 du -sh 输出错误大小的内存映射文件
- 将内存保存到文件并加载它而不必解析数据?
- 将提升管理的共享内存写入文件
- C++类似于 std::vector / boost::array 的文件内存映射容器