0%

王道笔记

绪论

要点:

  1. 概念和术语
  2. 三要素:逻辑结构,物理结构和数据运算
  3. 算法的事件复杂度和空间复杂度的分析与计算

数据结构的基本概念

基本概念和术语

数据结构

相互之间存在一种或多种特定关系的数据元素的集合。
数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。


数据结构的三要素

数据的逻辑结构

指数据元素之间的逻辑关系,与数据的存储无关是独立于计算机的。
集合: 结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。
线性结构: 结构中的数据元素之间只存在一对一的关系。
树形结构: 结构中的数据元素之间存在一对多的关系。
图状结构或网状结构: 结构中的数据元素之间存在多对多的关系。


数据的存储结构

存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构

  1. 顺序存储:把逻辑上的相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的临界关系来体现。其优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一块存储单元,因此可能产生较多的外部碎片。
  2. 链式存储:不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针标识元素之间的逻辑关系。其优点是不会出现碎片现象,充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,并且只能实现顺序存取。
  3. 索引存储:在存储元素信息的同时,还建立附加的索引表。索引表中的每一项称为索引项,索引项的一般形式是(关键字,地址)。其优点是检索速度快;缺点是增加了附加的索引表,会占用较多的存储空间。另外在增加和删除数据时要修改索引表,因而会花费较多的时间。
  4. 散列存储:根据元素的关键字直接计算出该元素的存储地址,又称为Hash存储。其优点是检索、增加和删除节点的操作都很快;缺点是如果散列函数不好可能出现元素存储单元的冲突,而解决冲突会增加时间和空间的开销。

数据的运算

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


算法基本概念

对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令标识一个或多个操作。此外,一个算法还具有下列5个重要特性。

  1. 有穷性: 一个算法必须总是(对任何合法的输入值)在执行又穷步之后结束,且每一步都可在有穷时间内完成。
  2. 确定性: 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。即对于相同的输入只能得出相同的输出。
  3. 可行性: 一个算法是可行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
  4. 输入: 一个算法有零个或多个的输入,这些输入取自某个特定的对象的集合。
  5. 输出: 一个算法有一个或多个输出,这些输出是同输入有着某种特定关系的量。

通常设计一个“好”的算法应考虑达到以下目标。

  1. 正确性
  2. 可读性
  3. 健壮性
  4. 效率与低存储量需求

算法效率的度量

算法效率的度量是通过时间复杂度和空间复杂度来描述的。

时间复杂度

最坏事件复杂度: 是指在最坏情况下,算法的事件复杂度。
平均事件复杂度: 是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
最好时间复杂度: 是指在最好情况下,算法的时间复杂度。
在分析一个程序的时间复杂性时,有以下两条规则:

  1. 加法规则
    T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  2. 乘法规则
    T(n)=T1(n)xT2(n)=O(f(n))xO(g(o))=O(f(n)xg(n))

常见的渐进时间复杂度有:
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<<O(n3)<O(2n)<O(n!)<O(nn)


空间复杂度

算法原地工作是指算法所需辅助空间是常量,即O(1)。


归纳总结

计算时间复杂度题型的两种形式

  1. 循环主体中的变量参与循环条件的判断
    找出主体语句中与T(n)成正比的循环变量,将之带入条件中进行计算
  2. 循环主体中的变量与循环条件无关
    此类题可采用数学归纳法或直接累计循环次数。多层循环时从内到外分析,忽略单步语句、条件判断语句,只关注主题语句的执行次数。

线性表

线性表的定义和基本操作

线性表的定义

具有相同数据类型的n(n≥0)个数据元素的有限序列。其中n为表长,当n=0时该线性表是一个空表。
除了第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。
注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构,两者属于不同层面的概念。


线性表的基本操作

  1. InitList(&L): 初始化表
  2. Length(L): 求表长
  3. LocateElem(L,e): 按值查找操作
  4. GetElem(L,i): 按位查找操作
  5. ListInsert(&L,i,e): 插入操纵
  6. ListDelete(&L,i,&e): 删除操作
  7. PrintList(L): 输出操作
  8. Empty(L): 判空操作
  9. DestroyList(&L): 销毁操作

线性表的顺序表示

顺序表的定义

线性表的顺序存储又称为顺序表。它是用一组地址连续的存储单元,一次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。