我有一个任务是找到重复的元素并编写一个方法来返回一个布尔值。
下面的代码是我拥有的。
import java.util.ArrayList;
import java.util.List;
public class DuplicateEle {
public static void main(String args[]) {
String[] arr = { "hello", "hi", "hello", "howru" };
DuplicateEle de = new DuplicateEle();
for (int i = 0; i < arr.length; i++) {
boolean isDup = de.isDuplicate(arr[i]);
System.out.println(arr[i]+" is duplicate :" +isDup);
}
}
List<String> dList = new ArrayList<String>();
private boolean isDuplicate(String str) {
boolean isDup = false;
if (dList.contains(str)) {
isDup = true;
} else
dList.add(str);
return isDup;
}
}
它按预期工作。 输出:
hello is duplicate :false
hi is duplicate :false
hello is duplicate :true
howru is duplicate :false
我想找到上述代码的时间复杂度。我正在研究教程中关于它如何工作的时间复杂性one。
有人可以就上述代码向我提供意见并帮助我了解时间复杂度如何运作吗?
提前谢谢!
答案 0 :(得分:0)
可以说,n
是要检查的元素数,m
是最长单词的大小。因此,您将浏览元素数组,并检查每个元素是否在dList
中。
在开始时,它是空的,所以随着时间的推移,你添加元素。所以,问题是方法contains的速度有多快。如果查看ArrayList
的源代码,您将看到它通过数组并检查每个元素是否为equal,这是通过从结尾开始检查每个字符来完成的(首先它会检查它们是否大小相同)。
所以最糟糕的情况是所有元素都是相同的大小,并且它们在第一个元素上是不同的。所以,在第一个元素,你什么都不做,所以基本操作计为1.在第2步,你做1检查,在第3步,你做2检查等,然后在步骤n你做n-1检查包含。所以,你有:
0+1+2+...+n-1 = n(n-1)/2
现在,最糟糕的情况是,每个元素的大小相同,并且它们在第一个元素上不同,因此您有另一个大小为m
的循环。在这里,m
也可以表示字符串中不同char
的位置的平均字符串大小或统计预期(从结尾开始)。
所以,它是O(mn^2)
,但如果我们说m
中有一些随机性,我们就可以说Ω(n^2)
。
但是我收到了一个好消息。使用HashSet
有更快的方法。您只需要使用一些HashSet更改dList,并在浏览初始列表时将每个元素放入其中,因此检查每个元素将在O(1)
中完成,这意味着整体速度将为O(n)
答案 1 :(得分:0)
您使代码过于复杂,使用HashSet<String>
,这将保证唯一性,并将返回元素是否已在集合中。
public class DuplicateEle {
public static void main(String args[]) {
Set<String> seen = new HashSet<>();
String[] arr = { "hello", "hi", "hello", "howru" };
for (String word : arr) {
boolean unique = seen.add(word);
System.out.printf("%s is duplicate: %b%n", word, !unique);
}
}
}
使用HashSet
是非常有效的,因为它将使用字符串的int
哈希来查找存储桶,然后才需要使用equals
来执行完整的操作。昂贵&#39;等于。