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 ...
随机推荐
- JS_进阶-遍历对象属性、数组输出、Math、正则表达式匹配
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- 《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...
- python学习-Day30
目录 今日内容详细 作业讲解 设计模式 单例模式 实现思想 编写 pickle模块 今日内容详细 作业讲解 编写元类规定对象的所有数据值转大写 eg: obj.name = 'jason' print ...
- Linux 设置开机自启动脚本(ES、MySQL、Nacos、Nginx)
/etc/rc.d/init.d 中文件会在 Linux 系统各项服务都启动完毕之后再被运行 cd /etc/rc.d/init.d:新建xxx.sh文件. chmod +x xxx.sh,赋予可执行 ...
- NLTK基础学习
学习视频来自:Youtube 学习文档来自:简书 NLTK:自然语言工具包 目的:将段落拆分为句子.拆分词语,识别这些词语的词性,高亮主题,帮助机器了解文本关于什么.这个小节将解决意见挖掘或情感分析的 ...
- go 语言开发1 环境配置和语言基础
Go 语言环境配置 windows 环境变量: 设置 GOROOT (安装路径),GOPATH(工程目录) Path 中加入 %GOROOT%/bin 和 %GOPATH%/bin mac 环境变量: ...
- Sentinel Dashboard 规则 持久化到Nacos
本篇文章基于sentinel1.8.4版本进行改造的.本篇主要记录改造步骤 1.下载源码 https://github.com/alibaba/Sentinel 2.打开下载的sentinel,到se ...
- SpringBoot项目使用jasypt加解密
Jasypt 是一个 Java 库,它允许开发者以最小的努力为他 / 她的项目添加基本的加密功能,而且不需要对密码学的工作原理有深刻的了解. 一.添加依赖 <dependency> < ...
- 561. Array Partition I - LeetCode
Question 561. Array Partition I Solution 题目大意是,给的数组大小是2n,把数组分成n组,每组2个元素,每个组取最小值,这样就能得到n个值,怎样分组才能使这n个 ...
- 「ABC 249Ex」Dye Color
考虑停时定理. 初始势能为 \(\sum \Phi(cnt_i)\),末势能为 \(\Phi(n)\),我们希望构造这样一个 \(\Phi:Z\to Z\) 函数,使得每一次操作期望势能变化量为常数. ...