我有一个n个字符串的数组。我想选择has
给定字符串的数组的所有元素。
很抱歉,如果不清楚的话。我举个例子。
input = "as"
array = {"abas", "aras", "as", "ask", "asi", "aso", "atas", "best", "test"}
output = {"abas", "aras", "as", "ask", "asi", "aso", "atas"}
我需要使用哪种算法进行此选择。我需要最快的算法来执行此操作,因为我在android中将它用于autoComplete所以搜索应该比用户的打字速度更快。 我总共有20000个条目。
答案 0 :(得分:1)
Boyer Moore - Horspool算法是字符串搜索的快捷方式。这是在大型文本中查找子串的好方法
答案 1 :(得分:1)
对于单个字符串,您可以使用KMP算法检查子字符串。
您还可以通过使用字符串字母映射并根据输入字符串字母在此映射上执行查找来跳过循环数组中的某些字符串。但天气比查看所有内容更加优化将取决于数据集。
答案 2 :(得分:1)
首先对数组进行排序,并对mantain进行排序。
然后从中间搜索继续。
String[] a = ....;
Arrays.sort(a); // Only first time
String str = .... // String to find
String[] output = find(str, a, 0, a.length - 1);
请注意,以下功能尚未经过测试,因此请将其作为原型来编写正确的功能。
public int find(String str, String[] a, int start, int end) {
if (start >= end) {
return start;
}
int middle = end - start / 2;
if (a[middle].startsWith(str)) { // Search the middle point
return find(str, a, middle + 1, end);
} else {
return find(str, a, start, middle - 1);
}
}
此代码在log(n)中针对每个研究执行,其中n是可搜索数组中的元素数(在本例中为a
)。
为初始排序添加一次O(n log(n))。如果数组a已经排序,则不需要。
答案 3 :(得分:1)
注意:如果您希望显示从输入开始的所有字符串,请阅读此内容。
如果你想要所有以给定input
开头的字符串,任何字符串匹配算法如KMP
或Boyer Moore
不都会给你带来好处结果。因为你必须迭代数组中的所有字符串并进行比较(如果你想要后缀,KMP不会比线性搜索更好)。
更好的选择是使用Trie
构建array
,当您想要显示autoComplete的结果时,只需遍历数组并显示当前节点下的所有单词。
输入array = ["abas", "aras", "as", "ask", "asi", "aso", "atas" ,"best","test"]
相应的Trie将是:('。'代表字符串的结尾)
我没有添加test
,但结构就像best
DUMMY
/ \
a b
/ | \ |
b r s est.
/ | ?
as. as.
代替?
的树看起来像:
s.
/ | \
k. i. o.
当您要搜索以as
开头的所有字符串时,您必须遍历路径as
并打印其下的所有字词。这里{as,ask,asi,aso}
答案 4 :(得分:1)
<强> StringSearch 强>
Java中的高性能模式匹配算法
Java语言缺乏快速的字符串搜索算法。 StringSearch提供Boyer-Moore和Shift-Or(位并行)算法的实现。这些算法比java.lang.String
中的简单实现快5到10倍