散列表
散列查找,我们又回到了查找,
编译的时候,涉及变量及属性的管理:
- 插入:新变量的定义
- 查找:变量的引用
实际上是动态查找问题,查找树AVL树。
两个变量名(字符串)比较效率不高。字符串的比较要一个一个的比下去,时间会比较长,
是否可以把字符串转换成数字,再处理,就快多了。就是散列查找的思想。
已知的查找方法:
- 顺序查找 O(N)
- 二分查找(静态查找,不适合动态查找) O(log2N)
- 二叉搜索数 适合动态查找 O(h) h为树的高度
- 平衡二叉树 适合动态查找 O(log2n)
二叉树呢要比每个字符,所以AVL树用在刚才的场景中不太合适,还有什么方法
下面是二分查找
插入和删除是一个动态的数据,所以不能用二分查找,那么用什么?
查找的本质:给你这个对象,让你找这个对象的位置。
- 有序安排对象:全序(二分查找),半序(某些关键字 ,查找树(左子树小,右子树大))。
- 直接“算出”对象的位置:散列
散列查找法的两项基本工作:
- 计算位置:构造散列函数确定关键词存储的位置
- 解决冲突:应用某种策略解决多个关键词位置相同的问题
时间复杂度几乎是常量O(1),即查找时间与是问题规模无关!
散列表的抽象数据结构
主要是 3 5 6 Find insert delete
例题 1
散列表在这个例题中是数组,
例题 2
如果没有冲突,三个都可以在线性时间内完成,
总结
散列(Hashing)查找的基本思想:
- 以关键字key为自变量,通过一个确定的函数h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。
- 可能不通的关键字会映射到同一散列地址上,即h(key i) = h(key j)(当key i !=key j )称为冲突 ---需要某种冲突解决策略。
时间: 2024-11-07 04:57:03