`
javatoyou
  • 浏览: 1069476 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

数据结构之哈希表

 
阅读更多


wikipedia上的解释

http://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8


下图示意了哈希表(Hash Table)这种数据结构。

哈希表

哈希表

如上图所示,首先分配一个指针数组,数组的每个元素是一个链表的头指针,每个链表称为一个槽(Slot)。哪个数据应该放入哪个槽中由哈希函数决定,在这个例子中我们简单地选取哈希函数h(x) = x % 11,这样任意数据x都可以映射成0~10之间的一个数,就是槽的编号,将数据放入某个槽的操作就是链表的插入操作。

如果每个槽里至多只有一个数据,可以想像这种情况下searchinsertdelete操作的时间复杂度都是O(1),但有时会有多个数据被哈希函数映射到同一个槽中,这称为碰撞(Collision),设计一个好的哈希函数可以把数据比较均匀地分布到各个槽中,尽量避免碰撞。如果能把n个数据比较均匀地分布到m个槽中,每个糟里约有n/m个数据,则searchinsertdelete和操作的时间复杂度都是O(n/m),如果n和m的比是常数,则时间复杂度仍然是O(1)。一般来说,要处理的数据越多,构造哈希表时分配的槽也应该越多,所以n和m成正比这个假设是成立的。

请读者自己编写程序构造这样一个哈希表,并实现searchinsertdelete操作。

如果用我们学过的各种数据结构来表示n个数据的集合,下表是searchinsertdelete操作在平均情况下的时间复杂度比较。

各种数据结构的search、insert和delete操作在平均情况下的时间复杂度比较

数据结构 search insert delete
数组 O(n),有序数组折半查找是O(lgn) O(n) O(n)
双向链表 O(n) O(1) O(1)
排序二叉树 O(lgn) O(lgn) O(lgn)
哈希表(n与槽数m成正比) O(1) O(1) O(1)

根据以上算法,抽象数据结构如下:

/*哈希表*/

struct obj_container {
obj_hash_fn *hash_fn;//哈希函数
obj_callback_fn *cmp_fn;
int n_buckets; //分配多少个slot ?
int elements; //哈希表中元素数目
int version;
/*!variable size */
struct bucket buckets[0]; /*! lengthen tailq, each bucket is a linkedlist */
};

// 每个slot 为一个链表

struct bucket_entry {
SPD_LIST_ENTRY(bucket_entry)entry;
int version;
struct obj *pobj; /* pointer to internal data */
}bucket;


接下来实现 search, link , unlink函数。


分享到:
评论

相关推荐

    数据结构之哈希表.pdf

    在这个“数据结构之哈希表”的实验中,主要目标是设计并实现一个基于哈希表的电话号码查询系统。以下是实验中涉及的主要知识点: 1. **哈希函数**:哈希函数是哈希表的核心,它负责将键转换为数组索引。在实验中,...

    数据结构哈希表实验报告

    数据结构中的哈希表是一种高效的数据存储和检索结构,它通过特定的哈希函数将关键字映射到数组的索引位置,实现快速访问。在这个实验报告中,我们关注的是如何构建哈希表并进行基本操作,包括插入、删除、查找等。 ...

    数据结构课程设计 哈希表设计

    针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2...

    Java数据结构 线性表,链表,哈希表是常用的数据结构

    Java数据结构 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构

    数据结构课设 哈希表

    数据结构课设 哈希表 C++源码 需要的拿去

    数据结构哈希表设计实验报告

    在“数据结构哈希表设计实验报告”中,我们可能会涉及到以下几个关键知识点: 1. **哈希函数**:哈希函数是哈希表的核心,它的作用是将键转化为数组的索引。一个好的哈希函数应该尽可能使得不同的键映射到不同的...

    数据结构试验 哈希表设计

    哈希表是一种高效的数据结构,它通过特定的函数——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。在“数据结构试验:哈希表设计”中,我们将探讨哈希表的基本...

    严蔚敏 数据结构 ppt 哈希表 数 图

    哈希表是一种高效的数据结构,主要用于快速查找和存储数据。它通过哈希函数将数据映射到一个固定大小的数组中,以达到快速访问的目的。哈希冲突是哈希表面临的主要挑战,解决冲突的方法有开放寻址法、链地址法等。 ...

    数据结构哈希表

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(Key)映射到一个固定大小的数组中,以此实现快速的查找、插入和删除操作。在数据结构领域,哈希表是解决查找问题的重要工具,尤其适用于大数据量且需要频繁...

    数据结构的哈希表使用C++实现

    哈希表,也被称为散列表,是一种非常重要的数据结构,它在计算机科学中扮演着关键角色,尤其是在存储和检索大量数据时。哈希表通过使用哈希函数将键(Key)映射到数组的索引位置,实现了快速的查找、插入和删除操作...

    数据结构-哈希表设计程序

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,以此实现快速查找、插入和删除等操作。在数据结构设计中,哈希表是一个重要的组成部分,尤其对于大量数据的处理,它的...

    数据结构 哈希表 实验报告

    数据结构里哈希表的实验报告 构造二叉树,构造哈希表等 c语言版

    数据结构中的哈希表查找

    ### 数据结构中的哈希表查找 #### 哈希表简介 哈希表(Hash Table)是一种基于数组的数据结构,它通过将关键字映射到数组的某个位置来存储和检索数据,这种映射过程通常由一个哈希函数完成。哈希表能够实现快速的...

    数据结构 C语言 哈希表.docx

    ### 数据结构:C语言实现哈希表 #### 核心知识点概述 本篇文章将围绕一个C语言中的哈希表实现案例展开,详细解析哈希表的基本概念、设计思路及其实现过程。通过阅读本文,您将了解到哈希表在C语言编程中的应用,并...

    数据结构中的哈希表和二叉树

    哈希表和二叉树是数据结构中两个重要的概念,它们在存储和检索数据时具有各自的优势和应用场景。本文将详细探讨这两种数据结构,并通过C++实现来加深理解。 首先,我们来了解一下哈希表。哈希表,又称散列表,是一...

    数据结构哈希表实验

    哈希表的代码,可以用于数据结构试验交作业或者用于写实验报告

    数据结构 (课程设计)哈希表实现

    哈希表,又称散列表,是数据结构课程中一种非常重要的数据存储结构,它通过将关键字(key)映射到数组的索引位置来实现快速的查找、插入和删除操作。在本课程设计中,我们将深入理解哈希表的原理,并亲手实现一个...

    数据结构 哈希表 哈希算法

    哈希表,也被称为散列表,是数据结构中一种高效的数据存储和检索工具。它通过哈希函数将数据的关键字映射到一个固定大小的数组中,使得在平均情况下,查找、插入和删除操作的时间复杂度可以达到O(1)。这种高效的性能...

    哈希表课程设计数据结构实验报告——哈希表设计

    哈希表课程设计数据结构实验报告——哈希表设计 针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序. 1.2 人名为汉语拼音形式,最长不超过18个字符(如:庄双双 ...

Global site tag (gtag.js) - Google Analytics