08 数据结构之查找-Hash、二分、顺序

引言: 实现链式哈希的代码

/*
质数: 对于大于1的正自然数, 处理1和它本身别的数都无法整除它, 这个数就是质数
hash函数的确定: 
α(质量因子) = 0.7-0.8比较合适
m:存储数据的真实个数
n:存储空间的大小

α = m / n, 这样就能将n的值确定下来

给定一个数, 需要判断这个数存储再哈希表的哪一个位置, 这个时候需要引出hash函数
p:该质数一般取比存储空间小的最大质数,保证hash表的散列度好
H(key) = key % p(质数)


链式哈希和顺序哈希

以上的算法, 肯定有数据元素对应的hash的索引值是一致的, 这个叫做冲突,解决冲突的方法有两种:
1.对于顺序存储的哈希表, 再冲突的位置的基础上加上步长
2.对于链式存储的hash表, 将经过hash函数处理之后索引值一样的数据元素使用一条链表串起来, 这样查找的时候, 最多也是对这条链表查找。

*/

#ifndef _HASH_H
#define _HASH_H

/****************************************************
 *
 *
 *Author:hewei
 *Date:2024-3-9
 *File:hash.h
 *Note: value = hash(key) = key % MOD;
 *
 *
 *
 *************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 15
#define MOD 15           



typedef int datatype;
typedef struct node {
	datatype key;
	int value;
	struct node *next;
}list_node, *link_list;

typedef struct {
	list_node data[N];
}hash_t;

hash_t *hash_create();
int hash_free(hash_t *h);
int hash_insert(hash_t *h, datatype value);
link_list hash_search(hash_t *h, datatype key);



/***********************************
 *
 *Base search, squence search and binary search, assess ASL平均查找长度
 *
 *********************************/
int squence_search(int *arr, int arr_len, int obj_value);
int binary_search(int *arr, int arr_len, int obj_value);

#endif
#include "hash.h"


/*brife: create a link hash table
 *
 * */
hash_t *hash_create()
{
	hash_t *h;
	if((h = (hash_t *)malloc(sizeof(hash_t))) == NULL) {
		printf("malloc hash heap space failed\n");
		return NULL;
	}

	memset(h, 0, sizeof(hash_t));

	return h;
}

/*brife: release a hash table
 *
 * */
int hash_free(hash_t *h)
{
	if(h == NULL) {
		printf("param is invalid\n");
		return -1;
	}

	free(h);

	return 0;
}


/*brife: need search element insert to hash table
 *
 * */
int hash_insert(hash_t *h, datatype key)
{
	if(h == NULL) {
		printf("param is invalid\n");
		return -1;
	}

	link_list p, q;

	if((q = (link_list)malloc(sizeof(list_node))) == NULL) {
		printf("%s, alloc new node memery failed\n", __func__);
		return -1;
	}

	q->key = key;
	q->value = key % MOD;
	q->next = NULL;

	p = &(h->data[key % MOD]);

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

	return 0;
}


/*brife: specify data search
 *param:hash_t handle, search key
 *       
 * */
link_list hash_search(hash_t *h, datatype key)
{
	if(h == NULL) {
		printf("param is invalid\n");
		return NULL;
	}
	
	link_list p = &(h->data[key % MOD]);

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

}

int squence_search(int *arr, int arr_len, int obj_value)
{
	if(arr == NULL) {
		printf("param is invalid\n");
		return -1;
	}

	int i = 0;
	for(;i < arr_len; i++) {
		if(arr[i] == obj_value) {
			return i;
		}	
	}

	return -1;
}


int binary_search(int *arr, int arr_len, int obj_value)
{
	if(arr == NULL) {
		printf("param is invalid\n");
		return -1;
	}

	int low = 0, high = arr_len - 1, mid = (high + low) / 2;
	while(arr[mid] != obj_value) {
		if(arr[mid] < obj_value) {
			low = mid + 1;	
			mid = (low + high) / 2;
		} else {
			high = mid - 1;	
			mid = (low + high) / 2;
		}
	}

	return mid;
}
#include "hash.h"

