Hashing Process

关于hash本身,解决冲突是一个小重点,如下图。

代码实现分析

—— 定义HashTable类

一、数据结构

  1. def __init__(self):
  2. self.size = 11
  3. self.slots = [None] * self.size
  4. self.data = [None] * self.size

二、Hashing策略

注意,因“冲突”而导致的rehash不是原本的"key+1",而是"key的hash结果+1"。用的是”线性解决冲突“的策略。

  1. def bashfunction(self, key, size):
  2. return key%size
  3.  
  4. def rehash(self, oldhash, size):
  5. return (oldhash+1)%size

三、设置

理解的关键,有冲突时找下一个位置,

  1. def put(self, key, data):
  2. hashvalue = self.hashfunction(key, len(self.slots))
  3.  
  4. if self.slots[hashvalue] == None
  5. # 第一次出现,则直接添加
  6. self.slots[hashvalue] = key
  7. self.data[hashvalue] = data
  8. else:
  9. if self.slots[hashvalue] == key:
  10. #已经有了则“更新”数值
  11. self.data[hashvalue] = data
  12. else:
    # 有值但key不是,说明“被占”了,那就循环直到”没冲突“时
  13. nextslot = self.rehash(bashvalue, len(self.slots))
  14. while self.slots[nextslot] != None and self.slots[nextslot] != key:  # ”被占“:非空,且key不对
  15. nextslot = self.rehash(nextslot, len(self.slots))
  16.  
  17. # 找到位置后,看位置的具体情况;
  18. if self.slots[nextslot] == None:
  19. # append new key.
  20. self.slots[nextslot] = key
  21. self.data[nextslot] = data
  22. else:
  23. # update existing key's value.
  24. self.data[nextslot] = data

四、获取

值得注意的是:”没找到“的标示是又回到了原来的起始位置。这也是线性探测的特点。

  1. def get(self, key):
  2. startslot = self.hashfuncion(key, len(self.slots))
  3.  
  4. data = None
  5. stop = False
  6. found = False
  7. position = startslot
  8.  
  9. while self.slots[position] != None and not found and not stop:
  10. if self.slots[position] == key:
  11. found = True
  12. data = self.data[position]
  13. else:
  14. # update 'position', 冲突解决之‘线性探测’
  15. position = self.rehash(position, len(self.slots))
  16. if position == startslot:
  17. # 是真没有这个key
  18. stop = True
  19.  
  20. return data

五、类的 ”字典化“

  1. def __getitem__(self, key):
  2. return self.get(key)
  3.  
  4. def __setitem__(self, key, data):
  5. self.put(key, data)

一个简单的例子:

  1. class Tag:
  2. def __init__(self):
  3. self.change={'python':'This is python'}
  4.  
  5. def __getitem__(self, item):
  6. print('这个方法被调用')
  7. return self.change[item]
  8.  
  9. a=Tag()
    print(a['python'])

End.

[Algorithm] Hashing for search的更多相关文章

  1. PAT-1145(Hashing - Average Search Time)哈希表+二次探测解决冲突

    Hashing - Average Search Time PAT-1145 需要注意本题的table的容量设置 二次探测,只考虑正增量 这里计算平均查找长度的方法和书本中的不同 #include&l ...

  2. 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 ...

  3. [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 ...

  4. PAT_A1145#Hashing - Average Search Time

    Source: PAT A1145 Hashing - Average Search Time (25 分) Description: The task of this problem is simp ...

  5. PAT 甲级 1145 Hashing - Average Search Time (25 分)(读不懂题,也没听说过平方探测法解决哈希冲突。。。感觉题目也有点问题)

    1145 Hashing - Average Search Time (25 分)   The task of this problem is simple: insert a sequence of ...

  6. 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 ...

  7. 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 ...

  8. 1145. Hashing - Average Search Time

      The task of this problem is simple: insert a sequence of distinct positive integers into a hash ta ...

  9. PAT 甲级 1145 Hashing - Average Search Time

    https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744 The task of this probl ...

随机推荐

  1. DFS树求割点问题

    时间复杂度:O(n玄学)总之不大 代码实现(好麻烦,蓝题变紫题) #include<iostream> #include<string.h> #include<algor ...

  2. Postman系列五:Postman中电商网站cookie、token检验与参数传递实战

    一:Postman中电商网站cookie实战 Postman接口请求使用cookie两种方式: 1.直接在header(头域)中添加cookie,适用于已知请求cookie头域的情况 2.使用Post ...

  3. Kafka集群环境配置

    Kafka集群环境配置 1 环境准备 1.1 集群规划 Node02 Node03 Node04 zk zk zk kafka kafka kafka 1.2 jar包下载 安装包:kafka_2.1 ...

  4. [Python] 通过采集23万条数据,对《哪吒》影评分析

    一.说明 数据来源:猫眼: 运行环境:Win10/Python3.7 和 Win7/Python3.5: 分析工具:jieba.WorldCloud.pyecharts和matplotlib: 程序基 ...

  5. mysql 实战

    建表语句: CREATE TABLE employee ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(150) NOT NULL DEFAULT ...

  6. 使用fine-uploader上传文件

    步骤1:下载fine-uploader 步骤2:加入引用 <link href="/fine-uploader/fine-uploader-gallery.min.css" ...

  7. WTM重磅更新,LayuiAdmin and more

    从善如登,从恶如崩.对于一个开发人员来说,那就是做一个好的系统不容易,想搞砸一个系统很简单,删库跑路会还不会么. 对于我们开源框架的作者来说,做一个好的框架就像登山(也许是登天),我们一步一步往上走, ...

  8. 利用poi包装一个简单的Excel读取器.一(适配一个Reader并提供readLine方法)

    通常,读文本我们会使用BufferedReader,它装饰或者说管理了InputStreamReader,同时提供readLine()简化了我们对文本行的读取.就像从流水线上获取产品一样,每当取完一件 ...

  9. P2050 [NOI2012]美食节 动态连边优化费用流

    题意 类似的一道排队等候,算最小总等待时间的题目. 思路 但是这道题的边数很多,直接跑会tle,可以动态加边,就是先连上倒数第一次操作的边,跑一遍费用流,然后对使用了倒数第一条边的点,连上相应的倒数第 ...

  10. 牛客-2018多校算法第五场C-KMP

    字符串的问题 在原来的字符串中前缀与后缀相同,且原来的中间还含有这个子串: 这里加的num[]数组真是太厉害了,可以直接用来判断中间是否有子串: #include <iostream> # ...