根据于小甲鱼大佬的数据结构与算法教程而 ~~ 写 ~~ 抄的笔记

什么是数据结构?

数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

程序设计 = 数据结构 + 算法

数据元素相互之间存在的一种或多种特定关系的集合

数据结构分为逻辑结构和物理结构

逻辑结构:指的是数据对象中数据元素之间的相互关系

物理结构:指的是数据的逻辑结构在计算机中的存储形式

四大逻辑结构:

集合结构: 集合结构中的数据元素是同属性一个集合的

线性结构:线性结构中的数据元素之间是一对一的关系

树型结构:树性结构中数据元素之间存在一种一对多的层次关系

图形结构:图形结构的数据元素是多对多的关系

物理结构:实质是研究如何将数据元素存储到计算机的存储器中

存储器主要是针对于内存,外部存储器(例如:硬盘)的数据组织一般用文件结构来表示

数据元素的存储结构形式有两种,顺序存储和链式存储

顺序存储结构:指的是数据元素存放在地址连续的存储单元里,其数据之间的逻辑关系和物理关系是一样的,例如编程语言中的数组

链式存储结构:经常变化的结构,指的是将数据元素存放在任意的存储单元里,而这组存储单元是可以连续的,也可以是不连续的,数据元素存储关系不能反应其逻辑关系,通过分配一个指针指向一个内存,而这个内存用来存放数据元素的地址,通过内存来寻找相对应的数据元素地址

算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令一个或多个的操作,就是一个解决问题的技巧或者方式

一个问题可以用多个算法解决,但是一个算法不能解决所有问题的能力

算法五个基本特征:输入,输出,有穷性,确定性和可行性

输入:算法具有零个或者多个输入

输出:算法至少有一个或者多个输出

有穷性:指的是算法在执行有限的步骤之后,自动结束,而不是无限循环,要求每一个步骤在一段时间内完成,而不是永远不会停止的

确定性:算法的每一个步骤都具有确定的含义,不会出现二义性(二义性指的是一个东西在一个环境下出来两种或者两种以上的含义)

可行性:算法的每一个步骤必须是可行的,,每一个步骤都可以通过执行有限次数完成

算法设计的要求:

正确性:算法必须要具备输入,输出,无歧义,能正确反应问题的要求,能够得到问题的正确答案

算法没有语法错误,能对合法的输入返回满足要求的输出,对于非法输入能返回满足要求的说明,对于输入的内容要满足其满足要求的输出结果

可读性:算法的另一目的是方便阅读,理解或者交流其算法的实现原理

健壮性:当输入数据不合法时,算法也能做出对应的处理,而不是产生异常,崩溃之类的

时间效率高和存储量低

算法效率的度量方法

算法的效率一般指的是算法的执行时间

事后统计方法:这种方法主要是通过设计好的程序和数据,利用计算机计时器对不同算法的运行时间进行比较,从而达到确定算法效率的高低

缺点:需要根据算法事先编写好测试程序,需要耗费大量时间和精力,不同的测试环境下的效率差异大

事前分析估算方法:在编写程序之前,依据统计方法对算法进行估算

影响算法效率的原因:

算法采用的策略或者方案

代码质量

问题的输入规模

机器执行指令的速度

一个算法程序的运行时间依赖于算法的好坏和问题的输入规模(输入量)

算法的复杂性实际上就是算法因为输入规模扩大而增长量的一个抽象,只关心其实现的算法

函数的渐近增长

最高次项相乘的常数并不重要,可以忽略

所以一个算法存在一个常数,那么这个常数基本上可以忽略

最高次项的指数大的,函数会随着n的增长,结果也会变得增长特别快。指数!!! 判断一个算法的效率时间,应该忽略函数中的常数和其他次要项,而关注最高项(主项)的阶数

算法的时间复杂度

算法时间复杂度的定义:

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,T(n) = O(f(n)),表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为时间复杂度,f(n)是问题规模n的某个函数。

像上面的,用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。

随着输入规模n的增大,T(n)增长最慢的算法为最优算法

简称为执行次数等于时间

分析一个算法的时间复杂度(推导大O阶方法):

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

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

如果最高阶项存在且不是1,则去除于这个项相乘的常数

得到的就是大O阶

线性阶

一般含有非嵌套循环涉及线性阶,线性阶就是随着问题规模n的扩大,对应计算次数呈直线增长

平方阶

循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数

对数阶