算法介绍:
哈希算法应该不算是算法,而算是一种数据结构的应用。
向将数据放入哈希表中,然后再进行查找。
成员函数介绍:
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;
}