Algorithm第四版算法 C++实现(十)——基于拉链法的散列表(Hash table)

本文探讨了散列表的关键步骤——碰撞处理,重点介绍了使用拉链法解决冲突的方式,通过一个二维数组实现,每个数组元素对应一个链表,存储相同散列值的键值对。此外,还提及了使用STL中vector的理由,包括安全性、语法相似性和内置功能。接下来的内容将涉及线性探测法的散列表。
摘要由CSDN通过智能技术生成

要构造一个散列表,第二步(第一步比较简单就不说了,主要是得到hashcode与构造哈希表)也是最关键的一步就是碰撞处理
一种直接的办法就是将大小为M的数组中的每个元素都指向一条链表(此处用二维数组来表示),链表中每个结点都储存了散列值为当前键的值,这种方法叫做拉链法

template<typename T,typename V>
class hashST
{
public:
	hashST(int m)
	{
		this->m = m;
		st.resize(m);
	}
	V get(T key)
	{
		return st[hash(key)][0];
	}
	void put(T key, V value)
	{
		st[hash(key)].push_back(value);
	}
private:
	int n;	//键对总数
	int m;	//线性表大小
	std::vector<std::vector<V>> st;
	int hash(T key)
	{
		std::hash<T> hash_t;
		return (hash_t(key) & 0x7fffffff) % m;
	}
};

下一篇我们会介绍基于线性探测法的散列表。

关于我一直使用STL-vector这件事,我用vector是基于以下几点考虑:
  • vector更加的安全,不容易发生内存泄漏等问题
  • vector与java的语法更加相像,所以更方便执行书中的操作,也更方便理解
  • vector有很多现成的方法,方便我们进行调用而不必过多的重新构造相应方法

    (这可不是因为我懒哈)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值