[Algorithm] Hashing for search
Hashing Process
关于hash本身,解决冲突是一个小重点,如下图。
代码实现分析
—— 定义HashTable类
一、数据结构
- def __init__(self):
- self.size = 11
- self.slots = [None] * self.size
- self.data = [None] * self.size
二、Hashing策略
注意,因“冲突”而导致的rehash不是原本的"key+1",而是"key的hash结果+1"。用的是”线性解决冲突“的策略。
- def bashfunction(self, key, size):
- return key%size
- def rehash(self, oldhash, size):
- return (oldhash+1)%size
三、设置
理解的关键,有冲突时找下一个位置,
- def put(self, key, data):
- hashvalue = self.hashfunction(key, len(self.slots))
- if self.slots[hashvalue] == None
- # 第一次出现,则直接添加
- self.slots[hashvalue] = key
- self.data[hashvalue] = data
- else:
- if self.slots[hashvalue] == key:
- #已经有了则“更新”数值
- self.data[hashvalue] = data
- else:
# 有值但key不是,说明“被占”了,那就循环直到”没冲突“时- nextslot = self.rehash(bashvalue, len(self.slots))
- while self.slots[nextslot] != None and self.slots[nextslot] != key: # ”被占“:非空,且key不对
- nextslot = self.rehash(nextslot, len(self.slots))
- # 找到位置后,看位置的具体情况;
- if self.slots[nextslot] == None:
- # append new key.
- self.slots[nextslot] = key
- self.data[nextslot] = data
- else:
- # update existing key's value.
- self.data[nextslot] = data
四、获取
值得注意的是:”没找到“的标示是又回到了原来的起始位置。这也是线性探测的特点。
- def get(self, key):
- startslot = self.hashfuncion(key, len(self.slots))
- data = None
- stop = False
- found = False
- position = startslot
- while self.slots[position] != None and not found and not stop:
- if self.slots[position] == key:
- found = True
- data = self.data[position]
- else:
- # update 'position', 冲突解决之‘线性探测’
- position = self.rehash(position, len(self.slots))
- if position == startslot:
- # 是真没有这个key
- stop = True
- return data
五、类的 ”字典化“
- def __getitem__(self, key):
- return self.get(key)
- def __setitem__(self, key, data):
- self.put(key, data)
一个简单的例子:
- class Tag:
- def __init__(self):
- self.change={'python':'This is python'}
- def __getitem__(self, item):
- print('这个方法被调用')
- return self.change[item]
- a=Tag()
print(a['python'])
End.
[Algorithm] Hashing for search的更多相关文章
- PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突
Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...
- PAT 1145 Hashing - Average Search Time [hash][难]
1145 Hashing - Average Search Time (25 分) The task of this problem is simple: insert a sequence of d ...
- [PAT] 1143 Lowest Common Ancestor(30 分)1145 Hashing - Average Search Time(25 分)
1145 Hashing - Average Search Time(25 分)The task of this problem is simple: insert a sequence of dis ...
- PAT_A1145#Hashing - Average Search Time
Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...
- PAT 甲级 1145 Hashing - Average Search Time (25 分)(读不懂题,也没听说过平方探测法解决哈希冲突。。。感觉题目也有点问题)
1145 Hashing - Average Search Time (25 分) The task of this problem is simple: insert a sequence of ...
- PAT A1145 Hashing - Average Search Time (25 分)——hash 散列的平方探查法
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- hdu, KMP algorithm, linear string search algorithm, a nice reference provided 分类: hdoj 2015-07-18 13:40 144人阅读 评论(0) 收藏
reference: Rabin-Karp and Knuth-Morris-Pratt Algorithms By TheLlama– TopCoder Member https://www.top ...
- 1145. Hashing - Average Search Time
The task of this problem is simple: insert a sequence of distinct positive integers into a hash ta ...
- PAT 甲级 1145 Hashing - Average Search Time
https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744 The task of this probl ...
随机推荐
- DFS树求割点问题
时间复杂度:O(n玄学)总之不大 代码实现(好麻烦,蓝题变紫题) #include<iostream> #include<string.h> #include<algor ...
- Postman系列五:Postman中电商网站cookie、token检验与参数传递实战
一:Postman中电商网站cookie实战 Postman接口请求使用cookie两种方式: 1.直接在header(头域)中添加cookie,适用于已知请求cookie头域的情况 2.使用Post ...
- Kafka集群环境配置
Kafka集群环境配置 1 环境准备 1.1 集群规划 Node02 Node03 Node04 zk zk zk kafka kafka kafka 1.2 jar包下载 安装包:kafka_2.1 ...
- [Python] 通过采集23万条数据,对《哪吒》影评分析
一.说明 数据来源:猫眼: 运行环境:Win10/Python3.7 和 Win7/Python3.5: 分析工具:jieba.WorldCloud.pyecharts和matplotlib: 程序基 ...
- mysql 实战
建表语句: CREATE TABLE employee ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(150) NOT NULL DEFAULT ...
- 使用fine-uploader上传文件
步骤1:下载fine-uploader 步骤2:加入引用 <link href="/fine-uploader/fine-uploader-gallery.min.css" ...
- WTM重磅更新,LayuiAdmin and more
从善如登,从恶如崩.对于一个开发人员来说,那就是做一个好的系统不容易,想搞砸一个系统很简单,删库跑路会还不会么. 对于我们开源框架的作者来说,做一个好的框架就像登山(也许是登天),我们一步一步往上走, ...
- 利用poi包装一个简单的Excel读取器.一(适配一个Reader并提供readLine方法)
通常,读文本我们会使用BufferedReader,它装饰或者说管理了InputStreamReader,同时提供readLine()简化了我们对文本行的读取.就像从流水线上获取产品一样,每当取完一件 ...
- P2050 [NOI2012]美食节 动态连边优化费用流
题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...
- 牛客-2018多校算法第五场C-KMP
字符串的问题 在原来的字符串中前缀与后缀相同,且原来的中间还含有这个子串: 这里加的num[]数组真是太厉害了,可以直接用来判断中间是否有子串: #include <iostream> # ...