查找算法之六 哈希查找(C++版本)

算法介绍:
哈希算法应该不算是算法,而算是一种数据结构的应用。
向将数据放入哈希表中,然后再进行查找。

成员函数介绍:
NewHashTable(int destSize)
构造一个destSize大小的数组m_pData,同时将其元素值都设置为INT_MAX,表示该位置未被使用。
bool NeedRehash()
判断负载因子,如果负载因子为1,就需要进行ReHash。
void Insert(int newData)
插入一个新元素newData,当需要进行rehash时,为了实现方便,直接抛出异常。
int Find(int destData)
查找元素destData,如果未找到,返回-1。找到返回下标。

注意点:
hash函数使用的是除留余数法
冲突解决使用的是直接定址法,增量的取法为线性探测法

代码实现:
头文件NewHashTable.h

class NewHashTable
{
public:
	NewHashTable(int destSize);
	~NewHashTable();
	bool NeedRehash();
	void Insert(int newData);
	int Find(int destData);

private:
	int m_size; // 总大小
	int m_use; // 已使用大小
	int* m_pData;
};

实现文件NewHashTable.cpp

NewHashTable::NewHashTable(int destSize)
	: m_size(destSize)
	, m_use(0)
	, m_pData(new int[m_size])
{
	for (int idx = 0; idx < m_size; ++idx) m_pData[idx] = -INT_MIN;
}

NewHashTable::~NewHashTable()
{
	delete [] m_pData;
}

void NewHashTable::Insert(int newData)
{
	if (NeedRehash())
	{
		throw "Need Rehash";
	}

	 // hash函数的实现方式为除留余数法
	int hashIdx = newData % m_size;

	// hash位置就是空位
	if (m_pData[hashIdx] == INT_MIN) 
	{
		m_pData[hashIdx] = newData;
		++m_use;
		return;
	}
	
	// hash冲突,使用开放定址法,增量的增长方式为线性探测法
	for (int idx = 1; idx < m_size; ++idx) 
	{
		hashIdx = (newData + idx) % m_size;
		if (m_pData[hashIdx] == INT_MIN) break;
	}

	m_pData[hashIdx] = newData;
	++m_use;
}

int NewHashTable::Find(int destData)
{
	int hashIdx = destData % m_size;

	if (m_pData[hashIdx] == INT_MIN) return -1;
	if (m_pData[hashIdx] == destData) return hashIdx;

	for (int idx = 1; idx < m_size; ++idx)
	{
		hashIdx = (destData + idx) % m_size;
		if (m_pData[hashIdx] == INT_MIN) return -1;
		if (m_pData[hashIdx] == destData) return hashIdx;
	}

	return -1;
}

bool NewHashTable::NeedRehash()
{
	return m_use >= m_size;
}

测试代码:

#include <iostream>
#include "NewHashTable.h"

int main()
{
	NewHashTable hashTable(5);

	while (true)
	{
		std::cout << "请输入操作(INSERT FIND RPINT):" << std::endl;
		std::string choice;
		std::cin >> choice;

		if ("INSERT" == choice)
		{
			if (hashTable.NeedRehash())
			{
				std::cout << "没有剩余空间,请先Rehash" << std::endl;
			}
			else
			{
				std::cout << "请输入数据:";
				int newData;
				std::cin >> newData;
				hashTable.Insert(newData);
			}
		}
		else if ("FIND" == choice)
		{
			std::cout << "请输入待查数据:";
			int newData;
			std::cin >> newData;
			std::cout << "DestIdx = " << hashTable.Find(newData) << std::endl;
		}
		else if ("PRINT" == choice)
		{
			hashTable.Print();
		}
		else;
	}

	return 0;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值