《数据结构》学习-- Hash(2) --Separate Chaining

本文详细介绍了数据结构中的Separate Chaining方法,用于解决哈希表中的冲突问题。通过将每个元素改为指针链表,实现插入、查找和删除操作。同时,文章讨论了rehash的原理和load factor的重要性,以及在C++中实现Separate Chaining的代码细节。
摘要由CSDN通过智能技术生成

本系列是《数据结构与算法分析-C语言描述》(Data Structures and Algorithm Analysis in C,作者Mark Weiss)一书的学习笔记,当我在做cc150需要补某个知识点时,就会把这本书翻出来学习一下,同时分享~

如果你有任何问题和建议,希望能与我分享.

1. 回顾

上一次我们简单介绍了:

  1. Hash表的概念
    由输入数据的数据结构构成的Array
  2. 优缺点
    查找、插入、删除平均常数时间。但不维护Array的顺序。
  3. 四大要素
    Hash表主体,Hash表大小,Hash Function,冲突解决方案。

实际上,Hash表最难设计的就是Hash Function以及冲突解决方法(Collision Resolution)。关于Hash Function的设计,没有一个统一的方法,常用的方法我们也在第一章介绍过了。
这一章,我们将介绍一种常用的冲突解决方案,即开散列法(Separate Chaining)。

2. Separate Chaining简介

Separate Chaining的思想无比简单。即原本Hash表每个元素是一个输入数据的数据结构类型,现在把每个元素改成一个由该数据结构类型构成的指针链表。这样,当发生冲突时,只要在该指针链表的尾端或首端插入该值即可。

3.Rehash

在详述我们的HashTable实现之前,我们还要引入最后一个概念:rehash。当我们不断往HashTable内插入元素,HashTable就会越来越满,而Find,Insert,Remove的操作都会越来越慢!
事实上,我们定义一个负重参数(load factor) λ ,它的值是HashTable已有的元素数除以HashTable表大小。对于每一次不成功的搜索,平均搜索次数为 λ (不包括最后的NULL),对于每一次成功的搜索,平均搜索次数为 1+λ/2 。因此,HashTable本身的大小对性能的影响并不大,重要的是load factor的大小。Mark Weiss建议,general rule是保证 λ

Redis在不同版本中对哈希表(hash)的数据结构进行了一些改进和优化。下面是Redis中哈希表的数据结构在不同版本中的变化: 1. Redis 2.4及之前版本: - 哈希表的底层数据结构使用链地址法(Separate Chaining)来解决哈希冲突。每个哈希表节点包含一个指向下一个节点的指针,形成链表结构。 - 每个哈希表节点包含一个键(key)和值(value),以及一个指向下一个节点的指针。 2. Redis 2.6版本: - 引入了渐进式哈希表扩容(progressive hash table expansion)的概念,用于解决哈希冲突。 - 哈希表的底层数据结构使用链地址法(Separate Chaining)来解决哈希冲突。 3. Redis 3.0版本: - 引入了ziplist(压缩列表)作为哈希表的底层数据结构,用于存储较小的哈希表。 - 当哈希表的键值对数量较小时,Redis会使用ziplist来存储,以节省内存空间。 4. Redis 3.2版本: - 哈希表的底层数据结构可以是ziplist或者hashtable。 - 当哈希表的键值对数量较小时,Redis会使用ziplist来存储,以节省内存空间。而当键值对数量超过一定阈值时,会切换为hashtable。 5. Redis 4.0及之后版本: - 哈希表的底层数据结构可以是ziplist、hashtable或者quicklist。 - quicklist是一种优化的数据结构,用于存储大型哈希表。它将多个hashtable链接在一起,以减少内存碎片和提高性能。 需要注意的是,Redis的不同版本可能会引入新的功能和优化,并可能修改底层数据结构以提高性能和减少内存消耗。因此,具体的数据结构和实现方式可能会随着版本的更新而有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值