首页 > 其他分享 >线性探索哈希表

线性探索哈希表

时间:2024-03-31 23:59:54浏览次数:26  
标签:key 探索 int state primeIdx 哈希 ._ 线性 table

线性探索哈希表基础操作实现:

#include<iostream>
using namespace std;


enum State
{
	STATE_UNUSE,//never used
	STATE_USING,//is using
	STATE_DEL, //once used
};
//桶的类型
struct Bucket
{
	Bucket(int key = 0, State state = STATE_UNUSE)
		:_key(key),
		_state(state)
	{}
	int _key; //存储的数据
	State _state; //桶的当前状态
};

class HashTable
{
public:
	HashTable(int size = _primes[0], double loadFactor = 0.75)
		:_useBucketNum(0),
		_loadFactor(loadFactor),
		_primeIdx(0)
	{
		//用户传入的size调整到最近的比较大的素数
		if (size != _primes[0])
		{
			for (; _primeIdx < PRIME_SIZE; _primeIdx++)
			{
				if (_primes[_primeIdx] >= size)
					break;
			}
			//用户传入的值过大
			if (_primeIdx == PRIME_SIZE)
			{
				_primeIdx--;
			}
		}
		_tableSize = _primes[_primeIdx];
		_table = new Bucket[_tableSize];
	}
	~HashTable()
	{
		delete[]_table;
		_table = nullptr;
	}

public:
	bool insert(int key)
	{
		//考虑扩容
		double factor = _useBucketNum * 1.0 / _tableSize;
		cout << "factor = " << factor << endl;
		if (factor > _loadFactor)
		{
			//开始扩容
			expand();
		}
		int idx = key % _tableSize;
		int i = idx;
		do
		{
			if (_table[i]._state != STATE_USING)
			{
				_table[i]._state = STATE_USING;
				_table[i]._key = key;
				_useBucketNum++;
				return true;
			}
			i = (i + 1) % _tableSize;
		} while (i != idx);
		return false;
	}

	bool erase(int key)
	{
		int idx = key % _tableSize;
		int i = idx;
		do
		{
			if (_table[i]._state == STATE_USING && _table[i]._key == key)
			{
				_table[i]._state = STATE_DEL;
				_useBucketNum--;
			}
			i = (i + 1) % _tableSize;
		} while (_table[i]._state != STATE_UNUSE && i != idx);
		return true;
	}

	bool find(int key)
	{
		int idx = key % _tableSize;
		int i = idx;
		do
		{
			if (_table[i]._state == STATE_USING && _table[i]._key == key)
			{
				return true;
			}
			i = (i + 1) % _tableSize;
		} while (_table[i]._state != STATE_UNUSE && i != idx);
		return false;
	}
private:
	void expand()
	{
		++_primeIdx;
		if (PRIME_SIZE == _primeIdx)
		{
			throw "is too large";
		}
		Bucket* newTable = new Bucket[_primes[_primeIdx]];
		for (int i = 0; i < _tableSize; i++)
		{
			if (_table[i]._state == STATE_USING)
			{
				int idx = _table[i]._key % _primes[_primeIdx];
				int k = idx;
				do
				{
					if (newTable[k]._state != STATE_USING)
					{
						newTable[k]._state = STATE_USING;
						newTable[k]._key = _table[i]._key;
						break;
					}
					k = (k + 1) % _primes[_primeIdx];
				} while (k != idx);
			}
		}
		delete[]_table;
		_table = newTable;
		_tableSize = _primes[_primeIdx];
	}
private:
	Bucket* _table; //指向动态开启的哈希表
	int _tableSize;//哈希表的当前的长度
	int _useBucketNum;//已经使用的桶的个数
	double _loadFactor; //哈希表的装载因子

	static const int PRIME_SIZE = 10; //素数表的大小
	static int _primes[PRIME_SIZE];//素数表
	int _primeIdx;//当前使用的素数的下标
};
int HashTable::_primes[PRIME_SIZE] = { 3, 7, 23, 47, 97, 251, 443, 911, 1471, 42773 };

