如何优化String数组数组的搜索?

时间:2011-05-11 05:17:19

标签: java arrays algorithm optimization

我有数组的String数组。

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

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

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

假设我想找到元素“milk”。

我可以用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循环内部的循环,作为添加到mainList的行数,如row3 ['item1','item2','item3'],迭代在N中递增^ 2)

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

如果您知道要查找散列映射的get操作的密钥实际上是O(1)

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

答案 2 :(得分:2)

为什么不能成为如下代码?

        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);

答案 3 :(得分:1)

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

我相信你的查询时间和建设时间可能有点不清楚。

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

但是,对于你的第二个例子,你正在建造n。你的实际查找是O(1),就像其他答案所说的那样。

因此,重要的是要考虑的是你所测量的。 lookup Asymptotic notation是你感兴趣的。

祝你好运!