【发布时间】:2015-04-30 19:41:19
【问题描述】:
我编写了这两种算法来检查字符串中是否存在重复字符(ABBC、AAAC)。第一个使用 hashset 数据结构,而第二个完全依赖于迭代。
算法 1
String s = "abcdefghijklmnopqrstuvwxxyz";
public boolean isUnique(String s) {
Set<Character> charSet = new HashSet<Character>();
for(int i=0; i<s.length(); i++) {
if(charSet.contains(s.charAt(i))) {
return false;
}
charSet.add(s.charAt(i));
}
return true;
}
算法 2
String s = "abcdefghijklmnopqrstuvwxxyz";
public boolean isUnique2(String s) {
for(int i=0; i<s.length()-1; i++) {
for(int j = i+1; j<s.length(); j++) {
if(s.charAt(i) == s.charAt(j)) {
return false;
}
}
}
return true;
}
我的想法是第一个算法是O(N),第二个算法是O(N^2)。当我在我的(可能不可靠的)笔记本电脑上运行执行时间测试时,第一个算法的平均速度是 2020ns,而第二个算法是 995ns。这违背了我对算法复杂度的计算,有人可以告诉我吗?
【问题讨论】:
-
@zubergu:不!
HashSets 的工作方式不同。 -
@fabian 我刚刚意识到 HashSet 部分 :)
-
了解运行时的性能不能仅从大 O 表示法中收集。
-
您如何衡量执行时间?您是在测试整个可执行文件运行需要多长时间,还是仅测试方法体?如果是前者,你可能不会注意到这么小的数据集有很大的不同。无论哪种方式,时间复杂度和运行时间都是两个不同的东西。时间复杂度不假设您实际运行代码的对象是什么,在本例中是 jvm,这会引入一些初始开销。
-
用超过 100 万个字符的字符串试一试,看看会得到什么。
标签: java performance algorithm big-o time-complexity