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

简介: 【数据结构】时间复杂度和空间复杂度

一、数据结构前言


       1.什么是数据结构:


         数据结构(Data Structure)计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合


2.什么是算法?


       算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果

       通俗来说:二分查找,冒泡排序等等都为算法


  3.如何学好算法和数据结构

       1.多写代码(写到吐)

image.png


2.勤于思考多画图

      注:学习数据结构为软件开发打下深厚功底,提升代码能力    


二、算法的时间复杂度和空间复杂度

   1.算法效率

               1.1如何衡量一个算法的好坏

               比如对于以下斐波那契数列:

long long Fib(int N)
{
  if (N < 3)
    return 1;
  return Fib(N - 1) + Fib(N - 2);
}


   1.2算法的复杂度


算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。


  2.时间复杂度

               2.1 时间复杂度的概念


时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例


               注:算法中的基本操作的执行次数,为算法的时间复杂度。


               求其时间复杂度:

void Func1(int N)
{
  int count = 0;
  for (int i = 0; i < N; ++i)
  {
    for (int j = 0; j < N; ++j)
    {
      ++count;
    }
  }
  for (int k = 0; k < 2 * N; ++k)
  {
    ++count;
  }
  int M = 10;
  while (M--)
  {
    ++count;
  }
  printf("%d\n", count);
}


 操作次数:


95dc5d093232427393466bd0e9d150a2.png


实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法

               2.2大O的渐进表示法

                      大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

                       推导大O阶方法:


 1、用常数1取代运行时间中的所有加法常数。

                       2、在修改后的运行次数函数中,只保留最高阶项。

                       3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大 O 阶。

                     

使用大O的渐进表示法以后,Func1的时间复杂度为: N^2

     

                       N = 10 F(N) = 100

                       N = 100 F(N) = 10000

                       N = 1000 F(N) = 1000000


 实例1.计算Func2的时间复杂度?

// 计算Func2的时间复杂度?
void Func2(int N)
{
 int count = 0;
 for (int k = 0; k < 2 * N ; ++ k)
 {
 ++count;
 }
 int M = 10;
 while (M--)
 {
 ++count;
 }
 printf("%d\n", count);
}


按照大O的渐进表示法,时间复杂度为O(N)

      实例2.计算Func3的时间复杂度?

// 计算Func3的时间复杂度?
void Func3(int N, int M)
{
 int count = 0;
 for (int k = 0; k < M; ++ k)
 {
 ++count;
 }
 for (int k = 0; k < N ; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}


O(M+N),如果M远大于N,时间复杂度为O(M),如果N远大于M,时间复杂度为O(N)

实例3:计算Func4的时间复杂度?

// 计算Func4的时间复杂度?
void Func4(int N)
{
 int count = 0;
 for (int k = 0; k < 100; ++ k)
 {
 ++count;
 }
 printf("%d\n", count);
}


    时间复杂度并不代表1次,而是常数次

       

实例4:计算strchr的时间复杂度

//计算strchr的时间复杂度
const char * strchr ( const char * str, int character );
{
    while(*str)
    {
        if(*str == character)
        {
            return str;
        }
    }
}


有些算法的时间复杂度存在最好、平均和最坏情况:

最坏情况:任意输入规模的最大运行次数 ( 上界 )

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数 ( 下界 )


3.空间复杂度


空间复杂度也是一个数学表达式,是对一个算法在运行过程中 临时占用存储空间大小的量度 。

空间复杂度不是程序占用了多少 bytes 的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。

空间复杂度计算规则基本跟实践复杂度类似,也使用 大 O 渐进表示法 。

注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。


4. 常见复杂度对比


一般算法常见的复杂度如下:


eca47edfd1db4e7a9fbedc27ef75dd5a.pngd904d0b5276449bcac55b4466b8c8863.png


目录
相关文章
|
8月前
|
算法 搜索推荐 程序员
数据结构中时间复杂度的介绍
冒泡排序是通过重复遍历数组,比较并交换相邻元素来排序数组的。因为它包含两层嵌套循环,每层循环的最大迭代次数近似于n,所以时间复杂度是O(n²)。 通过上述分析,我们可以看到不同代码结构对算法性能有着显著的影响。在设计数据结构和算法时,理解并计算时间复杂度是非常重要的,它帮助程序员选择或优化算法,以处理更大的数据集或提高程序的运行速度。
73 2
|
8月前
|
存储 算法 C语言
数据结构中的空间复杂度
优化空间复杂度对于提升程序性能和资源利用率至关重要,特别是在资源受限的环境(如嵌入式系统和移动设备)中。高效的数据结构和算法设计可以显著提升程序的执行效率和可扩展性。 综上所述,理解和优化空间复杂度是设计高效数据结构和算法的关键。通过分析常见数据结构的空间复杂度,并结合实际代码示例,我们可以更好地理解这一重要概念,并在实际编程中应用这些知识。希望本文能帮助你更好地掌握空间复杂度及其在数据结构中的应用。
62 2
|
4月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
88 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
4月前
|
机器学习/深度学习 存储 算法
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
【初阶数据结构】算法效率大揭秘 | 时间与空间复杂度的深度剖析
|
4月前
|
算法
[数据结构] -- 时间复杂度和空间复杂度
[数据结构] -- 时间复杂度和空间复杂度
39 0
|
6月前
|
存储 算法
【数据结构】——时间复杂度与空间复杂度
【数据结构】——时间复杂度与空间复杂度
|
8月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
8月前
|
机器学习/深度学习 算法
数据结构入门 时间 空间复杂度解析
数据结构入门 时间 空间复杂度解析
55 0
|
8月前
|
存储 算法 C语言
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
数据结构和算法——堆排序(选择排序、思路图解、代码、时间复杂度、堆排序及代码)
51 0