数据结构与算法一: 时间复杂度和空间复杂度

358 阅读4分钟

关注我,以下内容持续更新

数据结构与算法(一):时间复杂度和空间复杂度

数据结构与算法(二):桟

数据结构与算法(三):队列

数据结构与算法(四):单链表

数据结构与算法(五):双向链表

数据结构与算法(六):哈希表

数据结构与算法(七):树

数据结构与算法(八):排序算法

数据结构与算法(九):经典算法面试题


一 时间复杂度

时间频度

一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度时间频度。记为T(n)

时间复杂度

一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度,这种表示方法叫大o符号表示法

T(n)不同,但时间复杂度可能相同。如:T(n)=n²+7n+6 与T(n)=3n²+2n+2,它们的T(n)不同,但时间复杂度相同,都为O(n²)。

大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。

计算时间复杂度的方法:

把时间频度表达式①去掉常数阶②只保留最高项③去掉最高阶项的系数

例如:T(n)=n²+7n+6 =>o(n²)

先来看段代码

for(i=1; i<=n; i++)
{
   j = i;
   j++;
}

大O符号表示法,这段代码的时间复杂度为:O(n)

假设每行代码的执行时间都是一样的,我们用1颗粒时间 来表示,那么这个例子的第一行耗时是1个颗粒时间,第三行的执行时间是 n个颗粒时间,第四行的执行时间也是 n个颗粒时间(第二行和第五行是符号,暂时忽略),那么总时间就是 1颗粒时间 + n颗粒时间 + n颗粒时间 ,即 (1+2n)个颗粒时间,即: T(n) = (1+2n)*颗粒时间,从这个结果可以看出,这个算法的耗时是随着n的变化而变化,因此,我们可以简化的将这个算法的时间复杂度表示为:T(n) = O(n)。 如果n无限大的时候,T(n) = time(1+2n)中的常量1就没有意义了,倍数2也意义不大。因此直接简化为T(n) = O(n) 就可以了。

常见的时间复杂度量级由小到大依次为:常数阶O(1),对数阶O(logN),线性阶O(n),线性对数阶O(nlogN),平方阶O(n²),立方阶O(n³),K次方阶O(n^k),指数阶(2^n)

(说明:n^k代表n的k次方; logN在这里代表以2为底N的对数)

  1. 常数阶O(1) 无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)
int i = 1;
int j = 2;
int k = 3;
i++;
j++;
  1. 线性阶O(n) 一个循环里面的代码执行n遍,它消耗的时间是随着n的变化而变化的,这类代码都可以用O(n)来表示它的时间复杂度。
for(i=1; i<=n; ++i)
{
   i++;
}
  1. 对数阶O(logN) while循环里面,每次都将 i 乘以 2,当 i==n 时退出循环
int i = 1;
while(i<n)
{
    i = i * 2;
}
  1. 线性对数阶O(nlogN) for循环里放个对数阶O(logN)运算
for(i=1; i<=n; ++i)
{
   int j = 1;
   while(j<n)
    {
        j = j * 2;
    }
}
  1. 平方阶O(n²) 嵌套两层for循环
for(i=1; i<=n; i++)
{
   for(j=1; j<=n; j++)
    {
       j++;
    }
}

二 空间复杂度

前面讲过,时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。

  int i = 0;              //1
  int[] a = new int[n];   //2
  for (i; i <n; ++i) {
    a[i] = i * i;
  }

第1行代码中,我们申请了一个空间存储变量 i,但是它是常量阶的,跟数据规模 n 没有关系,所以我们可以忽略。第 2 行申请了一个大小为 n 的 int 类型数组,除此之外,剩下的代码都没有占用更多的空间,所以整段代码的空间复杂度就是 O(n)。

我们常见的空间复杂度就是 O(1)、O(n)、O(n2 ),空间复杂度分析比时间复杂度分析要简单很多。

关注我

如果觉得我写的不错,请点个赞 关注我 您的支持是我更文最大的动力!