数据结构---算法的时间复杂度

前言

计算机重要存储

  • 重要存储分为俩种:内存硬盘

数据结构与算法

数据结构概念

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

*简述
对内存进行数据管理

算法

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

简述

对数据进行处理

数据库

概念

*简述
对硬盘进行数据管理

算法的复杂度

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

时间复杂度

概念

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

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

为什么有时间复杂度

时间复杂度能让我们了解当前思路的执行程序次数。 当一个问题拥有几个解决的思路算出解决思路的时间复杂度,可知最优的解决思路

大O渐进表示法

大O渐进表示法:

是用于描述函数渐进行为的数学符号。
估算出来的时间复杂度
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

有些时间复杂度分为多种情况:例如: 最好 - 平均 - 最坏

能让算法的时间复杂度在预估计的执行范围内

时间复杂度实例

实例1:时间复杂度:O(N)

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

实例2:这里输入参数是不确定的所以 时间复杂度为O(M+N)

void Func3(int N, int M)
{
   
 int count = 0;
 for (int k = 0; k < M; ++ k) 执行M次
 {
   
 ++count;
 }
 for (int k = 0; k < N ; ++ k) N次
 {
   
 ++count;
 }
 printf("%d\n", count);
 }

实例3:输入参数与执行次数无关 执行常数次 所以是 O(1)

void Func4(int N)
{
   
 int count = 0;
 for (int k = 0; k < 100; ++ k)
 {
   
 ++count;
 }
 printf("%d\n", count);
}

实例4
这里从一个字符串中寻找一个字符 寻找的情况分为
最好:1-前几个找到
平均:在中间前后范围找到
最坏:最后一找到 or 没有找到
时间复杂度取最坏情况:所以是O(N)

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

实例5:
计算时间复杂度最好是按思路计算 数循环不能正确算出所有的时间复杂度
排序:将数据按升序或降序排列
冒泡排序的思想:一组数据 从第一个和第二个比较,按升序排列如果后一个小于前一个交换数值,否则不交换,接着第二个和第三个比较,直至比较到最后一个和前一个相比较,最后最大值交换到最后一项,下一趟只需比较到最后一项的前一个选出次大的。
第一次的执行次数为n-1次,因为一次俩俩比较,比较到最后
例如俩俩比较一共5个数据,执行总数据个数-1次
下一趟选出次大的,执行总数据-2次
一直到不足两个数据结束。
在这里插入图片描述

((1+n-1)*(n-1))/2 时间复杂度:O(N^2)

Void BubbleSort(int* a, int n)
{
   
 assert(a);
 for (size_t end = n; end > 0; --end)
 {
   
 int exchange = 0;
 for (size_t i = 1; i < end; ++i)
 {
   
 if (a[i-1] > a[i])
 {
   
 Swap(&a[i-1], &a[i]);
 exchange = 1;
 }
 }
 if (exchange == 0)
 break;
 }
}

时间复杂度:O(N)
每次执行一次 调用N个函数栈帧 执行N次

// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{
   
 if(0 == N)
 return 1;
 
 return Fac(N-1)*N;
}

时间复杂度为:O(2^N)
不以以一个函数递归到底接着返回到上一层 调用函数去思考
直接想递归次数
第一次创建俩个函数栈帧,第二次创建四个,第三个创建八个,每次以二倍的形式去创建函数栈帧
也就是在主函数调用2^0
接着 2^1
2^2 …… 时间复杂度是执行次数的累加 这是一个等比数列

// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
   
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}

在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 19:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 19:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 19:30:03       82 阅读
  4. Python语言-面向对象

    2023-12-28 19:30:03       91 阅读

热门阅读

  1. svg学习

    svg学习

    2023-12-28 19:30:03      49 阅读
  2. 从字符串中移除星号

    2023-12-28 19:30:03       60 阅读
  3. Caché Objects | 第四章 | Registered Objects 的使用

    2023-12-28 19:30:03       43 阅读
  4. 12月27日,每日信息差

    2023-12-28 19:30:03       55 阅读
  5. 2024,5G-A风起,中兴通讯破浪

    2023-12-28 19:30:03       55 阅读