Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为二进制搜索预处理一组常量字符串_Performance_Algorithm_Sorting_Search_Data Structures - Fatal编程技术网

Performance 为二进制搜索预处理一组常量字符串

Performance 为二进制搜索预处理一组常量字符串,performance,algorithm,sorting,search,data-structures,Performance,Algorithm,Sorting,Search,Data Structures,我有几个字符串的排序列表(size=K

我有几个字符串的排序列表(size=K<1000)。我需要在排序列表中找到数十亿(size=N)字符串的插入位置。列表保持不变,字符串插入子节点


问题是:我目前使用的是二进制搜索,时间开销是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的解决方案了。