(005)线性哈希表的相关操作

(005)线性哈希表的相关操作
                                         2014/12/23   jxlijunhao
线性hash表是最简单的一种hash表。设线性hash表的长度为n。关键字用k表示,现在用数字来作为例子。
1,线性hash表的填入
      1)找到一个合适的哈希函数,计算关键字k的哈希码i=hash(k)
      2)检查表中是否已满及第i项的内容: 
            --若第i项为空,则将关键字k及其有关信息填入,并用改变标志位;
            --若第i项不为空,则向后依次i=mod(i+1,n)进行查找,找到未被使用的位置,填入(处理冲突,开放定址);

2,线性hash表的查找
      1)利用哈希函数,计算关键字k的哈希码 i=hash(k)
      2)检查表中第i项的内容: 
            -- 若第i项登记着关键字k,则找到关键字的元素;
            -- 若第i项为空,则表示hash表中没有该元素;
            -- 若第i项不为空且 登记的不是关键字k的信息,则i=mod(i+1,n),再进行第(2)查找;

线性hash表的缺点:
1,在线性hash表填入的过程中,当发现冲突时,首先考虑的是下一项,因此当发生很多冲突时,在线性hash表中
     会出现“堆聚”现象,不满足均匀性;
2,在线性hash表中不顾后续元素的插入的处理冲突会带来新的冲突;
3,线性中难以删除元素;

linearHashTable.h

#include
using namespace std;

//定义线性哈希表节点的结构体,用来表示相应节点的key,是否被占用
template
struct hashNode
{
	int flag; //占用‘1’,非占用‘0’
	T key;    //相应节点的key
};

//定义线性哈希表类
template
class LinearHashTable
{
public:
	LinearHashTable(int s); //构造函数,初始化线性哈希表的长度
	void print_hashTable(); //顺序打印出哈希表中有元素
	int  empty_hashTable();  //统计哈希表中空项的个数
	void insert_hashTable(int (*hashCode)(T),T x);  //将元素x插入到hashtable中
	int search_hashTable(int (*hashCode)(T),T x); //在哈希表中查找元素x
private:
	int size; //线性哈希表的长度
	hashNode *hashTableHead; //指向线性哈希表的首地址

};


//构造函数,初始化线性哈希表的长度
template
LinearHashTable::LinearHashTable(int s)
{
	size=s;
	hashTableHead=new hashNode[size];
	for (int k=0;k
void LinearHashTable::print_hashTable()
{
	for (int i=0;i"<<" ";
		else
			cout<<"<"<"<<" ";
	}
	cout<
int LinearHashTable::empty_hashTable()
{
	int count=0;
	for (int i=0;i
void LinearHashTable::insert_hashTable(int (*hashCode)(T),T x)
{
	int k;
	if (empty_hashTable()==0)
	{
		cout<<"哈希表已满"<
int LinearHashTable::search_hashTable(int (*hashCode)(T),T x)
{
	int k;	
	k=(*hashCode)(x); 
	while((hashTableHead[k-1].flag) &&(hashTableHead[k-1].key!=x))
	{
		k=k+1;
		if (k==size+1)
			k=1;
	}
	if(hashTableHead[k-1].flag &&hashTableHead[k-1].key==x)
		return k;
	return 0;
}

linearHashTable.cpp

#include "linearHashTable.h"

//哈希函数

int hashFun(int x)
{
	return (x/3+1);
}


int main()
{
	int a[13]={9,31,26,19,1,13,2,11,27,16,5,21};
	int k;
	LinearHashTable h(12);
	cout<<"原序列: "<



     

你可能感兴趣的:(数据结构与算法)