`
yu06206
  • 浏览: 111522 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

浅谈哈希表

阅读更多

                                       浅谈哈希表
     之前学过hash表,当时对哈希表的的了解不是很深,经过这几天的深入分析,现在算是对哈希表有了一个比较浅的了解,
下面就简单的谈一下我对哈希表的了解,以后肯定还会对它进行深入的分析.
什么是哈希表?
     散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关
键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。通过自定义一个哈希表现在对哈希表这种结合数组和链表的优点的数据结构有了比较深的认识,解决了了数组插入速度慢,链表查询慢得问题。
系统中的hashMap与hashTable
      这里就不分析hashMap与hashTable的区别了,系统中HashMap的实例有两个参数影响其性能:初始容量 和加载因子。容
量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作,在自己实现的hash表中的改变加载因子确实会改变hash的性能,这个要具体的情况具体对待。
哈希函数
      系统中hashMap和hashtable使用的哈希函数不一样,hashMap使用的是h & (length-1)而hashTable使用的是很简单hash% table.length,至于为什么他们使用的是不同的哈希函数,这个其实是很大的学问,就像胡老师说的我们可以根据数理统计分析使用这两个哈希函数针对不同的数据他们分布概率,在我自己使用的hash表中对这两个hash函数进行了测试,我测试的结论是使用h & (length-1)函数的哈希冲突要少一些,这个可能和我的测试用例有关吧,我也自己根据网上的资料在自己的哈希表中使用一些不同的哈希函数,一下以字符串为例:

1.SDBMHash函数

	/**
	 * SDBMHash哈希函数
	 * @param v
	 * @return:hash索引
	 */

	public int SDBMHash(V v) {
		String str = (String) v;
		int hash = 0;
		char[] chars = str.trim().toCharArray();
		int count = 0;
		int length = chars.length;
		while (count < length) {
			hash = (int) chars[count] + (hash << 6) + (hash << 16) - hash;
			count++;
		}
		return (hash & 0x7FFFFFFF);
	}

 2.RS Hash函数

/**
	 *  RS Hash函数
	 * @param v
	 * @return
	 */

	public int RSHash(V v){
		int b = 378551;
		int a = 63689;
		int hash = 0;
		String str = (String) v;
		char[] chars = str.trim().toCharArray();
		int count = 0;
		int length = chars.length;
		while (count < length) {
			hash = (int) chars[count] + hash * a;
			a *= b;
			count++;
		}
		return (hash & 0x7FFFFFFF);

	}

  3.AP Hash函数

/**
	 * AP Hash函数
	 * @param v
	 * @return
	 */

	public int APHash(V v) {
		int hash = 0;
		String str = (String) v;
		char[] chars = str.trim().toCharArray();
		int i;
		for (i = 0; i < chars.length; i++) {
			if ((i & 1) == 0) {
				hash ^= ((hash << 7) ^ (hash >> 3));
			} else {
				hash ^= (~((hash << 11) ^ (hash >> 5)));
			}
		}
		return (hash & 0x7FFFFFFF);

	}

 4.ELFHash函数

/**
	 * ELFHash函数
	 * @param v
	 * @return
	 */
	public int ELFHash(V v){
		int hash = 0;
		int x = 0;
		String str = (String) v;
		char[] chars = str.trim().toCharArray();
		int count = 0;
		int length = chars.length;
		while (count < length) {
			hash = (int) chars[count] + (hash << 4);
			if ((x = (int) (hash & 0xF0000000L)) != 0) {
				hash ^= (x >> 24);
				hash &= ~x;
			}
			count++;
		}
		return (hash & 0x7FFFFFFF);
	}

 

以上的哈希函数都是针对字符串的,由于时间的关系还没有测试各个哈希函数的优缺点,希望大家有兴趣的话可以帮忙测试一下,对于哈希函数我总结一点:不同的情况不同对待!

Hash表的数据结构

       之前为了弄清楚系统中哈希表的数据结构,把系统中的源代码来来回回看了很多遍,理解也越来越深,最后看完之后不得不感叹系统对哈希表的设计真的是太好了,让我不得不赞叹,我不得不说我现在能想到的他都想到了,而且想的比我全面多了,最后只有是模仿系统的哈希表写了一个自己的哈希表,只是简化了很多东西,最后和系统的哈希表进行了一个简单的测试,测试结果让我很不服气,为什么呢?

 

哈希表的应用

      在做完哈希表后,稍微做了一下哈希表的应用,做了一个利用哈希表实现电话号码查询和存储的功能,非常简单,其实也可利用队列或者链表实现,但是用上哈希表之后查询或者删除数据肯定比较快速(这个没有测试),看一下截图:

 

  • 大小: 23 KB
  • 大小: 24.7 KB
分享到:
评论

相关推荐

    浅谈哈希表及哈希冲突.ppt

    哈希表是一种数据结构,它通过使用哈希函数将键(Key)映射到一个固定大小的数组(也称为哈希表或散列表)中的特定位置,以此实现快速的查找、插入和删除操作。哈希表的核心在于哈希函数,它能将任意大小的键转化...

    浅谈哈希表存储效率一般不超过50%的原因

    本文主要是讲”哈希表的存储效率一般不超过50%”的原因。 Hash Table 常用于频繁进行 key/value 模式的查找中。(查找模式,如匹配查找) 哈希表最大的优点在于查找速度快,但存储时可能发生collision(冲突)。 哈希表...

    浅谈竞赛中哈希表的应用

    哈希表是一种高效的数据结构。本文分五个部分:首先提出了哈希表的优点,其次介绍了它的基础操作,接着从简单的例子中作了效率对比,指出其适用范围以及特点,然后通过例子说明了如何在题目中运用哈希表以及需要注意...

    yxy版c++教程 Hash 浅谈哈希算法(csdn)————程序.pdf

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。哈希表的理论基础在于将任意长度的键转化为固定长度的哈希值,这个过程称为哈希化。...

    浅谈java集合框架

    ### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...

    浅谈C++容器.pdf

    本文旨在通过解析《浅谈C++容器》的内容,帮助读者深入了解C++容器的基本概念、分类及其背后的原理。 #### 二、容器的基本概念 容器是C++标准库中用于存储和管理数据的一种机制。它们提供了一种高效的方式来组织和...

    浅谈Java中常用数据结构的实现类Collection和M

    1. HashMap:HashMap是最常用的Map实现,它基于哈希表,提供快速的查找、插入和删除操作。但是,它不保证元素的顺序,尤其是当集合被迭代时。 2. TreeMap:TreeMap基于红黑树,其内部会对键进行排序。这使得TreeMap...

    提升网页游戏性能浅谈——缓冲池

    ### 提升网页游戏性能浅谈——缓冲池 在网页游戏开发的过程中,特别是在使用Actionscript 3.0开发MMORPG类网页游戏时,游戏性能往往成为开发者关注的重点。随着技术的发展,网页游戏不仅要求具备良好的视觉效果,还...

    Java基础之浅谈集合.doc

    HashSet 是基于哈希表实现的集合,插入元素的速度较快,但元素的顺序是不确定的。 #### 1.4.2 TreeSet TreeSet 是基于红黑树(一种自平衡二叉查找树)实现的集合,它提供了排序的功能,插入元素时会自动排序,元素...

    6.何森《浅谈数据的合理组织》1

    1. **哈希表(HASH 表)**:在给定的N个大数字问题中,哈希表可以实现快速的查询,通过映射关系减少查找时间,常用于处理“存在性”查询的问题。 2. **字典树(TRIE)**:适合处理字符串查询,通过树状结构存储字符...

    IOI国家集训队论文集1999-2019

    + [哈希表](#哈希表) + [Splay](#splay) * [图论](#图论) + [图论](#图论-1) + [模型建立](#模型建立) + [网络流](#网络流) + [最短路](#最短路) + [欧拉路](#欧拉路) + [差分约束系统](#差分约束系统) + ...

    浅谈Oracle数据库性能的优化

    ### 浅谈Oracle数据库性能的优化 #### 一、引言 随着信息技术的快速发展和企业对数据处理需求的增加,数据库作为数据管理的核心组件,在企业的信息化建设中扮演着至关重要的角色。Oracle数据库作为全球最广泛使用...

    JSON浅谈-2

    1. 名称/值对的集合(一个对象):在不同的编程语言中,这种结构可以被理解为对象、记录、结构、字典、哈希表、键列表或关联数组。在JSON中,一个对象由一系列名称和值组成,这些名称/值对用逗号分隔,整个对象被大...

    浅谈Java中HashMap类的使用.pdf

    HashMap 是基于哈希表的 Map 接口实现,提供了快速查找和存储数据的能力。它允许使用 null 值和 null 键,不保证映射的顺序,特别是它不保证该顺序恒久不变。 二、HashMap 的常用方法 1. put(K key, V value):向...

    浅谈C++容器

    Hash 表是一种数据结构,它使用哈希函数将关键字映射到索引上,然后根据索引快速地查找、插入或删除元素。 Hash 表的操作包括插入元素、删除元素、查找元素和遍历 Hash 表等。 这些容器类都是基于数据结构的基本...

    浅谈嵌入式的学习步骤及方法

    学习数据结构与算法的基础内容,如顺序表、链表、队列、栈、树、图、哈希表、查找排序算法等,以及它们的C语言实现过程是至关重要的。 C++和QT语言的学习也是嵌入式系统学习的重要组成部分。C++作为Linux应用开发的...

    浅谈ORACLE数据库锁的类型与机制.pdf

    浅谈 Oracle 数据库锁的类型与机制 Oracle 数据库锁是指 Oracle 数据库中用于保护数据的一致性和完整性的机制。 Oracle 数据库锁可以分为五大类:DML 锁、DDL 锁、内部锁、分布式锁和 PCM 锁。 1. DML 锁(Data ...

Global site tag (gtag.js) - Google Analytics