首页 > 其他分享 > 数据结构之散列表与哈希函数初识

数据结构之散列表与哈希函数初识

时间:2023-10-29 23:01:03浏览次数:36  
标签:之散 Java 哈希 Key 初识 数组 列表 函数

一:概述

一:为什么需要散列表

* 在我们的程序世界里,往往也需要在内存中存放这样一个“词典”,方便我们进行高效的查询和统计。

* 例如开发一个学生管理系统,需要有

* 通过输入学号快速查找对应学生的姓名的功能。

* 这里不必要每次都去查询数据库,而可以在内存中建立一个缓存表,这样做可以提高

* 查询效率。
*           学号          姓名
*           001121        张三
*           002123        李四
*           002931        王五
*           003278        赵六
*
* 再如我们需要统计一本英文书里面单词出现的频率,就需要遍历整本书的内容
* 把这些单词出现的次数记录在内存中。
*          单词             出现次数
*          this               108
*          and                56
*          are                79
*          by                 46
* 因为这个需求,一个重要的数据结构诞生了,这个数据结构叫作散列表。
*
* 散列表i也叫作哈希表(hash table),这种数据结构提供了键(key)和值(value)的映射关系
* 只要给出一个key,就可以高效的查找它所匹配的Value,时间复杂度接近于O(1)。
*

二:哈希函数

* 在数组、链表、栈、队列中,数组的访问效率最高,对元素进行随机的访问

* 散列表在在本质上也是一个数组。

*

* 数组只能根据下标,像a[1]、a[2]、a[3]、a[4]、a[5]这样来访问,而散列表的Key则是以字符串

* 类型为主的。

* 例如以学生的学号作为Key,输入002123,查询到李四;或者以单词为Key,输入by,查询到数字

* 46.....

* 需要一个“中转站”,通过某种方式,把Key和数组下标进行转换。这个中转站就叫做哈希函数。

* 哈希函数的实现:
* 在不同的语言中,哈希函数的实现方式是不一样的。这里以Java常用集合HashMap为例。
* 来看一看哈希函数在Java中的实现。
*
* 在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这个hashcode
* 是区分不同对象的重要标识。无论对象自身的类型是什么,它们的hashcode都是一个整型变量。
*
* 既然是一个整型变量,想要转换成数组的下标也就不难实现了。
* 最简单的实现方式就是按照数组的长度取模运算。
*   即:index = HashCode(Key) % Array.length
* 实际上,JDK(Java Development Kit,Java语言的软件开发工具包)中的哈希函数
* 并没有直接采取取模运算,而是利用了位运算的方式来优化性能。不过在这里姑且简单理解成
* 取模操作
*
* 通过哈希函数,我们可以把字符串或其他类型的Key,转换成数组的下标index。
* 如给出一个长度为8的数组,则当
* key = 001121时,
*     index = HashCode("001121") % Array.length = 1420036703  %8 = 7
*而当key = this时,
*     index = HashCode("this") % Array.length = 3559070 % 8 = 6 ;
*

标签:之散,Java,哈希,Key,初识,数组,列表,函数
From: https://blog.51cto.com/u_15912723/8082018

相关文章

  • 字符串、线性表、队列、栈、哈希表、dfs、bfs
    题目列表:1.字符串无重复字符的最长子串(中等难度)给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。AC代码,展开查看classSolution{public:intlengthOfLongestSubstring(strings){intres=0;unordered_map<char,int>heap......
  • 第一章 初识Linux
    1.Linux简介1.1Linux是多用户多任务的操作系统,免费开源,主要用于搭建服务器,性能稳定。但是Linux系统是专业系统,原始环境较为简单,大部分功能的实现都需要自我搭建。1.2  Linux系统都是由文件构成。对于操作系统内核而言,命令、硬件、软件设备都被视为一个拥有特定功能的......
  • 初识python
    学习目标1、使用print输出内容2、熟悉字符串类型3、熟悉数字类型4、熟悉数字与字符串操作核心知识输出print可控制输出内容也可配合+、-、、/进行运算,和整数型配合可进行运算和字符型配合有不同效果,如+为拼接,为多次输出注:整数型如:123456,字符型需用引号包起来,可为中文......
  • 【题解】P9753 [CSP-S 2023] 消消乐(字符串哈希,DP)
    【题解】P9753[CSP-S2023]消消乐不知道考场脑子是抽了还是有病,全程都不知道在放什么屁。特别鸣谢:@dbxxx给我讲解了解法一的满分做法,并让我对哈希有了更加深刻的认识;@Daidly给我讲解了解法二。题目链接P9753[CSP-S2023]消消乐题意概述给定一个长度为\(n\)的只含小......
  • 数据结构与算法(LeetCode) 第二节 链表结构、栈、队列、递归行为、哈希表和有序表
    一、链表结构1.单向链表节点结构publicclassNode{ publicintvalue;publicNodenext;publicNode(intdata){value=data;}}2.双向链表节点结构publicclassDoubleNode{publicintvalue;publicDoubleNodelast;publicDouble......
  • 字符串中的BKDRHash哈希函数
    字符串中的BKDRHash哈希函数在计算机科学中,哈希函数是一种将任意长度的输入(也称为“消息”)通过散列算法转换成固定长度的输出,该输出就是哈希值。哈希函数的一个重要特性是,对于相同的输入,无论何时执行哈希函数,它都应该产生相同的输出。然而,对于不同的输入,即使它们只有微小的差别,哈......
  • 2023 10.26 初识计算机
    什么是计算机由硬件软件组成科学计算数据处理硬件计算机运行的基本原理由输入设备(键盘鼠标)发布命令—CPU计算处理数据的结果—放到内存(通过媒介主板)—然后通过输出设备(显示器)(当然需要电源供电,显卡提高显示精度)CPU里面包含运算器+控制器,运算器计算结果反馈内存,控......
  • 一致性哈希算法
    图解一致性哈希算法,看这一篇就够了!(qq.com)近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法......
  • P5537 【XR-3】系统设计 题解-哈希+线段树二分
    20231026P5537【XR-3】系统设计题解-哈希+线段树二分这个东西怎么会和哈希有关?!直接寄。Statement这个系统首先需要输入一棵\(n\)个点的有根树和一个长度为\(m\)的序列\(a\),接下来需要实现\(q\)个操作。操作分两种:1xlr表示设定起点为有根树的节点\(x\),接下来......
  • 初识Linux(swxy,2021tln)
    什么是Linux,为什么要学习Linux,这是我们学习Liunx的第一步。Linux是一套操作系统,与windows,苹果电脑的macOSX一样,都是可以在电脑上运行的操作系统。但是相对于windows7,windows10,以及macos来说,Linux在个人电脑上可以说是很小众了,在我们的日常生活中可能根本看不到。其实不然,Lin......