Python实现哈希表(分离链接法)
一、python实现哈希表
只使用list,构建简单的哈希表(字典对象)
# 不使用字典构造的分离连接法版哈希表
class HashList():
""" Simple hash function(seperate list table) by python list """
def __init__(self, table_size = 457):
self.usage = 0 # 已用
self.table_size = table_size # max size of hash table
# initial list table and the count num of table's list
self.hash_table = [[] for i in range(self.table_size)]
self.flags = [0 for i in range(self.table_size)] # the num of element store in each cell list def __len__(self):
return self.usage def __getitem__(self, key):
return self.get(key) def __setitem__(self, key, value):
return self.insert(key, value) def __contain__(self, key):
if self.get(key) is None:
return False
else:
return True def hash(self, key):
return (key + 27) % self.table_size # simple hash def check(self, key):
# handle nums(int) and chars
flag = False # [], "", 0 == False
if key is not None:
if isinstance(key, int) or isinstance(key, str):
flag = True
else:
print("Can't handle other datatype!")
else:
print("Key is None!")
return flag def get_pos(self, key):
# 每个函数只做自己该做的事
pos = 0
if isinstance(key, int):
pos = self.hash(key) # [[], [], ... , [[k1, v1], [k2, v2]], ..., []]
elif isinstance(key, str):
pos = self.hash(sum(map(lambda x: ord(x), key)))
return pos def get(self, key):
value = None
if self.check(key):
pos = self.get_pos(key) # 遍历key对应列表
for i in range(self.flags[pos]):
if self.hash_table[pos][i][0] == key:
# 对应pos的list上存在key print("\nfinding key:{}, pos:{}, idx:{}".format(key, pos, i))
value = self.hash_table[pos][i][1]
break
return value # invalid key def insert(self, key, value):
# Support key datatype: integer and string
flag = False
if self.check(key):
if self.__contain__(key):
print("Key:{} exsit!".format(key)) # 真存在key
else:
pos = self.get_pos(key) # key合法但是不存在
print("Insert key:{}, value:{}, pos:{}".format(key, value, pos))
if len(self.hash_table[pos]) == 0:
self.usage += 1 # if it's empty key, add usage num
self.hash_table[pos].append([key, value]) # 需存储键和值(对于id password很危险)
self.flags[pos] += 1 # num of element on this key
flag = True
return flag def clear(self):
self.usage = 0 # 已用
self.table_size = table_size # max size of hash table
self.flags = [0 for i in range(self.table_size)]
self.hash_table = [[] for i in range(self.table_size)]
def main():
table = HashList()
table["shopping"] = "8008208820"
table["12312qweq"] = [12312,123]
table[12312] = [12, 2, 123]
table.insert("helloworld", 12312)
table.insert("1888888888", "My brother")
table.insert("1518089898", "No problem")
table.insert([], 12312)
table.insert("", 12312)
table.insert(None, 12312) print()
table.insert(12312, [12, 2, 123])
table.insert("hash is hash", 110)
table["FirePolice"] = 119 print('\n',12312, table.get(12312))
print("12312qweq", table.get("12312qweq"))
print("hash is hash", table["hash is hash"])
print("1888888888", table["1888888888"])
t = HashList()
[t.insert(chr(ord('a') + i), i) for i in range(26)] if __name__ == "__main__":
main()
Python实现哈希表(分离链接法)的更多相关文章
- JAVA数据结构--哈希表的实现(分离链接法)
哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...
- Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
- 分离链接法(Separate Chaining)
之前我们说过,对于需要动态维护的散列表 冲突是不可避免的,无论你的散列函数设计的有多么精妙.因此我们解决的重要问题就是:一旦发生冲突,我们该如何加以排解? 我们在这里讨论最常见的两种方法:分离链接法和 ...
- 解决hash冲突之分离链接法
解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...
- POJ2549【hash分离链接法】
题意: 给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d. 思路: 没想到可以用hash搞/ 这个就是数据结构里的分离链接法~ 解决hash冲突的方法:将所有关键字为 ...
- 使用python实现哈希表、字典、集合
哈希表 哈希表(Hash Table, 又称为散列表),是一种线性表的存储结构.哈希表由一个直接寻址表和一个哈希函数组成.哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标. 简单哈希函数: ...
- 用python实现哈希表
哈哈,这是我第一篇博客园的博客.尝试了一下用python实现的哈希表,首先处理冲突的方法是开放地址法,冲突表达式为Hi=(H(key)+1)mod m,m为表长. #! /usr/bin/env py ...
- 217。数据中是否有重复元素(哈希表/set简法)
给定一个整数数组,判断是否存在重复元素. 如果任意一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 1: 输入: [1,2,3,1] 输出: t ...
- HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)
1. ListNode 及 HashTable 的类型声明 声明 typedef int ElementType; typedef unsigned int Index; struct ListNod ...
随机推荐
- 0基础学习docker
进入docker容器命令 docker exec -it 容器id bash 获取镜像 # 1.获取镜像,镜像托管仓库 docker search centos # 查询centos镜像 docker ...
- python学习-Day29
目录 今日内容详细 反射实际案例 面向对象的双下方法 __ str __ __ del __ __ getattr __ __ setattr __ __ call __ __ enter __ __ ...
- 同时将代码备份到Gitee和GitHub
同时将代码备份到Gitee和GitHub 如何将GitHub项目一步导入Gitee 如何保持Gitee和GitHub同步更新 如何将GitHub项目一步导入Gitee 方法一: 登陆 Gitee 账号 ...
- 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...
- JavaWeb之如何把请求数据转成实体类
JavaWeb之如何把请求数据转成实体类 自己写个工具类加入下面两个静态方法 自定一个注解类DateTimeFormatting 调用方式User user = util.ObjectFromMap( ...
- 如何查看Linux进程详情?(ps命令)
点击关注上方"开源Linux", 后台回复"读书",有我为您特别筛选书籍资料~ 1. ps是什么? 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是 ...
- 容器内的Linux诊断工具0x.tools
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 Linux上有大量的问题诊断工具,如perf.bcc等,但这些诊断工具,虽然功能强大,但却需要很高的权限才可以使用 ...
- 论文解读(SAGPool)《Self-Attention Graph Pooling》
论文信息 论文标题:Self-Attention Graph Pooling论文作者:Junhyun Lee, Inyeop Lee, Jaewoo Kang论文来源:2019, ICML论文地址:d ...
- 管家婆软件工贸版(标准财务+进销存+生产管理)V18.0功能简介
管家婆软件工贸版(标准财务+进销存+生产管理)V18.0功能简介 管家婆 工贸版(标准财务+进销存+生产管理) 1.整体介绍 管家婆工贸版系列软件是针对国内中小型生产加工企业,将ERP管理思想与几十万 ...
- 设计并实现加法器类 Adder
学习内容:设计并实现加法器类 Adder 代码示例: package 实验三; import java.util.Scanner; public class Adder { private int n ...