我有几个字符串的排序列表(大小= K <1000)。我需要在排序列表中找到数十亿(size = N)字符串的插入位置。列表保持不变,字符串插入子节点。
问题是:我目前使用二进制搜索,其时间成本为O(strlen * NlogK)。但由于排序列表是不变的。我想知道在小排序列表上是否有预处理方法使搜索速度比logK更快?
答案 0 :(得分:2)
一些好的选择包括Trie(可能实现为Patricia trie或ternary search tree)或perfect hash table。
编辑:要使用trie找到不匹配字符串的“插入位置”,首先使用其位置标记每个完整字符串(您可以在最初构建trie时执行此操作)。搜索不匹配的字符串时,您将在字符串中没有匹配项的第一个索引处检测到此字符串。
例如,假设您在包含CAN NOT和CATASTROPHE(并且没有任何其他相关内容)的trie中查找字符串CAR。你会在R处检测到这种不匹配,因为A下面没有R子,但是那时应该很容易辨别 那个位置的周围字母是N和T.前往N然后继续向下,向右将带你到不能在那里读取位置。或者,前往T然后继续往下走,你会看到CATASTROPHE。
答案 1 :(得分:1)
除了Chris Okasaki之外,我建议你计算每个树节点(trie或patricia)相应子树中叶子的数量(你可以通过深度优先遍历来轻松完成)。
要使用字符串进行查询,请按树和叶子的总数(预先计算)进行查询,并将其留在当前位置留下的子树中。当你停在位置并且你不能继续树路径而不与查询字符串冲突时,它意味着你找到了这个字符串的位置。索引是使用sum计算的所有左侧叶子的数量。