`
raidyue
  • 浏览: 18956 次
  • 性别: Icon_minigender_1
  • 来自: 湖南常德
社区版块
存档分类
最新评论

数据结构之Hash

阅读更多

数据结构之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;
        }
分享到:
评论

相关推荐

    数据结构课程设计hash表

    哈希表,又称散列表,是数据结构课程中一种高效的数据组织方式,它通过特定的函数(哈希函数)将键(key)映射到数组的特定位置来实现快速访问。这种数据结构允许我们以接近常数时间的复杂度进行插入、删除和查找...

    上海交大数据结构课件 上海交大数据结构课件

    数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和存储数据,以便于进行各种操作。上海交通大学的数据结构课件是学习这一主题的重要资源,它涵盖了广泛的知识点,帮助学生深入理解数据结构...

    数据结构作业Hash表

    数据结构第16次作业,hash表 Spellchecking Prerequisites, Goals, and Outcomes Prerequisites: Students should have mastered the following prerequisite skills. • Hash Tables - Understanding of the ...

    广工计算机数据结构课程设计之电梯模拟

    在"广工计算机数据结构课程设计之电梯模拟"这个项目中,学生们被要求运用所学的数据结构知识来实现一个电梯模拟系统。这个设计不仅检验了学生的编程技能,更重要的是锻炼了他们对数据结构的理解和应用能力。 电梯...

    杂凑表的设计与实现 数据结构 哈希 hash

    哈希表,又称散列表,是一种高效的数据存储和检索结构,它通过特定的函数(哈希函数)将数据映射到一个固定大小的数组中,从而实现快速查找...这是一个综合性的任务,涵盖了数据结构、算法和基本的I/O操作等多个方面。

    数据结构课后答案.pdf

    7. **哈希表(Hash Table)**:哈希表是一种通过哈希函数来实现快速查找的数据结构,它允许将键映射到特定的位置以存储数据,从而实现平均时间复杂度为O(1)的查找性能。冲突解决策略包括链地址法、开放寻址法等。 ...

    数据结构Hash表C语言实现

    数据结构Hash表C语言实现

    清华大学教程 --数据结构

    此外,哈希表(Hash Table)是一种提供快速查找的数据结构,通过散列函数将键映射到数组的特定位置,实现常数时间的查找。堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列,如最大堆和最小堆。 排序算法...

    图形化hash函数 数据结构

    在数据结构中,哈希表(Hash Table)是利用哈希函数实现的一种高效查找数据结构。它通过将键(Key)映射到数组的索引位置来存储和检索数据,这大大减少了查找的时间复杂度,通常可以达到平均O(1)的时间复杂度。 本...

    数据结构课程实验Hash表设计实验报告

    数据结构课程实验中,哈希表的设计与实现是一项重要的任务,旨在帮助学生深入理解哈希表的概念和工作原理。哈希表是一种数据结构,通过哈希函数将数据映射到一个固定大小的数组中,以实现快速的查找、插入和删除操作...

    数据结构课程实验Hash表设计

    数据结构课程实验Hash表设计,严蔚敏C语言版。

    软考之数据结构

    《软考之数据结构》是针对软件设计师考试中关于数据结构这一重要知识点的详细解析。在计算机科学领域,数据结构是研究数据如何在计算机中存储和操作的基础理论,它是算法设计与分析的重要支撑。本资料集包含了多个...

    数据结构 hash表 hash table 原理,以及实现介绍

    hash 表是我们经常使用的一种存储数据的结构,它查找性能不会因为数据的增长而下降。

    hash表——数据结构实验

    哈希表是一种高效的数据结构,它通过特定的函数——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中。这个数组的每个位置称为槽位(bucket),用来存储键值对。哈希表的核心优势在于它的快速查找能力,...

    数据结构实验六(二分查找、Hash查找)题目和源程序

    ### 数据结构实验六知识点概述 #### 一、二分查找(Binary Search) **定义与适用条件:** 二分查找是一种在有序数组中查找特定元素的高效算法。为了使用二分查找,数组必须是按照升序或降序排列的,并且通常采用...

    李春葆数据结构教程上机实验全部源代码

    数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和检索数据,是软件工程、算法分析和计算机系统设计的基础。李春葆教授的《数据结构教程》是该领域的经典教材,深受学生和专业人士的喜爱。这个压缩包包含...

    数据结构_北大

    7. **高级数据结构**:如散列表(Hash Table)、B树和B+树、Trie树等,这些在数据库和文件系统中有着广泛的应用。 8. **实践应用**:结合实际问题,讲解如何选择合适的数据结构以及优化数据结构设计,提升程序性能...

    数据结构(c语言版)课后题答案-(学生版 )

    数据结构是计算机科学中的核心课程之一,主要研究数据如何在计算机中存储、组织和操作。C语言版的数据结构教材,由严蔚敏教授编著的《数据结构》(第2版),是许多大学和考研机构推荐的经典教材。该书深入浅出地介绍...

    数据结构1800题 很全的数据结构题库虽然老但是经典

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的检索、存储和操作。本题库“数据结构1800题”虽年代较远,但其经典性使得它仍然对学习者具有很高的参考价值。Word...

Global site tag (gtag.js) - Google Analytics