3.2 链地址法
链地址法就是将相应位置上冲突的所有关键词存储在同一个单链表中。
设关键字序列为 47 , 7 , 29 , 11 , 16 , 92 , 22 , 8 , 3 , 50 , 37 , 89 , 94 , 21 47, 7, 29, 11, 16, 92, 22, 8, 3, 50, 37, 89, 94, 2147,7,29,11,16,92,22,8,3,50,37,89,94,21,散列函数取为h ( k e y ) = k e y m o d 11 h(key) = key \mod 11h(key)=keymod11,用分离链接法处理冲突。
表中有9个结点只需1次查找,5个结点需要2次查找,所以查找成功的平均查找次数为:
a s l s = ( 9 + 5 ∗ 2 ) / 14 ≈ 1.36
参考代码:
#include
#include
#include
#include
#include
using namespace std;
#define maxtablesize 10000 //允许开辟的最大散列表长度
#define keylength 100 //关键字的最大长度
typedef int elementtype;
struct lnode
{
elementtype data;lnode *next; };
typedef lnode *ptrtonode;
typedef ptrtonode linklist;
struct tblnode
{
int tablesize; //表的最大长度linklist heads; //存放散列单元数据的数组 };
typedef struct tblnode *hashtable;
/返回大于n且不超过maxtablesize的最小素数/
int nextprime(int n)
{
int p = (n % 2) ? n + 2 : n + 1; //从大于n的下一个奇数开始int i;while (p 2; i--) { if ((p % i) == 0) break; } if (i == 2) break; //说明是素数,结束 else p += 2;}return p; }
/创建新的哈希表/
hashtable createtable(int table_size)
{
hashtable h = (hashtable)malloc(sizeof(tblnode));h->tablesize = nextprime(table_size);h->heads = (linklist)malloc(h->tablesize * sizeof(lnode));//初始化表头结点for (int i = 0; i tablesize; i++){ h->heads[i].next = null;}return h; }
/查找数据的初始位置/
int hash(elementtype key, int n)
{
//这里只针对大小写return key % 11; }
/查找元素位置/
linklist find(hashtable h, elementtype key)
{
int pos;pos = hash(key, h->tablesize); //初始散列位置linklist p = h->heads[pos].next; //从链表的第一个节点开始while (p && key != p->data){ p = p->next;}return p; }
/插入新的元素/
bool insert(hashtable h, elementtype key)
{
linklist p = find(h, key); //先查找key是否存在if (!p){ //关键词未找到,可以插入 linklist new_cell = (linklist)malloc(sizeof(lnode)); new_cell->data = key; int pos = hash(key, h->tablesize); new_cell->next = h->heads[pos].next; h->heads[pos].next = new_cell; return true;}else{ cout << 键值已存在!
next; free(p); p = tmp; }}free(h->heads);free(h); }
int main(int argc, char const *argv[])
{
int a[] = {47, 7, 29,29, 11, 16, 92, 22, 8, 3, 50, 37, 89, 94, 21};int n = 15;hashtable h = createtable(n);for (int i = 0; i heads[i].next; while (p) { cout
语音芯片助力充电桩实现声音提示功能!
智能家居公司Nest将开放第三方应用平台
使用Intellij IDEA的一些小技巧
神奇科技!智能光显技术可自动调节屏幕亮度
MEMS芯片简介及测试
MASS竞猜幸运哈希游戏系统开发中冲突的解决方法
松下能源业务亏损84亿能否可以扭亏为盈?
如何通过智慧搬送提高建设智能工厂的自动化水平
广明源研发推出紫外杀菌系列产品 致力于提供更安全的紫外杀菌产品
IM5200同步降压控制器概述、特点及应用
华德电子葫芦起重机亮相于上海举行的第21届上海物流展
工地施工最靠谱的监测,系统扬尘预警监测解决方案
使用能量收集从可穿戴设备中获得优化的性能
基于STM32的矿用本质安全型电源设计
电气火灾的起因
机器视觉在物联网领域中有多重要
容百科技携手韩国LGES共探新能源技术先机
柔性印刷电路的优点和缺点
3D视觉越来越成为人们关注的焦点!
明微推出的芯片SM2096E,有效解决了无贴片电容带来的各种问题