哈希表
来源:互联网 发布:三星专用下载软件 编辑:程序博客网 时间:2024/06/03 19:17
哈希表的相关概念
常用的构造哈希函数的方法: 直接定值法:H(key) = key 除留余数法
- 产生冲突的处理办法:链地址法,就是顺序表加链表的操作.
采用链地址创建哈希表
- 定义一个哈希表并且初始化
typedef struct HashNode{ int data; //数据域 struct HashNode *link; //指针域}HashNode;typedef HashNode* HashTable[P]; //定义一个数组void InitHashTable(HashTable &ht){ for(int i = 0; i < P; i++){ ht[i] = NULL; //初始化, }}
- 定义一个数组和地址的关系
int Hash(int key){ return key % P;}
- Hash表的查找
HashNode *SearchHashTable(HashTable &ht, int key){ int index = Hash(key); //先找到位置 HashNode *p = ht[index]; //相当于链表的查找 while(p!=NULL && p->data != key){ //没找到并且没找完成,不能颠倒位置 p = p->link; } return p;}
- 插入
void InsertHashTable(HashTable &ht, int x){ int index = Hash(x); //查找一个插入的位置 HashNode *s = (HashNode *)malloc(sizeof(HashNode)); assert(s != NULL); s->data = x;//以上的三步是申请节点 HashNode *p = ht[index]; //用头插法 s->link = ht[index]; ht[index] = s;}
- 显示
void ShowHashTable(HashTable ht){ for(int i=0; i<P; i++){ printf("%d ", i); HashNode *p = ht[i]; while(p != NULL){ printf("%d-->", p->data); p = p->link; } printf("NUL \n"); }}
- 删除
bool RemoveHashTable(HashTable &ht, int key){ HashNode *p = SearchHashTable(ht, key); //找到这个节点 if(p == NULL) return false; int index = Hash(key); HashNode *q = ht[index]; //这是第一个节点 if(q == p) //如果删除的是头结点 { ht[index] = p->link; free(p); return true; } while(q->link != p)//非头结点,找到前一个节点 { q = q->link; } q->link = p->link; free(p); return true;}
采用溢出桶的插入方法
- 初始化
struct bucket_node{ int data[3]; //定义桶节点 struct bucket_node *next;};bucket_node hash_table[P];void Init_bucket_node(){ for(int i=0; i<P; i++){ for(int j=0;j<3; j++){ hash_table[i].data[j] = NULL_DATA; } hash_table[i].next=NULL; //初始化桶节点 }}
- 插入
int Hash(int key){ return key % P;}void Insert_new_element(int x){ int index = Hash(x); //找到插入的位置 //第一个桶有位置就插入后返回 for(int i=0; i<3; i++){ if(hash_table[index].data[i] == NULL_DATA){ hash_table[index].data[i] = x; return; } } //第一个桶没有位置 bucket_node *p = &hash_table[index]; //p用于寻找最后一个桶 while(p->next != NULL){ //存在溢出桶 p = p->next; for(i = 0; i < 3; i++){ if(p->data[i] == NULL_DATA){ p->data[i] = x; return; } } } //创建溢出桶,并初始化 bucket_node *s = (bucket_node*)malloc(sizeof(bucket_node)); assert(s != NULL); for(i = 0; i < 3; i++){ s->data[i] = NULL_DATA; } s->next = NULL; s->data[0] = x; p->next = s; //将新建的桶进行链接 return;}
0 0
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- .哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 哈希表
- 冷知识 —— 别名与别称
- 归并排序思想应用之----求数组中的逆序对
- 泛洪填充算法(Flood Fill Algorithm)
- 大型分布式网站术语分析
- hdu 3666 THE MATRIX PROBLEM (差分约束)
- 哈希表
- java基础知识7this关键字
- 通过河内之塔问题深入理解递归思想
- Gym 101246E Kidnapping 递推or dfs 优化
- 线程池为什么能维持线程不释放,随时运行各种任务?
- Adreno SDK 详细介绍(一)
- 设计模式---适配器模式
- java
- java基础知识8继承