hashmap的数据结构和算法

hashmap的数据结构就是一个哈希表(散列表)

hashmap:

1)数组:连续地址,查找迅速,但是占用内存太大

    2)链表:地址不是连续的节省空间,查找较数组慢,删除和添加快

    集合了两种数据结构的优点

数组的目的:就是根据关键字的key利用散列函数映射地址,此地址就存储在数组中

链表的目的:解决冲突问题,因为不同的关键字根据散列函数映射地址可能会相等,讲最新的插入头部

散列函数

  1)、直接定址法

取关键字或关键字的某个线性函数值为散列地址,即:

h(key) = key   或 h(key) = a * key + b

其中a和b为常数。

(2)、数字分析法

(3)、平方取值法

取关键字平方后的中间几位为散列地址。

(4)、折叠法

将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为散列地址。

(5)、除留余数法

取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址,即:

h(key) = key MOD p    p ≤ m

(6)、随机数法

选择一个随机函数,取关键字的随机函数值为它的散列地址,即:

h(key) = random(key)

其中random为随机函数。

处理冲突

对不同的关键字可能得到同一散列地址,即key1 ≠ key2,而h(key1)= h(key2),这种现象称为冲突。具有相同函数值的关键字对该散列函数来说称作同义词。

在一般情况下,散列函数是一个压缩映像,这就不可避免地会产生冲突,因此,在创建散列表时不仅要设定一个好的散列函数,而且还要设定一种处理冲突的方法。

常用的处理冲突的方法有:

(1)、开放定址法

hi =(h(key) + di) MOD m     i =1,2,…,k(k ≤ m-1)

其中,h(key)为散列函数,m为散列表表长,di为增量序列,可有下列三种取法:

1)、di = 1,2,3,…,m-1,称线性探测再散列;

2)、di = 12,-12,22,-22,32,…,±k2 (k ≤m/2),称二次探测再散列;

3)、di = 伪随机数序列,称伪随机探测再散列。

(2)、再散列法

hi = rhi(key)   i = 1,2,…,k

rhi均是不同的散列函数。

(3)、链地址法

将所有关键字为同义词的数据元素存储在同一线性链表中。假设某散列函数产生的散列地址在区间[0,m-1]上,则设立一个指针型向量void *vec[m],其每个分量的初始状态都是空指针。凡散列地址为i的数据元素都插入到头指针为vec[i]的链表中。在链表中的插入位置可以在表头或表尾,也可以在表的中间,以保持同义词在同一线性链表中按关键字有序排列。

(4)、建立一个公共溢出区

通常情况下,采用除留余数法的散列函数和链地址法的处理冲突方法

  struct hash_node {

       int count;

    struct hash_node *next;

    };

  static int hash(int num)

    {

      return num % LEN;

    }

  static void collision(struct hash_node *vec[], int elem, struct hash_node *new)

    {

      if (vec[elem] == NULL)

         vec[elem] = new;

      else

          {

            new -> next = vec[elem];

                vec[elem] = new;

          }

}

hash是散列函数,collision函数用于处理冲突

时间: 2024-11-10 13:16:46

hashmap的数据结构和算法的相关文章

[转]java 的HashMap底层数据结构

java 的HashMap底层数据结构 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractM

java 的HashMap底层数据结构

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

HashMap的数据结构

HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难:而链表的特点是:寻址困难,插入和删除容易.那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法-- 拉链法,我们可以理解为"链表的数组",如图: 从上图我们可以发现哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点.那么这些元素是按照什么样的规则存储到数组中呢.一般情

java常用的数组、字符串、集合操作以及数据结构与算法基本知识

java中常用封装的数组 .字符串. 集合来操作对象,但数据结构中常用的有栈和队列   数与图以及他们之间的排序,查找. 数组声明没有分配内存空间  只有创建或者是初始化时才分配,创建时把数组中的数据类型数据所在的内存空间首地址赋值给数组名,在创建每个对象时,都会给该对象分配地址和它存储的数据 .如变量    int arr[]; int arr[]={1,2,3};  arr=new int[10] ,int arr[][]={{1,9,7},{1,2,3}}  int arr[][]=new

HashMap底层数据结构

1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2.    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外.HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体. 从上图中可以看出,HashM

我是如何学习数据结构与算法的?

数据结构与算法的地位对于一个程序员来说不言而喻.今天这篇文章不是来劝你们学习数据结构与算法的,也不是来和你们说数据结构与算法有多重要.主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什么捷径,是要看视频还是看书,去哪刷题等-..而且有些还是大三大四的,搞的我都替你们着急.担心-..所以我今天就分享下自己平时都是怎么学习的. 学习算法的捷径就是多刷题 说实话,要说捷径,我觉得就是脚踏实地着多动手去刷题,多刷题.但是,如果你是小白,也就是说,你连常见的数据结构,如链表.树以及常见的算法

HashMap 的数据结构

目录 content append content HashMap 的数据结构: 数组 + 链表(Java7 之前包括 Java7) 数组 + 链表 + 红黑树(从 Java8 开始) PS:这里的<红黑树>与链表都是链式结构. HashMap 内部维护了一个数组,数组中存放链表的链首或红黑树的树根. 当链表长度超过 8 时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高 HashMap 的性能:在红黑树结点数量小于 6 时,红黑树转变为链表. 下面分别为上面两种数据结构的图示: [定位

java之数据结构与算法

1.了解基本数据结构及特点 如,有哪些二叉树,各有什么特点 树二叉搜索树 每个节点都包含一个值,每个节点至多有两棵子树,左孩子小于自己,右孩子大于自己,时间复杂度是O(log(n)),随着不断插入节点,二叉树树高变大,当只有左(右)孩子时,时间复杂度变为O(n). 平衡二叉树保证每个节点左右子树高度差绝对值不超过1.比如,AVL树在插入和删除数据是经常需要旋转以保持平衡.适合插入删除少场景. 红黑树非严格平衡二叉树,更关注局部平衡,而非总体平衡,没有一条路径比其他路径长出两倍,接近平衡,减少了许