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

文章目录

前言

计算机重要存储

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

数据结构与算法

数据结构概念

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

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

算法

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

简述:

对数据进行处理

数据库

概念

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

算法的复杂度

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

时间复杂度

概念

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

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

为什么有时间复杂度

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

大O渐进表示法

大O渐进表示法:

是用于描述函数渐进行为的数学符号。
估算出来的时间复杂度

推导大O阶方法:

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

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

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

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

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

时间复杂度实例

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

c 复制代码
// 计算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)

c 复制代码
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)

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

实例4

这里从一个字符串中寻找一个字符 寻找的情况分为

最好:1-前几个找到

平均:在中间前后范围找到

最坏:最后一找到 or 没有找到

时间复杂度取最坏情况:所以是O(N)

c 复制代码
// 计算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)

c 复制代码
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次

c 复制代码
// 计算阶乘递归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 ...... 时间复杂度是执行次数的累加 这是一个等比数列

c 复制代码
// 计算斐波那契递归Fib的时间复杂度?
long long Fib(size_t N)
{
 if(N < 3)
 return 1;
 
 return Fib(N-1) + Fib(N-2);
}
相关推荐
特种加菲猫3 分钟前
初阶数据结构之栈的实现
开发语言·数据结构·笔记
LNTON羚通4 分钟前
算法定制LiteAIServer视频智能分析平台工业排污检测算法智控环保监管
算法·目标检测·音视频·监控·视频监控
好好学习O(∩_∩)O8 分钟前
11-23刷题记录
算法·leetcode·职场和发展
bingw011431 分钟前
华为机试HJ62 查找输入整数二进制中1的个数
数据结构·算法·华为
苏言の狗34 分钟前
小R的二叉树探险 | 模拟
c语言·数据结构·算法·宽度优先
jianqimingtian1 小时前
如何使用 Matlab 制作 GrabCAD 体素打印切片
数据结构·数据库
gkdpjj1 小时前
C++优选算法十四 优先级队列(堆)
开发语言·数据结构·c++·算法
几窗花鸢1 小时前
力扣面试经典 150(上)
数据结构·c++·算法·leetcode
lu_rong_qq2 小时前
决策树 DecisionTreeClassifier() 模型参数介绍
算法·决策树·机器学习
Heisenberg~2 小时前
详解八大排序(五)------(计数排序,时间复杂度)
c语言·数据结构·排序算法