大话数据结构(二 )第八章

大话数据结构(二 )第八章

第八章 查找

8.1顺序查找(O(n))

优化查找的方法:设置一个哨兵i,如果不是,那么继续向后进行

8.2有序表查找

8.2.1 二分查找(O(logn))

二分查找又称为折半查找,前提是线性表中必须是有序的,顺序存储
mid=(low+ high)/2

8.2.2 插值查找(O(logn))

关键字key与查找表中最大最小记录的关键字比较后的查找方法,适合均匀分布的数据
mid=low + (high - low)* (key-a[low])/(a[high]-a[low])

8.2.3 斐波那契查找(O(logn))

mid=low + F[k-1] -1 (F={0,1,1,2,3,5,8,13,21})

8.3 线性索引查找

索引分为:线性索引,树形索引,多级索引
其中线性索引分为:稠密索引,分块索引,倒排索引
分块索引运用的比较多

8.4 二叉排序树(O(logn))

二叉排序树是链式存储,易于查找,并且插入方便,删除只需要修改链接指针即可。

8.5 平衡二叉树(O(logn))

查询和插入查找都是O(logn)
平衡二叉树(AVL树)是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1(-1,0,+1)

平衡因子(Balance Factor):二叉树上结点的左子树深度减去右子树深度的值,仅有右子树为-1,仅有左子树为+1,有1左1右,BF=0

最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,我们成为最小不平衡子树

如何构建平衡二叉树:找到最小不平衡子树的根结点,进行旋转:前提根节点和子节点的符号应一致,若BF为负值,左旋(逆时针旋转);如果符号不一致,进行右旋或左旋使得符号相同,再反向旋转依次才能够完成平衡操作。

8.6 多路查找树(B-tree)

2-3 树
2-3-4 树
B 树
B+ 树

###8.7散列表(哈希表)
Hash哈希函数: 存储位置=f(关键字)
散列表是面向查找的存储结构,最适合的求解问题是查找与给定值相等的记录。相当于数据库中的主键,有且仅有一个的关键字。
散列表不适合范围查找,适合单条记录查找

8.7.1 散列函数的构造方法

原则
1.计算简单,散列函数的计算时间不应该超过其他查找技术与关键字比较的时间
2.散列地址分布均匀

  • 直接定址法 适用于有关键字可以当作主键的

  • 数字分析法 适用于手机号有大量数字,且有固定结构的,对后四位可用于散列地址,但是遇到前三位不同,后四位相同情况的手机号的时候可以反转左环位移,前后叠加等方法,确定其唯一性。

  • 平方取中法 适用于不知道关键字的分布,而且位数不是很大的情况

  • 折叠法 将关键字从左到右分割成位数相等的几部分,然后叠加求和,适用于不需要知道关键字的分布,且关键字位数比较多的情况。

  • 除留余数法 取模是mod求余数的意思,关键在于选取合适的p,经验就是若散列表表长为m,通常p为小于或等于表长(最好接近m)的最小质数或不包含小于20质因子的合数。

  • 随机数法 random(key),适用于关键字的长度不等时

所有的这些都可以转化成 ASCII 或者 Unicode 编码

关键字的考虑因素:
(1)计算散列地址所需要的时间
(2)关键字的长度
(3)散列表的大小
(4)关键字的分布情况
(5)记录查找的频率

猜你喜欢

转载自blog.csdn.net/weixin_43220058/article/details/86559173