gpt4 book ai didi

算法-涉及if语句时如何计算时间复杂度

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:59:30 25 4
gpt4 key购买 nike

我是算法的新手,有一个关于如何在有 if 语句的情况下计算时间复杂度的问题。我有一个在堆中实现的优先级队列。这是出列方法:

int[] pQueue;
int length;
int dequeue()
{
int node = 1;
int value = pQueue[--length];
int maxValue = pQueue[node];

int location = sift(node * 2, value);
pQueue[location] = value;
return maxValue;
}

int sift(int node, int value){
if (node <= length){
if (node < length && pQueue[node] < pQueue[node + 1])
node++;
if (value < pQueue[node]){
pQueue[node / 2] = pQueue[node];
return sift(node * 2, value);
}
}
return node / 2;
}

在sift方法中,有两行代码:

         if (node < length && pQueue[node] < pQueue[node + 1])
node++;

既然n++是按上面的条件执行的,那么推导递归方程时要算还是不要算呢?我知道它确实会渐近地产生任何影响,但是有没有标准的方法可以做到这一点?非常感谢。

最佳答案

标准方法是在条件取决于所考虑的变量时将其考虑在内。例如,考虑一个在 if 语句中调用自身的简单递归函数:

double factorial(int n) {
double result = n;
if (n > 0) {
result *= factorial(n - 1);
}
return result;
}

如果我们假装总是满足 if 条件,则递归是无限的,复杂度是无限的(不管 n)。如果我们假装从未满足 if 条件,则递归调用永远不会发生,并且复杂度是恒定的。显然,这些都不是可以接受的借口。复杂度实际上是 O(n)。

当条件取决于正在考虑的变量时,标准方法通常是给出最坏情况的复杂性(并表明我们正在这样做)。例如,对于排序算法,我们通常根据要排序的序列的长度给出复杂度,但是许多排序算法的执行方式不同,具体取决于元素的初始排序。因此,我们假设我们感兴趣的是它们对长度具有最不有利排序的序列的性能,并进行相应的计算。

(通常也可以提供平均情况复杂度,但是,通过对所有可能的输入进行平均,有时甚至是典型情况复杂度。)

关于算法-涉及if语句时如何计算时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25707444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com