int main(int argc, const char *argv[])
{
	datatype arr[] = {67, 7, 89, 6, 1, 198, 201};	
	int sort_arr[] = {1, 4, 6, 8, 9, 88};

	int i, arr_len = sizeof(arr) / sizeof(datatype);
	link_list ret = NULL;
	hash_t *h;

	if((h = hash_create()) == NULL) {
		printf("hash table create failed\n");
		return -1;
	}

	for(i = 0; i < arr_len; i++) {
		hash_insert(h, arr[i]);
	}

	printf("Please input a hope search data:");
	scanf("%d", &i);

	if((ret = hash_search(h, i)) == NULL) {
		printf("Not found\n");
	} else {
		printf("Found: key: %d, value: %d\n", ret->key, ret->value);
	}

	int r = squence_search(sort_arr, sizeof(sort_arr) / sizeof(int), 8);
	printf("squence_search: %d\n", r);

	r = binary_search(sort_arr, sizeof(sort_arr) / sizeof(int), 9);
	printf("squence_search: %d\n", r);


	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H264解码器实现-帧间预测

前言 本文所说的帧间预测是指根据当前预测块的MV向量和预测所需的参考块数据&#xff0c;计算出当前预测块的预测像素值的过程。该过程得到的预测像素值经过运动补偿后&#xff08;与反变换量化之后得到的残差像素值相加&#xff09;可以得到滤波前的重建像素值。 原理说明 …

<Linux> 初识线程

目录 前言&#xff1a; 一、什么是线程 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;线程理解 &#xff08;三&#xff09;线程与进程的关系 &#xff08;四&#xff09;简单实用线程 &#xff08;五&#xff09;重谈虚拟地址空间 1. 页表的大小 2…

ARMv8/ARMv9架构入门到精通-学习方法

目录 1、学习ARM基础知识2、学习ARM异常(中断)3、学习MMU4、学习Cache5、学习Trustzone和安全架构6、学习ARM架构和各类IP推荐 本文转自 周贺贺&#xff0c;baron&#xff0c;代码改变世界ctw&#xff0c;Arm精选&#xff0c; 资深安全架构专家&#xff0c;11年手机安全/SOC底层…

WorldView卫星遥感影像数据/米级分辨率遥感影像

目前世界上最常用的高分辨率卫星影像莫过于WORLDVIEW系列了&#xff0c;在卫星遥感圈内可谓大名鼎鼎&#xff0c;不仅具有超高的分辨率还具有其他高分辨卫星所不具有的8波段&#xff0c;风光无限。在分辨率方面目前只有WORLDVIEW3和WORLDVIEW4能够达到0.3米的分辨率&#xff0c…

【神经网络与深度学习】LSTM(Long Short-Term Memory)神经网络模型

概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;通常被用于处理和学习时间序列数据。因此&#xff0c;LSTM属于深度学习领域中的一种神经网络模型。 在深度学习中&#xff0c;LSTM被广泛应用于…

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器&#xff0c;想搭建一个站库分离的wordpress为主的网站&#xff0c;采用d…

数据结构:图及相关算法讲解

图 1.图的基本概念2. 图的存储结构2.1邻接矩阵2.2邻接表2.3两种实现的比较 3.图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历 4.最小生成树4.1 Kruskal算法4.2 Prim算法4.3 两个算法比较 5.最短路径5.1两个抽象存储5.2单源最短路径--Dijkstra算法5.3单源最短路径--Bellman-…

CentOS 7安装MySQL及常见问题与解决方案(含JDBC示例与错误处理)

引言 MySQL是一个流行的开源关系型数据库管理系统&#xff0c;广泛应用于各种业务场景。在CentOS 7上安装MySQL后&#xff0c;我们通常需要使用JDBC&#xff08;Java Database Connectivity&#xff09;连接MySQL进行后端操作。 目录 引言 CentOS 7安装MySQL 使用JDBC连接My…

AI入门笔记(四)

深度学习是人工智能的一种实现方法。本文我将学习到的关于深度学习的代表卷积神经网络的数学结构分享给大家。 深度学习是重叠了很多层的隐藏层&#xff08;中间层&#xff09;的神经网络。我们以一个例题为例。 建立一个卷积神经网络&#xff0c;用来识别通过 66 像素的图像读…

基于VSCode安装Node.js开发环境

根据官网介绍&#xff0c;Node.js 是一个免费的、开源的、跨平台的JavaScript实时运行环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本. Node.js框架由于是采用JavaScript语法进行调用的&#xff0c;因此Node.js环境除了用来编写调试Node.js代码&#…

mybatis基础操作(三)

动态sql 通过动态sql实现多条件查询&#xff0c;这里以查询为例&#xff0c;实现动态sql的书写。 创建members表 创建表并插入数据&#xff1a; create table members (member_id int (11),member_nick varchar (60),member_gender char (15),member_age int (11),member_c…

视图【MySQL】

文章目录 概念操作视图创建视图查询视图更新视图删除视图 视图规则和限制 概念 MySQL 中的视图&#xff08;View&#xff09;是一个虚拟表&#xff0c;其内容由查询定义。视图本身不包含数据&#xff0c;这些数据是从一个或多个实际表中派生出来的&#xff0c;通过执行视图定义…

简单了解TCP/IP四层模型

什么是计算机网络&#xff1f; 计算机网络我们可以理解为一个巨大的城市地图&#xff0c;我们想从A地前往B地&#xff0c;其中要走的路、要避开的问题都交给计算机网络解决&#xff0c;直到我们可以正常的到达目的地&#xff0c;那么我们会把其中的过程抽象成一个网络模型&…

练习01-登录注册(简单)

一、用户登录/注册实现 综合前面学的知识来实现简单的注册登录功能 1.准备工作 注册登录页面 数据库&#xff0c;数据表 mybatis 坐标引入&#xff0c;MySQL驱动 配置 映射文件 用户实体类 Servlet代码 2.页面 不想手写的可以看博主IT黄大大【带源码】 【炫酷登录界…

吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)

