【问题标题】:Searching for a List of Strings start with a particular String from a sorted ArrayList in java搜索字符串列表从 java 中排序的 ArrayList 中的特定字符串开始
【发布时间】:2014-01-14 12:02:58
【问题描述】:

这里有一个英文单词表:(例如)

account

angel

apple

application

black

...

我想搜索以特定字符串开头的字符串。例如:the result for "ap" should be { apple, application }.

可以通过基于序列搜索的解决方案轻松实现返回一组对应的字符串。但是仍然有比序列搜索更强大的算法,但它们只返回一个字符串。那么,从 ArrayList 中返回一组对应的字符串是否比基于序列搜索的字符串更快?

谢谢!

【问题讨论】:

  • TRIE 算法似乎是为这项工作而设计的:en.wikipedia.org/wiki/Trie 这是一些实现:pathakalgo.blogspot.cz/2012/11/…
  • 在您寻找更快的版本之前:您是否分析了现有代码并发现它是一个实际的瓶颈?
  • 你也可以使用一个稍微修改过的二分搜索,它返回最后一个搜索位置,不管字符串是否被找到。从那里,您可以在数组中向上移动,直到初始字符串大于您的搜索字符串。
  • TRIE 不是算法,而是数据结构。如果你想保留你的 ArrayList,二分查找非常有效。
  • 谢谢,特里应该是一个伟大的理想!但我在这篇文章之前想到了一个前缀树。前缀树需要我们支付成本来构建树,而数组列表已经对其自身进行了排序。此外,我们可以找到包含特定字符串的字符串的第一个和最后一个索引,而不是返回一组字符串,这比遍历树中的每个叶子要快。我认为会有算法可以快速完成。

标签: java string search


【解决方案1】:

标准 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++;
    }

【讨论】:

  • 但是标准 API 会返回包含特定字符串的第一个元素吗?
  • @ThucHung 您是否研究过 Javadoc,如本答案中所链接的那样?
  • 对不起,我以前从未读过 Javadoc。我现在去看看。
  • 谢谢@JB Nizet,你帮我找出答案。
  • @JB Nizet :谢谢,我在我的应用程序中实现了你的代码,它的速度非常快。
【解决方案2】:

老实说,一个简单的二分搜索会很快做到这一点:

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 中,直到找到不匹配的字符串。

【讨论】:

  • Ummm ... 如果没有列表项以 str 开头怎么办?
  • 没错,我为此添加了检查。这就是我快速扔东西的结果。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2015-04-19
相关资源
最近更新 更多