哈希表-示例(这个还是实际的功能应用更便于理解)

2024-01-10 04:04

本文主要是介绍哈希表-示例(这个还是实际的功能应用更便于理解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示例代码参考代码随想录

1、啥是哈希表

哈希表,简单说吧,复杂的现在还没有弄明白怎么描述

1、就是按照一定的规则,将数据存入到数据结构中。而C语言中现在我们常见的就是数组,以及使用数组和链表的结合。还有C++,一般使用的都是unordered_set,unordered_map。

突出的就是一个存储位置和值的对应关系(书上写的是关键字,,实际上就是值,看书上的强迫症都犯了

比如计算存储位置(索引)的方法之一   Hash(value) =  value %p,这个被称为除留取余法。不过这个方法,这样的表现形式是使用数字做取余运算的方式。如果存储其他类型数据可能需要看情况转化成可使用数字做索引的方式了。(突然发现,这个索引的计算,有点像是计算某个范围内随机值的感觉  )

2、还有一点,这个hash表,更多的是突出一个散列的存储

        根据下面例子我们就可以发现,只是使用字符的ascii码差值做索引,来记录相同字符的个数,这字符的字符数据之间没有直接的关联关系什么的。

        这个例子就有点像:点到原点的距离。这些字符串中的字符,有多少到原点a的距离是相同的比如:n - a = 20,就相当于我们设定好了,n的位置就存放在数组的位置 record [20]处,而我们需要计算的是有多少点的位置在里。直接给record[20] ++.

 2、代码题示例

#include <iostream>
#include <stdio.h>
#include <string>using namespace std;
bool isAnagram(string s, string t);
int main()
{string s("anagram");string t("nagaram");isAnagram(t,s);
}bool isAnagram(string s, string t){    // s = anagram   t = nagaramint record[26] = {0};if(s.size()!= t.size()){return false;}for(int i = 0; i < s.size(); i++)  {record[s[i] - 'a']++;      //一开始接触这个也是没反应过来,实际上就是 用字母去减字母,这种情况下,都是使用askii码进行相加减}                               //这个操作就相当于记录一个标志值,因为26个英文字母在ascii中是连续的,所以其他字母和a的差值不会超过25/26//至于我为啥用25/26呢,因为确实记不清a是多少了    不过作为数组record的下标,不会超过26//上面的这个可以发现如果相同的字母减a,那么那个下标的值就会+1.//当两个字符串的字母一样时,如果用同样的数组记录,结果应该就是一样的,字符串t//比如  : t有三个a, 结果遍历字符的时候,a-a 的ascii值,是一样的,有三个,所以record['a' - 'a'] ==3;//这个时候,如果我们做个相反的计算 record[]-=1; 是不是遍历结束后,record[0]的位置就是0 .其他的字符也一样for(int i = 0; i < t.size(); ++i){record[t[i]-'a']--;}//上面两步操作完,数组里如果都是0,就表示两个字符串的字符一样。顺序不同 。这有点那个信号量控制共享资源的感觉for(int i = 0; i < 26; i++){if(record[i]!=0){return false;}}cout << "t 和s 是互为字母异位词"<< endl;return true;
}

3、哈希表的链地址法 

        基本上就是使用一个数组,去存储链表的头指针。然后将数据根据我们设定的索引规则,存储在特定的索引地址下。

这个我们也可以用来做索引数据结构啥的,在标准模板库STL中的无需关联式容器使用的就是链地址法。(用来解决hash冲突)        

这个网上挺多的,就是需要注意一个装填因子的问题, 装填因子/装载因子= 元素个数/表长=0.5~0.75   这个值在这个范围之间就比较合适。再多了,可能需要更换数据结构。、

比如C++有序关联式容器中使用红黑树去存储数据(目前还没扣明白,等搞明白了写上。)

使用epoll 的时候,这个底层实现也是使用红黑树去实现的。(因为select 底层就是一个位图,可以当成个数组,大概能监听1024个文件描述符。而epoll好像在10万以上)

//哈希表的用途,可以用来做缓存(比如服务器使用哈希表做缓存机制,缓存用户的id,作为key;value 用来存储用户详细信息等,查询起来方便,就不用每次都向服务器发送请求了)

这篇关于哈希表-示例(这个还是实际的功能应用更便于理解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589475

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

C#中DateTime的格式符的实现示例

《C#中DateTime的格式符的实现示例》本文介绍了C#中DateTime格式符的使用方法,分为预定义格式和自定义格式两类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录DateTime的格式符1.核心概念2.预定义格式(快捷方案,直接复用)3.自定义格式(灵活可控

MyBatisPlus乐观锁和悲观锁的实现示例

《MyBatisPlus乐观锁和悲观锁的实现示例》本文主要介绍了MyBatisPlus乐观锁和悲观锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录1.场景2.乐观锁和悲观锁3.乐观锁实现4.悲观锁1.场景一件商品,成本价是80元,售价是10

Java中@Accessors使用的实现示例

《Java中@Accessors使用的实现示例》本文主要介绍了Java中@Accessors使用的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、@Accessors(chain = true)二、@Accessors(fluent =

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.