首页 > 其他分享 >哈希表原理

哈希表原理

时间:2024-07-15 20:00:32浏览次数:14  
标签:map 哈希 int 键值 key 原理 include

哈希表(键值对)

键(key):类似于数组的下标,可以为任意类型,但是不能重复

值(val) :类似于数组的元素,可以为任意类型哈希表不存在元素访问溢出的情况,只要访问未创建的元素,便会创建一个值为0的键值对

哈希表的插入:

//方法一:

【】法(中括号法)

//方法二:

insert()函数插入法

#include <iostream>
#include <string>
#include<unordered_map> //无序哈希表
#include<map>  //有序哈希表
using namespace std;
/*
哈希表(键值对)
键(key):类似于数组下标,可以是任意类型,但不能重复
值(val):类似于数组中的元素
*/
int main() {
    unordered_map<int ,char > map;//创建 键:int类型   值: char类型 的哈希表
    unordered_map<int , int > map1;
//向哈希表中插入元素
    //[]法 (【】本质为运算符)
    map[1] = 'a';
    map1[1] = 111;
    map1[2] = 222;
    cout << map1[2] << endl;
    cout << map1[3] << endl;//map1[3]中没有元素,因此会在map1[3]中插入(3,0)
    //insert()函数法
    pair<int, int > p = make_pair(7, 7);//创建pair数据对
    cout << "pair的第一个元素是:" << p.first << "pair的第二个元素是:" << p.second << endl;
    map1.insert(p);//利用insert传入数据对p
    map1.insert(make_pair(8, 8));//利用insert传入make_pair()
    return 0;
}

利用哈希表的迭代器

  • 查询key的val
  • 循环赋值
  • 遍历哈希表
  • #include <iostream>
    #include <string>
    #include<unordered_map> //无序哈希表
    #include<map>  //有序哈希表
    using namespace std;
    /*
    哈希表(键值对)
    键(key):类似于数组下标,可以是任意类型,但不能重复
    值(val):类似于数组中的元素
    */
    int main() {
        unordered_map<int, int > map;//创建 键:int类型   值: char类型 的哈希表
        unordered_map<int, int >::iterator it;//哈希表的迭代器
        for (int i = 0; i < 5; i++) {
            map[i] = i;
        }
        it = map.begin();//map.begin()返回指向哈希表首元素的迭代器
        //map.end():返回指向哈希表最后一个元素的下一位的迭代器
     for(const auto &it:map){//争强for循环哈希表
     //其中的it代表的是map哈希表里面的各种元素
     //auto(推断类型,根据赋值的类型推断变量的类型)
         cout<<it.first<<" "<<it.second<<endl; 
     }
        for (; it != map.end(); it++) {//迭代器遍历哈希表
            cout << it->first << " " << (*it).second << endl;
            //->和* 两种不同的方式返回迭代器指向的两个值
        }
        //查找find(key);如果存在键为key的键值对,返回该键值对对应的迭代器,否则返回end();
        if (map.find(3) != map.end()) {
            cout << "找到了" << endl;
        }
        else {
            cout << "没找到" << endl;
        }
        return 0;
    }

    无序哈希表的实现(unordered_map):

    无序哈希表:在键盘输入的键值对会随机分配成任意的顺序

    无序哈希表的组成:数组+哈希函数

    原理:

    无序哈希表在存储数据的时候,会将键(key)放入到哈希函数中进行计算

    哈希函数会返回对应的一个int类型的数值n

    紧接着会对n进行 处余桶个数的计算=i(桶:类似于数组),其返回值必然是小于桶的整数

    于是会将值(valval)存储到对应的桶的 i(下标)处

    因此,在经历上述操作下,存入哈希表的数值将会以乱序(非人为输入数)的形式进行存储

哈希函数:

一般的哈希函数都是采用除留余数法(f(key) % m)m不会超过表长

哈希函数的特征:

1、输入域 f(string)无穷大(输入可以是字符串),输出域有限(int类型的范围限制)

2、有可能不同的输入对应相同的输出(哈希表冲突)

3、如果输入的参数是相同的,那么输出一定是相同的,没有任何的随机成分(查找、删除、修改)

4、均匀性:类似的输入,通过打乱,得到均匀的输出

哈希冲突的解决方法(哈希碰撞):

1、线性冲突再散列:(无脑硬算法)

对于val=99的这个数据,经过哈希函数求得,应放入key=2的位置,但是key=2的位置存在数据,因此将会一位一位的向后进行查找,直到发现val为空的哈希表位置,并且将其存入

