我有数组的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的情况下优化它?
答案 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是你感兴趣的。
祝你好运!