当前位置: 首页 > news >正文

数据结构(陈越,何钦铭) 第十一讲 散列查找

11.1 散列表

11.1.1 引子:散列的基本思路

编译处理时,涉及变量及属性(如:变量类型)的管理:

  • 插入:新变量定义
  • 查找:变量的引用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

11.1.2 什么是散列表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.2 散列函数的构造方式

11.2.1 数字关键词的散列函数构造

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.2.2 字符串关键词的散列函数构造

在这里插入图片描述
在这里插入图片描述

11.3 冲突处理方法

11.3.1 开放定址法

在这里插入图片描述
在这里插入图片描述

11.3.2 线性探测

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.3.3 线性探测-字符串的例子

在这里插入图片描述

11.3.4 平方探测法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.3.5 平方探测法的实现

#define MAXTABLESIZE 100000
typedef int ElementType;
typedef int Index;
typedef Index Position;
typedef enum {Legitimate,Empty,Deleted} EntryType;typedef struct HashEntry Cell;
struct HashEntry{ElementType Data;EntryType Info;
};typedef struct TblNode *HashTable;
struct TblNode{int TableSize;Cell *Cells;
};int NextPrime(int N){int i,p=(N%2)?N+2:N+1;while(p<=MAXTABLESIZE){for(i=(int)sqrt(p);i>2;i--){if(!(p%i)){break;}}if(i==2){break;}else{p+=2;}}return p;
}HashTable CreateTable(int TableSize){HashTable H;int i;H=(HashTable)malloc(sizeof(struct TblNode));H->TableSize=NextPrime(TableSize);H->Cells=(Cell*)malloc(H->TableSize*sizeof(Cell));for(i=0;i<H->TableSize;i++){H->Cells[i].Info=Empty;}return H;
}Position Find(HashTable H,ElementType Key){Position CurrentPos,NewPos;int CNum=0;NewPos=Current=Hash(Key,H->TableSize);while(H->Cells[NewPos].Info!=Empty&&H->Cells[NewPos]!=Key){if(++CNum%2){NewPos=CurrentPos+(CNum+1)*(CNum+1)/4;if(NewPos>=H->TableSize){NewPos=NewPos%H->TableSize;}}else{NewPis=CurrentPos-CNum*CNum/4;while(NewPos<0){NewPos+=H->TableSize;}}}return NewPos;
}bool Insert(HashTable H,ElementType Key){Position Pos=Find(H,Key);if(H->Cells[Pos].Info!=Legitimate){H->Cells[Pos].Info=Legitimate;H->Cells[Pos].Data=Key;return true;}else{printf("键值已存在");return false;}
}

11.3.6 分离链接法

在这里插入图片描述

#define KEYLENGTH 15
typedef char ElementType[KEYLENGTH+1];
typedef int Index;typedef struct LNode *PtrToLNode;
struct LNode{ElementType Data;PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;typedef struct TblNode *HashTable;
struct TblNode{int TableSize;List Heads;
};HashTable CreateTable(int TableSize){HashTable H;int i;H=(HashTable)malloc(sizeof(struct TblNode));H->TableSize=NextPrime(TableSize);H->Heads=(List)malloc(H->TableSize*sizeof(struct LNode));for(i=0;i<H->TableSize;i++){H->Heads[i].Data[0]='\0';H->Heads[i].Next=NULL;}return H;
}Position Find(HashTable H,ElementType Key){Position P;Index Pos;Pos=Hash(Key,H->TableSize);P=H->Heads[Pos].Next;while(P&&strcmp(P->Data,Key)){P=P->Next;}return P;
}bool Insert(HashTable H,ElementType Key){Position P,NewCell;Index Pos;P=Find(H,Key);if(!P){NewCell=(Position)malloc(sizeof(struct LNode));strcpy(NewCell->Data,Key);Pos=Hash(Key,H->TableSize);NewCell->Next=H->Heads[Pos].Next;H->Heads[Pos].Next=NewCell;return true;}else{printf("键值已存在");return false;}
}void DestoryTable(HashTable H){int i;Position P,tmp;for(i=0;i<H->TableSize;i++){P=H->Heads[i].Next;while(P){tmp=P->Next;free(P);P=tmp;}}free(H->Heads);free(H);
}

11.4 散列表的性能分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.5 应用实例:词频统计

在这里插入图片描述

int main(){int TableSize=10000;int wordcount=0,length;HashTable H;ElementType word;FILE *fp;char document[30]="HarryPottr.txt";H=initializeTable(TableSize);if((fp=fopen(document,"r"))==NULL){FatalError("无法打开文件!\n");}while(!feof(fp)){length=GetAWord(fp,word);if(length>3){wordcount++;InsertAndCount(word,H);}}fclose(fp);printf("该文档共出现%d个有效单词,",wordcount);Show(H,10.0/100);DestoryTable(H);return 0;
}
http://www.dtcms.com/a/391066.html

相关文章:

  • 2025年JBD SCI2区TOP,基于改进蚁群算法的应急路径规划,深度解析+性能实测
  • UIKit-layer
  • 一物一码公司推荐再互动平台
  • Wireshark捕获MQTT报文
  • Docker镜像核心作战手册:镜像命令全解析+离线迁移实战+压缩共享储存,打造无缝跨环境部署!
  • Static Deinitialization Order Fiasco
  • 如何使用 Qt Creator 高效调试
  • 保障路灯用电安全!配电箱漏电检测,为城市照明筑牢防线
  • 不同版本tensorflow推理报错解决方法
  • 嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
  • 在没有随机对照的情况下如果做实验对比:双重差分法(结合虚拟变量回归)(五)
  • 材质、效率双突破:Rendercool 解决室内渲染核心痛点
  • 【ThreeJs】【材质Material】核心材质参数解析手册
  • 无人机桨叶的材质与工艺对飞行速度的影响
  • PMBOK第六版项目沟通管理总结
  • fatal: Need to specify how to reconcile divergent branches.原因及解决方案
  • 二叉树与二叉搜索树(BST):从基础到应用
  • 【一天一个Web3概念】区块链分叉(Fork)全面解析:类型、案例与影响
  • PHP低代码工作流创新,为企业数字化转型添翼
  • 低代码+AI生态:企业数字化起步阶段的“核聚变”冲击波
  • 【Linux基础知识系列:第一百三十四篇】理解Linux的进程调度策略
  • 主机windows虚拟机centos的hadoop调试mapreduce访问hdfs文件
  • 嵌入式Linux C语言程序设计
  • 【开题答辩全过程】以 基于Python的电影数据爬取及可视化分析为例,包含答辩的问题和答案
  • 推荐一些适合新手的Java项目教程
  • 探索PV操作:并发编程的核心钥匙
  • 一计算机网络基本概念-体系结构-思考题
  • Teslasuit动捕服的实际应用,系统利用电肌肉刺激为用户在VR中提供逼真的感觉和触觉
  • 【DMA】深入解析DMA控制器架构与运作原理
  • wayland 下 带特殊权限的 Qt GUI 程序 部署为 开机自启+守护进程