序章
定义
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
程序设计 = 数据结构 + 算法
逻辑结构
-
集合结构:集合结构中的数据元素同属于一个集合,他们之间是并列的关系,除此之外没有其他关系
-
线性结构:线性结构中的元素存在一对一的相互关系。
-
树形结构:树形结构中的元素存在一对多的相互关系。
-
图形结构:图形结构中的元素存在多对多的相互关系
数据在内存中的存储结构,也就是物理结构,分为两种:顺序存储结构和链式存储结构。
-
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。数组就是顺序存储结构的典型代表。
-
链式存储结构:是把数据元素存放在内存中的任意存储单元里,也就是可以把数据存放在内存的各个位置。这些数据在内存中的地址可以是连续的,也可以是不连续的。
和顺序存储结构不同的是,链式存储结构的数据元素之间是通过指针来连接的,我们可以通使用指针来找到某个数据元素的位置,然后对这个数据元素进行一些操作。
算法
定义
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
特征
算法具有五个基本特征:输入、输出、有穷性、确定性和可行性。
-
输入:(Input)
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
-
输出:(Output)
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
-
有穷性:(Finiteness)
算法的有穷性是指算法必须能在执行有限个步骤之后终止;
-
确定性:(Definiteness)
算法的每个步骤都有确定的含义,不会出现二义性。
-
可行性:(Effectiveness)
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。
算法的设计要求
时间复杂度与空间复杂度
时间复杂度
-
时间频度:一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
-
时间复杂度:在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
空间复杂度
![](https://images2015.cnblogs.com/blog/1197632/201707/1197632-20170711112527431-232009316.png)