【问题标题】:Searching algorithm with complexity O(log n), UNSORTED list/array复杂度为 O(log n) 的搜索算法,未排序的列表/数组
【发布时间】:2014-10-23 08:22:54
【问题描述】:

我在考试中做了这个练习,上面写着:

找到一个算法,它可以搜索一个最大的数 未排序的列表,并且具有 O(log(N)) 的 Big-Oh 复杂度。

我发现的唯一具有 log n 复杂度的搜索算法是二进制搜索算法,但它需要对我的列表/数组进行排序。

有这样的算法吗?

【问题讨论】:

    标签: arrays algorithm search complexity-theory


    【解决方案1】:

    这是一个棘手的问题。没有说明该列表有 N 个元素。因此,您可以使用变量的更改,并将 N 替换为 2K。现在,在具有 K 个元素的列表上使用线性算法解决问题。

    如果我们假设列表中有 N 个元素,一个可能的解决方案是使用 N 个并行计算元素 [CE0 sub> .. CEN ]。在算法的基本情况下,我们让每个计算元素 CEi 在 [ CEN/2 .. CEN ] 比较列表值 x2i-Nx2i-N+1。每个计算元素向CEi/2 报告它们两个分配值中较大的一个。该算法的迭代步骤是每个接收到两个报告值的计算元素CEk将最大的报告给CEk/2。这种迭代逻辑一直持续到 CE0 处理来自自身的报告。它不再向自身报告,而是输出结果。

    如果排除并行计算,则问题无解。

    【讨论】:

    • 不理解反对票。这是一个完全有效的答案。
    • 请注意,并行算法允许我们达到 O(log n) 的时间复杂度,但计算复杂度仍然是 O(n)。
    【解决方案2】:

    不,没有这样的算法。在未排序的列表中,找到浏览所有元素所需的最高数字。

    所以,没有比 O(n) 更好的算法了!

    【讨论】:

      【解决方案3】:

      最好的办法是在一个未排序的数组中花费 O(n) 时间。

      但是,您可以应用 partition() 例程(来自快速排序算法),而不是简单地查看整个列表,而不是在分区的下半部分递归,您可以在上半部分递归并保持分区直到最大找到元素。这需要 O(n) 时间。

      查看详细说明:

      http://en.wikipedia.org/wiki/Quickselect

      How to find the kth largest element in an unsorted array of length n in O(n)?

      希望对您有所帮助! :)

      【讨论】:

      • 根据问题 O(n) 不够好。正常的线性搜索需要 O(n) 时间。
      猜你喜欢
      • 2021-06-22
      • 2011-09-03
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多