【数据结构和算法】时间复杂度和空间复杂度

目录

 


 


一、前言

二、时间复杂度

2.1时间复杂度表示形式

2.1.1规则:

3.1如何计算时间复杂度

3.1.1线性阶

3.1.2平方阶

3.1.3对数阶

常见的时间复杂度排序:

三、空间复杂度

3.1Java的基本类型内存占用


一、前言

数据结构和算法是程序的灵魂,这是某位程序员大佬所言,学习了这门,我们便可以在

编程之路越走越远。时间复杂度一般是我们所关心的。

二、时间复杂度

时间复杂度简单的说就是一个程序运行所消耗的时间,叫做时间复杂度,我们无法目测

一个程序具体的时间复杂度,但是我们可以估计大概的时间复杂度。

一段好的代码的就根据算法的时间复杂度,即使在大量数据下也能保持高效的运行速

率,这也是我们学习算法的必要性。

2.1时间复杂度表示形式

一般用O()来表示算法的时间复杂度,我们叫做大O记法。

2.1.1规则:

①用常数1取代运行时间中的所有的加法常数。比如,一个程序中有十条输出语句

我们不会记成O(10),而是用O(1)来表示。

②如果最高阶项不是1,那么去掉最高阶阶项,因为我们认为数字在后期影响不大。

如O(8n),则时间复杂度应该为O(n)。

③只保留最高阶项,如O(3n^2+6n+2),则时间复杂度为O(n^2)

3.1如何计算时间复杂度

计算时间复杂度主要看执行的次数和输入的关系

3.1.1线性阶

顾名思义,就是输入和输出成正比。


       for(int i=0;i<n;i++){
            sum+=i;
       } 

当n=1,执行一次,当n=100,执行100次 ,所以当为n时,执行n次,所以时间复杂度为

O(n)

3.1.2平方阶

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

外层for循环和内层for循环都是时间复杂度时n外层循环一次,内层循环n次,所以时间复杂度是

O(n^2)。

另一种:

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

外层复杂度是n,内层是1+2+...+n-1+n,所以是n(1+n)/2,由大O法得时间复杂度是O(n^2).

3.1.3对数阶

int i=0;n=100;
while(i<n){
i=i*2;
}

满足条件时,程序运行了,先设X个2相乘后大于n,则2^X=n,解得X=log2(n),所以时间

复杂度时O(log2(n)),log以2为底,n为真数。

常见的时间复杂度排序:

O(1)< O(log2(n))< O(n)< O(nlog2(n)< O(n^2)< O(n^3)< O(2^n)< O(n!)< O(n^n)

一般来说,到了O(n^2)及以上数据量大时运行效率极低,所以数据量大时,应选用更有的算法

三、空间复杂度

简单的说就是程序运行所需要的空间。

写代码我们可以用时间换空间,也可以用空间换时间。加大空间消耗来换取运行时间

的缩短加大时间的消耗换取空间,我们一般选择空间换时间。一般说复杂度是指时间复杂度

3.1Java的基本类型内存占用

计算机访问内存都是一次一个字节。

一个引用(机器地址)需要8个字节表示

如 Date date=new Date();则date这个变量需要8字节表示。

一般内存的使用,如果不够8字节,都会自动填充8字节(也就是8的整数倍)

  • 28
    点赞
  • 23
    收藏
  • 打赏
    打赏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:撸撸猫 设计师:马嘣嘣 返回首页
评论 30

打赏作者

执久呀

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值