散列用来以常数时间实现 Insert、Find 和 Delete 操作。
With
direct addressing, an element with key k is stored in slot k.(相当于数组)
With
hashing, this element is stored in slot h(k); that is, we use a hash function h to compute the slot from the key k.
h(k) 的范围远小于 k,所以必定会产生冲突(Collision)。
哈希函数表大小一般选择素数,可以使得均匀分布,缓解冲突。(为什么素数可以做到均匀分布?)
解决冲突方法一:链表数组实现,觉得代码很漂亮^_^
typedef int ElementType;
typedef struct ListNode *Position;
struct ListNode
{
ElementType Element;
Position Next;
};
typedef Position List;
struct HashTbl
{
int TableSize;
List *TheLists; // an array of lists
};
typedef struct HashTbl *HashTable;
HashTable InitializeTable(int TableSize)
{
HashTable H;
int i;
H = (HashTbl *)malloc(sizeof(struct HashTbl));
if (H == NULL)
Error("Out of space!!!");
H->TableSize = NextPrime(TableSize);
H->TheLists = (List *)malloc(sizeof(List) * H->TableSize);
if (H->TheLists == NULL)
Error("Out of space!!!");
/* Allocate list headers */
for (i = 0; i < H->TableSize; i++)
{
H->TheLists[i] = (ListNode *)malloc(sizeof(struct ListNode));
if (H->TheLists[i] == NULL)
Error("Out of space!!!");
else
H->TheLists[i]->Next = NULL;
}
return H;
}
int Hash(ElementType Key, int TableSize)
{
return Key%TableSize;
}
Position Find(ElementType Key, HashTable H)
{
List L = H->TheLists[Hash(Key, H->TableSize)];
Position P = L->Next;
while (P != NULL && P->Element != Key)
P = P->Next;
return P;
}
void Insert(ElementType Key, HashTable H)
{
Position Pos, NewCell;
List L;
Pos = Find(Key, H);
if (Pos == NULL)
{
NewCell = (ListNode *)malloc(sizeof(struct ListNode));
if (NewCell == NULL) {
Error("Out of space!!!");
} else {
L = H->TheLists[Hash(Key, H->TableSize)];
NewCell->Next = L->Next;
NewCell->Element = Key;
L->Next = NewCell;
}
}
}
void DestroyTable(HashTable H)
{
int i;
for (i = 0; i < H->TableSize; i++)
{
Position P = H->TheLists[i];
Position Tmp;
while (P != NULL) {
Tmp = P->Next;
free(P);
P = Tmp;
}
}
free(H->TheLists);
free(H);
}
解决冲突方法二:
Open addressing,数组实现
每个位置需要附加一个属性,表示这个位置
已存、空的或已删的。
1. 线性探测法:往后面一个一个地找。
2. 平方探测法:往后面跳着找。
只能懒惰删除,不能真删。即标记已删。
再散列:表的大小不够时,建立另外一个大约两倍大小的新表,扫描原表,一个一个的插入到新表中。
来自《数据结构与算法分析》
分享到:
相关推荐
Search function: This function searches the key specified as the parameter in the hash table. If exist, return true, else return false. Note to use the eq which is a member of HashSet to compare ...
根据提供的文件信息,我们可以深入分析C语言中哈希表(Hash Table)的实现方式与具体细节。本篇文章将从以下几个方面展开讨论: 1. **哈希表的基本概念** 2. **哈希函数的设计** 3. **哈希表的创建与管理** 4. **...
"FPGA-based hash table"是指利用FPGA的特性实现的哈希表数据结构。哈希表是一种高效的数据存储和检索结构,它通过将关键字映射到数组的特定位置来快速查找、插入和删除数据。 哈希表的核心是哈希函数,它将输入的...
方便地查看文件的MD5/SHA1值 – HashTab给文件属性窗口添加校验值!
Sorting Hash Table Increase Sorting Searching Elementd in hash table BSTree
在Java编程语言中,哈希表(Hash Table)是一种常用的数据结构,它的实现通常通过`Hashtable`类。这个数据结构提供了快速的插入、删除和查找操作,其平均时间复杂度为O(1)。`Hashtable`是Java集合框架的一部分,位于...
在本实验中,主要涉及了哈希表(Hash Table)这一数据结构的使用,目的是让学生了解哈希表的概念、不同的哈希方式以及如何在程序中应用哈希表进行员工信息的搜索。实验环境包括Windows XP操作系统和VC++ 6.0/WinTC...
this is a hash table using hash function
散列表(Hash Table)从理论到实用 散列表(Hash Table)是一种数据结构,它可以实现快速查找、插入和删除操作。下面是关于散列表的理论和实用知识点的总结。 散列表的定义 散列表是一种数据结构,它使用哈希函数...
分布式哈希表(DHT,Distributed Hash Table)是一种用于分布式环境的数据存储技术,它将数据分布在网络中的多个节点上,以实现高效、可扩展的数据管理和检索。DHT的设计目标是提供一种全局一致性的哈希函数,使得...
哈希表(Hash Table)是一种高效的数据结构
本文探讨了分布式哈希表(Distributed Hash Table, DHT)系统在节点频繁加入与离开(即“churn”现象)情况下查找性能的优化策略。随着互联网规模应用的不断发展,DHT作为基础设施的支持变得尤为重要。然而,节点...
Hash tables are the fundamental data structure for analytical database workloads, such as aggregation, joining, set filtering and records... We designed a new hash table, SAHA, which is tightly integrate
本文档收集了前端大厂最新面试题的 Hash Table 相关知识点,涵盖 Hash Table 的基本概念、 ハッシュ関数、 Collision 解决方法、Hash Table 的实现和应用等方面。 一、Hash Table 基本概念 * Hash Table 是一种...
现行哈希的C++实现代码,具体原理可以参考:Larson, Per-Ake (April 1988),"Dynamic Hash Tables",Communications of the ACM 31: 446–457, doi:10.1145/42404.42410.
(1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。...
在IT领域,哈希表(Hash Table)是一种高效的数据结构,用于存储和检索键值对。标题中的"u_hash_table.rar_Table For Two"暗示我们关注的是一个特定的哈希表实现,可能是为处理两个相关对象设计的。描述中的"compare...
`uthash`是一个开源的C宏库,专门用于简化哈希表的实现,它提供了高效且易于使用的接口,使程序员能够快速构建自己的哈希表结构。 哈希表的关键组成部分包括哈希函数、冲突解决策略和存储结构。哈希函数负责将键...
哈希表(Hash Table)是一种数据结构,它通过关联键(Key)与值(Value)实现高效的数据存储和检索。在“所有哈希ids_hash_Table_”这个主题中,我们聚焦于利用哈希表来创建作弊表,这可能是为了在游戏中快速查找...