数据结构:查找基础知识

查找

  • 查找表是方便查找的数据结构
  • 查找表中元素的每项信息称为字段
  • 若字段能标识一个数据元素,则称为关键字,能唯一标识的称为主关键字,标识多个的为次关键字

顺序表查找

简单顺序查找
  • A [ 0 ] A[0] A[0] 作为监视哨,从 n n n 搜索到 0 0 0
二分查找
  • 适用于有序表
  • m i d , m i n , m a x mid,min,max mid,min,max 分别存储当前搜索区域中间、最小、最大的位置
  • 初始 m i n = 0 , m a x = n , m i n = m a x + m i n 2 min = 0,max=n,min=\frac{max+min}{2} min=0,max=n,min=2max+min
  • A [ m i d ] . k e y = = x A[mid].key== x A[mid].key==x 查找结束
  • A [ m i d ] . k e y < x , = > m i n = m i d + 1 A[mid].key<x,=>min=mid+1 A[mid].key<x,=>min=mid+1
  • A [ m i d ] . k e y > x , = > m a x = m i d − 1 A[mid].key>x,=>max=mid-1 A[mid].key>x,=>max=mid1
  • m a x < m i n max<min max<min 说明查找失败
索引顺序表查找
  • “分块有序”:某一部分的所有值均小于后面
  • 对数据分块,标记区块首地址和该块元素最大值
  • 查找时先查索引,再在对应块中查找

树表查找

二叉排序树
  • 二叉排序树是二叉树,为空或:
    • 左子树所有元素小于根,右子树所有元素大于根
    • 左右子树均为二叉排序树
  • 性质:中序序列递增
  • 查找:查找元素 x x x 与根结点比较,相等则查找成功, x x x 小于根节点则去左子树搜索,大于根节点则去右子树搜索
  • 构造和维护
    • 插入:递归调用插入方法,小于根结点插入左子树,大于根节点插入右子树,直到找到空位
平衡二叉树
  • 平衡二叉树(Balance Binary Tree),又称 “AVL 树”

    • 左右子树的高度差绝对值不超过 1 1 1 (结点的平衡因子 = 左子树高度 - 右子树高度)
    • 左右子树都是平衡二叉树
  • 平衡二叉树的平衡化:(记最低不平衡结点为 A A A

    • LL 型调整
    • RR 型调整
    • LR 型调整
  • 高度接近 l o g 2 n log_2 n log2n 的数量级,基本操作时间复杂度 O ( l o g 2 n ) O(log_2n) O(log2n)

散列表查找

  • 通过对关键字进行直接计算来得到地址

  • 哈希函数(Hash)”,又称“散列函数”,计算出的结果称为“散列地址”,按这种方法建立的表称为“哈希表”或“散列表

  • 不同关键字可能计算出相同的哈希值,称为“冲突”,两个关键字称为“同义词

  • 常用构造哈希函数的方法有:

    • 直接定址法:取关键字的某个线性函数作为散列地址,即 :
      H ( k ) = a ∗ k + b   ( a , b 为 常 数 ) H(k)=a*k+b~(a,b 为常数) H(k)=ak+b (a,b)

    • 除留取余法:取关键字被某个不大于表长 m m m 的数 P P P 除后余数作为散列地址,即 :
      H ( k ) = k   %   P ( P < = m ) H(k)=k~ \% ~P(P<=m) H(k)=k % P(P<=m)
      一般 P P P 取素数的时候冲突可能较小

    • 平方取中法:取关键字平方后的中间几位

    • 折叠法:关键字位数较多而地址区间较小时常用,将关键字分割成相同的部分,再将几部分叠加

    • 数值分析法:事先知道所有可能的关键字取值时,分析关键字,根据规律构造

  • 处理冲突的办法

    • 开放定址法:当算出的 H ( k ) H(k) H(k) 位置不空时,依此用下面函数找出新的空位置:

    H i ( k ) = ( H ( k ) + d i )   m o d   m   ,   其 中 i = 1 , 2 , … , k   ( k ≤ m − 1 ) H_i(k)=(H(k)+d_i)~mod~m~,~其中i=1,2,…,k~(k\le m-1) Hi(k)=(H(k)+di) mod m , i=1,2,,k (km1)

    • d i d_i di 的确定有两种办法:

      • 线性探测(顺序往后找)
      • 二次探测( d i d_i di ± 1 2 , ± 2 2 , ± 3 2 , . . . \pm1^2,\pm2^2,\pm3^2,... ±12,±22,±32,...
    • 再散列法:冲突时用别的散列函数再计算

    • 链地址法(拉链法):也称“开散列表”,冲突的话用链表接在原来的元素后面

  • 查找过程和构造过程基本一致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值