【问题标题】:How can I optimize search on array of String array?如何优化对字符串数组的搜索?
【发布时间】:2011-05-11 05:17:18
【问题描述】:

我有数组的字符串数组。

List<String[]> mainList = new ArrayList<String[]>();

String[] row1 = {"foo", "bar", "moo"}
String[] row2 = {"cocoa", "zoo", "milk", "coffee"}

mainList.add(row1);
mainList.add(row2);

假设我想找到一个元素“牛奶”。

我可以用 N^2 做。

for(int i=0, j=mainList.size(); i<j; i++) {
    for(int x=0, y=mainList.get(i).length(); x<y; x++) {
        String item = mainList.get(i)[x];

        if(item.equals("milk")) {
            return true; //found milk
        }
    }
}

我试图通过将所有元素作为 Map 键来使其更快。

//put all elements to map key
Map m = new HashMap<String, String>();
for(int i=0, j=mainList.size(); i<j; i++) {
    for(int x=0, y=mainList.get(i).length(); x<y; x++) {
        m.put(mainList.get(i)[x], "whatever");
    }
}

//now iterate and see if key "milk" is found
if(m.contains("milk")) { return true; }

但我认为这仍然是 N^2(即 for 循环内的 for 循环,因为添加到 mainList 的行数如 row3['item1', 'item2', 'item3'],迭代增量为 N ^2)

如何在没有 N^2 的情况下优化它?

【问题讨论】:

  • Map m = new HashMap&lt;String&gt;(); 这不会编译,因为 Map 有两个类型参数。另外,是什么让你认为这将是 O(n^2)?
  • 哎呀,我现在修,谢谢指出

标签: java arrays algorithm optimization


【解决方案1】:

这两种算法都不是 N^2,因为您只访问元素一次。但是,第一种算法每次查找需要 O(N),而第二种算法需要 O(N) 来填充地图,而每次后续查找需要 O(1)。

【讨论】:

  • 哦,我以为是 N^2,因为 for 循环位于 for 循环中。我可能误会了
  • 循环边界不同,所以不可能是N^2。您可以使用 M=mainList.size() 和 N=max(mainList 中任何数组的长度) 将其称为 M*N,但算法复杂性的重要部分是弄清楚您的重要操作是什么。在这种情况下,它是比较次数,它具有所有列表中所有数组中所有元素的上限(即某个数字 N)。如果您的算法尝试使用 for(mainList) for (array) for(mainList) for(array) 来计算重复的数量,那将是 N^2。
【解决方案2】:

如果您知道要查找的哈希图获取操作的键实际上是 O(1)

来源:http://www.coderfriendly.com/wp-content/uploads/2009/05/java_collections_v2.pdf

【讨论】:

    【解决方案3】:

    为什么不能是下面的代码?

            String[] row1 = {"foo", "bar", "moo"};
            String[] row2 = {"cocoa", "zoo", "milk", "coffee"};
    
            HashMap<String, String> mainMap = new HashMap<String, String>();
            for(String s: row1) {
                mainMap.put(s, s);
            }
    
            for(String s: row2) {
                mainMap.put(s, s);
            }
    
            System.out.println(mainMap.get("milk") != null);
    

    【讨论】:

      【解决方案4】:

      Bkail 在这个答案上击败了我,但我的答案可能会提供更多的见解(即使它是相同的。)

      我相信您可能对查找时间和构建时间有点不清楚。

      对于您提供的第一个示例,我认为您有一个恒定的构造时间(是在 Java 中分配一个静态数组常量吗?)。然后,您的查找时间(对于每次查找)为 n(对于 n 个元素,而不是 n*n)。我可以看到这可能与您的符号有点混淆,因为您的 n 元素分为两行。

      但是,对于您的第二个示例,您在建设上花费了 n。就像其他答案所说的那样,您的实际查找是 O(1)。

      因此,要考虑的重要事项是您要测量的内容。 查找Asymptotic notation 是您感兴趣的内容。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2011-10-23
        • 2011-04-27
        • 1970-01-01
        • 2019-05-18
        • 2013-09-08
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        相关资源
        最近更新 更多