数据结构-查找(B树、散列表)

查找表

查找表是由同一类型的数据元素(或记录)构成的集合。

根据操作可分为

  • 静态查找表:只做查找操作的查找表
  • 动态查找表:查找时插入或删除数据的查找表

常见查找方式:

顺序表查找

**方法:**线性表+顺序遍历+等值比较

有序表查找

方法: 线性表+排序+折半查找/插值查找/斐波那契搜索等

插值查找:基于二分查找,将查找点的选择改进为自适应选择,提高查找效率
斐波那契搜索:就是在二分查找的基础上根据斐波那契数列进行分割的

线性索引查找

方法: 创建索引

  • 稠密索引: 每个记录各对应一个索引项
  • 分块索引:
    特点:块间有序,块内无序
    索引结构:最大关键码+块内个数+首元素指针
  • 倒排索引:
    索引结构:次关键码+记录号

二叉排序树

方法: 建立二叉排序树
特点:左子树小于根节点,右子树大于根节点,并不重复
优点:

  1. 查找次数小于树深度
  2. 插入删除不移动元素,时间性能好
    缺点:
  3. 查找性能取决于树的形状,极端情况下性能会很差。

平衡二叉树(AVL)

方法: 建立二叉平衡树
优化的二叉排序树,左右子树深度相差不能大于一。

多路查找树(B树)

方法: 建立多路查找树
多路查找树:每个节点的孩子数多于两个,每个节点可以存储多个元素。
B树是一种平衡的多路查找树。
2-3树:
来源于知乎,侵删
2-3-4树:
来源于网络,侵删
2-3树、2-3-4树都是特殊的多路查找树

散列表(哈希表)查找

方法: 建立关键字与存储位置之间的对应关系(散列函数)

散列函数的构造方法:
  1. 直接定址法
  2. 数字分析法
  3. 平方取中法
  4. 折叠法
  5. 除留余数法
  6. 随机数法

哈希冲突:关键字不同的元素被映射到了同一个内存位置

处理散列冲突的方法:
  1. 开放定址法: 一旦发生冲突就去找下一个散列地址
    1. 线性探测再散列: 顺序寻找
    2. 二次探测再散列: 下一个散列地址为1^2 , (-1)^2, 2^2 , (-2)^2 , 3^2 , ( -3)^2……
    3. 伪随机探测再散列: 随机生成下一个散列地址
  2. 再哈希法: 准备多种散列函数,一旦冲突就换一种散列函数
  3. 链地址法: 为每个冲突分别建立单链表,一旦冲突则加入对应链表(同义冲突)
  4. 建立公共溢出区: 建立溢出表(顺序),所有的冲突都加入溢出表(非同义冲突)
散列表的查找性能

无冲突时为O(1),冲突时取决于

  1. 散列表是否均匀
  2. 处理冲突的方法
  3. 散列表的填装因子
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值