7-42 整型关键字的散列映射 (25 分)

这篇博客介绍了如何使用除留余数法作为哈希函数创建哈希表,并通过线性探测法处理哈希冲突。文章提供了一个C语言实现的例子,包括哈希表的创建、查找合适位置插入元素的函数以及主函数的使用,展示了哈希表在存储和查找数据时的运作过程。

原题:https://pintia.cn/problem-sets/15/problems/889

本题是考察对哈希表的理解,这里面哈希函数是用的除留余数法。【H(key)=key%p】除留余数法的关键在于找到那个余数p;题中已经给出。

规定处理哈希冲突的方法是线性探测法,就是简单地加一就行了。

#include<stdio.h>
#include<stdlib.h>
typedef struct h{
	int *data;
	int TableSize;			 
}*HashList;
HashList creat(int p)
{
	int i;
	HashList H=(HashList)malloc(sizeof(HashList));
	H->TableSize=p;
	H->data=(int*)malloc(sizeof(int)*H->TableSize); 
	for(i=0;i<p;i++)H->data[i]=0;//初始化0是空 
	return H;
}
int Findindex(HashList H,int key)//线性探测处理哈希冲突,找到合适的位置,并且返回它 
{	
	int index=key%H->TableSize; 
	//找空位,如果在找的过程中碰到它本身,直接退出就行了。 
 	while(H->data[index]!=0&&H->data[index]!=key)
	{
		index++;
		if(index==H->TableSize)index=0;//如果满了就从头开始找 
	} 			
	return index;
}
int insert(HashList H,int key)
{
	int index=Findindex(H,key);//先找一个合适的位置 
	H->data[index]=key;
	return index;
}
int main()
{
	int i,N,P,key;
	scanf("%d%d",&N,&P);
	HashList H=creat(P);
	for(i=0;i<N;i++)
	{
		scanf("%d",&key);
		int x=insert(H,key);
		if(i==0)
		printf("%d",x);
		else
		printf(" %d",x);
	}	
	return 0;
}

### 整型关键字的哈希表实现 #### 创建哈希表类 为了有效地管理键值对并提供高效的查找功能,可以创建一个名为 `HashTable` 的类。该类负责初始化哈希表、插入新项以及查询现有项。 ```cpp #include <vector> using namespace std; template<typename K, typename V> class HashTable { private: vector<pair<K, V>> table; size_t capacity; public: explicit HashTable(size_t cap) : capacity(cap), table(capacity) {} // 插入或更新键值对 void insert(const K& key, const V& value); // 查找指定键对应的值 bool find(const K& key, V &value); }; ``` #### 实现简单哈希函数 针对整数类型的键,可以直接采用模运算作为基本的哈希算法。这种方法能够快速计算出索引位置,并均匀布各个元素至不同的槽位上[^3]。 ```cpp size_t hashFunction(K key) { return abs(key) % this->capacity; } ``` #### 插入操作 当执行插入时,先利用上面定义好的哈希函数获取目标槽的位置;如果此位置为空,则直接放置新的记录;反之则需考虑解决碰撞的方法之一——开放寻址法中的线性探查策略[^2]。 ```cpp void HashTable::insert(const K& key, const V& value){ auto index = hashFunction(key); while (!table[index].first.empty() && table[index].first != key) { ++index %= capacity; // 线性探测下一个可用空间 } table[index] = make_pair(key, value); } ``` #### 查询操作 同样地,在寻找某个特定键的过程中也需要遵循相同的逻辑路径直到找到匹配项或是遍历完整个环形数为止[^4]。 ```cpp bool HashTable::find(const K& key, V &value){ auto index = hashFunction(key); do{ if (table[index].first == key){ value = table[index].second; return true; } ++index %= capacity; }while(table[index].first.has_value()); return false; } ``` 以上即为基于整型关键字构建哈希表的方式及其核心方法的具体编码示例。需要注意的是这里仅展示了最基础的形式,实际应用中可能还需要加入更多特性如动态调整容量等以提高性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值