【问题标题】:What is the time complexity of inserting elements of an array into a map? [duplicate]将数组元素插入地图的时间复杂度是多少? [复制]
【发布时间】:2020-04-17 17:23:02
【问题描述】:

如果在地图中插入元素需要 log(N) 时间,其中 N 是地图的大小。 然后将数组的元素一一插入 log(1)+log(2)+....+log(N) = log(N!) 复杂度。但是对元素进行排序的正常最佳复杂度是 Nlog(N),我哪里出错了?

【问题讨论】:

标签: c++ c++11 stl


【解决方案1】:

无处可去,O(log n!) == O(n log n)。证明有点数学。

首先,我们有log(n!) = log(1) + log(2) + ... + log(n) <= log(n) + log(n) + ... + log(n) = n log(n)。另一方面,我们也得到以下

2 log(n!) = 2*(log(1) + log(2) + ... + log(n)) 
          = (log(1) + log(n)) + (log(2) + log(n-1)) + ... + (log(i) + log(n-i+1)) + ... + (log(n) + log(1)) 
          = log(1*n) + log(2*(n-1)) + ... + log(i*(n-i+1)) + ... log(n*1) 
          >= log(n) + ... + log(n) = n log(n)

i*(n-i+1) = i*n - i*i + i >= n 以来我们从哪里得到不等式(看起来有点神秘,但它基本上说产品的增长速度快于总和)。

所以我们有log(n!) <= n log(n) <= 2 log(n!)。根据 O 符号的定义,这意味着 O(log(n!)) = O(n log(n))

【讨论】:

  • 好的,我明白了,但这是否意味着最坏的 log(n!) 比对最坏情况可以达到 nlog(n) 的数组进行排序要好?
  • 我认为您应该再次思考/阅读我们为什么使用 O 表示法。对数组进行排序的运行时间并不完全是 O(n log n) 并且将元素插入到地图中并不完全是 log n 时间。两者都是一个粗略的估计,只有在一个常数因子下才是正确的。因此,出于运行时分析的原因,我们不区分log(n!)2log(n!),这样做也没有意义,因为我们分析所基于的知识(一次插入的运行时间)并不准确开始,但也只在一个常数因子之前为真。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2018-05-05
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多