数据结构——哈希表

devtools/2025/2/22 19:17:59/

一、哈希表

  1.1 哈希表的概念

        散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

        例如:字典

  1.2 哈希函数的构建

        1> 直接定址法:取关键字或关键字的某个线性函数值为哈希地址的方法

        2>数字分析法:通过分析取关键字的若干数位组成哈希地址的方法

        3>平方取中法:取关键字平方后的中间几位数组成哈希地址的方法

        4>除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址的方法

        H(key)=key MOD p (p

        m: 元素的个数除以3/4

        p一般取不大于表长m的最大质数

  1.3 哈希冲突

        1.哈希冲突:不同的关键码值通过哈希函数映射在同一片内存

        2.线性探测法:di=1,2,3,…,m-1,即从冲突地址向后依次查找空闲地址的处理冲突方法

        3.二次探测法:di=12,- 12 ,22,-22,32,…,±k2,(k≤m/2)即从冲突地址向前后以整数二次方为增量查找空闲地址的处理冲突方法

        4.伪随机探测法:di为确定的伪随机数序列(如3,5,8…),即将冲突地址加上序列中的伪随机数以查找空地址的处理冲突方法

        5.再哈希法:在发生冲突时使用另一个哈希函数计算地址,直到不再发生冲突

        6.链地址法:将所有哈希函数值相同的记录存储在同一线性链表中

        7.建立公共溢出区:一旦发生冲突,都填入溢出表

  1.4 创建哈希表、插入表值、输出哈希表

    1.4.1 head.h

#ifndef __HEAD_H__
#define __HEAD_H__#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef int datatype;
typedef struct Node
{datatype data;struct Node *next;
}*Hashlist;Hashlist creat_list();
int max_prime(int m);
void insert_hash(int key,Hashlist hash[],int m);
void output(Hashlist hash[],int m);#endif

    1.4.2 main.c

#include "head.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, const char *argv[])
{int arr[]={25,51,8,22,26,67,11,16,54,41};int len=sizeof(arr)/sizeof(arr[0]);int m=len*4/3;Hashlist hash[m];for(int i=0;i<m;i++){hash[i]=NULL;}for(int i=0;i<len;i++){insert_hash(arr[i],hash,m);}output(hash,m);return 0;
}

    1.4.3 fun.c

#include "head.h"
Hashlist creat_list()
{Hashlist s=(Hashlist)malloc(sizeof(struct Node));if(NULL==s)return NULL;s->data=0;s->next=NULL;return s;
}int max_prime(int m)
{for(int i=m;i>=3;i++){int flag=1;for(int j=2;j<=sqrt(i);j++){if(i%j==0){flag=0;break;}}if(flag==1){return i;}}
}void insert_hash(int key,Hashlist hash[],int m)
{int p=max_prime(m);int sub=key%p;Hashlist s=creat_list();s->data=key;if(NULL==hash[sub]){hash[sub]=s;return;}else{s->next=hash[sub];hash[sub]=s;return;}
}void output(Hashlist hash[],int m)
{for(int i=0;i<m;i++){printf("%d:\t",i);Hashlist p=hash[i];while(p!=NULL){printf("%d ",p->data);p=p->next;}putchar(10);}putchar(10);
}


http://www.ppmy.cn/devtools/161005.html

相关文章

认识HTML的标签结构

一、HTML的基本概念 1.什么是HTML&#xff1f; ①HTML是描述网页的一种标记语言&#xff0c;也被称为超文本标记语言【并不是一种编程语言】 ②HTML包含了HTML标签和文本内容 ③HTML文档也称为web页面 2.HTML的标签 HTML的标签通常成对出现&#xff0c;HTML文档由标签和受…

nats集群搭建

本次使用三台机器搭建nats集群&#xff0c;ip分别为192.168.20.7、192.168.20.8、192.168.20.10&#xff0c;预先在三台机器上装好nats&#xff0c;版本为0.0.35。 1. 在192.168.20.7机器上操作&#xff0c;配置server.conf # 为节点设置唯一的名称 server_name: node1 port: …

多场景建模在得物交易搜索下的创新与实践

一、整体概述 2024年得物算法团队基于交易搜索的场景特点与数据现状&#xff0c;围绕“多场景建模”开展了一系列工作&#xff0c;取得了较大幅度的在线业务指标提升&#xff1b;同时我们利用碎片时间将积累的技术经验形成相应的论文&#xff0c;成功被搜索推荐/数据挖掘领域顶…

计算机网络:应用层 —— 域名系统 DNS

文章目录 什么是域名系统 DNS&#xff1f;域名系统DNS的作用域名结构顶级域名二级域名因特网的域名空间 域名服务器域名解析的过程递归查询迭代查询 DNS本地高速缓存总结 什么是域名系统 DNS&#xff1f; 域名系统&#xff08;DNS&#xff0c;Domain Name System&#xff09;是…

OpenCV(5):图像形态学操作

图像形态学操作是图像处理中的一种重要技术&#xff0c;主要用于处理二值图像&#xff08;即黑白图像&#xff09;。OpenCV 中的图像形态学操作是图像处理中的重要工具&#xff0c;通过腐蚀、膨胀、开运算、闭运算和形态学梯度等操作&#xff0c;可以实现对图像的噪声去除、对象…

x86平台基于Qt+opengl优化ffmpeg软解码1080P视频渲染效率

一般的在arm嵌入式平台&#xff0c;大多数板子都要硬解码硬件渲染的框架&#xff0c;使用即可。 在x86下比较麻烦了。 优化的思路一共有以下几个方面&#xff0c; 1. 软解码变成硬解码 2. 将YUV转QImage的操作转移到GPU 3. QWidget渲染QImage变成opengGL渲染AVFrame 这三点…

影视大数据分析新范式:亮数据动态代理驱动的实时数据采集方案

一、项目背景与挑战 在数据驱动决策的时代&#xff0c;影视数据分析对内容平台至关重要。但豆瓣等平台设有&#xff1a; 高频请求IP封禁机制User-Agent指纹检测请求频率阈值控制验证码验证系统 传统爬虫方案面临&#xff1a; 单一IP存活时间<5分钟采集成功率<30%数据更新…

在UBUNTU下搭建Deepseek

在UBUNTU下搭建Deepseek 一、安装UBUNTU 这个就不多说了&#xff0c;无外乎下载UBUNTU的iso&#xff0c;然后用UltraIso制作U盘&#xff0c;然后重启设置启动盘&#xff0c;安装… 二、安装Ollama curl -sSfL https://ollama.com/install.sh | sh这里可能需要你先安装curl工…