【详解数据结构与算法】一、数据结构与算法概念知识篇-时间复杂度||空间复杂度等

本文介绍了数据结构的基本概念,包括数据、数据元素、数据对象和数据结构的逻辑与存储结构。讨论了算法的特征、设计原则及效率度量,特别强调了时间复杂度和空间复杂度在评估算法性能中的重要性。同时,提到了时间复杂度和空间复杂度的常见表示及估算规则。
摘要由CSDN通过智能技术生成

以下是个人在自学严奶奶的数据结构与算法以及观看王道考研的一些学习笔记以及个人心得,供学友们参考学习以及个人学习复习,如有理解错误欢迎各位学友们更正

 

目录

数据结构的基本概念术语

数据结构

逻辑结构

存储(物理)结构

数据的运算

算法

算法特征

设计一个好的算法必须考虑

算法效率度量(△△△△)


 本章思维导图(思维导图中红体加粗字为重点掌握):

数据结构的基本概念术语

  1. 数据:什么是数据?在数据结构中,数据就是能输入到计算机中并被计算机程序处理的符号,例如:正数、实数、字符串等等
  2. 数据元素:数据元素是数据的基本单位,是数据的基本单位,在计算  在有些情况下, 数据元素也称为元素、记录等。
  3. 数据项 ( Data Item ) 是组成数据元素的、有独立含义的、不可分割最小单位。例如,学生 基本信息表中的学号、姓名、性别等都是数据项。
  4. 数据对象 ( Data Object ) 是性质相同的数据元素的集合, 是数据的 一 个子集。 例如: 正整数的数据对象是集合N= {0,1,2, …}, 字母字符数据对象是集合C= { ' A', ' B', …, 'Z' , 'a' , 'b' , …, 'z'} , 学生基本信息表也可以是 一 个数据对象(如student={{'1','张三'},{},.....}.

以上是数据结构中基本概念术语,可以结合概述用以下图示看关系:


数据结构

数据结构 ( Data Structure ) 是相互之间存在一 种或多种特定关系的数据元素的集合。换句话 说, 数据结构是带 ” 结构 " 的数据元素的集合, “结构 ” 就是指数据元素之间存在的关系。 数据结构包括逻辑结构和存储结构两个层次。三个方面内容:逻辑结构、存储结构、数据的运算

逻辑结构

概念::从逻辑字样可以看,出从逻辑上描述数据的结构,与数据的存储无关,独立千计算机的。因此, 数据的逻辑结构可以看作是从具体问题抽象出来的数学模型`。

集合结构、线性结构、树结构、图结构。

【这里有写过代码的学友们应该很好理解,也就是说这些结构用什么样的方式实现在逻辑层面是无关的,那是存储结构上的内容,如线性结构可以用顺序结构和链式结构。】

存储(物理)结构

概念:数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。把数据对象存储到 计算机时, 通常要求既要存储各数据元素的数据, 又要存储数据元素之间的逻辑关系,数据元素 在计算机内用 一 个结点来表示。数据元素在计算机中有两种基本的存储结构,分别是顺序存储结 构和链式存储结构。【扩展:还有索引存储和散列存储

  1. 顺序存储结构:

顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。

     2.链式存储结构:

顺序存储结构要求所有的元素依次存放在一片连续的存储空间中, 而链式存储结构,无需占 用 一 整块存储空间。但为了表示结点之间的关系,需要给每个结点附加指针字段, 用千存放后继 元素的存储地址。 所以链式存储结构通常借助于程序设计语言的指针类型来描述。

数据的运算

  施加在数据上的运算包括运算的定义和实现。运算定义是针队逻辑结构的,指出运算的功能;运算的实现是针队存储结构的,指出运算的具体步骤


算法

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中的每条指令表示一个或多个操作。

算法特征

有穷性:也就是说一个算法总能在执行有穷步之后结束,且每一步都可在有穷时间内完成。

确定性:算法中的每条指令必须有明确的含义,对于相同的输出总有相同的结果。

可行性:算法中描述的操作都可以通过已经实现的基本运算顺序有限次有序实现。(也就是说可以实现出现)

输入:一个算法有零个或多个输入,这些输入取决于某个特定的对象的集合。

输出:一个算法有一个或者多个输出,这些输出是与输入有着某种特定关系的量。

设计一个好的算法必须考虑

正确性。算法应该能够正确的解决问题。

可读性。算法应该具有良好的可读性,帮助人们理解。

健壮性。输入非法数据时,算法能够适当地做出反应进行处理,而不会产生莫名其妙的输出结果。

高效率和低存储需求。效率是指算法执行的时间,存储量需求是指算法执行过程中所需要的最大存储空间,这两者都与问题规模有关。

最后一个特性是数据结构重点考虑的。

算法效率度量(△△△△)

算法效率的度量可以分为时间复杂度空间复杂度。

时间复杂度官方定义:一个语句的频度是指在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),它是该算法问题规模n的函数,时间复杂度主要分析T(n)的数量级。

时间复杂度,通俗来说,也就是说算法在执行的时候,所花费的时间,通过所花费时间的长短来判断时间复杂度和空间复杂度,对此,我们可以想到其实在各门语言中,其实都有计算时间的函数

如C语言中time.h头文件,我们很容易想到可以这样来评测时间复杂度:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define CLOCKS_PER_SEC 1000

int main()
{
	time_t startTime,endTime;
     startTime = clock();
	int n=10000,sum=0;
	for(int i=1;i<=n;i++){
		sum+=i;
		//1+2+3+4+....+1000
	}
     endTime = clock();
     printf("%d\n",sum);
	double totalTime = (double)(endTime-startTime)/CLOCKS_PER_SEC;
	printf("测试结果:\n插入数据数量:10000条\n用时:%f秒",totalTime); 
	return 0;
}

但是这种事后统计的方法不可能适应与所有场景,例如导弹发射类程序的设计,不能说发射出去来评测时间用时多少,然后不断修改不断发射,这显然是不现实的,由此,我们可以想到可以用事前统计的方法进行。

事前统计像是提前进行判断算法的执行流程,如一下代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int sum=0,int n=10000;
	for(int i=1;i<=n;i++){
		sum+=i;
	}
	
}

分析以上代码,程序在执行的时候会从1~n执行sum+=i语句,这里我们人工走查可以知道执行了n次,简单的来说,时间复杂度就等于T(n)。当然在一些别的场景中时间复杂度并不是那么好判断的,我会在别的章节上详解自己总结的过程。


空间复杂度其实和时间复杂度差不多,简单来说时间复杂度关心的是所使用的时间空间复杂度则关心的是所使用的的内存大小。

官方定义:一个程序在执行时除需要存储空间来存储本身所使用的命令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为实现计算所需信息的辅助空间。

算法的空间复杂度S(n)定义为算法所耗费的空间,它是问题规模n的函数。

如下代码在执行时候,int sum=0会分配n次,说明空间复杂度为S(n):

#include <stdio.h>
#include <stdlib.h>
int main()
{

	int n=1000;
	for(int i=1;i<=n;i++){
		int sum=0;
       //.....其他代码
	}
	
}

时间复杂度通常是用T(n),空间复杂度用S(n),但是其实在真正考虑时间复杂度和空间复杂度的时候,问题规模的扩大其实也伴随着复杂度估算的复杂性,我们通常用O(n)来进行计算。

下面的log以2为底 

常见的渐进时间复杂度为

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n);

 

我们在进行分析算法的T(n)时,有以下几种规则:

1.T(n^3+n^2+n+1)=O(n^3)[取渐进趋势最大的]

2.加法规则:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))).

3.乘法规则:   T(n)=T1(n)xT2(n)=O(f(n))xO(g(n))=O(f(n)xg(n));


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值