python实现顺序查找和哈希查找
顺序查找非常简单,只是个开胃菜,今天主要练习的是哈希查找
先上顺序查找代码:
def sequence_search(array, num):for i in range(len(array)):if array[i] == num:return ireturn Falsearray_0 = [23, 43, 12, 54, 65, 48]
print(sequence_search(array_0, 12))
>>> 2
在来看hash查找:
算法思想
哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。
算法流程
1)用给定的哈希函数构造哈希表;
2)根据选择的冲突处理方法解决地址冲突;
常见的解决冲突的方法:拉链法和线性探测法。
3)在哈希表的基础上执行哈希查找。
单纯论查找复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)(注意,在查找之前我们需要构建相应的Hash表)。
class HashSearch:def __init__(self, num):if isinstance(num, int):self.num = abs(num)self.empty = self.numself._list = [None] * self.numelse:raise TypeError('num must be a int number')def __hash(self, key):return key % self.numdef put(self, key):assert self.empty > 0, 'this array is full'index = self.__hash(key)while self._list[index]:index = self.__hash(index+1)self._list[index] = keyself.empty -= 1def find(self, key):index = self.__hash(key)temp = indexwhile self._list[index] != key:index = self.__hash(index+1) if index == temp:return Falsereturn index
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class HashTable:def __init__(self):# 哈希表的初始大小已经被选择为 11。尽管这是任意的,但是重要的是,# 大小是质数,使得冲突解决算法可以尽可能高效。self.size = 11self.slots = [None] * self.sizeself.data = [None] * self.size# hash 函数实现简单的余数方法def hash(self, key, size):return key % size# 冲突解决技术是 加1 rehash 函数的线性探测def rehash(self, old_hash, size):return (old_hash+1) % size# 假定最终将有一个空槽,除非 key 已经存在于 self.slots 中。 它计算原始# 哈希值,如果该槽不为空,则迭代 rehash 函数,直到出现空槽。如果非空槽已经包含 key,# 则旧数据值将替换为新数据值。def put(self, key, data):hash_value = self.hash(key, len(self.slots))if self.slots[hash_value] is None:self.slots[hash_value] = keyself.data[hash_value] = dataelse:if self.slots[hash_value] == key:self.data[hash_value] = dataelse:next_slot = self.rehash(hash_value, len(self.slots))while self.slots[next_slot] is not None and \self.slots[next_slot] != key:next_slot = self.rehash(next_slot, len(self.slots))if self.slots[next_slot] is None:self.slots[next_slot] = keyself.data[next_slot] = dataelse:self.data[next_slot] = data# 从计算初始哈希值开始。如果值不在初始槽中,则 rehash 用# 于定位下一个可能的位置。def get(self, key):start_slot = self.hash(key, len(self.slots))data = Nonestop = Falsefound = Falsepos = start_slotwhile self.slots[pos] is not None and not found and not stop:if self.slots[pos] == key:found = Truedata = self.data[pos]else:pos = self.rehash(pos, len(self.slots))if pos == start_slot:stop = Truereturn data# 我们重载 __getitem__ 和 __setitem__ 方法以允许使# 用 [] 访问。 这意味着一旦创建了HashTable,索引操作符将可用。def __getitem__(self, item):return self.get(item)def __setitem__(self, key, value):self.put(key, value)
python实现顺序查找和哈希查找相关推荐
- python实现顺序查找和哈希查找算法
顺序查找 顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法,顺序查找是最简单的搜索算法,其实现如下: def sequential_search(items, item):for i i ...
- 数据结构和算法系列13 五大查找之哈希查找
原文地址 http://www.cnblogs.com/mcgrady/p/3294871.html 数据结构和算法系列13 五大查找之哈希查找 这一篇要总结的是五天查找的最后一篇,哈希查找,也称为散 ...
- C/C++折半查找与哈希查找[2023-05-11]
C/C++折半查找与哈希查找[2023-05-11] 4.折半查找与哈希查找(难度等级 A) [问题描述] 查找是通过在查找表中做比较来完成的操作.折半查找与哈希查找都是利用数组实现的查找算法.通过本 ...
- 查找算法06-哈希查找
查找算法06-哈希查找 6.哈希查找 6-1实现代码 6-2测试 6-3方法解析 知识分享: 热门博客 6.哈希查找 (1)概述 在哈希表中,若出现key1≠key2,而f(key1)=f(key2) ...
- 九种查找算法-哈希查找
哈希查找算法又称散列查找算法,是一种借助哈希表(散列表)查找目标元素的方法,查找效率最高时对应的时间复杂度为 O(1). 哈希查找算法适用于大多数场景,既支持在有序序列中查找目标元素,也支持在无序序列 ...
- C++实现查找 - 顺序、二分和哈希查找
数据结构与算法专栏 -- C++实现 写在前面: 前面我们其实已经涉及到了查找算法,比如二叉排序树和平衡二叉树等.这一讲我们来补充一下其它常见的查找算法,下面我会依次讲解并实现顺序查找.二分查找和哈希 ...
- 【python】数据结构与算法之二分查找
一.查找 在一组数据中找某一个特定项的算法过程 通常用来判断某个特定项是否在一组数据中,最终返回True或False 常用的查找算法:顺序查找.二分查找.树表查找.哈希查找等 二.二分查找 二分查找又 ...
- 数据结构哈希查找的C语言实现
大家好,我是练习编程时长两年半的昆工第一ikun,今天我们来分享查找算法中的一个--哈希查找,哈希查找适用于有庞大的数据量时的查找,是一种很好用的查找算法,话不多说,开团!!! 一.六种 ...
- 【查找算法】哈希查找法
本篇文章将介绍一种新的查找算法--哈希查找. 文章目录 何为哈希查找? 散列表 冲突 构造散列函数 直接定址法 除留余数法 解决冲突的方式 开放地址法 链地址法 查找效率分析 何为哈希查找? 先看定义 ...
最新文章
- 一则鬼故事:如果全世界程序员都消失了
- views 多个文件夹 netcore_Visual Studio 2019发布.NET Core项目部署或者独立运行的方法...
- CodeSmith实用技巧(八):生成的代码输出到文件中
- 计算机组成原理期末复习题
- 旅游解说系统 VS 旅游信息系统
- 9月10日见!OPPO再曝Reno2相机细节:你想要的全都有
- 容器入门(6) - 获取访问Docker Registry的公钥证书
- go install
- Android学习(十三) BroadcastReceiver组件(广播)
- php中函数的类型提示和文件读取功能
- 为资产分类定义折旧范围_SAP FICO-AA资产知识要点.doc
- 落户雄安,千方科技助力新区打造智慧出行样板
- 参加考试时不要使用计算机,2016年计算机等级考试上机操作应试技巧
- 宇视NVR录像机下载录像没有声音如何解决
- TemplateBinding和Binding的区别
- MySQL Manual
- 吉林大学计算机 王恩,【十佳研究生】王恩:越努力,越幸运
- 什么是云计算的简单理解
- 计算机丢失mfc110d.dll,msvcp110d.dll
- 电机学变压器涉及公式学习笔记(待补全)