哈希表初识(一)

本文深入探讨哈希表的概念,通过学号存储学生信息和字典查找单词的例子阐述哈希表的应用。讲解了哈希函数、开放地址法(线性探测、二次探测、再哈希化)和链地址法解决冲突的方法,以及数组扩展和装填因子的重要性。文章旨在帮助读者理解哈希表的工作原理和设计思路。
摘要由CSDN通过智能技术生成
2824145-01e4b20ee6720064.jpg
死侍.jpg

写这篇文章的时候,是大年三十,本来应该和家人一起看春节联欢晚会的,但是看了一个小时感觉没有什么劲,我想今年春晚又会被吐槽吧。哈哈哈哈。书归正传,还是按照我们的老规矩,走起。(PS:本来是早就应该写完的文章,发现自己还是太懒。到了现在真正的写完。反省反省....)

在写这篇文章之前,看了很多关于HashMap解析的文章。对于大多数人来说,可了跟着别人的文章走一遍。大家都能了解HashMap的内部结构,使用方法以及注意事项。我还是觉得知道用是一回事。知道原理是另一回事。只有了解了其数据结构设计初衷。才能更好的使用它。
此系列文章主要分为两个部分,具体目录如下:

  • 哈希表初识(一)
  • 哈希表之 HashMap(二)

其中第一篇是带领着大家理解为什么会设计此种数据结构,及其遇见的问题及解决办法。我相信通过阅读这篇文章后,你再去理解HashMap,我相信你会有一种豁然开朗的感觉。建议先阅读第一部分。

前言

哈希表是我们程序员开发者经常会使用到的数据结构。我们都知道是其主要用于映射(键值对)关系的数据。哈希表在查找、删除、添加数据方面效率都比较高。既然哈希表有如此多的优点,那么我就带着大家从哈希表实际应用例子出发,通过相应例子,带领大家彻底的了解哈希表的使用情景及其遇到的问题,以及相应的解决方法。

哈希表简介

哈希表(Hash table,也叫散列表),是根据关键值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键键值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。

上文提到了两个比较重要的知识点。哈希表是基于数组且通过哈希函数来构建映射关系。接下来我们通过生活中的几个例子,来了解一下哈希表在实际使用中会出现的问题以及解决方案。

学号作为键,存储学生信息

假如现在我们要做一个学校的学生信息记录。这个学校大概有1000人。学生的记录信息包括学号、年龄、性别等信息。假设学生的学号是从零开始的有序自增长,那么如果要求我们需要从快速检索某一个学生的信息。那我们应该使用什么样的数据结构呢?

我们可能首先想到的就是数组。即数组下标对应着相应学生信息,具体数据结构如下图所示:


2824145-5b39808f6cbe991f.png
学生存储数组.png

如果我们需要找到Jennifer这个学生。我们只需要通过数组下标拿到相应信息就行了。

Student andy = StudentArray[2];

如果我们需要增加一个Jack学生,我们只需要在数组的末尾添加新添加的学生信息。

StudentArray[storeNumber++] = new Student("Jack");

我们发现通过上述结构设计,我们能很快的找到某个学生,或者删除一个学生,因为学生的信息是与学号进行关联的。同时每个学生的学号与数组的下标是相对应的。通过数组下标的操作。我们就能完成我们想要的数据操作。当然上述情况只是理想的数据情况,我们可以直接通过将学号作为数组的下标来作为键值对的映射关系。实际开发常见中,我们并不能遇到如此良好的数据映射关系的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值