Optimization 用于搜索文件名并获取其路径的数据结构
我将以动态的方式插入文件名,大约直到10亿个名称。此外,我还希望存储文件所在的路径,以便执行以下查询:Optimization 用于搜索文件名并获取其路径的数据结构,optimization,data-structures,graph,trie,Optimization,Data Structures,Graph,Trie,我将以动态的方式插入文件名,大约直到10亿个名称。此外,我还希望存储文件所在的路径,以便执行以下查询: 搜索是否存储了文件名以获取其路径 搜索与子字符串匹配的所有文件的名称,类似于查询(例如,如果搜索*o*,它将返回我joel、hola、ola、oso、osea、algo,如果搜索aa*,它将返回我aaab,如果搜索*so,它将返回oso) 删除文件名 因此,我试图通过以下方式制作一种trie数据结构: 我有26个节点(英文字母a-z,我不打算把所有节点都放在图像中,因为是空格),因此如果我
- 搜索是否存储了文件名以获取其路径
- 搜索与子字符串匹配的所有文件的名称,类似于查询(例如,如果搜索*o*,它将返回我joel、hola、ola、oso、osea、algo,如果搜索aa*,它将返回我aaab,如果搜索*so,它将返回oso)
- 删除文件名
我在过去解决了一个类似的问题,用于存储纵横填字游戏的单词列表,并快速查找单词。我称之为“超级索引”。我的主要目标是速度,而不是存储大小,但最初的问题并没有说明作者认为是什么“改进”:可能是大小,可能是速度,可能是算法复杂性。我的方法以相对较小的复杂度获得了巨大的速度,但在存储大小方面有相当适度的节省。方法如下:
然后,有许多优化是可能的。例如,在对数据结构进行推理时,“条目”可能是一个有用的概念,但在实际实现中它可能会完全消失:在每个节点中,您可以有一个单独的“摘要”32位机器字,其中前26位中的每一位表示字母表的对应字母是否存在于节点中,接着是一个指向子节点(或有效载荷)的指针数组,它包含了在摘要字中有设置位的许多元素。为了节省更多的内存,考虑有向无环单词图(DAWG)。通常,您构建一个trie,然后对其进行优化。数据结构的用途是什么?这意味着要解决什么问题?我很确定您的图表对于您的示例是不正确的(例如,why is->b=4??)。此外,此数据结构不支持您描述的用例-它将如何表示“jola”不是一个单词?因此,最终您将有一个以字母结尾的所有“路径”列表,该字母存储在附加到该字母节点的单个集合中?听起来,通过构建此数据结构,您将一无所获—要验证匹配,您必须迭代集合(希望它将保持排序,并且您可以进行二进制搜索),而对于非匹配,您仍然有很好的机会命中假结束节点。不是试图消极,但这看起来不太有效-对不起。我真的认为你在寻找一个,这是一个高度优化的trie。其思想是构建一个普通的trie,然后应用一些众所周知的优化。我曾见过它在大约1兆字节的内存中对一本650000字的英语词典进行编码。