微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查数组是否为最小堆时间复杂度

如何解决检查数组是否为最小堆时间复杂度

我实现了一个递归算法来检查数组是否是最小堆。我无法弄清楚最坏情况下的时间复杂度应该是多少。代码如下:

CHECK-MIN-HEAP(A,i,n)
    if i > (n - 1) / 2
        return true
    if A[i] > A[left(i)] or A[i] > A[right(i)]
        return false
    return CHECK-MIN-HEAP(A,left(i),n) and CHECK-MIN-HEAP(A,right(i),n)

简要说明:基本情况由节点是叶子的情况表示。这是因为元素 A[(n-1)/2] 代表最后一个非叶节点。另一种基本情况是违反最小堆条件。在递归的情况下,我们检查左右子树是否是堆。

所以在最好的情况下,当数组不是堆时,我们有一个恒定的时间复杂度。在最坏的情况下,当数组是堆时,函数会检查堆的所有节点,因为堆的高度是logn,时间复杂度应该是O(logn )。是正确的?或者时间复杂度是O(n)

解决方法

O(N) 显然是这里的正确答案。

这很明显,因为您逐个遍历整个数组元素以查找无效的不变量。

你说的最好的情况作为分析点毫无用处,可能是最终节点使整个堆无效O(N)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。