【问题标题】:How to determine the worst case complexity for my algorithm?如何确定我的算法的最坏情况复杂度?
【发布时间】:2013-02-14 15:54:23
【问题描述】:

我正在为堆编写siftup 算法,但我被困在问题的最后。问题的最后一部分说算法应该具有对数最坏情况时间复杂度,即O(log(n)。我写了下面的算法,其中i 是堆中元素的索引,v 是堆数组。根的索引是最低的,而它的最大值是堆的最低孩子。我正在考虑数组从 1 到 n

算法

Siftup (v, i) {
While(v[i] > v[i/2] and i != 0) {
    Temp = v[i] // Temp is of the same type as v[i]
    v[i] = v[i/2]
    v[i/2] = temp
    i = i / 2
    }
}

由于该过程涉及while loop 中的四个赋值语句,每个语句都具有恒定的最坏情况时序,因此该算法应该具有对数最坏情况时间复杂度。任何人都可以展示一种方法来确定其O(n),其中n 是堆中元素的数量?

附:也请告诉我算法中的错误。

【问题讨论】:

    标签: algorithm heap


    【解决方案1】:

    是的,看起来您的算法具有对数复杂度。

    我同意您的观察,即每次迭代似乎都具有恒定的复杂性。

    之后的步骤是计算对于给定的 N 值将执行多少次迭代。虽然我不会直接提供答案,但这里的关键是 i = i / 2。这可能更容易反过来看:对于某些给定的 N,您必须将 i 加倍(从 1 开始)多少次才能达到该 N?更具体地说,N 的大小与您需要将i 翻倍才能至少与 N 一样大的次数之间有什么关系?

    【讨论】:

    • 条件i != 0 是否不能达到目的,因为那是元素值将停止筛选的点?
    • @buzzinga:我不得不考虑一下——我认为它可能有效,但我不确定(当我用 C++ 编写堆排序时,我已经作弊并使用基于 1 的索引)。
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多