C数据结构之哈希表如何实现
更新时间:2023-09-29哈希表的概述
哈希表是一种高效的数据结构,它能够实现快速的查找、插入和删除操作。哈希表的基本思想是将关键字通过哈希函数映射到一个固定的存储位置,这个存储位置就是哈希值。当需要进行查找、插入和删除操作时,只需要计算关键字的哈希值,进行一次对应的位置的查找即可。
哈希表的实现
哈希表的实现需要考虑以下几个问题:
1、哈希函数的设计。哈希函数的设计应该尽量避免出现哈希冲突,即不同的关键字映射到相同的哈希地址。常见的哈希函数有直接寻址法、除留余数法、数字分析法、折叠法等。
2、哈希表的存储结构。哈希表可以使用数组实现,在数组中每个元素对应一个哈希地址,将关键字存储在数组相应的元素中。此外,哈希表也可以使用链表实现,每个链表中存储哈希地址相同的关键字。
3、解决哈希冲突。当出现哈希冲突时,需要使用一些方法解决。比较常用的方法有开放地址法、链地址法、再哈希法等。
C++实现哈希表
const int N = 100010; // 哈希表的大小 const int null = 0x3f3f3f3f; // 表示当前位置没有被占用 struct HashMap{ int val[N]; int nxt[N]; int idx[N]; int tot; // 当前已经存储的数的个数 HashMap(){ tot = 0; memset(idx, -1, sizeof(idx)); } // 哈希函数 int get_hash(int x){ return (x % N + N) % N; } // 清空哈希表 void clear(){ tot = 0; memset(idx, -1, sizeof(idx)); } // 插入一个数 void insert(int x){ int t = get_hash(x); val[++tot] = x; nxt[tot] = idx[t]; idx[t] = tot; } // 删除一个数 void erase(int x){ int t = get_hash(x); for(int i = idx[t]; i != -1; i = nxt[i]){ if(val[i] == x){ val[i] = null; return; } } } // 查找一个数 bool find(int x){ int t = get_hash(x); for(int i = idx[t]; i != -1; i = nxt[i]){ if(val[i] == x) return true; } return false; } };
总结
哈希表是一种高效的数据结构,通过哈希函数将关键字映射到一个固定的位置,实现快速的查找、插入和删除操作。哈希表的实现需要考虑哈希函数的设计、存储结构的选择以及哈希冲突的解决。C++中可以使用数组和链表结合实现哈希表,同时也可以使用STL中的unordered_map作为哈希表。