【问题标题】:Complexity for binary search in a non random access structure非随机访问结构中二进制搜索的复杂性
【发布时间】:2020-08-24 21:49:57
【问题描述】:

对已排序数组执行二分查找具有O(logN) 复杂性,其中 N 是数组中的元素数。
但是,如果我们在排序(链接)列表中执行二进制搜索,那么复杂度是多少?
我们正在对范围的中间元素进行logN 比较,但要达到范围,复杂度为O(N),因为列表不是随机访问结构。
时间复杂度也是如此:
1)logN * O(N) = O(N)logN 视为常数?或
2)logN*O(N) = O(NlogN) 在所有情况下都意味着logN = O(logN)

这里什么是正确的? 1 还是 2?

【问题讨论】:

  • 为什么不遍历O(N) 中的整个列表?执行二分搜索将是 O(NlogN),因为您可以访问 O(N) 中的元素。
  • @fas 我的问题纯粹是渐近分析。它与实际评估使用哪种数据结构无关

标签: algorithm data-structures big-o complexity-theory binary-search


【解决方案1】:

第二个假设是正确的,第一个是错误的。渐近分析处理增长。如果节点数量增加,log(n) 也会增加。你不能把它当作一个常数。举一个非常基本的例子,如果你有 10 个节点并且执行需要 10 秒,假设 100 个节点需要 200 秒执行似乎比假设 100 秒更准确(忽略 log(n))。

【讨论】:

  • 你提到的原因是我对此感到困惑并问它的原因。因为另一方面,O(NlogN) > O(N),但我们在列表中可能遇到的更糟糕的情况是遍历所有节点,即O(N),并进行二分搜索,我们实际上是在遍历N + N/2 + N/4 + N/8 +... = O(N) 元素,所以这两种推理似乎都是有效的,但对我来说(1) 似乎正确
  • @Jim 当访问元素的时间为 O(1) 时,二进制搜索为 O(logn)。更正确的说法是 O(logn * accesstime) 中二进制搜索的时间复杂度。 We aren't traversing N + N/2 + N/4 + N/8+... 如果元素位于后半部分,则每次迭代至少需要N/2次
  • @Jim 考虑列表1 2 3 4 5 6。要定位元素5,我们可以将范围缩小到4 5 6,但时间复杂度不是N/2,因为我们必须遍历1 2 3才能到达其他元素
  • 是的,但它会是O(N) 而不是O(NlogN) 对吗?
  • @Jim 计算开始中间和结束节点的位置将是 O(n),并且会有 log(n) 次迭代。所以它的 n*log(n)。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 2016-07-31
  • 2011-09-16
  • 2014-04-24
  • 2023-03-17
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
相关资源
最近更新 更多