散列表(一)
来源:互联网 发布:民间借款记账软件 编辑:程序博客网 时间:2024/05/19 23:03
一、基本概念
1.散列表,也叫哈希表:存放关键码散列地址的数组;
2.散列地址冲突:将不同的关键码映射到同一个散列地址上;
(一般关键码集合比散列地址集合打得多)
3.散列函数选取原则:计算简单&分布均匀
二、散列函数构造方法
1.直接定址法:
一一映射,要求散列地址空间的大小与关键吗集合的大小相同。
2.数字分析法:
取关键字中的若干位或其组合作哈希地址。
3.平方取中法:
取关键字平方后中间几位作哈希地址。
4.折叠法:
部分数字的叠加方法有:移位法和分界法。
5.随机数法:
取关键字的随机函数值作为散列地址。
6.除留余数法:
散列函数为:hash(key) = key%p p<=m (m为散列表中允许的地址数)。
根据经验,取一个小于等于m的置数p,得到的散列函数较好。
若p<m,存在几个散列地址在一开始不可能用散列函数计算出来,只可能在处理溢出是用到这些地址。
7.乘余取整法:
散列函数为: hash(key)= [n*(A*key%1)] (用[]表示下取整,0<A<1, n为常数)
三、常见字符串哈希函数
常见的8个字符串哈希函数有:
SDBMHash, RSHash, JSHash, PJWHash, ELFHash, BKDRHash, DJBHash, APHash.
SDBMHash, RSHash, JSHash, PJWHash, ELFHash, BKDRHash, DJBHash, APHash.
这些都是计算机科学家研究出来的,计算出来的哈希地址分布均匀,冲突较少。
使用时需注意:返回值要%地址总数,才会映射到哈希表的地址范围内。
下面的程序用来测试产生冲突的情况:
运行结果: 结果显示的依次为——关键字、散列地址和该地址的映射次数
说明:
1.一维数组初始化时,若为全部赋值,则剩下的被初始化为0;
2.字符串数组可以定义为 char *a[]
字符串用指针标志,eg: char *a[5]={"red","yellow","blue","white","black"};
向散列函数传递的实参为char *,即keywords[i].
另外,sizeof(char *) =4.
3.printf:
格式替代符 %s:字符串
%-10s 格式为左对齐且宽度为10的字符串代替(-表示左对齐,不使用则是右对齐)
0 0
- 散列表(一)
- wxWidgets类列表(一)
- Linux信号列表 (一)
- Memcached命令列表(一)
- Python列表操作(一)
- Python列表详解(一)
- 列表视图控件(一)
- Ruby中的数组和散列表(一)
- MFC(一)创建列表--列表框形式
- 散列表(一):散列表概念、 散列函数构造方法、 常见字符串哈希函数(测试冲突)
- 散列表(一):散列表概念、 散列函数构造方法、 常见字符串哈希函数(测试冲突)
- MFC控件(一)(列表框)
- (一)列表控制的主要功能
- jboss seam疑问解答列表(一)
- 常用软件分类 精选列表(一)
- 用CListCtrl创建列表视图(一)
- Java核心技术(高级Swing)一列表
- 序列:列表及方法(一)
- linux 惊群问题
- Android中的SQLiteOpenHelper类
- Linux 如何写makefile文件
- WERTYU
- SSH整合(一)——开篇
- 散列表(一)
- Swift和Keystone单机安装总结
- ASP.NET表单
- ios button 图文布局
- windows7下Sublime Text设置lua的Build System
- Algorithm Gossip:老鼠走迷宫(一)
- ROS 学习系列 -- RViz中移动机器人来学习 URDF,TF,base_link, map,odom和odom 主题的关系
- MySQL数据库操作
- C++ Primer 笔记+习题解答(七)