Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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
Java 快速字符串搜索,如startsWith()不等于()_Java_String_Search_Performance - Fatal编程技术网

Java 快速字符串搜索,如startsWith()不等于()

Java 快速字符串搜索,如startsWith()不等于(),java,string,search,performance,Java,String,Search,Performance,我有一个有序的列表(一本字典——10万个单词),还有很多单词需要经常搜索。因此,性能是一个问题。我知道HashSet.contains(theWord)或Collections.binarySearch(sortedList,theWord)非常快。但我实际上并不是在寻找整个词 我想要的是,比如说,搜索“se”并获取所有以“se”开头的单词。那么,Java或任何库中是否有现成的解决方案 一个更好的例子:在排序列表上,可以快速解决以下操作 List.subList(String beginInde

我有一个有序的列表(一本字典——10万个单词),还有很多单词需要经常搜索。因此,性能是一个问题。我知道HashSet.contains(theWord)或Collections.binarySearch(sortedList,theWord)非常快。但我实际上并不是在寻找整个词

我想要的是,比如说,搜索“se”并获取所有以“se”开头的单词。那么,Java或任何库中是否有现成的解决方案

一个更好的例子:在排序列表上,可以快速解决以下操作

List.subList(String beginIndex,String endIndex)//返回间隔

myWordList.子列表(“ab”、“bc”)

注意:这里有一个非常类似的问题,但公认的答案并不令人满意。

这种结构非常适合于字典和查找带有常见前缀的单词。Google Collections/Guava中有a的贡献。

您在这里寻找的是一种通常称为“trie”的数据结构:


它将字符串存储在按前缀索引的树中,其中树的第一级包含字符串的第一个字符,第二级包含第二个字符,其结果是,它允许您通过前缀非常快速地提取非常大的字符串集的子集。

确实不需要新的结构:这个问题可以通过对列表进行二进制搜索来解决。特别是,您可以修改二进制搜索以返回第一个匹配元素(具有指定前缀的第一个元素)

List.subList(String beginIndex,String endIndex)//返回间隔

我可能很愚蠢,但什么样的索引具有字符串类型?你能澄清这一部分吗?

你的搜索结果将在你的有序单词列表的范围内。要得到它,您需要范围的第一个和最后一个元素的索引

要获得第一个,请使用原始搜索字符串(“se”)运行二进制搜索,并将其与每次迭代中的当前位置进行比较。当当前位置的单词大于搜索字符串,但当前第1个单词小于搜索字符串时停止

要获取最后一个索引,请在搜索词+“z”(“sez”)上运行另一个二进制搜索,但现在仅当当前索引中的单词小于“sez”,但当前+1大于时才停止

最后,使用编程语言中可用的任何方法返回由第一个和最后一个索引标记的范围

该方法基于两个假设:

  • 字符串比较发现“b”大于“az”
  • “z”是单词列表中的最高字符值

我在一个JavaScript数据操作库(jOrder.net)中实现了这个算法。

我只是想用已知的方法解释这个问题,比如List.subList(int-beginIndex,int-endIndex)@hrzafer那么,这些参数有什么意义呢?是字符串前缀和后缀吗?你真的应该使用Character.MAX_值而不是“z”,但除此之外,这篇文章对其进行了总结。取决于你正在做什么,当我遇到这样的问题时,我通常会对前缀进行二值搜索,然后使用“True(value .GET(x).StastSube(前缀)”)进行处理,而不是试图返回一个范围。我完全同意Max的值。但是,考虑到100K的大小,考虑执行log(n)不是更好吗?(N=字典长度)附加字符串比较,而不是K(K=结果集长度)?我检查过了。它看起来不错。但是我无法编译代码。它依赖于其他一些包,这使得事情变得更复杂。我将修改字符串上的二进制搜索实现。我无法理解Guava库或Apache commons集合中的Trie实现。它是以其他名称命名的吗?是否有由任何流行库提供的ny实现?这一个?声称它被用于Apache Commons Collections和Google Collections,但快速查看ACC并没有在Javadoc中显示出来。是的,完全正确。我也不明白这就是为什么问你。