hash与map的区别联系应用

2023-11-13

一,hashtable原理:

哈希表又名散列表,其主要目的是用于解决数据的快速定位问题。考虑如下一个场景。

一列键值对数据,存储在一个table中,如何通过数据的关键字快速查找相应值呢?不要告诉我一个个拿出来比较key啊,呵呵。

大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找。而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的。

具体如何做呢?大家是否有注意到前面说的话:“数组可以通过下标直接定位到相应的空间”,对就是这句,哈希表的做法其实很简单,就是把Key通过一 个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标 的数组空间里,而当使用哈希表进行查询的时候,就是再次使用哈希函数将key转换为对应的数组下标,并定位到该空间获取value,如此一来,就可以充分 利用到数组的定位性能进行数据定位。

不知道说到这里,一些不了解的朋友是否大概了解了哈希表的原理,其实就是通过空间换取时间的做法。到这里,可能有的朋友就会问,哈希函数对key进 行转换,取余的值一定是唯一的吗?这个当然不能保证,主要是由于hashcode会对数组长度进行取余,因此其结果由于数组长度的限制必然会出现重复,所 以就会有“冲突”这一问题,至于解决冲突的办法其实有很多种,比如重复散列的方式,大概就是定位的空间已经存在value且key不同的话就重新进行哈希 加一并求模数组元素个数,既 (h(k)+i) mod S , i=1,2,3…… ,直到找到空间为止。还有其他的方式大家如果有兴趣的话可以自己找找资料看看。


2 hash_map和map的区别在哪里?
构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。

3 什么时候需要用hash_map,什么时候需要用map?
总 体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且 hash_map的构造速度较慢。
现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。


4 map基本原理介绍:


用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:

岳不群-华山派掌门人,人称君子剑
张三丰-武当掌门人,太极拳创始人
东方不败-第一高手,葵花宝典
...
 

这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按 照名字一个一个比较。如果要速度快,就需要把这些记录按照字母顺序排列,然后按照二分法查找。但是增加记录的时候同时需要保持记录有序,因此需要插入排 序。考虑到效率,这就需要用到二叉树。讲下去会没完没了,如果你使用STL 的map容器,你可以非常方便的实现这个功能,而不用关心其细节。关于map的数据结构细节,感兴趣的朋友可以参看学习STL map, STL set之数据结构基础。看看map的实现:


