Day 11-12:查找

news2025/1/12 1:06:01

目录

概念

方法

折半查找   

        前提

        算法思路

分块查找

        算法思路

哈希表 

         概念

        构造哈希函数的方法

        保留除数法

        处理冲突的方法

                开放地址法(二次探查法)

                链地址法(重要) 

 哈希表的实现

        结构体的创建

        哈希表的创建         

        哈希元素插入 

        哈希元素查找

概念

        记录表L=(R1 R2……Rn),其中Ri(l≤i≤n)为记录,对给定的某个值k,在表L中确定key=k的记录的过程,称为查找

        表L中存在一个记录Ri的key=k,记为Ri.key=k,则查找成功,返回该记录在表L中的序号i(或Ri 的地址),否则(查找失败)返回0(或空地址Null)。

方法

      顺序查找、折半查找、分块查找、Hash表。      

折半查找   

        前提

        仅仅适用于有序的顺表。

        算法思路

        首先将给定值key与表中中间位置的元素(mid的指向元素)比较。mid=low+high/2(向下取整)

        若key与中间元素相等,则查找成功,返回该元素的存储位置,即mid;
        若key与中间元素不相等,则所需查找的元素只能在中间元素以外的前半部分或后半部分。(至于是前半部分还是后半部分要看key与mid所指向元素的大小关系)
        a.若给定值key大于中间元素则所查找的元素只可能在后半部分。此时让low=mid+1;
        b.若给定值key小于中间元素则所查找的元素只可能在前半部分。此时让high=mid-1;

        举例:查找key = 20

分块查找

        算法思路

  1. 需要把数据分成N多小块,块与块之间不能有数据重复的交集。

  2. 给每一块创建对象单独存储到数组当中。

  3. 查找数据的时候,先在数组查,当前数据属于哪一块。

  4. 再到这一块中顺序查找。

哈希表 

         概念

        对给定的k,不经任何比较便能获取所需的记录,其查找的时间复杂度为常数级O(C)。在建立记录表的时候,确定记录的key与其存储地址之间的关系f,即:

        使key与记录的存放地址H相对应。

        这个关系f就是所谓的Hash函数(或称散列函数、杂凑函数),记为H(key)。 

        构造哈希函数的方法

        保留除数法

        概念:设Hash表空间长度为m,选取一个不大于m的最大质数p。

        H(key) = key % p

         

         冲突:表中某地址j∈[0,m-1]中己存放有记录,而另一个记录的H(key)值也为 j。

        表的装填因子α:α=n/m,其中m为表长,n为表中记录个数。一般α在0.7~0.8之间,使表保持一定的空闲余量,以减少冲突和聚积现象。比如:有70%的数据要存,选择一个数组长度为100%的数组来存。

        质数的选取:不大于m的最大质数。            

        处理冲突的方法

        在地址j的前面或后面找一个空闲单元存放冲突的记录,或将相冲突的诸记录拉成链表。


                开放地址法(二次探查法)

        当发生冲突时,在H(key)的前后找一个空闲单元来存放冲突的记录,即在H(key)的基础上获取下一地址: 

        Hi=(H(key)+di)%m

        其中m为表长,%运算是保证Hi落在[0,m-l]区间

        di为地址增量。di的取法有多种:    

        (1)di=1,2,3,……(m-1)——称为线性探查法;    

        (2)d = 1^2, -1^2, 2^2, -2^2, 3^2,……

        举例

        设记录的key集合k={23,34,14,38,46,16,68,15,07,31,26},记录数n=11。

        令装填因子α=0.75,取表长m= n/α =15。 用“保留余数法”选取Hash函数(p=13):                  H(key)=key%13

         16 % 13 == 68 % 13

         46 % 13 == 7   % 13


                链地址法(重要) 

        发生冲突时,将各冲突记录链在一起,即同义词的记录存于同一链表。

        设H(key)取值范围(值域)为[0,m-l], 建立头指针向量HP[m], HP[i](0≤i≤m-l)初值为空。 

 哈希表的实现

        结构体的创建

