这里我有一个英文单词列表:(例如)
account
angel
apple
application
black
...
我想搜索以特定String开头的字符串。例如:the result for "ap" should be { apple, application }.
可以通过基于序列搜索的解决方案轻松实现返回一组相应的字符串。但是那里的算法仍然比序列搜索强,但它们只返回一个字符串。那么,从ArrayList返回一组相应的String的理想情况比基于序列搜索的那个更快吗?
谢谢!
答案 0 :(得分:2)
标准API已经有binary search,允许这样做:
int index = Collections.binarySearch(list, key);
if (index < 0) {
index = -(index + 1);
}
List<String> result = new ArrayList<String>();
while (index < list.size()) {
String s = list.get(index);
if (s.startsWith(key)) {
result.add(s);
}
else {
break;
}
index++;
}
答案 1 :(得分:0)
老实说,简单的二进制搜索可以很快完成:
int startPoint = 0;
int endPoint = list.length()-1;
do {
int mid = (startPoint+endPoint)/2;
int cmp = list.get().compareTo(str);
if (cmp > 0) {
startPoint = mid;
} else if (cmp < 0) {
endPoint = mid;
} else {
startPoint = mid;
}
} while (! list.get(startPoint).startsWith(str) && startPoint<endPoint-1);
现在只需从startPoint向你的Set添加字符串两个方向进行扫描,直到找到不匹配的字符串。