luc*_*ter 12 java algorithm time-complexity
我对这两种算法的时间复杂性感到困惑.
//time complexity O(nlog(n))
public void usingTreeMap(){
Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
for (int i = 0; i < 10; i++) {
map.put(i, i);
}
}
//time complexity O(n)
public void usingHashMap(){
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < 10; i++) {
map.put(i, i);
}
}
Run Code Online (Sandbox Code Playgroud)
usingTreeMap算法的时间复杂度是否正确.我确实在树形图中知道插入时间是log(n)但是如果我们迭代10个元素的数组,它就变成了nlog(n).
dis*_*ame 21
对于HashMap,后备存储是一个数组.当您尝试插入十个元素时,您将获得哈希值,从该哈希值计算特定的数组索引,并且由于它是后面的数组,因此您将注入O(1).
因此,在HashMap中插入n个元素的总时间= n*O(1)= O(n)
在这种情况下,后备存储是一个树.对于具有总k个元素的树,平均而言,找到该位置的时间是O(Log k).
总时间= Log 1 + Log 2 + Log 3 + ... + Log(n-1)
由于Log a + Log b = Log(ab),因此TreeMap的插入时间总和为较不为人知的运行时间值O(Log(n!)).
此外,O(Log(n!))由O(n Log(n))约束.[ 提示: Log 1,Log 2,... Log(n-1)是总(n-1)个值,并且所有值都小于Log(n).因此,它们的总和是n*Log(n)]的上限.
因此,在TreeMap中插入n个元素的时间复杂度松散地写为O(n Log(N)).
小智 6
插入时间复杂度通常是根据每个实例定义的。
平均情况:
最坏的情况:
在上面的代码中,由于您要插入多个项目,因此我们需要区分地图中有多少个元素(n)和要添加到地图中的有多少个元素(m)。如果映射最初是空的,则上面的运行时是正确的。如果它们已经有一些元素,那么运行时将是:
Avg Worst
Insert m elements into HashMap: O(m) O(mn)
Inset m elements into TreeMap: O(mlogn) O(mlogn)
Run Code Online (Sandbox Code Playgroud)
usingTreeMap算法的时间复杂度是否正确.
TreeMap在Javadoc中正确指定了基本操作的时间复杂性.
我知道在树形图中插入时间是log(n)
正确.
但如果我们迭代10个元素的数组,它会变成nlog(n).
如果这意味着插入那些10种元素的时间复杂度是M*log(N)其中M是阵列的尺寸和N是的大小TreeMap.,如果它并不意味着,问题是不清楚.