原文地址:http://www.cnblogs.com/lidabo/archive/2013/08/12/3253045.html


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hash与map的区别联系应用 的相关文章

  • 114DNS Public DNS+ 阿里DNS 百度DNS 360 DNS派 Google DNS

    为什么80 的码农都做不了架构师 gt gt gt 114DNS 腾讯dnspod DNS 阿里DNS 百度DNS 360DNS Google DNS公 共DNS评测体验报告从ping及dig返回时间对比测试 国内DNS普遍很快 而阿里DN
  • 在react中使用redux并实现计数器案例

    React Redux 在recat中不使用redux 时遇到的问题 在react中组件通信的数据是单向的 顶层组件可以通过props属性向下层组件传递数据 而下层组件不能向上层组件传递数据 要实现下层组件修改数据 需要上层组传递修改数据的
  • Matplotlib 散点图 绘制详解

    目录 基础 点的大小 点的颜色 透明度 颜色条 多组散点 1 散点图 基础 代码 import matplotlib pyplot as plt import numpy as np 第一组散点 x np array 1 2 3 4 5 6
  • 在C++上利用onnxruntime (CUDA)和 opencv 部署模型onnx

    概述 将得到的模型转化为onnx模型 加载到c 中运行 来完成模型的部署 下载并安装onnxruntime CMakeLists txt cmake minimum required VERSION 2 8 project test 使用c
  • 一起学nRF51xx 10 -  rng

    前言 随机数产生器 RNG 的结构 随机数发生器 RNG 根据内部热产生真实的非确定性随机数噪音 RNG通过触发START任务启动 并通过触发STOP任务停止 当随机数已经生成 它会产生一个VALRDY事件 同时把随机数存入VALUE寄存器
  • 智慧城市领域大单,巨头占尽优势

    智慧城市领域 哪个公司做的比较好 一 前言 二 智慧城市中标大单 清单 三 中标厂商分析 1 华为 2 科大讯飞 3 腾讯 4 阿里 5 中国电科 6 中国电子 7 百度 8 数字广东 四 获取 智慧城市等全套最新解决方案合集 一 前言 在
  • python eclipse+pydev(An error has occurred when creating this preference page)

    Eclipse 安装pydev Help gt Install New Software gt add gt Location http pydev org updates 点击pydev左边的小三角勾选pydev for eclipse
  • Shell init Ubuntu

    echo HISTFILESIZE 99999 gt gt bashrc echo HISTSIZE 99999 gt gt bashrc echo HISTTIMEFORMAT F T gt gt bashrc echo PROMPT C
  • Thrift原理简析(JAVA)

    Apache Thrift是一个跨语言的服务框架 本质上为RPC 同时具有序列化 反序列化机制 当我们开发的service需要开放出去的时候 就会遇到跨语言调用的问题 JAVA语言开发了一个UserService用来提供获取用户信息的服务
  • CUDA编程 基础与实践 学习笔记(十)

    线程束 warp 一个GPU由多个SM组成 一个SM上可以放多个线程块 不同线程块之间并行或顺序执行 一个线程块分为多个线程束 一个线程束由32个线程 有连续的线程号 组成 从更细粒度来看 一个SM以一个线程束为单位产生 管理 调度 执行线
  • Java面向对象 - 封装、继承和多态

    第1关 什么是封装 如何使用封装 相关知识 为了完成本关任务 你需要掌握 1 什么是封装 2 封装的意义 3 实现Java封装的步骤 package case1 public class TestPersonDemo public stat
  • GoLang之”奇怪用法“实践总结

    2013 11 23 wcdj 0 摘要 本文通过对A Tour of Go的实践 总结Go语言的基础用法 1 Go语言 奇怪用法 有哪些 1 go的变量声明顺序是 先写变量名 再写类型名 此与C C 的语法孰优孰劣 可见下文解释 http
  • 销售心理学

    销售中的心理学 影响你一生的销售心理学书籍 要想钓到鱼 就要像鱼一样思考 在生活中 如果想钓到鱼 你就得像鱼那样思考 而不是像渔夫那样思考 当你对鱼了解得越多 你也就越来越会钓鱼了 这样的想法用在销售中同样适用 要知道 销售的过程其实就是销
  • 【Redis17】Redis进阶:管道

    Redis进阶 管道 管道是啥 我们做开发的同学们经常会在 Linux 环境中用到管道命令 比如 ps ef grep php 在之前学习 Laravel框架时的 Laravel6 4 管道过滤器https mp weixin qq com
  • Latex使用

    问题 在使用latex的过程中插入图片 在某些条件下 图片可能会出现越过后续的文字出现在下一页的页首 解决办法 在该tex文件首部加上 usepackage stfloats 然后参数设置成H如下 begin figure H center
  • 使用frp 实现内网穿透 & 将私人电脑变成一个服务器

    使用frp 实现内网穿透 frp 是什么 frp 是一个可用于内网穿透的高性能的反向代理应用 支持 tcp udp 协议 为 http 和 https 应用协议提供了额外的能力 且尝试性支持了点对点穿透 作用 比如你需要用到云服务器部署你的

