【发布时间】:2012-09-25 14:36:13
【问题描述】:
给定一个 KeyValuePairs 列表,其中每对都有一个 getValue() 方法,获得唯一值的 List(或 Set)最快的方法是什么?
以下所有都产生可接受的结果。 u1 似乎比预期的列表大小(大约 1000-2000 KVP)最快
我们可以做得更好(更快)吗?
private static Set<String> u1(List<_KVPair> pairs) {
Set<String> undefined = new HashSet<String>();
for (_KVPair pair : pairs) {
undefined.add(pair.getValue());
}
if (undefined.size() == 1) {
return new HashSet<String>();
}
return undefined;
}
private static List<String> u2(List<_KVPair> pairs) {
List<String> undefined = new ArrayList<String>();
for (_KVPair pair : pairs) {
if (!undefined.contains(pair.getValue())) {
undefined.add(pair.getValue());
}
}
return undefined;
}
private static List<String> u3(List<_KVPair> pairs) {
List<String> undefined = new LinkedList<String>();
Iterator<_KVPair> it = pairs.iterator();
while (it.hasNext()) {
String value = it.next().getValue();
if (!undefined.contains(value)) {
undefined.add(value);
}
}
return undefined;
}
在大约 3600 对时,“u3”获胜。在大约 1500 对时,'u1' 获胜
【问题讨论】:
-
当你尝试它时会发生什么?哪个时间复杂度最低?
-
好像第一个最快的。
-
.. 它的时间复杂度最低,O(N) vs O(N^2)
-
我会确保每个测试至少运行 2-5 秒,否则您会得到无法重现的结果。
-
@NimChimpsky 集合是只包含唯一值的集合。通常,从大量值集合中找到唯一值的最快方法是将所有值添加到集合中,从而导致所有重复项消失,因为如果输入已经存在于集合中,则集合的 add 方法将简单地忽略输入。
标签: java performance collections