- 浏览: 18967 次
- 性别:
- 来自: 湖南常德
最新评论
数据结构之hash
首先介绍两种非常重要的数据结构。数组,为了方便我们把同类型的数据按照一定的数据放在一起[][][][],数组的好处在于,数组的查找很方便,只要知道下标便可以找到数据,但是数据的大小超过数组的大小时,那么就会变得非常麻烦,在java等强类型语言中数组的大小一旦被定义那么就无法改变(javascript中如果定义了一个10长度的数组a可以直接扩张该数组,比如a[10]),我们就只能创建一个新的数组,然后将原数组中的内容拿出来重新放到新数组中。这样做是很麻烦的。还有另外一种数据结构,链表,链表就像一根环环相扣的链子。链表的连接类似于如下结构,每个节点指向它的下一个节点O->O->O->... 对于链表来说添加添加数据很方便,但是,但你要查找一个数据是每次要重第一个节点开始遍历,这样查找或者修改是很麻烦的。
结合了数组和链表的优点,出现了一种新的数据结构--Hash,Hash结构在确保了查找速度的同时,确保了可以方便的添加节点。
[O] [O] [O] [O] [O] [O] [O]
↓ ↓ ↓ ↓ ↓ ↓ ↓
O O O O O O O
↓ ↓ ↓ ↓ ↓ ↓ ↓
O O O O O O O
↓ ↓ ↓ ↓ ↓ ↓ ↓
. . . . . . .
. . . . . . .
. . . . . . .
我们可以先使用java中的HashSet接口,当我们向HashSet中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,根据该值确定该对象在HashSet中的位置。也就是说每个对象的hashCode值就是他的所以。
String a1 = new String("aaa"); String a2 = new String("aaa"); String a3 = new String("aaa"); System.out.println("a1:"+a1.hashCode()+" a2:"+a2.hashCode()+" a3:"+a3.hashCode()); Output:a1:96321 a2:96321 a3:96321
我们把数据放在很多个链表里面,把根数据放在数组里面。每个数据节点有一个key值,我们通过key值计算出其应该在的数组中下标index(使用key对数组的长度取模),若是该数组没有数据,那么就让下标为index的等于该节点,若是index上已经有了数据,那么我们就让该数据成为该链的一个节点。同时我们在加入节点的同时还要记录已加入的节点数,并计算阀值,判断是否应该增大数组的大小,重新分配
public void addNode(HashNode newNode) { int index = getIndex(newNode);// if (hashArray[index] == null) { hashArray[index] = newNode; newNode.setNext(null); } else { HashNode node = hashArray[index]; newNode.setNext(node.getNext()); node.setNext(newNode); } length++; }
根据节点的key值计算出该节点在数组中应该存在的位置,对key之和数组的大小取模,
public int getIndex(HashNode node) {
return node.getKey() % arraySize;
}
我们不能让数组的hash表中的数据不断增加当数据的个数是数组长度的阀值倍是我们扩充数组的长度,同时重新分配所有节点的位置
if ((length / arraySize) >= load) { refresh(); }
// 当hash数组的长度改变时更新hash表 public void refresh() { printHash(); HashNode[] newHashArray = new HashNode[arraySize * 2];// 创建心新的数组 arraySize = arraySize * 2; for (int i = 0; i < hashArray.length; i++) { HashNode node = hashArray[i]; while (node != null) { int index = getIndex(node); System.out.println("refresh-->" + "key:" + node.getKey() + " " + "value:" + node.getValue() + " " + "index: " + index); node = node.getNext(); if (newHashArray[index] == null) { newHashArray[index] = node; node.setNext(null); } else { HashNode this_node = newHashArray[index]; node.setNext(this_node.getNext()); this_node.setNext(node); } System.out.println("node-->next" + node.getKey()); } } hashArray = newHashArray; }
发表评论
-
git入门
2015-02-11 11:02 0git入门 -
JVM内存结构浅谈
2013-05-19 14:47 698Java程序的运行过程: ... -
菜鸟入门之网页数据抓取
2013-05-04 21:53 5558有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放 ... -
动态编译
2013-03-01 22:33 627前几天谈论了关于动 ... -
位映射
2013-03-01 22:33 947前些天讨论了位映射的内容,一个具体的例子就对于M个int ... -
线程同步
2013-03-01 22:34 7461,为什么要有线程同 ... -
生产消费模型
2013-03-01 22:34 722当遇到一个线程要产生数据而另一个线程要处理数据时,这就是生 ... -
设计模式之单例模式
2012-12-02 23:02 0单例模式又叫单台模式或者单例模式 -
数据结构之Hash
2012-11-18 14:47 0数据结构之hash 首先介 ... -
网络通信总结
2012-10-28 15:33 857网络通信:一句话说,用网络传输数据(各种数据) 。进行通讯那 ... -
哈弗曼压缩
2012-08-03 11:43 705一、哈弗曼树,又称最优树,是一种带权路径长度最短的树。 ... -
链表总结
2012-08-03 11:43 808首先,链表是一种顺 ... -
线程及线程应用总结
2012-08-03 11:44 762一、什么是线程 每个java程序都至少有一个线程 ... -
树二叉树总结
2012-08-03 11:45 880一、数的相关 节点: 节点是树的基本组成单 ... -
java集合框架
2012-07-16 21:21 753java集合框架总结 主要由以下三部分组成: ... -
I/O体系结构总结
2012-07-16 21:22 922I/O体系结构总结 流的概念和分类: ... -
File相关类总结
2012-07-16 21:22 930File是java中的与文件相关的类,可以对进行创建、删 ... -
java异常机制
2012-07-11 13:01 729JAVA异常机制 一、异常的基本概念 简单的说 ... -
总结20120705
2012-07-05 10:07 690一、类与对象 1. ... -
java关键字总结
2012-05-20 13:31 749常用关键字: 访问修饰符关键字: public: 是最为公 ...
相关推荐
哈希表,又称散列表,是数据结构课程中一种高效的数据组织方式,它通过特定的函数(哈希函数)将键(key)映射到数组的特定位置来实现快速访问。这种数据结构允许我们以接近常数时间的复杂度进行插入、删除和查找...
数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和存储数据,以便于进行各种操作。上海交通大学的数据结构课件是学习这一主题的重要资源,它涵盖了广泛的知识点,帮助学生深入理解数据结构...
数据结构第16次作业,hash表 Spellchecking Prerequisites, Goals, and Outcomes Prerequisites: Students should have mastered the following prerequisite skills. • Hash Tables - Understanding of the ...
在"广工计算机数据结构课程设计之电梯模拟"这个项目中,学生们被要求运用所学的数据结构知识来实现一个电梯模拟系统。这个设计不仅检验了学生的编程技能,更重要的是锻炼了他们对数据结构的理解和应用能力。 电梯...
哈希表,又称散列表,是一种高效的数据存储和检索结构,它通过特定的函数(哈希函数)将数据映射到一个固定大小的数组中,从而实现快速查找...这是一个综合性的任务,涵盖了数据结构、算法和基本的I/O操作等多个方面。
7. **哈希表(Hash Table)**:哈希表是一种通过哈希函数来实现快速查找的数据结构,它允许将键映射到特定的位置以存储数据,从而实现平均时间复杂度为O(1)的查找性能。冲突解决策略包括链地址法、开放寻址法等。 ...
数据结构Hash表C语言实现
此外,哈希表(Hash Table)是一种提供快速查找的数据结构,通过散列函数将键映射到数组的特定位置,实现常数时间的查找。堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列,如最大堆和最小堆。 排序算法...
在数据结构中,哈希表(Hash Table)是利用哈希函数实现的一种高效查找数据结构。它通过将键(Key)映射到数组的索引位置来存储和检索数据,这大大减少了查找的时间复杂度,通常可以达到平均O(1)的时间复杂度。 本...
数据结构课程实验中,哈希表的设计与实现是一项重要的任务,旨在帮助学生深入理解哈希表的概念和工作原理。哈希表是一种数据结构,通过哈希函数将数据映射到一个固定大小的数组中,以实现快速的查找、插入和删除操作...
数据结构课程实验Hash表设计,严蔚敏C语言版。
《软考之数据结构》是针对软件设计师考试中关于数据结构这一重要知识点的详细解析。在计算机科学领域,数据结构是研究数据如何在计算机中存储和操作的基础理论,它是算法设计与分析的重要支撑。本资料集包含了多个...
hash 表是我们经常使用的一种存储数据的结构,它查找性能不会因为数据的增长而下降。
哈希表是一种高效的数据结构,它通过特定的函数——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中。这个数组的每个位置称为槽位(bucket),用来存储键值对。哈希表的核心优势在于它的快速查找能力,...
### 数据结构实验六知识点概述 #### 一、二分查找(Binary Search) **定义与适用条件:** 二分查找是一种在有序数组中查找特定元素的高效算法。为了使用二分查找,数组必须是按照升序或降序排列的,并且通常采用...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和检索数据,是软件工程、算法分析和计算机系统设计的基础。李春葆教授的《数据结构教程》是该领域的经典教材,深受学生和专业人士的喜爱。这个压缩包包含...
7. **高级数据结构**:如散列表(Hash Table)、B树和B+树、Trie树等,这些在数据库和文件系统中有着广泛的应用。 8. **实践应用**:结合实际问题,讲解如何选择合适的数据结构以及优化数据结构设计,提升程序性能...
数据结构是计算机科学中的核心课程之一,主要研究数据如何在计算机中存储、组织和操作。C语言版的数据结构教材,由严蔚敏教授编著的《数据结构》(第2版),是许多大学和考研机构推荐的经典教材。该书深入浅出地介绍...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的检索、存储和操作。本题库“数据结构1800题”虽年代较远,但其经典性使得它仍然对学习者具有很高的参考价值。Word...