`
wq294948004
  • 浏览: 31587 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hash Table

阅读更多
散列用来以常数时间实现 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. 平方探测法:往后面跳着找。
只能懒惰删除,不能真删。即标记已删。
再散列:表的大小不够时,建立另外一个大约两倍大小的新表,扫描原表,一个一个的插入到新表中。

来自《数据结构与算法分析》
分享到:
评论

相关推荐

    hash table spell checking

     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的实现

    根据提供的文件信息,我们可以深入分析C语言中哈希表(Hash Table)的实现方式与具体细节。本篇文章将从以下几个方面展开讨论: 1. **哈希表的基本概念** 2. **哈希函数的设计** 3. **哈希表的创建与管理** 4. **...

    fpga-hash-table-master.zip_Table_fpga hash table_hash_hash fpga_

    "FPGA-based hash table"是指利用FPGA的特性实现的哈希表数据结构。哈希表是一种高效的数据存储和检索结构,它通过将关键字映射到数组的特定位置来快速查找、插入和删除数据。 哈希表的核心是哈希函数,它将输入的...

    hash table

    方便地查看文件的MD5/SHA1值 – HashTab给文件属性窗口添加校验值!

    SSD 5 hash table

    Sorting Hash Table Increase Sorting Searching Elementd in hash table BSTree

    在Java中运用Hashtables.rar_hash table

    在Java编程语言中,哈希表(Hash Table)是一种常用的数据结构,它的实现通常通过`Hashtable`类。这个数据结构提供了快速的插入、删除和查找操作,其平均时间复杂度为O(1)。`Hashtable`是Java集合框架的一部分,位于...

    . In hash table, to complete the code for Insert_Hash,

    在本实验中,主要涉及了哈希表(Hash Table)这一数据结构的使用,目的是让学生了解哈希表的概念、不同的哈希方式以及如何在程序中应用哈希表进行员工信息的搜索。实验环境包括Windows XP操作系统和VC++ 6.0/WinTC...

    Hash table

    this is a hash table using hash function

    白话算法之散列表(Hash Table)从理论到实用.doc

    散列表(Hash Table)从理论到实用 散列表(Hash Table)是一种数据结构,它可以实现快速查找、插入和删除操作。下面是关于散列表的理论和实用知识点的总结。 散列表的定义 散列表是一种数据结构,它使用哈希函数...

    分布式哈希表(Distributed Hash Table DHT)1

    分布式哈希表(DHT,Distributed Hash Table)是一种用于分布式环境的数据存储技术,它将数据分布在网络中的多个节点上,以实现高效、可扩展的数据管理和检索。DHT的设计目标是提供一种全局一致性的哈希函数,使得...

    哈希表(Hash Table)是一种高效的数据结构

    哈希表(Hash Table)是一种高效的数据结构

    Analytical Study on Improving Lookup Performance of Distributed Hash Table Systems under Churn.pdf

    本文探讨了分布式哈希表(Distributed Hash Table, DHT)系统在节点频繁加入与离开(即“churn”现象)情况下查找性能的优化策略。随着互联网规模应用的不断发展,DHT作为基础设施的支持变得尤为重要。然而,节点...

    DB - A String Adaptive Hash Table for Analytical Databases.pdf

    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.docx

    本文档收集了前端大厂最新面试题的 Hash Table 相关知识点,涵盖 Hash Table 的基本概念、 ハッシュ関数、 Collision 解决方法、Hash Table 的实现和应用等方面。 一、Hash Table 基本概念 * Hash Table 是一种...

    Linear Hash Table (C++ Implementation)

    现行哈希的C++实现代码,具体原理可以参考:Larson, Per-Ake (April 1988),"Dynamic Hash Tables",Communications of the ACM 31: 446–457, doi:10.1145/42404.42410.

    JAVA-hash-table.zip_Table_hash_hash table java_java hash 查找_哈希表设

    (1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。...

    u_hash_table.rar_Table For Two

    在IT领域,哈希表(Hash Table)是一种高效的数据结构,用于存储和检索键值对。标题中的"u_hash_table.rar_Table For Two"暗示我们关注的是一个特定的哈希表实现,可能是为处理两个相关对象设计的。描述中的"compare...

    哈希表Hash table 用于哈希表等的 C 宏

    `uthash`是一个开源的C宏库,专门用于简化哈希表的实现,它提供了高效且易于使用的接口,使程序员能够快速构建自己的哈希表结构。 哈希表的关键组成部分包括哈希函数、冲突解决策略和存储结构。哈希函数负责将键...

    All hash ids_hash_Table_

    哈希表(Hash Table)是一种数据结构,它通过关联键(Key)与值(Value)实现高效的数据存储和检索。在“所有哈希ids_hash_Table_”这个主题中,我们聚焦于利用哈希表来创建作弊表,这可能是为了在游戏中快速查找...

Global site tag (gtag.js) - Google Analytics