在本实验中&#xff0c;您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)jupy…

机器学习——PPO补充

On-policy vs Off-policy 今天跟环境互动&#xff0c;并学习是on-policy 只是在旁边看&#xff0c;就是Off-policy 从p中选q个重要的&#xff0c;需要加一个weight p(x)/q(x) p和q不能相差太多 采样数太少导致分布差很多&#xff0c;导致weight发生变化 On-Policy -&g…

STM32F103 CubeMX ADC 驱动 PS2游戏摇杆控制杆传感器模块

STM32F103 CubeMX ADC 驱动 PS2游戏摇杆控制杆传感器模块 1. 工程配置1.1 配置debug口1.2 配置时钟1.3 配置ADC1.4 配置串口1.5 配置时钟1.6 生成工程 2. 代码编写2.1 串口代码2.2 ADC读取数据的代码 1. 工程配置 1.1 配置debug口 1.2 配置时钟 1.3 配置ADC 1.4 配置串口 1.5 …

小迪安全37WEB 攻防-通用漏洞XSS 跨站权限维持钓鱼捆绑浏览器漏洞

#XSS跨站系列内容:1. XSS跨站-原理&分类&手法 XSS跨站-探针&利用&审计XSS跨站另类攻击手法利用 XSS跨站-防御修复&绕过策略 #知识点&#xff1a; 1、XSS 跨站-另类攻击手法分类 2、XSS 跨站-权限维持&钓鱼&浏览器等 1、原理 指攻击者利用…

JavaWeb-Maven基础

Maven是专门用于管理和构建Java项目的工具&#xff0c;是 Apache 下的一个纯 Java 开发的开源项目&#xff0c;基于项目对象模型&#xff08;POM&#xff09;概念。先来学习一下Maven基础&#xff0c;等后面学完开发框架后再学Maven高级&#xff0c;这次的内容如下 一、概述 …

leetcode 热题 100_搜索二维矩阵

题解一&#xff1a; 二叉搜索树&#xff1a;从矩阵右上角观察&#xff0c;结构类似二叉搜索树&#xff0c;因此可以用类似的解法来做。具体做法是双指针从右上角开始&#xff0c;向左下角逐步搜索&#xff0c;如果当前值比目标值大&#xff0c;则向下移动&#xff0c;如果当前值…
最新文章