我将以动态方式插入文件名,大约有 10 亿个名称。此外,我还想存储文件所在的路径,以便进行以下查询:
所以,我试图通过以下方式制作一种特里数据结构:
我有 26 个节点(英文字母 az,我不会将所有节点都放在图像中,因为空格),这样如果我插入单词“hola”,那么我会从带有字母“h”的节点到节点创建一条边带有字母 'o' 并且其边缘的数据为 1,因为该数字表示深度的级别。此外,在存储“a”的节点中,我将有一个映射结构来存储文件的路径,这是因为我肯定会在包含字母“a”的节点中存储很多路径.
话虽如此,我插入了以下词:joel、hola、ola、oso、osea、algo、aaab。
我这样做是因为我不想有很多带有 sama 字母的节点(例如 a、b 等),但问题是我有很多边和结构需要
内存字节(我用 C++ 编程),其中 w 是一个大小为 的字符串.
如您所见,如果我搜索文件“jola”(未插入)的名称,则不会返回任何路径,这告诉我们未存储此类文件。
How can I improve this? Is it any way to reduce the number of edges? or there exists a better structure and way to do this? I am very open to hear of any suggestion.
最佳答案
过去我解决了一个有点类似的问题,用于存储填字游戏的单词表,并非常快速地找到单词。我称之为“ super 索引”。我的主要目标是速度,而不是存储大小,但最初的问题并没有说明作者认为什么是“改进”:也许是大小,也许是速度,也许是算法复杂性。我的方法在相对较小的复杂性下产生了巨大的速度,但在存储大小方面却有相当大的节省。方法如下:
所以,搜索算法如下:
如您所见,这是一个相当简单的算法,并且保证非常快。如果没有任何进一步的优化,存储要求将是每个名称存储一个“条目”的顺序,并且一个“条目”将由一个字符和一个指针组成。
然后,有许多可能的优化。例如,“条目”在推理您的数据结构时可能是有用的概念,但在实际实现中可能会完全消失:在每个节点中,您可以有一个“摘要”32 位机器字,其中每个前 26 位表示节点中是否存在字母表的相应字母,然后是指向子节点(或有效载荷)的指针数组,其中包含与摘要字中设置的位一样多的元素。
关于optimization - 用于搜索文件名并获取其路径的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47244582/