7.1 查找的基本概念

查找表
由同一类型的数据元素(或记录)构成的集合,用于按关键字检索。

7.2 静态查找表

1. 顺序查找

从第一个元素开始逐个与关键字比较,直到找到或遍历完毕。

int SeqSearch(int a[], int n, int key){
  a[0]=key;                      // 监视哨
  for(int i=n; a[i]!=key; i--);
  return i;
}

顺序查找动画

交互式
速度1x

2. 折半查找(二分查找)

前提条件必须是有序的顺序表(链表无法折半查找)。

每次与中间元素比较,缩小一半查找范围。

int BinarySearch(int a[], int n, int key){
  int low=1, high=n, mid;
  while(low<=high){
    mid = (low+high)/2;
    if(a[mid]==key) return mid;
    else if(a[mid]>key) high = mid-1;
    else low = mid+1;
  }
  return 0;
}

折半查找动画

交互式
速度1x

3. 分块查找(索引顺序查找)

将表分成若干块,块内无序但块间有序。先查索引表确定块号,再在块内顺序查找。ASL = 查索引 + 块内查找。

7.3 动态查找表

1. 二叉排序树 (BST)

二叉排序树
左子树所有结点 < 根 < 右子树所有结点。中序遍历得到递增有序序列

二叉排序树 BST 查找/插入

交互式
速度1x

2. 平衡二叉树 (AVL)

平衡因子 BF
左子树高度 − 右子树高度。AVL 要求所有结点 |BF| ≤ 1。

插入失衡时,通过旋转恢复平衡,共四种情况:

含 n 个结点的 AVL 树最大高度为 O(log n),查找/插入/删除均为 O(log n)。

AVL 平衡旋转演示(LL/RR/LR/RL)

交互式
速度1x

3. B 树与 B+ 树

m 阶 B 树
多路平衡查找树:① 根至少 2 个子女(非空);② 非根结点 ⌈m/2⌉ ≤ 子女数 ≤ m;③ 所有叶子在同一层。

B+ 树(常用于数据库索引)

7.4 散列表(哈希表)

散列查找
通过散列函数 H(key) 将关键字映射为存储地址,理想情况下 O(1)。

1. 散列函数构造

2. 冲突处理

散列表(线性探测法)构造动画

交互式
速度1x

7.5 B树插入与分裂动画演示

3阶B树(2-3树):每个节点最多2个关键字、3个子节点。插入后关键字数达到3时需分裂:选中间关键字提升到父节点,左右两部分各成独立节点。演示依次插入 1 2 3 4 5 6 7。

B树插入分裂演示(3阶)

交互式动画
速度 1x
步骤 0/0

7.6 分块查找动画演示

分块查找(索引顺序查找): 将数据分成若干块, 块间有序(索引表有序), 块内无序。先在索引表中折半查找确定块, 再在块内顺序查找。查找key=38。

分块查找

交互式动画
速度 1x
步骤 0/0

7.7 B+树结构演示

B+树是B树的变体: 所有数据存储在叶子节点, 叶子节点用链表连接支持范围查询。内节点仅作索引。演示3阶B+树插入1-7的结构。

B+树结构 (3阶)

交互式动画
速度 1x
步骤 0/0