2、再哈希表法:(无脑硬算法)

类似于【线性冲突再散列】的方法,一旦发现有key的位置发生碰撞,那么会在100多种哈希函数中寻求另外一种哈希函数,直到没有位置冲突为止

3、链地址法(java hashmap 就是采用的这种方法)

在c++和java的哈希表中,都是采用该方法

【数组】+【链表】+【哈希函数】,其时间和空间复杂度大概接近于 O(1)

4、建立一块公共溢出区

在发生哈希碰撞的时候,将冲突的数据放入该公共溢出区,以此来解决哈希冲突

标签:map,哈希,int,键值,key,原理,include
From: https://blog.csdn.net/s386199/article/details/140420039

相关文章

  • 【笔记】Nmap工具原理探索
    【笔记】Nmap工具原理探索原文章:【THM】Nmap(Nmap工具使用简介)-学习-Hekeatsll-博客园(cnblogs.com)Nmap是一款跨平台的开源端口扫描软件,它用来扫描计算机的开放端口,以确定运行的网络服务,并推断出计算机运行的操作系统Nmap三种基本扫描类型TCP连接扫描(-sT)工作原理:通过......
  • 雷达1——基本原理
    雷达1——基本原理1雷达的原理以及基本组成1.1雷达工作原理简介雷达是利用目标对电磁波的反射(或称为二次散射)现象来发现目标标并测定其位置的。当雷达探测到目标后,就要从目标标回波中提取有关信息:可对目标的距离和空间角度定位,目标位置的变化率可由其距离和角度随时......
  • 【AI原理解析】—KAN原理
    目录一、理论基础与数学表示二、网络结构与特点1.权重与激活函数的创新2.节点与边的角色3.B样条表示三、学习机制与训练过程四、优势与应用1.优势2.应用五、未来展望Kolmogorov-ArnoldNetworks(KANs)是一种创新的神经网络架构,其独特的设计使其在处理复杂函数......
  • 浏览器工作原理
    摘要本文是学习极客时间上的课程,进而整理出的浏览器工作原理。第一部分:浏览器的进程和线程(1)进程和线程的区别?在浏览器中,各个进程负责处理自己的事情,而不同的进程中,也有线程之间相互配合,所以在了解浏览器的工作原理之前,要明白进程和线程之间的区别。线程不能单独存在,它要由进......
  • 硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型
    前言  电阻,电容,电感还有各种基础的电子元器件、连接器和IC构成了各种实现功能的电子电路。  本篇介绍电感,并将贴片电感封装导入AD21,预览其三维模型。 贴片电感  贴片电感作为电子元件中的重要一员,因其小型化、高品质、高能量储存和低电阻等特性,在电子线路中发挥......
  • AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教
    大家好,我是设计师阿威想要入门AI绘画,首先需要了解它的原理是什么样的。其实很早就已经有人基于深度学习模型展开了对图像生成的研究了,但在那时,生成的图像分辨率和内容都非常抽象。直到近两年,AI产出的图像内容的质量变高、而且有一定的艺术价值,这时它才算正式拥有了理......
  • 大语言模型的原理
    大语言模型(LargeLanguageModels,LLMs)是深度学习领域的一个重要分支,它们通过大规模的文本数据训练,能够理解和生成人类语言。这些模型通常基于Transformer架构,具有以下核心组件和原理:Transformer架构自注意力机制(Self-Attention):允许模型在处理序列数据时关注输入序列中的不......
  • 一文读懂Java线程池之线程复用原理
    什么是线程复用在Java中,我们正常创建线程执行任务,一般都是一条线程绑定一个Runnable执行任务。而Runnable实际只是一个普通接口,真正要执行,则还是利用了Thread类的run方法。这个rurn方法由native本地方法start0进行调用。我们看Thread类的run方法实现/*Whatwillberun.......
  • 面试题之一文搞定浏览器的渲染原理
    浏览器渲染原理:听过了渡一袁老师的讲解,感觉收获满满,进行一下总结从服务器获取的HTML字符串渲染到页面的整体过程包括以下几步:解析HTML样式计算布局分层生成绘制指令分块光栅化绘制解析HTML:整体过程:解析html代码,生成DOM和CSSOM树在解析的过程中,会遇......
  • elasticsearch性能调优方法原理与实战
    ❃博主首页:「码到三十五」,同名公众号:「码到三十五」,wx号:「liwu0213」☠博主专栏:<mysql高手><elasticsearch高手><源码解读><java核心><面试攻关>♝博主的话:搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,......