public String mostFrequent(){
int a = 0; Set s = hm.keySet(); String r = "";
Iterator<String> itrs = s.iterator();
while (itrs.hasNext()){
String b = itrs.next();
if (hm.get(b) > a){
a = hm.get (b);
r = b;
}
}
return r;
我知道get(v)的最坏情况运行时间是o(n)。然后是这个方法的最坏情况运行时间o(n ^ 3),因为它在while循环中使用get(b)两次?我不确定我的想法是否正确。 感谢您提供各种提示和解释!
答案 0 :(得分:0)
我建议你阅读Cormen或Tamassia的几个章节。让我们访问您的问题陈述。
1)Hashmap上的操作必须理想地保持恒定时间(尽管它们取决于负载因子),我们可以安全地假设它在这里是恒定时间,即O(1)。
2)keySet方法通常是O(n)时间操作。
3)在while循环中,您只是进行查找,比较和赋值,所有这些都是具有O(1)运行时的原始操作。
4)此外,在while循环中你不应该使用get方法两次,没有多大意义,你可以只使用它一次并将值存储在另一个变量中。
如果所有这些论点都对你有意义,你可以放心地说,运行时间是T(n)= O(n)+ c1 O(1)+ c2 O(1)+ C3 O(1)< / p>
您可以安全地删除低阶项和常数以获得T(n)= O(n)
如果您真的想了解这些内容,可以随时访问我的blog
答案 1 :(得分:0)
这是一种可视化O()
的有用方法Imagine 1000 things
If you have an outer loop of 1000 times
doing 1000 things thats 1,000,000 things = O(N^2)
If you do 1000 loops that is O(N)
If you do 10 loops that is O(log(N))
If you don't loop that is O(1)
Multiplying or dividing O() by any constant does nothing
O() of a sequence of things is the O() of the biggest thing in the sequence
Every level of Loops multiplies O() by N
猜测当N = 1000时你做了多少事情,这将给你正确的数量级