数据结构学习——表、查找

news2024/11/19 4:27:26

定义

  • 设记录表L=(R1 R2…其中Ri(L<=i<=n)为记录, 对给定的某个值k,
    在表L中确定key= k的记录的过程,称为查找。
  • 若表Lz中存在记录Ri de key = k,记为Ri.key,则查找成功,返回该记录在表L中的序号i(或Ri的地址),否者(查找失败)返回0(或空地址NULL )

查找方法有顺序查找、折半查找、分块查找、Hash表查找等
查找算法的优劣影响到计算的使用效率,应根据应用场合选择响应的查找算法。

对于查找算法,主要分析其T(n)(时间复杂度),一般以“平均查找长度”来衡量T(n)
平均查找长度ASL (Average Search Length) :对给定k,查找表L
中记录比较次数的期望值(或平均值),即:
在这里插入图片描述
Pi为查找Ri的概率。等概率情况下Pi=1/n; Ci为查找Ri时key的比较次数(或查找次数)。

哈希表

理想的查找方法是:对给定的k,不经任何比较便能获取所需的记录,其查找的时间复杂度为常数级0©。
这就要求在建立记录表的时候,确定记录的key与其存储地址之间的关系f,即使key与记录的存放地址H相对应:
在这里插入图片描述
当要查找key=k的记录时,通过关系就可得到相应记录的地址而获取记录,从而免去了key的比较过程。
这个关系f就是所谓的Hash函数(或称散列函数、杂凑函数) ,记为
H(key)。
它实际上是一个地址映象函数,其自变量为记录的key,函数值为记录的存储地址(或称Hash地址)。
不同的key可能得到同一个Hash地址,即当key;≠key,时, 可能有
H(key)=H(key2),此时称key 和key2为同义词。这种现象称为“冲突"
或“碰撞”,因为一个数据单位只可存放一条记录,
一般, 选取Hash函数只能做到使冲突尽可能少,却不能完全避免。这就要求在出现冲突之后,寻求适当的方法来解决冲突记录的存放问题。
一般, 选取Hash函数只能做到使冲突尽可能少,却不能完全避免。这就要求在出现冲突之后,寻求适当的方法来解决冲突记录的存放问题。
在这里插入图片描述
选取(或构造) Hash函数的方法很多,原则是尽可能将记录均匀分布,以减少冲突现象的发生。以下介绍几种常用的构造方法。
直接地址法
平方取中法
叠加法
保留除数法
随机函数法

保留除数法

又称质数除余法,设Hash表空间长度为m,选取-个不大于m的最大质数p,令:H(key)=key%p
表的填充因子a:0.7-0.8左右,(需要存储的的数据占存储空间的比例)
a = n / m (n :需要存储的数据个数)

链式hash的实现

hash.c

#include "hash.h"


hash* hash_creat(){
    hash *HT;
    if((HT = (hash *)malloc(sizeof(hash)))== NULL){
        printf("HT malloc is failed \n");
        return NULL;
    }
    memset(HT,0,sizeof(hash));

    return HT;
}
int hash_insert(hash *HT, datatype key){
    linklist p,q;

    if(HT == NULL){
        printf("HT is NULL\n");
        return -1;
    }

    if((p = (linklist)malloc(sizeof(listnode))) == NULL){
        printf("HT is NULL\n");
        return -1;
    }
    p->key = key;
    p->value = key % N;
    p->next = NULL;

    q = &(HT->data[key % N]);

    while (q->next && q->next->key < p->key)
    {
       q = q->next;
    }
    p->next = q->next;
    q->next = p;
    printf("key = %d\n",key);
    return 0;
}
linklist hash_search(hash *HT,datatype key){
    linklist p;
    
    if(HT == NULL){
        printf("HT is NULL\n");
        return NULL;
    }

    p = &(HT->data[key%N]);

    while (p->next && p->next->key < key)
    {
       p = p->next;
    }

    if(p->next == NULL){
        return NULL;
    }else{
        printf("found2\n");
        return p->next;
    }
    
    return NULL;
}

hash.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include “hash.h”

hash * hash_create() {
hash * HT;

if ((HT = (hash *)malloc(sizeof(hash))) == NULL) {
	printf("malloc failed\n");
	return NULL;
}

memset(HT, 0, sizeof(hash));

return HT;

}

int hash_insert(hash *HT, datatype key) {
linklist p, q;

if (HT == NULL) {
	printf("HT is NULL\n");
	return -1;
}

if ((p = (linklist)malloc(sizeof(listnode))) == NULL) {
	printf("malloc failed\n");
	return -1;
}
p->key = key;
p->value = key % N;
p->next = NULL;

q = &(HT->data[key % N]);

while (q->next && q->next->key < p->key ) {
	q = q->next;
}

p->next = q->next;
q->next = p;

return 0;

}

linklist hash_search(hash *HT, datatype key) {
linklist p;

if (HT == NULL) {
	printf("HT is NULL\n");
	return NULL;
}

p = &(HT->data[key % N]);

while (p->next && p->next->key != key) {
	p = p->next;
}

if (p->next == NULL) {
	return NULL;
} else {
	printf("found\n");
	return p->next;
}

}

main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"
int test();
int main(){
    printf("main start\n");
    test();

    return 0;
}

int test(){
    printf("test start\n");
    hash *HT;
    datatype key;
    int data[] = {24,35,74,29,36,96,48,55,6,13,62};
    int i;
    linklist r;
    if((HT = hash_creat()) == NULL){
        printf("HT is NULL\n");
        return -1;
    }

    for(i = 0; i<sizeof(data)/sizeof(int); i++){
        hash_insert(HT,data[i]);
    }

    printf("input:");
    scanf("%d",&key);
    r = hash_search(HT,key);
    if(r == NULL){
        printf("not found\n");
    }else{
        printf("found:%d %d\n",key,r->key);
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优秀的 Verilog/FPGA开源项目介绍(二十)- 张量处理单元(TPU)

介绍张量处理单元( Tensor Processing Unit, TPU ) 是谷歌专门为神经网络机器学习开发的人工智能加速器 专用集成电路(ASIC) &#xff0c;特别是使用谷歌自己的TensorFlow软件。谷歌于 2015 年开始在内部使用 TPU&#xff0c;并于 2018 年将它们作为其云基础设施的一部分并通过…

Zabbix6.0使用教程 (三)—zabbix6.0的安装要求

接上篇&#xff0c;我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署。接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍。本篇讲的是部署zabbix6.0的要求。 zabbix6.0安装要求 硬件&#xff1a;内存和磁盘 Zabbix6.0安装 运行需要物…

算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)

目录 前言 DP问题它是什么&#xff08;了解&#xff09; 从中学的例题谈起 再来说一下&#xff0c;DP问题的核心思想&#xff08;理解&#xff09; DP问题的解决方法 先说方法论&#xff1a; 再说具体的例子 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; DP和…

kotlin之range范围表达式

Kotlin 中的 Range 有 CharRange、LongRange、IntRange range 范围 CharRange、LongRange、IntRange 范围区间 var a:IntRange 50..100for (i in a){ //遍历50~100的分数分别在什么位置print("成绩&#xff1a;$i")if(i in 1..59){ //1~59 范围println("…

Leica Infinity三维映射环境数据

Leica Infinity三维映射环境数据 Leica Infinity是软件工程师和该领域专家的名字&#xff0c;以及您的工作计划信息。该软件被设计和呈现为一个强大的产品&#xff0c;并且来自六边形组。Leica Infinity产品的居民试图用新的眼光创造新的数据处理。使用此软件&#xff0c;您可以…

和ChatGPT 比一比谁更懂Kubernetes?

有时&#xff0c;很难得到关于云原生世界中棘手话题的明确答案。哪个是最好的服务网格&#xff1f;平台工程只是devops的另一个标签吗&#xff1f;多云是一种风险吗&#xff1f; 如果你无法从一个人那里得到直截了当的答案——为什么不问一台机器呢&#xff1f; 因此&#xf…

net6自动注册到Consul 代码实例

简单理解: 服务多的时候&#xff0c;服务地址都是写固定&#xff0c;增加一个地址&#xff0c;配置一次&#xff0c;配置nginx或者其他配置&#xff0c;麻烦 有了这个就可以通过应用服务上报服务名servicename和访问地址&#xff0c;同一个服务名servicename可以有多个节点&a…

【教学类-15-05】20221207《八款字体的描字帖-2*4格》(中班大班)

成品样式&#xff1a; 80号字&#xff08;适应2-3个名字的大小&#xff09; 68号字&#xff08;适应4个名字大小&#xff08;2-3个名字也可以用&#xff0c;字会很小&#xff09;&#xff09; 打印样式&#xff1a; 背景需求&#xff1a; 前期进行多次的Python学具教学活动&a…

能跟CAD、BIM软件联合使用的地图神器,比奥维谷歌地图还方便!

是的&#xff0c;今天王工推荐的跟之前的地图工具不一样&#xff0c;百度、谷歌、MAPBOX那些称之为地图工具&#xff0c;这个简直就是地图的浏览器&#xff01;而且它还可以与CAD、BIM软件联合使用&#xff01; 实在是比奥维地图“香”。 海量图源任意浏览 ▲ 任意切换各种地…

OpUtils的网络扫描

什么是网络扫描程序 网络扫描程序只需扫描整个网络基础架构&#xff0c;即可获取和记录网络资源的可用性、性能和利用率指标。它执行 Ping 扫描和 SNMP 扫描&#xff0c;以识别网络中运行的实时主机和服务。网络扫描程序可以执行网络扫描以显示详细信息&#xff0c;例如当前登…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win11)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…

Servlet 目录(pom.xml内容) 和 打包的两种方法

目录 一、webApp目录结构 web.xml里的内容 代码放置位置 后端代码&#xff1a;放到 src/main/java目录下 前端代码&#xff1a;放到webapp目录下 二、打包程序 一、webApp目录结构 web.xml里的内容 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web…

TI Lab_SRR学习_1 硬件基础 AWR1642和AWR1642EVM

首先需要对AWR1642芯片有一定的了解,包括天线设计,收发芯片的主要参数等。同时需要区分AWR1642和EVM板之间的区别。 可参考文档 awr1642 datasheetAWR1642 Evaluation Module (AWR1642BOOST) Single-Chip mmWave Sensing Solution 主要的Features(想了解各个子系统,请参考…

如何使用Spring Boot,Thymeleaf和Bootstrap上传多个文件

在本教程中&#xff0c;我将向您展示如何使用Spring Boot&#xff0c;Thymeleaf和Bootstrap上传多个文件。我们还使用 Spring Web MultipartFile界面来处理 HTTP 多部分请求并显示上传文件的列表。 春季启动多文件上传与百里香叶概述 我们的 Spring Boot Thymeleaf 多文件上…

如何通过“推送文案的千人千面”有效提升用户转化和留存

随着互联网用户红利消失和获客成本不断飙升、互联网正从“增量时代”迈向“存量时代”。 通过精细化运营激活存量用户&#xff0c;从而带动企业的第二增长曲线发力&#xff0c;已经成为行业共识。 在此趋势下&#xff0c;企业纷纷开始搭建私域流量池&#xff08;如会员体系、…

HTML学生个人网站作业设计:HTML做一个公司官网首页页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于鹰优化算法和粒子群优化算法结合焊接梁设计,拉伸/压缩,压力容器,悬臂梁设计的应用(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Linux学习】进程概念(下)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 进程概念&#xff08;下&#xff09;&#x1f35f;进程优先级&#x1f35f;进程切换&#x1f35f…

Logistic回归(随机梯度上升算法)

梯度上升算法 def gradAscent(dataMatIn, classLabels):dataMatrix np.mat(dataMatIn) #转换成numpy的matlabelMat np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置m, n np.shape(dataMa…

Elasticsearch入门(三)高级查询操作

前期准备 先把上一个内容的 student 索引删除掉 在 Postman 中&#xff0c;向 ES 服务器发 DELETE 请求&#xff1a;http://127.0.0.1:9200/student 在 Postman 中&#xff0c;向 ES 服务器发五个 POST 请求&#xff1a;http://127.0.0.1:9200/student/_doc/100x x分别是1&…