【发布时间】:2014-10-23 08:22:54
【问题描述】:
我在考试中做了这个练习,上面写着:
找到一个算法,它可以搜索一个最大的数 未排序的列表,并且具有 O(log(N)) 的 Big-Oh 复杂度。
我发现的唯一具有 log n 复杂度的搜索算法是二进制搜索算法,但它需要对我的列表/数组进行排序。
有这样的算法吗?
【问题讨论】:
标签: arrays algorithm search complexity-theory
我在考试中做了这个练习,上面写着:
找到一个算法,它可以搜索一个最大的数 未排序的列表,并且具有 O(log(N)) 的 Big-Oh 复杂度。
我发现的唯一具有 log n 复杂度的搜索算法是二进制搜索算法,但它需要对我的列表/数组进行排序。
有这样的算法吗?
【问题讨论】:
标签: arrays algorithm search complexity-theory
这是一个棘手的问题。没有说明该列表有 N 个元素。因此,您可以使用变量的更改,并将 N 替换为 2K。现在,在具有 K 个元素的列表上使用线性算法解决问题。
如果我们假设列表中有 N 个元素,一个可能的解决方案是使用 N 个并行计算元素 [CE0 sub> .. CEN ]。在算法的基本情况下,我们让每个计算元素 CEi 在 [ CEN/2 .. CEN ] 比较列表值 x2i-N 和 x2i-N+1。每个计算元素向CEi/2 报告它们两个分配值中较大的一个。该算法的迭代步骤是每个接收到两个报告值的计算元素CEk将最大的报告给CEk/2。这种迭代逻辑一直持续到 CE0 处理来自自身的报告。它不再向自身报告,而是输出结果。
如果排除并行计算,则问题无解。
【讨论】:
不,没有这样的算法。在未排序的列表中,找到浏览所有元素所需的最高数字。
所以,没有比 O(n) 更好的算法了!
【讨论】:
最好的办法是在一个未排序的数组中花费 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)?
希望对您有所帮助! :)
【讨论】: