1. 数据结构的基本概念

定义:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

算法:指令的有限序列,每一条指令表示一个或多个操作
– 解决问题的方法和步骤,一个问题可以用多种算法来解决,需要比较不同算法的效率 – 引入了算法代价

算法代价 – 算法效率的度量:
算法运行所需要的计算机资源的量,包括
时间代价:需要的时间资源的量
空间代价:需要的空间(即存储器)资源的量
反映算法所采用的方法的效率,与硬件、软件环境无关

数据结构:

  1. 逻辑结构 - 数据之间的相互关系 - 实现应用程序
  1. 线性结构:数据元素之间一对一的关系,包括线性表、栈、队列、串
    存在唯一一个被称为第一个的数据元素
    存在唯一一个被称为最后一个的数据元素
    除第一个外,每个元素有且只有一个前驱
    除最后一个外,每个元素有且只有一个后继
  2. 非线性结构
    集合:结构中的数据元素同属于一种类型
    树形结构:数据元素之间一对多的关系
    图状/网状结构:数据元素之间存在多对多的关系
  1. 存储/物理结构 – 数据在计算机中的表示 – 描述数据具体在内存中的存储
  1. 顺序结构:用元素在存储器中的相对位置来表示数据元素间的逻辑关系
  2. 链式结构:用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示
  3. 索引结构:采用附加的索引表的方式来存储节点信息的一种存储方式
    1. 索引表由若干索引项组成;
    2. 索引存储方式中索引项的一般形式为(关键字、地址);
    3. 其中,关键字是能够唯一标识一个节点的数据项
  4. 散列结构:根据节点的关键字直接计算出该节点的存储地址

算法的五个特性:

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

算法设计要求:正确性、可读性、健壮性、高效性、低存储量需求

2. 渐进算法分析方法 – asymptomatic algorithm analysis – 事前分析估算的方法

估算出当问题规模变大时,一种算法及实现它的程序的效率和开销;

影响运行时间的因素:
a.算法所采用的策略
b.问题规模
c.书写程序采用的语言
d.机器速度

渐近分析:
是指当输入规模n→∞时, 对算 法运行时间函数T(n)的渐近性态的估算, 它提供了对算法资源开销进行评估的简单化的模型。

  1. 大O表示法 – 算法运行时间的上限
  2. 大Ω表示法 – 算法运行时间的下限
  3. Θ表示法 – 上、下限相等:如果非负函数T(n)既在O(h(n))中,又在 Ω(h(n))中,则称T(n)是Θ(h(n)),也称T(n)与h(n)同阶

四法则:

  1. 传递性
  2. 忽略常数系数
  3. 取大值:
    若 f1 (n)在O(g1 (n))中,且 f2 (n)在 O(g2 (n)) 中,则 f1 (n)+f2 (n)在O(max(g1 (n), g2 (n)))中;
  4. 函数相乘则复杂度相乘

例:二分法检索 – 二叉查找树

数据结构与算法分析 shaffer 数据结构与算法分析c++版_数据结构与算法分析 shaffer


数据结构与算法分析 shaffer 数据结构与算法分析c++版_算法_02


3.时间复杂度

基本操作(basic operation)数 – 衡量算法的时间性能 ,一般情况下,执行次数是问题规模的函数
规模:一般指输入量的数目;
基本操作:完成该操作所需时间与操作数的具体取值无关;

执行算法所需要的时间 T = T(n) – n为输入规模

常见时间代价:

数据结构与算法分析 shaffer 数据结构与算法分析c++版_算法_03


数据结构与算法分析 shaffer 数据结构与算法分析c++版_数据结构与算法分析 shaffer_04


运行时间估计:

数据结构与算法分析 shaffer 数据结构与算法分析c++版_运行时间_05

4.空间复杂度

若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间.
时间复杂度与空间复杂度之间没有必然联系,可用时间换空间或空间换时间.