int main()
{
	HashTable htable;
	htable.insert(21);
	htable.insert(34);
	htable.insert(14);
	htable.insert(15);
	cout << htable.find(15) << endl;
	htable.erase(15);
	cout << htable.find(15) << endl;


	return 0;
}

标签:key,探索,int,state,primeIdx,哈希,._,线性,table
From: https://blog.csdn.net/2301_80434259/article/details/137056551

相关文章

  • 机器学习代码——线性模型
    3.1线性回归importnumpyasnpimportmatplotlib.pyplotaspltclassLinearRegressionClosedFormSol:"""线性回归,模型的闭式解1.数据的预处理:是否训练偏置项fit_intercept(默认True),是否标准化normalized(True)2.模型的训练:闭式解fit(self,x_train......
  • Python数据结构与算法——数据结构(链表、哈希表、树)
    目录链表  链表介绍  创建和遍历链表  链表节点插入和删除  双链表  链表总结——复杂度分析哈希表(散列表)哈希表介绍哈希冲突哈希表实现哈希表应用树树树的示例——模拟文件系统二叉树二叉树的链式存储 二叉树的遍历二叉搜索树插入......
  • 【数据结构】线性表-单链表
    编程语言:C++前言:节点:节点是链表的一个基本单元,包含两部分——数据域和指针域,数据域用于存储数据,指针域存储下一个节点的地址,形成链结。什么是单链表:n个节点链结成一个链表,即为线性表(a1,a2,a3……)的链式存储结构,每个节点只包含一个指针域的链表叫做单链表。链表组成:头节点、......
  • 数据结构 - 线性表 - 顺序表
    前言最近刚刚开始复习408数据结构,就想着把每个章节的代码部分汇总记录一下,写成一组文章,便于日后的复习和参考。本系列整体的框架和课后习题参考了王道的复习指导。在本系列的每篇文章中,我会先把该章节所对应数据结构的基础代码放上来,然后附上参考资料习题对应的题目代码。线性......
  • 云计算探索-剖析虚拟化技术
    引言    虚拟化技术,作为现代信息技术架构的核心构成元素,以其独特的资源抽象与模拟机制,成功地瓦解了物理硬件与操作系统间的刚性连接,开创了一个资源共享、灵活调配的崭新天地。本文将详细解析虚拟化技术的内涵、发展历程、分类及特性,并深入探讨其带来的显著优势与深远影......
  • 树哈希
    这种东西看代码比说话好用。#include<bits/stdc++.h>#defineintlonglong#defineullunsigned#defineup(i,l,r)for(inti=l;i<=r;++i)#definedn(i,r,l)for(inti=r;i>=l;--i)#definepbpush_backusingnamespacestd;constintN=111;constullmask=st......
  • 使用.NET Interactive Notebook探索代码
    注意,已被更名为PolyglotNotebooks询问了常见AI对此掌握情况,一言、通义认为和图像数据相关,混元了解一些但不多,GitHubCopilot不知其已改名......
  • LeetCode Hot100-哈希-两数之和
    题目描述:给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,1......
  • 数据结构 —— 线性表的链式存储(链表)(C++)
    目录单链表(有头结点)定义初始化判空销毁清空求表长取值查找插入删除创建头部创建尾部创建本文相关知识:以链式存储结构来实现线性表(C++)如有错误请指正~~谢谢~后面更新循环链表和双向链表单链表(有头结点)以带头结点的单链表为例,操作更加简便!定义首先,为了增强程序的可读性,做出以......
  • 使用OpenEuler x86_64 实现Bouncycastle SM3哈希功能
    使用OpenEulerx86_64实现BouncycastleSM3哈希功能一、安装运行环境安装java和mavensudoyuminstalljava-17-openjdksudoyuminstallmaven安装完成后,你就可以在OpenEuler上使用Maven来管理Java项目了。二、创建项目工程在项目根目录下创建pom.xml文件......