首页 > 其他分享 >8--哈希表Hash的相关操作

8--哈希表Hash的相关操作

时间:2024-03-16 15:59:10浏览次数:19  
标签:Hash 哈希 -- ht int hi key return

哈希表(Hash table)是一种数据结构,用于实现键值对的存储和查找。其中直接地址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法都可以作为哈希表的散列函数。

直接地址法是唯一一个不会产生冲突的方法,因为它是线性的,每一个数都有对应的地址,所有就不会产生冲突,但是空间利用率低,它是典型的用空间换时间。而除留余数法是最常用的一种方法。

哈希表的查找、插入和删除操作的时间复杂度通常为O(1),但在极端情况下,可能会出现冲突(多个键映射到同一个索引位置),这时需要解决冲突的方法,比如开地址法、链地址法、再散列法(双散列函数法)、建立一个公共溢出区。

开地址法中又包含了线性探测法(常用)、二次探测法、伪随机探测法。

线性探测法:下一个下一个

二次探测法:左一个右一个(一直循环直到找到空位置)

伪随机探测法:生成随机数,随机存储。每次都得从头遍历,不建议使用

此处我们就用除留余数法和开地址法中的线性探测法来实现哈希表,代码如下:

#include<stdio.h>

#define NONE -1 //将哈希表内初始成-1
#define p 13 //p一般取小于等于m且为质数
#define m 16 //哈希表的长度

//定义Hash结构体
typedef struct Hash
{
	int key;//关键字项;
	//InfoType otherinfo;//其他数据项
}Hash, HashTable[m]; //定义了一个长度为m的Hash数组

//初始化哈希表
void InitHashTable(HashTable  ht)
{
	for (int i = 0; i < m; i++)
	{
		ht[i].key = NONE;
	}
}

//将关键字映射到哈希表的索引位置
//得到key对p取模的结果
static int H(int key)
{
	return key % p;
}

//将key插入到哈希表ht中,成功返回true,失败返回false;
bool Insert(HashTable ht, int key)
{
	int hi = H(key);//得到key的哈希值;

	//当前哈希表没有被使用,将key直接存储;
	if (ht[hi].key == NONE)
	{
		ht[hi].key = key;
		return true;
	}
	
	else//在其他地方找合适的位置,使用线性探测法;
	{
		int i = (hi + 1) % m;//新的位置
		while (i != hi)
		{
			if (ht[i].key == NONE)
			{
				ht[i].key = key;
				return true;
			}
			i = (i + 1) % m;//更新i的位置,即向后移动一个位置
		}
		return false;
	}
}

//在哈希表中查找key,找到返回下标,失败返回-1
int Search(HashTable ht, int key)
{
	int hi = H(key);
	int i = hi;
	while (ht[i].key != NONE)
	{
		if (ht[i].key == key)
		{
			return i;
		}
		i = (i + 1) % m;

		if (i == hi)
		{
			break;
		}
	}
	return -1;
}

//从头到尾输出哈希表中的所有的值
void Show(HashTable ht)
{
	for (int i = 0; i < m; i++)
	{
		printf("%d ", ht[i].key);
	}
	printf("\n");
}

int main()
{
	HashTable ht;//ht指向哈希表
	InitHashTable(ht);//初始化哈希表
	int arr[16] = { 3,5,7,1,2,9,28,25,6,11,10,15,17,23,34,19 };

	//测试插入后得到的哈希表
	for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
	{
		Insert(ht, arr[i]);
	}
	Show(ht);//输出哈希表

	//测试查找
	int key = 2;
	int index = Search(ht, key);
	if (index != -1)
	{
		printf("关键字%d找到了!\n",key);
	}
	else
	{
		printf("关键字%d没有找到!\n",key);
	}

	return 0;
}

标签:Hash,哈希,--,ht,int,hi,key,return
From: https://blog.csdn.net/weixin_73974655/article/details/136661689

相关文章

  • 深入理解指针2
    今天我们接着上期来继续深入学习指针。1.指针运算指针的基本运算有三种,分别是:•指针+-整数•指针-指针•指针的关系运算 1.1指针+-整数因为数组在内存中是连续存放的,只要知道第⼀个元素的地址,顺藤摸⽠就能找到后⾯的所有元素。 intarr[10]={1,2,3,4,5,6,7......
  • 数据库引论:2.SQL简介
    SQL(StructuredQueryLanguage,结构化查询语言)2.1SQL查询语言概览SQL语言包含数据定义语言(Data-DefinitionLanguage,DDL)。SQLDDL提供定义关系模式、删除关系以及修改关系模式的命令。数据操纵语言(Data-ManipulationLanguage,DML)。SQLDML提供从数据库中查询信......
  • 376. 摆动序列c
    intmax(inti,intj){if(i>j)returni;returnj;}intwiggleMaxLength(int*nums,intnumsSize){int**dp=(int**)malloc(sizeof(int*)*numsSize);for(inti=0;i<numsSize;i++)dp[i]=(int*)malloc(sizeof(int)*2);dp[0][0]=1,dp[0][1]=......
  • 一定要会用selenium的等待,3种等待方式解读
    很多人问,这个下拉框定位不到、那个弹出框定位不到…各种定位不到,其实大多数情况下就是两种问题:有frame没有加等待殊不知,你的代码运行速度是什么量级的,而浏览器加载渲染速度又是什么量级的,就好比闪电侠和凹凸曼约好去打怪兽,然后闪电侠打完回来之后问凹凸曼你为啥还在穿鞋没出......
  • python接口自动化测试 —— unittest框架suite、runner详细使用
    testsuite测试套件,理解成测试用例集一系列的测试用例,或测试套件,理解成测试用例的集合和测试套件的集合当运行测试套件时,则运行里面添加的所有测试用例testrunner测试运行器用于执行和输出结果的组件testsuite、testrunner基础使用单元测试类1#创建单元测试类......
  • 什么是构造方法
    /*构造方法什么是构造方法?方法名和类名相同,和普通方法的格式不一样的特殊方法构造方法的定义格式?修饰符类名(形参){执行语句}构造方法的作用?1,用来创建对象2,......
  • C++类模板与友元详解
    C++模板下面分四种情况分别讨论。1.函数、类、类的成员函数作为类模板的友元函数、类、类的成员函数都可以作为类模板的友元。程序示例如下:void Func1() {  }class A {  };class B{public:    void Func() { }};template <class T>class Tmpl{......
  • 模板整理
    整理遇到的几个比较难记的算法的模板。KMP算法KMP算法是字符串匹配算法,通常是在长字符串中对短字符串(模式串)进行匹配。使用next数组对模式串的前缀表进行记录。前缀表:当匹配失败时,将根据这个前缀表决定指针的位置。前缀表的目的是找到模式串中相等的前缀和后缀。例如aabaaf,......
  • C++类模板中的静态成员
    C++模板类模板中可以定义静态成员,从该类模板实例化得到的所有类都包含同样的静态成员。程序示例如下:#include <iostream>using namespace std;template <class T>class A{private:    static int count;public:    A() { count ++; }    ~A()......
  • KBP210-ASEMI新能源专用整流桥KBP210
    编辑:llKBP210-ASEMI新能源专用整流桥KBP210型号:KBP210品牌:ASEMI封装:KBP-4正向电流(Id):2A反向耐压(VRRM):1000V正向浪涌电流:60A正向电压(VF):1.05V引脚数量:4芯片个数:4芯片尺寸:50MIL功率(Pd):中小功率设备工作温度:-55°C~150°C类型:插件整流桥、整流桥KBP210整流桥描述:ASEMI......