以下算法在未排序数组中查找最小值的算法的复杂性

时间:2018-11-02 16:53:57

标签: arrays algorithm time-complexity divide-and-conquer

通过使用分而治之的方法,如果我们将数组重复分成两半,直到它们减小为两半,然后我们可以在O(1)时间内返回这两个中的最小值。扩展方法,为了分别合并两个子数组A和B的最小值“ a”和“ b”,我们可以直接在O(1)时间中返回它们的最小值,从而使合并步骤成为恒定时间操作。

这实质上意味着存在logN级别,并且合并步骤的复杂度为O(1)。那么这是否意味着使用此算法在未排序数组中查找最小值的复杂度为O(logN)?

另外,请参考此讨论。

Finding the minimum in an unsorted array in logarithmic time

3 个答案:

答案 0 :(得分:3)

即使不看算法,也永远不可能找到O(Log N)。

由于采用何种策略,在您了解所有要素之前,都无法知道最小值。 (在未排序的数组中,读取元素绝对不会给您其他任何信息。)

因此搜索最小值是一个Ω(N)问题。

答案 1 :(得分:2)

  

然后我们可以在O(1)时间内返回两者中的最小值。

您确实要在固定时间内比较一对值,但是您有n / 2对值要比较。这使得第一步总和为O(n / 2)(已经是O(n)),对每一步求和得出O(n / 2 + n / 4 + n / 8 + ...)。 / p>

简而言之,您仍然必须至少进行n-1个比较。周围没有漏洞。

答案 2 :(得分:0)

尽管Nelfeal Yves Daoust回答得很好,但我想添加一些评论。

仅使用 未排序的数组,没有其他方法可以在亚线性时间中找到最小值/最大值。由于我们不知道哪个元素是最大或最小,因此您必须全部查看它们。

实用改进

如果在数据结构上允许更多操作和空间,我们可以使其更快。

  • 数组为空

    • 插入(e):使用e的值设置最小值/最大值。 O(1)
    • Remove(e):返回一些预定义的值。 O(1)
    • Minimum / Maximum(e):返回一些预定义值。 O(1)
  • 数组不是空的

    • 插入(e):比较e的值与最小值/最大值。如果满足条件,则将最小值/最大值设置为e的值。 O(1)
    • Remove(e):如果minimax / maximum == e,则将最小值/最大值设置为未知(可能为NULL?否则,只需从数组中删除e。 O(1)
    • 最小/最大(e):如果最小/最大未知,请使用O(N)算法查找并设置最小/最大。如果知道最小值/最大值,则将其返回。 O(N)或O(1)。

优缺点

“插入/删除”与“最小/最大”之间的操作比率决定了该算法的性能。 如果“最小/最大”运算的数量大于“插入/删除”的数量,则该算法可能会随着数组的增大而更快地工作。