数据结构(1): 基本数据结构

逻辑结构和物理结构

逻辑结构

  • 集合结构:同属一集合,之间没有关系
  • 线性结构:一对一关系,有顺序
  • 树形结构:一对多的层次关系
  • 图形结构:多对多的关系

物理结构

  • 顺序存储:地址连续,逻辑关系与物理一致
  • 链接存储:任意存储单元,可连续,也可不连续

算法时间复杂度

渐进增长

在输入规模n没有限制的条件下,只要超过一个数值N,这个函数就总大于另一个函数,我们称函数是渐进增长的。

函数的渐进增长

给定两个函数f(n)和g(n),如果存在一个整数N,是的对所有的n>N,f(n)总是比g(n)大,那么就说:f(n)的增长渐进快于g(n)。

时间复杂度

时间复杂度考虑的是渐进增长。如:O(n^3)>O(n^2+100)

常见时间复杂度:

O(1) 常数

O(logn) 对数

O(n) 线性

O(nlogn) nlog(n)

O(n^2) 平方

O(n^3) 立方

O(2^n) 指数

O(n!) 阶乘

O(n^n)

最后三个,除非n非常小,哪怕n=100,都是噩梦般的运行时间。这种不切实际的复杂度,一般不讨论。

线性表

零个或多个元素的有限序列。是有顺序的,有前驱、后继元素。

有顺序存储结构和链式存储结构两种。

顺序存储

用一段地址连续的存储单元依次存线性表的数据元素。

插入删除

最好(最后一位):O(1)

最坏(第0位):O(n)

平均:插到第i位,移n-i

存、读:O(1)

插、删:O(n)

优点:

  • 无须为表中元素之间的逻辑关系增加额外存储空间。
  • 可快速存取表中任意位置的元素。

缺点:

  • 插、删需要移动大量元素
  • 长度变化较大时,难以确定存储空间容量
  • 易造成存储空间的碎片。

链式存储结构

存储单元可以连续,也可以不连续。

单链表

头指针是必须的,头结点不是。