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

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 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的