【问题标题】:How to calculate O(log n) processing time on an array of size 625?如何计算大小为 625 的数组的 O(log n) 处理时间?
【发布时间】:2016-11-02 20:51:23
【问题描述】:

假设处理一个数组的算法是 O (log n)。这 算法最多需要 12 µs 来处理一个大小为 25 的数组。所有 条件相同,大约,最多多久 算法需要处理一个大小为 625 的数组吗?

我是否可以通过将 625/25 = 25 除以每 25 个元素所需的 12 微秒((625/25)*12 = 300 微秒)来解决这个问题,还是还有更多?例如,我是否需要使用 log2(625) + 1 计算最大比较次数并在计算中使用它?任何帮助表示赞赏。

编辑:这不是家庭作业问题。

【问题讨论】:

  • 这是作业吗?
  • 625 是 25 的平方。二的幂。 log(625) 因此是log(25)*2。因此处理时间将加倍。
  • 这个问题没有多大意义。这是对大哦符号的严重滥用。该符号用于渐近行为。仅使用此符号无法推导出算法为固定 n 所采取的步数。当然,如果是作业,他们想要的答案是 24 as log 625 / log 25 = 2 * log 25 / log 25 = 2。
  • @JonhKugelman 不是。 big-oh f(n) = O(n) 的定义表明,对于足够大的 n(即 n > N0) f(n) O(log n)。

标签: java arrays algorithm big-o


【解决方案1】:

如果算法需要 O(log n) 时间,那么它需要 C log n + f( n) 处理 n 个元素的时间。这里 C 是一些常数因子,而 f(n) 是一些增长慢于 O(log n )。

对于缩放目的最坏的情况是当 f(n) 项没有任何贡献时——即,当 f(n ) = 0——所以让我们忘记这个术语。我们只考虑C log n

我们知道

C log 25 = 12µs

因此

C = 12µs / log 25

现在如果我们插入 625,我们得到:

C log n = (12µs / log 25) log 625 = 24µs

(我的回答中的假设是 f(n) 总是非负的并且是单调递增的。这不是 Big-O 表示法的数学要求,但实际上这是一个合理的限制。)

【讨论】:

  • 如果 O(log N) 没有支配它就不会是 O(log N)
  • 谢谢!解释得很好。
  • @JonhKugelman 可以将相同的逻辑/公式应用于其他时间复杂性吗?
  • 不幸的是,假设是不充分的。可以定义 f(n) = n for n 625. 它是非负的且单调递增及其 O(log n)。然而,对于 n = 625,它不会产生 24(我知道这是一个非常病态的情况)。一个充分条件(可能不是最弱的条件)是所有 n 的 f(n)
  • 我不确定病态 f(n) 是否会使我的答案无效。是单位的问题。我认为您的评论将 操作次数时间 混为一谈。即使有那个疯狂的 f(n),我仍然可以通过提高乘法常数来使 log n 项增长得更快。
猜你喜欢
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多