【问题标题】:Finding an index in a sorted array在有序数组中查找索引
【发布时间】:2014-03-14 11:28:34
【问题描述】:

给定一个排序数组A[1...n]的键,另一个键x,存储在A中,显示如何找到索引k,以便A[k] = x及时O(log(k))

我知道平均而言,对排序数组的二进制搜索将在O(logn) 中完成,但是如上所述,对于排序数组,显示O(logk) 的运行时间的最佳方法是什么?
感谢您的帮助。

【问题讨论】:

  • 您的键是任意值,还是专门的整数?
  • 我没有得到 O(logk).. k 与 O() 复杂性有什么关系? k 只是索引的值,对吗?如果那个 x 在索引 0 处,我应该在 O(log0) 中完成它吗?
  • @DavidKernin 这正是 O(log k) 所说的:k 中的对数,因此(非常缓慢地)随着 k 的增长而增长。

标签: arrays performance algorithm big-o


【解决方案1】:

进行指数搜索,从索引 m=1 开始,然后每次将 m 翻倍,直到 m 处的数组元素大于 x。然后,对最终 m 下方的数组子集进行正常的二进制搜索。

【讨论】:

  • 是的,像这样。
  • @user2580516 首先进行指数搜索的原因是什么?
  • @DerrekWhistle 独立于项目总数。指数搜索为您提供了 k 的上限,该上限最多相差 2 倍,因此您可以在长度为 O(k) 的范围内进行二进制搜索,而不管 n 可能有多大。
  • @DerrekWhistle 德尔南说什么。基本上,O(log k) 算法仅在搜索几乎总是针对非常接近列表开头的项目时才有用。指数搜索会将搜索空间限制在列表的开头,避免对整个列表进行二分搜索。如果您考虑一下目标项几乎总是列表中的第一项的情况,我认为这会更有意义。
  • 我明白了。谢谢两位的解释。
【解决方案2】:

给出 O(log N) 的二进制搜索是标准方法。我不确定 O(log k) 是印刷错误、半等价,还是建议将搜索“偏向”该范围的低端。

也许使用非中间中点进行二分搜索.. 因为log 的微分是log,也许使用log() 函数在每次迭代中选择一个中点?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多