当前位置: 首页 > 知识库问答 >
问题:

如何分析以下算法复杂度[重复]

后易安
2023-03-14

我是新的算法分析,所以如果有人能帮助我,我很感激。我有以下排序数组的算法:

for(int i = 0 ; i < list ; i++){
    if(list[i] > list[i+1]){
       swap list[i] with list[i+1]
       i = -1;
    }
}

我声称这个算法是线性算法(即O(n)),但我不知道如何证明这一点。

共有1个答案

越扬
2023-03-14

在最坏的情况下,这个算法实际上是立方的(O(n^3),其中n=列表的长度)。设想以下输入:list=[5,4,3,2,1]

第一次迭代:List[0]>List[1]。进行交换时,list=[4,5,3,2,1]i被简化为-1,因此循环重新开始。

第二次迭代:List[0]

第三次迭代:List[1]>List[2]。进行交换时,list=[4,3,5,2,1]i被简化为-1,因此循环重新开始。

第四次迭代:List[0]>List[1]。进行交换时,list=[3,4,5,2,1]i被简化为-1,因此循环重新开始。

同样的模式还在继续:我们将需要更多的6次迭代来将2放到列表的开头,对1进行10次迭代,并在列表全部排序后浏览5次。4+6+10+5=25,等于5^2。那么为什么是N^3而不是N^2呢?

免责声明:当然,它不会完全是n^3步,但它将大致如此(这毕竟是大O符号的定义,n越大,它将越接近n^3)。

 类似资料:
  • 3. 算法的时间复杂度分析 解决同一个问题可以有很多种算法,比较评价算法的好坏,一个重要的标准就是算法的时间复杂度。现在研究一下插入排序算法的执行时间,按照习惯,输入长度LEN以下用n表示。设循环中各条语句的执行时间分别是c1、c2、c3、c4、c5这样五个常数[23]: void insertion_sort(void) 执行时间 { int i, j, key; for (j = 1;

  • 以下代码的时间复杂度是多少?我用图和优先级队列的邻接矩阵表示来实现prim的算法。在我看来,时间复杂度是:当源连接到每个其他节点时,堆最多可以增长到(n-1)的大小,而在内部循环中,邻接矩阵的成本是O(n),因此,总的来说:它的O((n-1)*n)-

  • 10.5.1 算法复杂度 为了回答上述问题,首先要明确如何衡量算法的好坏。以搜索问题为例,线性搜索算法 直接了当,易设计易实现,这算不算“好”?而二分搜索算法虽然设计实现稍难一些,但因 无需检查每一个数据而大大提高了搜索效率,这又算不算“好”? 在解决数学问题时,不论是证明定理还是计算表达式,只要证明过程正确、计算结果精 确,问题就可以认为成功地解决了,即正确性、精确性是评价数学解法好坏的标准。而

  • 我已经通过谷歌和堆栈溢出搜索,但我没有找到一个关于如何计算时间复杂度的清晰而直接的解释。 说代码像下面这样简单: 说一个像下面这样的循环: 这将只执行一次。 时间实际上被计算为而不是声明。

  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。

  • 我已经浏览了Google和Stack Overflow搜索,但是我没有找到一个关于如何计算时间复杂度的清晰而直接的解释 对于下面这样简单的代码: 比如下面这样的循环: 这将只执行一次。时间实际上计算为而不是声明。