【问题标题】:Fast Lookup of JavaJava的快速查找
【发布时间】:2013-07-05 13:53:39
【问题描述】:

我目前有一个字符串数组,我需要多次搜索才能完全匹配。最好使用什么数据结构?

Example - String array with elements

cat
dog
squirrel
raccoon
aardvark

java 代码接收对字符串的搜索并遍历数组:

  1. 查询“dogg” - 不返回任何内容
  2. 查询“浣熊” - 返回浣熊

我当前的代码执行以下操作:

for (String element : myList) {
      if (element.equals(searchTerm)) {
            return searchTerm;
      }
}

有没有更有效的方法来进行这种搜索?我考虑过使用地图,但我想不出一个好的价值(关键是'狗'/'猫'/等等......)。我应该为键和值使用相同的值吗?有没有更好的数据结构可以使用?

【问题讨论】:

标签: java arrays string


【解决方案1】:

在此处使用HashSet 以获得最佳查找性能。请注意,Set 不允许任何重复。在这里使用 Map 没有多大意义,因为您只对搜索密钥感兴趣,即您没有任何与之相关的内容。

示例代码:

Set<String> animals = new HashSet<String>(
                          Arrays.asList("cat", "dog", "squirrel", "raccoon"));
if (animals.contains("dog")) {
    System.out.println("Yep, dog's here!"); // prints
}
if (!animals.contains("aardvark")) {
    System.out.println("Ah, aardvark's missing!"); // prints
}

请注意,List 也有一个 contains() 方法,但它会遍历其所有元素以检查是否存在与使用 for 循环时想要避免的性能相同的项。

【讨论】:

  • 虽然我同意你的回答,但有两点值得一提。 1.HashSet实现内部使用HashMap。 2.您引用的实现本质上也在内部使用了for循环。如您所见,它们在某种程度上与您的答案相矛盾。
  • “您引用的实现本质上也在内部使用了 for 循环。”呃,什么?你在说什么?
  • @skuntsel 1. 是的,这是正确的,但我认为这对 OP 没有帮助,因为他正在考虑直接使用 Map。 2. HashSet/Map 的 for 循环实现与 List 的实现完全不同(使用哈希码提供接近 O(1) 的查找性能)更类似于 OP 所做的:循环遍历元素。
  • @RaviThapliyal 我知道。这就是为什么我告诉我同意你的回答但发现解释有点模糊:)
  • @nachokk 抱歉,我无法回复您,因为老实说我没有使用 Trie 的经验,所以我不知道哪个更好。但是,就冲突而言,您是对的:HashSet 的性能基本上取决于其元素的hashCode() 实现的效率。但是,由于 OP 使用的是String,我认为性能应该还不错。
【解决方案2】:

您可以使用Trie data structure

这是guava trie 中的一个实现。搜索的复杂度是O(L) where L = stringToSearch.length();

【讨论】:

  • 您能否估计一下两者的平均搜索和插入复杂度,以证明 trie 比哈希集“性能更高”?
【解决方案3】:

您可以使用Set 代替Map(或者,如果是Map,只需使用任何值作为键):

if (mySet.contains(element)) {
    return element;
} else {
    return null;
}

【讨论】:

    【解决方案4】:
    return myList.contains(searchTerm) ? searchTerm : null;
    

    【讨论】:

    • 请注意,他要求的是最好的数据结构,而不是如何让他的代码更简洁。
    • “有没有更有效的方法来做这个搜索?”是的,有一个:List#contains
    • 这不是更有效 - 它在内部执行与 OP 的 for-loop 完全相同的事情。
    【解决方案5】:

    试试这个

        String[] arr = new String[]{"cat", "dog", "squirrel", "raccoon", "aardvark"};
        List<String> list=new ArrayList<String>(Arrays.asList(arr));
        System.out.println(list.contains("dog") ? "found" : "not found");
    

    【讨论】:

      【解决方案6】:

      如果你只想返回你的搜索词,你可以这样做

      String result = myList.contains(searchTerm) ? result : "";
      

      【讨论】:

        【解决方案7】:

        将它们放在HashSet 中,因为它使用散列,这是一种快速检索元素的技术,因为它使用散列码来存储它们。

        Sub obj = new Sub();
        obj.items.add("one");
        obj.items.add("two");
        obj.items.add("three");
        
        System.out.println(obj.items.contains("one"));
        

        【讨论】:

          猜你喜欢
          • 2010-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-29
          • 2010-12-20
          • 1970-01-01
          相关资源
          最近更新 更多