数据结构与算法笔记 —— 绪论

数据结构与算法笔记 —— 绪论


一. 计算与算法

  1. 计算机的本质是计算,计算是寻找对象的规律,并从中找到技巧。计算的目标是高效,低耗。
  2. 算法就是借助一定的工具,在一定的规则下,以明确而机械的形式来进行的计算。
  3. 算法的主要特性:
    • 输入,输出
    • 正确性:算法能够正确地解决问题
    • 确定性:所有步骤均由基本的操作组成
    • 可行性:基本操作均能够实现
    • 有穷性:所有操作在时间的允许范围内
  4. 好的算法:效率最高(速度尽可能快,存储空间尽可能少)同时又兼顾正确(算法能够正确地解决问题)、健壮(容错性好)、可读(易于阅读)。

二. 计算模型

  1. 一个好的程序不仅要考虑数据结构与算法,还要考虑效率,即:(数据结构+算法)*效率 = 程序 => 应用。
  2. 算法分析的两个重要指标
    • 正确性:算法功能是否与问题一致
    • 成本:时间消耗与存储空间消耗
  3. 定义:T(n) 为一个算法在最坏的情况下所需要操作的步骤。不同算法之间的好坏主要看T(n)的大小,T(n)是屏蔽了计算机硬件差异,语言差异,编译差异等差异之后的理想平台下的运行指标,如大O,大 Ω ,大 Θ 等。
  4. 一般的计算模型有图灵模型与RAM模型,它们均将算法的运算时间转换成算法执行的基本操作次数。

三. 图灵机模型

  1. 图灵机的三个组成要件
    • 有限长的字母表: cell中存储的内容
    • 读写头:指示当前位置,可读可写。
    • 状态表:当前读写头的状态
  2. 图灵机状态转换过程 transform(q,c;f,L/R,p)
    • q:当前状态
    • c:读写头所指cell当前的内容
    • f:读写头所指cell改写的内容
    • L/R:向左/右移位
    • p:读写头转换后的状态

四. RAM 模型

  1. 与图灵机类似,均假设有无限空间
  2. 由一系列顺序编号寄存器组成,但总数无限
  3. 算法所运行的时间转换成算法运算时的次数

五. 数据结构

  1. 数据结构示意图

    • 数据对象由数据元素组成,数据元素由数据项组成,数据项是最基本的单位
    • 数据结构是一系列数据元素之间的关系
  2. 数据结构的逻辑结构

    • 集合结构
    • 线性结构
    • 树结构
    • 图结构
  3. 数据结构的物理结构
    • 顺序存储结构
    • 链式存储结构

六. 大O记号等

  1. 算法的效率主要看时间消耗与存储空间消耗,这里我们屏蔽存储空间的消耗,仅仅考虑时间的消耗。
  2. 大O的定义: T(n)=O(f(n)) , f(n) 为一个函数。当 c>0 , T(n)<cf(n) ,即大O记号表示 T(n) 的一个上界,其性质为:
    • O(n)=O(cn)
    • O(n2+n)=O(n2)
  3. Ω 的定义: T(n)=Ω(f(n)) , f(n) 为一个函数。当 c>0 , T(n)>cf(n) ,即大O记号表示 T(n) 的一个下界。
  4. Θ 的定义: T(n)=Θ(f(n)) , f(n) 为一个函数。当 c1>c2>0 c1f(n)>T(n)>c2f(n) ,即大O记号表示 T(n) 的一个区间。
  5. 大O记号的分类:
    • 常数类: O(1)=2 or 222222 ,有效
    • 对数类: O(logcn) 与常底数、常数次幂无关,复杂度接近常数,有效。
    • 多项式: O(nc)
    • 线性: O(n)
    • 指数: cn=O(2n) 任何c均可。成本增长极快,不是有效的。

七. 算法分析

  1. 算法分析主要有两个任务:
    • 正确性
    • 复杂度
  2. 复杂度的分析方法有三种:
    • 迭代式算法:级数求和
    • 递归式算法:递归跟踪 + 递归方程
    • 猜测 + 验证
  3. 算数级数:与末项的平方同阶
    T(n)=1+2+......+n=n(n+1)2=O(n2)
  4. 幂方级数:比幂次高出一阶
    T(n)=14+24+......+n4=n(n+1)(2n+1)(3n2+3n+1)30=O(n5)
  5. 几何级数 (a>1) :与末项同阶
    T(n)=a0+a1+......+an=an+11a1=O(an)
  6. 收敛级数: O(1)
  7. 可能未必收敛,但长度有限
    T(n)=1+12+......+1n=O(logn)
    T(n)=log2+log3+......+logn=log(n!)=O(nlogn)
  8. 循环:一般随着层数的增加指数式增长
  9. 递归跟踪分析:检查每个递归实例,累计所需时间(调入语句本身,计入对应的子实例),总和即为算法执行时间。

八. 迭代与递归

  1. 算法的两种思想方法:分而治之,减而治之。
  2. 分而治之:将一个问题分两个规模大小差不多的子问题。
  3. 减而治之:将一个问题分为一个子问题和一个规模缩减的问题。

九. 动态规划

  1. 动态规划的目的:
    • make it work(递归可以保证)
    • make it right(递归可以保证)
    • make it fast(迭代可以保证)
  2. 递归对于资源的消耗大而且 O(n) 比较大,然而迭代可以降低对存储空间的使用,有时亦可以降低 O(n)
  3. 子序列:由原序列中若干个元素,按原来相对次序排列而成的新的序列。
  4. 最长公共子序列(longest common subsequence, LCS)是两个序列中,在其相同的子序列中长度最长的那个子序列,可能含有多个。

参考文献

[1] 邓俊辉《数据结构》

你可能感兴趣的:(数据结构与算法)