while循环的时间复杂度_Leetcode从入门到精通(一)——什么是算法复杂度?

前言

算法是一类通过操作数据来解决实际问题的方法。数据结构则是一类用于表示数据的方法。本文主围绕算法的复杂度展开,阐述其定义及意义。

什么是算法复杂度?

为了解决同一个问题,往往可以采用不同的算法。那么,如何来评判算法的优越性?这里,我们往往通过算法的时间复杂度空间复杂度来评判某一算法的性能。然而,很多时候,时间复杂度空间复杂度往往是鱼与熊掌的关系。

时间复杂度

时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。

时间复杂度并不是表示算法所花费的具体时间大小,而是表征算法运算时间与输入之间的关系。

一般以

equation?tex=O%28f%28n%29%29 表示算法复杂度,这里的
equation?tex=f%28n%29 通常为:
  • 常数阶
    equation?tex=1

无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是

equation?tex=O%281%29 ,如:
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

上述代码在执行的时候,它消耗的时候并不随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用

equation?tex=O%281%29 来表示它的时间复杂度。
  • 对数阶
    equation?tex=log%28n%29
int i = 1;
while(i<n)
{
    i = i * 2;
}

从上面代码可以看到,在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。我们试着求解一下,假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么

equation?tex=x+%3D+log2%5En 。也就是说当循环
equation?tex=log2%5En 次以后,这个代码就结束了。

因此这个代码的时间复杂度为:

equation?tex=O%28log%28n%29%29
  • 线性阶
    equation?tex=n
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用

equation?tex=O%28n%29 来表示它的时间复杂度。
  • 线性对数阶
    equation?tex=nlog%28n%29

线性对数阶

equation?tex=O%28nlogN%29 其实非常容易理解,将时间复杂度为
equation?tex=O%28logn%29 的代码循环N遍的话,那么它的时间复杂度就是
equation?tex=+n+%2A+O%28logN%29 ,也就是
equation?tex=O%28nlogN%29

就拿上面的代码加一点修改来举例:

for(m=1; m<n; m++)
{
    i = 1;
    while(i<n)
    {
        i = i * 2;
    }
}
  • 平方阶
    equation?tex=n%5E%7B2%7D

如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

for(x=1; i<=n; x++)
{
   for(i=1; i<=n; i++)
    {
       j = i;
       j++;
    }
}
  • 立方阶与K次方阶
    equation?tex=n%5E%7B3%7D%E3%80%81n%5E%7Bk%7D

与平方阶相似,这里不再赘述。

时间复杂度的大小依次为

equation?tex=O%281%29%3CO%28log%28n%29%29%3CO%28n%29%3CO%28nlog%28n%29%29%3CO%28n%5E%7B2%7D%29%3CO%28n%5E%7B3%7D%29%5C%5C

空间复杂度

空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。

既然时间复杂度不是用来计算程序具体耗时的,那么我也应该明白,空间复杂度也不是用来计算程序实际占用的空间的。

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的一个量度,同样反映的是一个趋势,我们用

equation?tex=S%28n%29 来定义。

空间复杂度比较常用的有:

equation?tex=S%281%29%E3%80%81S%28n%29%E3%80%81S%28n%5E2%29

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为

equation?tex=S%281%29 :
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度为

equation?tex=S%281%29
int[] m = new int[n]
for(i=1; i<=n; ++i)
{
   j = i;
   j++;
}

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,这段代码的2-6行,虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即空间复杂度为

equation?tex=S%28n%29

总结

本文主要阐述算法的复杂度概念,这是评估算法性能的最主要指标。下一篇将围绕数据结构展开。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值