Python数据结构-哈希表(Hash Table)

Python021

Python数据结构-哈希表(Hash Table),第1张

哈希表(Hash Table) :通过键 key 和一个映射函数 Hash(key) 计算出对应的值 value,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

哈希函数(Hash Function) :将哈希表中元素的关键键值映射为元素存储位置的函数。

哈希冲突(Hash Collision) :不同的关键字通过同一个哈希函数可能得到同一哈希地址。

哈希表的两个核心问题是: 「哈希函数的构建」 「哈希冲突的解决方法」

常用的哈希函数方法有:直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。

常用的哈希冲突的解决方法有两种:开放地址法和链地址法。

给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。

如果存在则返回 true,不存在返回 false。

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。

数字 1-9 在每一列只能出现一次。

数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

力扣217

力扣389

力扣496

内容参考: https://algo.itcharge.cn/05.%E5%93%88%E5%B8%8C%E8%A1%A8/01.%E5%93%88%E5%B8%8C%E8%A1%A8%E7%9F%A5%E8%AF%86/

1-collections.MutableMapping

1.1 概念:这是什么?

大家可能想知道这一串英文是什么意思?其实只需要了解在collections库当中有一个非常重要的抽象基类MutableMappin

g,专门用于实现map的一个非常有价值的工具。后边我们会用到它。

2-我们的map基类

2.1 实现这个类

这个基类其实也就是确定了键值对的属性,并且存储了基本的比较方法。它的对象就是一个键值对咯。这个很好理解。有点类似object的感觉。

3-通过map基类实现的无序映射

给大家看一个上边的例子,这个例子来源于网络,自己改了改,能用,更加详细而已,凑合看.

4-Python哈希表的实现的基类

4.1 咱有话直说:上才(代)艺(码)

如果还不知道哈希表概念的同xio,请参考 python进阶之数据结构与算法–中级-哈希表(小白piao分享) 。废话不多说,咱们撸代码:

OK了,基本的哈希表就实现了,其实仔细想想很容易,但是自己要能实现还是要理解哈希表的本质哦,外加一定量的练习才可以熟练掌握,练习的目的就是为了熟练而已。

5-分离链表实现的具体哈希map类

说明:这玩意只是一种降低冲突的手段,上一节提过,降低冲突最好的地方是发生在元组进入桶的时候,所以想必大家猜到了,接下来的分离链表也就是为了self._bucket_xxxxxxx系列方法做准备。这里之所以在上边使用@abstractmethod就是为了继承实现,目的可以实现多种将冲突的哈希表。分离链表的概念上一节也有的。

“见码入面”(借鉴:见字如面这个电视节目,有兴趣可以看看,还不错的):

6-用线性探测处理冲突的哈希map类

这种方式的好处不需要再去借助其他额外的赋值结构来表示桶。结构更加简单。不会再像上一种方法还要让桶是一个UnsortedTableMap的对象。

代码如下:

一,数据结构概述

(一)什么是数据结构

(二)数据的逻辑结构

1,集合:

2,线性结构

3,树形结构

4,图状结构

(三)数据的存储结构

1,顺序存储结构

2,链式存储结构

3,索引存储结构

4,哈希存储结构

二,数据类型概述

(一)python基本数据类型

(二)抽象数据类型

三,算法概述

(一)什么是算法

1,算法的5个重要特性

2,算法的5个衡量标准

(二)算法的时间复杂度

(三)算法的空间复杂度

例子:兔子的繁殖问题

使用递归:

使用数组:

使用迭代:

一,数据结构概述

(一)什么是数据结构

数据是指所有能够输入到计算机中存储并被计算机程序处理的符号的集合。

比如数据库中保存的学生信息。

数据元素是数据的基本单位。

如果以学号、 性别和姓名来标识某个学生, 那么由学号、 性别和姓名组成的学生记录将构成一个数据元素。

数据项是构成数据元素的不可分割的最小单位。

比如学生记录中的学号、 性别或姓名,每一项就是一个数据项。

数据对象是性质相同的数据元素的集合, 是数据的一个子集。

比如学生记录中的学号数据。

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。这些数据间的关联关系就是结构,数据结构通常包括数据的逻辑结构和存储结构两个层次。

(二)数据的逻辑结构

数据的逻辑结构是从数据元素的逻辑关系上抽象描述数据,可以被看作是从具体问题中抽象出来的数学模型。

根据数据元素之间的不同关系特性, 通常可将数据逻辑结构分为线性结构、集合、树形结构和图状结构