Word以数组中的字符串开头

时间:2013-07-15 18:34:13

标签: java regex algorithm binary-search

有趣的算法我想得到社区的意见。如果数组中存在以某些字符开头的String,我希望循环遍历 Sorted ArrayList<String>以获取布尔结果。

实施例。数组{"he", "help", "helpless", hope"}

search character = h 
Result: true
search character = he
Result: true
search character = hea
Result: false

现在我的第一印象是我应该将二进制搜索与正则表达式结合起来,但如果我离开,请告诉我。虽然trie是最好的实现,但我需要一个最小化堆内存的解决方案(在android上开发),因为这个数组实际上将包含~10,000-20,000个条目(单词)。

我有一个包含~200,000个单词的数据库。我正在以一个固定字母开头(在我的例子中为h),它将包含~20,000个条目并将它们插入到数组中。然后我使用这个子集执行~100-1,000次查找/包含。我的方法中的想法是在尝试最小化内存命中(数组而不是trie树)时增加性能时间(而不是db查询)

也许 DAWG 会优化查找但是我不确定这个结构的大小要求是否会比ArrayList大得多?

2 个答案:

答案 0 :(得分:2)

如果你真的想避开trie,这应该符合你的需要:

NavigableSet<String> tree = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
tree.addAll(Arrays.asList("he", "help", "helpless", "hope"));
String[] queries = {"h", "he", "hea"};
for (String query : queries) {
    String higher = tree.ceiling(query);
    System.out.println(query + ": " + higher.startsWith(query));
}

打印

h: true
he: true
hea: false

答案 1 :(得分:0)

您应该考虑http://en.wikipedia.org/wiki/Skip_list作为选项。许多Java实现都很容易获得