#define M 15//表长
typedef int datatype;
/*1.创建链表结构体*/
typedef struct node
{
	datatype key;
	datatype value;
	struct node* next;
}listnode,*linknode;
/*创建链表数组,存放链表的头节点*/
typedef struct
{
	listnode data[M];
}hash,*linkhash;

        哈希表的创建         

/*哈希表创建*/
linkhash hash_create()
{
	linkhash HT;
	if (HT = malloc(sizeof(hash)) == NULL)
	{
		printf("create failed!\n");
		return NULL;
	}
	memset(HT, 0, sizeof(hash));
	return HT;
}

        哈希元素插入 

/*哈希元素插入*/
/*整体逻辑:1.求余数 2.判断是否冲突(原来有值)*/
int hash_insert(linkhash HT, datatype value)
/*注意:结构体数组上仅存放了指向第一个数的指针*/
{
	linknode p,q;
	if (HT == NULL)
		return -1;
	/*1.创建一个链表存放插入值:指针p*/
	if ((p = malloc(sizeof(listnode)) == NULL)
		return -1;
	p->key	 = value % P;
	p->value = value; 
	p->next  = NULL;
	/*2.找到数组上对应的位置,判断是否为冲突元素?否则就是空元素(?),指针q*/
	q = &(HT->data[value % P]);
	/*移动q指针,目标:越大越放在后面*/
	while (q->next != NULL && q->next->value < p->value)
	{
		q = q->next;
	}
	/*3.插入元素并要注意链表插入规则,以在16和68之间为例*/
	p->next = q->next;
	q->next = p;
	return 0;
}

        哈希元素查找

/*哈希查找*/
linknode hash_search(linkhash HT, datatype value)
{
	if (HT == NULL)
		return -1;
	linknode p;
	p = &HT->data[value % P];
	while (p->next &&  p->next->value != value)
	{
		p = p->next;
	}
	if (p->next == NULL)
		return NULL;
	else
		return p->next;
}

 

 

        

         

 

        

        

        

        

        

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

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

相关文章

Agent实战——使用 Dify 和 Moonshot API 构建 AI 工作流

引言 在当今的大模型应用浪潮中&#xff0c;AI Agent的开发和集成已经成为技术革新的重要方向。随着大模型的不断进步&#xff0c;如何利用这些强大的模型来简化复杂的任务&#xff0c;并将其集成到企业的生产环境中&#xff0c;成为开发者和企业共同关注的焦点。在2024年稀土…

linux-L3_linux 查看进程(node-red)

linux 查看进程 以查看进程node-red为例 ps aux | grep node-red

自制游戏手柄--Android画面的input输入控制

在使用传感器获取到运动数据后&#xff0c;怎样转换为input事件传给手机呢&#xff0c;这里以Android为例&#xff0c; 我们可以考虑以下方式&#xff1a; 1. 物理方式&#xff0c;使用舵机连接触碰笔去实现&#xff0c; 2. 构造MotionEvent事件&#xff0c;注入input&#…

Python之 条件与循环(Python‘s Conditions and loops)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

linux环境下手动安装mysql

没想到兜兜转转这么些年&#xff0c;今天申请个云服务器用来搭建求生2服务器&#xff0c;先用mysql来测试&#xff0c;结果还是花了相当久的时间。 基本所有单节点部署应用到linux环境&#xff0c;都三个流程&#xff1a; 1 下载安装包 2 解压修改配置文件 3 运行启动脚本 我们…

Idea 中的一些配置

配置 javap jdk 自带的 javap 可以用来查看字节码信息。 配置过程&#xff1a; 打开设置&#xff0c;定位到 Tools&#xff0c;External Tools新建项&#xff0c;Program 中填 javap 的路径Argument 中填 -c $FileClass$Working directory 中填 $OutputPath$ Argument 中也…

【有啥问啥】复习变分下界即证据下界(Evidence Lower Bound, ELBO):原理与应用

复习变分下界即证据下界&#xff08;Evidence Lower Bound, ELBO&#xff09;&#xff1a;原理与应用 变分下界&#xff08;Variational Lower Bound&#xff09;&#xff0c;也称为“证据下界”&#xff08;Evidence Lower Bound, ELBO&#xff09;&#xff0c;是概率模型中的…

Golang | Leetcode Golang题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; func canCross(stones []int) bool {n : len(stones)dp : make([][]bool, n)for i : range dp {dp[i] make([]bool, n)}dp[0][0] truefor i : 1; i < n; i {if stones[i]-stones[i-1] > i {return false}}for i : 1; i < n; i {…

产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台

在当今高速发展的信息技术领域&#xff0c;特别是对于那些致力于前沿科技探索与实践的高校而言&#xff0c;拥有一款能够支持复杂网络业务研究与开发的平台至关重要。开物™数据网络开发平台&#xff08;Data Network Development Platform&#xff0c;简称DNDP&#xff09;&am…

el-input 只能输入数字和一个小数点,或者只能输入正整数

只能输入框只能输入正整数&#xff0c;输入同时禁止了以0开始的数字输入&#xff0c;防止被转化为其他进制的数值。 下面为案例&#xff1a; <!-- 不能输入零时--> <input typetext oninput"valuevalue.replace(/^(0)|[^\d]/g,)"><!-- 能输入零时-…

const 声明变量 报错Missing initializer in const declaration

近日用const 声明一个变量发现一个问题&#xff0c;如果声明的同时没有赋值&#xff0c;就会报错Missing initializer in const declaration 以下是分别以const、let、var声明显示的结果 const 方式声明 const a null const b const c 1 const d 2 const e false console…

Java | Leetcode Java题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution {public int sumOfLeftLeaves(TreeNode root) {if (root null) {return 0;}Queue<TreeNode> queue new LinkedList<TreeNode>();queue.offer(root);int ans 0;while (!queue.isEmpty()) {TreeNode node que…

c++206 友元类

#include<iostream> using namespace std; class A { public://声明的位置 和public private无关friend void modifyA(A* pA, int _a);//函数modifyA是A的好朋友A(int a, int b){this->a a;this->b b;}int getA(){return this->a;} private:int a;int b; };vo…

频带宽度固定,如何突破数据速率的瓶颈?

目录 目录 引言 信道 频带宽度 信噪比 信噪比的重要性 影响信噪比的因素 码元 码元的特点&#xff1a; 码元与比特的关系&#xff1a; 码元的作用&#xff1a; 码元的类型&#xff1a; Question 类比解释&#xff1a; 技术解释&#xff1a; 引言 在现代通信系统中…

Python | Leetcode Python题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; class Solution:def sumOfLeftLeaves(self, root: TreeNode) -> int:if not root:return 0isLeafNode lambda node: not node.left and not node.rightq collections.deque([root])ans 0while q:node q.popleft()if node.left:if is…

Tomcat_使用IDEA开发javaWeb工程并部署运用

目录 1.配置文件 点击file projectStructure 配置SDK和language level的语言版本一致。apply然后ok。 2. 然后点击web-all创建一个moudle叫做demo02-web02。 3.这仅仅是一个java的目录结构&#xff0c;我们需要把他转换成javaweb的结构。所以我们需要添加web资源组件。右…

【STM32】独立看门狗(IWDG)原理详解及编程实践(下)

这篇文章详细讲解独立看门狗的编程实践代码。关于独立看门狗的原理及配置可以看上一篇文章。 【STM32】独立看门狗&#xff08;IWDG&#xff09;原理详解及编程实践&#xff08;上&#xff09;-CSDN博客 目录 1、 初始化 IWDG 2. 配置 IWDG 3. 喂狗 4. 处理看门狗复位 5、完…

Google推出Data Commons解决AI“幻觉”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

SQL进阶技巧:如何将字符串数组清洗为简单map结构? | translate + regexp_replace方法

目录 0 场景描述 1 数据准备 2 问题分析 2.1 方法1 特征法-通用解法 2.2 方法2枚举法(不通用) 3 小结 ~~END~~ 如果觉得本文对你有帮助,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下: 数字化建设通关指南专栏原价99,现在活动价29.9,按照阶梯式增长,直到恢…

C++面试3

一、常用设计模式 https://blog.csdn.net/m0_71530237/article/details/141140118?spm1001.2014.3001.5501 二、死锁以及解决方式&#xff1f; 死锁&#xff1a;一种常见的并发问题&#xff0c;发生在多个进程或线程因为竞争资源而陷入相互等待的状态&#xff0c;导致这些进…