数据结构与算法--概述

数据结构

  • 数据结构: 数据结构是一种特定的计算机存储、组织数据的方式。其宗旨是使计算机能够高效的使用数据, 越强大的计算机用来处理越复杂的数据结构
  • 抽象数据类型(ADT): 数列、列表、树、表格..., 对于某一类型的数据或者某一个数据集的描述以及对该书籍的各种操作
  • ADTs拥有干净的接口, 其具体的实施细节是封装起来的

 

算法

  • 算法: 有限时间内解决问题的一系列清晰的指令
  • 效率: 空间和时间
  • 目标: 能够识别程序要求的功能以解决当前任务, 设计能够高效解决此任务的数据结构与算法, 评价该方案的效率和正确性

 

算法分析

  • 运行时间

运行时间会随着输入的大小如何变化

- 最好的情况: 运行时间的上限(最少运行时间),
            由最简单的输入决定, 提供了所有输入的最终优化目标

- 最差的情况: 运行时间的下限(最多运行时间),
            由最复杂的输入决定, 提供了所有输入的保障时间

- 平均情况: 随机输入的运行时间的期望
            需要建立随机输入的模型, 是一种评价算法表现的方法

评价情况时间通常很难测定, 通常情况下关注最差情况下的运行时间

 

 近似记法

  • Big-O记法
    • 一般习惯用O(n)记法来渐进界定算法运行时间的常数函数边界。有时, 我们只希望这个常数函数代表算法运行时间的上界。
    • 尽管在最差情况下二分法搜索的运行时间为O(logn), 认为在所有情况下二分法搜索的搜索书剑为O(logn)是错误的
    • 二分法搜索的时间从来不会超过O(logn),多数情况下其搜索时间都会少于O(logn)
  • Big-θ(Big-Theta)记法
    • 当特别说明运行时间为θ(n)时, 当n变得很大的时候, 算法的运行时间介于k1*n和k2*n之间, 其中k1和k2是常数
  • Big-Ω记法(Big-Omega)记法
    • 有的算法我们只能描述其至少要运行多少时间而无法给出其运行时间的上限时, 采用Big-Ω记法
    • 如果算法的运行时间是Ω(f(n)), 则对于足够大的n来说m 运行的时间至少是k*f(n), 其中k为常数
notation provides example shorthand for used to
Big Theta

asymptotic

order of growth

θ(N^2)

1/2 * N^2

10 * N^2

5*N^2 + 22*N*logN + 3*N

classify

algorithms

Big Oh θ(N2) and smaller O(N^2)

100 * N^2

100 * N

22*N*logN + 3*N

develop

upper bounds

Big Omega θ(N2) and larger Ω(N^2)

1/2 * N^2

N^5

N^3 + 22*N*logN + 3*N

develop

lower bounds

 

时间复杂度

  • 一般情况下, 算法中基本操作重复执行的次数是问题规模n的某个函数, 用T(n)表示, 若有某个辅助函数f(n), 使得当n趋近于无穷大时, T(n)/f(n)的极限值为不等于零的常数, 则成f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)), 成O(f(n))为算法的渐进时间复杂度, 简称时间复杂度
  • T(n)=O(f(n))表示存在一个常数C, 使得在当n趋近正无穷时总有T(n)<=C*f(n)。简单来说, 就是T(n)在n趋于正无穷时最大也就跟f(n)差不多大, 也就是说当n趋于正无穷时T(n)的上界是C*f(n)

 

 主项定理(Master Theorem)

设a >=1 和 b > 1为常数, 设f(n)为一函数, T(n)有递归式

         T(n) = a * T(n/b) + f(n)

这时可以有2种方法,来计算时间复杂度:

1. 用递归树,逐层代入原式,最终形成一个级数, 然后用一个函数来表达, 得到T(n)
2. 是应用主项定理Master Method

其实, 主项定理也就是对递归树方法的一种归纳,形成了固定的计算方式, 并分为三种情形来计算

这三种情形主要是比较 nlogba 与 f(n),为什么要比较这两个函数呢?
观察原式,可以看出,nlogba其实相当于用递归树方法解出的递归方程的右侧的第一项,
而f(n)则是递归方程的右侧的第二项,这样,主项定理实际上是在比较组成结果的两个函数项,
而且这种比较是按照数量级(或者说是变化幅度)来比较的,也就是说,如2n 与 28n是
数量级(变化幅度)相当的。

    1. f(n) < nlogba

      也就是 f(n) = O(nlogba - e ) ,e > 0为任意小的常数
      或者说,f(n) 比 nlogba变化的慢,慢ne
      那么,T(n)=O(nlogba)

    2. f(n) > nlogba

      也就是 f(n) = W(nlogba +e ) ,e > 0为任意小的常数
      或者说,f(n) 比 nlogba变化的快,快ne
      那么, T(n)=O(f(n))

      可以简单地说,递归方程的右侧的两项,哪项变化的块,T(n)就属于哪项的数量级

    3. f(n) = nlogba

      也就是两项的数量级相当,就给这个数量级乘上一个lg n

      T(n)=O(nlogba * lg n)

 

 

 

 

 

 

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