随机推荐

  • 阅读GFS论文

    GFS论文发表距今已经十几年了 据之开源的hdfs也已经在业界得到了广泛应用 为了取得分布式系统的真经 拜读一下这篇经典论文 重要假设 软硬件失败乃家常便饭 我们写大文件 不屑小文件 文件改动的主流是追加新数据 随机写是非主流 一旦写完 仅
  • Neon Instruction C支持的向量运算

    转载请标明出处 https blog csdn net u013752202 article details 92008843 文章目的 快速索引到需要的向量运算 vadd gt ri ai bi 1 Vector add 正常指令 r a
  • pagehelper使用方法及参数说明

    pagehelper使用方法及参数说明 使用方法 Override public PageInfo
  • spring源码--10--IOC高级特性--autowiring实现原理

    spring源码 10 IOC高级特性 autowiring实现原理 1 Spring IoC容器提供了2种方式 管理Bean的依赖关系 1 1 显式管理 通过BeanDefinition的属性值和构造方法实现Bean依赖关系管理 1 2
  • vue学习笔记:在vscode中使用@提示路径

    在vscode中输入 后如果可以智能提示路径 可以有效防止路径名称输入错误 减少不必要的麻烦 效果如下图所示 安装 Path Autocomplete 插件后可以实现路径的智能提示 步骤如下 1 在vscode中查找Path Autocom
  • 关于shell运行python文件中的错误——shell脚本换行

    问题 https ask csdn net questions 7900411 spm 1001 2014 3001 5505 问题由来 由于工程需要在本地window中写 当需要比较少的算力时在本地跑 当需要比较大的算力时就需要在auto
  • K8S调用GPU资源配置指南

    06 09 K8S调用GPU资源配置指南 时间 版本号 修改描述 修改人 2022年6月9日15 33 12 V0 1 新建K8S调用GPU资源配置指南 编写了Nvidia驱动安装过程 2022年6月10日11 16 52 V0 2 添加K
  • 基于pytorch的手势识别

    本次实验主要是使用pytorch完成手势识别 网络包含两个隐藏层 第一层隐藏层有576个节点 第二层隐藏层有144个节点 输入784个节点 图片大小为28 28 输出10个节点 10种手势 目录 1 数据集处理 2 神经网络的建立 3 神经
  • 利用ajax添加到购物车代码,Woocommerce添加到购物车链接Ajax在其他帖子或页面中启用...

    要在自定义添加到购物车按钮中启用ajax 至少有3种方法 A simple HTML Ajax add to cart link Add to cart Using Woocommerce existing add to cart id 1
  • Axios 入门教程

    Axios Get Post 别名方式 Get Post Axios 引入 axios 的 js 文件 使用 axios 发送请求 并获取响应结果axios method get url then function resp alert r
  • 【NOIP2012】开车旅行(倍增)

    题面 Description 小A 和小B决定利用假期外出旅行 他们将想去的城市从1到N 编号 且编号较小的城市在编号较大的城市的西边 已知各个城市的海拔高度互不相同 记城市 i的海拔高度为Hi 城市 i 和城市 j 之间的距离 d i j
  • var、let、const的区别

    var let const的区别 大体区别 const定义的变量不可以修改 而且必须初始化 var定义的变量可以修改 如果不初始化会输出undefined 不会报错 var定义的变量没有块的概念 可以跨酷爱访问 不能跨函数访问 let是块级
  • 【华为OD机试真题】投篮大赛(C++&java&python)100%通过率 超详细代码注释 代码优化

    华为OD机试真题 2022 2023 真题目录 点这里 华为OD机试真题 信号发射和接收 试读 点这里 华为OD机试真题 租车骑绿道 试读 点这里 投篮大赛 知识点字符串 时间限制 1s空间限制 256MB限定语言 不限 题目描述 你现在是
  • dbnet训练_1215

    https blog csdn net hhhhhhhhhhwwwwwwwwww article details 123904386 ops request misc 257B 2522request 255Fid 2522 253A 25
  • java使用jdbc操作数据库

    一 概述 为了持久化 方便管理数据 出现了mysql sqlserver等多种数据库 我们可以直接这些数据库中使用sql语言增删改查管理数据 但是对于业务人员来说不懂sql 没法通过sql直接在数据库操作 所以我们要通过程序提供对数据库的操
  • 用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)

    本文主要总结用Qt的自定义按钮和QWidget界面实现QQ好友列表的界面伸展和收缩功能 以及鼠标滑过 鼠标单击的QSS样式表效果 全文分为两大部分 分别是原理讲解和效果实现 抽缩界面效果图 源代码下载地址 https download cs
  • 增量测试:自顶向下测试&自底向上测试

    本博客主要内容 自顶向下测试和自底向上测试的优缺点 软件开发周期流程 不同的测试方法针对不同的测试阶段 一 自顶向下测试 优点 1 如果主要的缺陷发生在程序的顶层将非常有利 2 一旦引入I O功能 提交测试或更容易 3 早期的程序框架可以进
  • VS2013,MFC,在视图类里添加鼠标左键响应函数OnLButtonDown

    以CVoronoi2D为例子 点击类视图的View 右击选择类向导 选择WM LBUTTONDOWN 鼠标左击响应函数 然后点击添加处理程序 代码会自动生成一个响应函数 如图 如果对您有帮助 可以评论一下 谢谢
  • 失败的人生图片_人到中年,做事失败了,很可能是遇到了以下五种情况

    人至中年 也到了迈入成功大门的时刻 但并非每个人都能在中年获得成功 相反 有不少人却在中年的时候失败 人至中年面临失败 其实原因有很多 但大多数情况下 可能是遇到了以下五种情况 究竟有哪五种情况呢 如果您想知道 就让小编来为您揭秘 本文所有
  • hash与map的区别联系应用

    一 hashtable原理 哈希表又名散列表 其主要目的是用于解决数据的快速定位问题 考虑如下一个场景 一列键值对数据 存储在一个table中 如何通过数据的关键字快速查找相应值呢 不要告诉我一个个拿出来比较key啊 呵呵 大家都知道 在所