Performance 为二进制搜索预处理一组常量字符串
我有几个字符串的排序列表(size=K<1000)。我需要在排序列表中找到数十亿(size=N)字符串的插入位置。列表保持不变,字符串插入子节点Performance 为二进制搜索预处理一组常量字符串,performance,algorithm,sorting,search,data-structures,Performance,Algorithm,Sorting,Search,Data Structures,我有几个字符串的排序列表(size=K
问题是:我目前使用的是二进制搜索,时间开销是O(strlen*NlogK)。但由于排序列表是常量。我想知道在小排序列表上是否有一种预处理方法可以使搜索比logK更快?一些好的替代方法包括a(可能实现为a或a)或a 编辑:要使用trie查找不匹配字符串的“插入位置”,请首先用位置标记每个完整字符串(您可以在最初构建trie时执行此操作)。在搜索不匹配的字符串时,您将在该字符串中没有匹配项的第一个索引处检测到此情况 例如,假设您在一个trie中寻找字符串CAR,其中包括CANNOT和construction(没有其他相关内容)。您将在R处检测到这种不匹配,因为在A下没有R子级。但是,这样应该很容易判断
这个位置周围的字母是N和T。先到N,然后再往下走,然后向右走,会把你带到你可以读出这个位置的地方。或者,走到T,然后继续向下和向左走会给你带来灾难。除了Chris Okasaki之外,我可能建议你计算每个树节点(trie或patricia)对应子树中的叶数(你可以很容易地使用深度优先遍历)
要使用字符串进行查询,请按树向下搜索,并将当前位置留下的子树中的叶数(预先计算)相加。当您在位置处停止并且无法继续树路径而不与查询字符串冲突时,这意味着您找到了该字符串的位置。索引是用sum计算的所有左置叶子的数量 trie对于查找完全匹配非常有用,但我想查找两个字符串之间的插入位置(查找比S小的maxinum字符串)。我怎样才能用trie做到这一点?谢谢,我现在明白了。谢谢你的回答,我现在明白Chris Okasaki的解决方案了。