一、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实现哈希表(分离链接法)的更多相关文章

  1. JAVA数据结构--哈希表的实现(分离链接法)

    哈希表(散列)的定义 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度 ...

  2. Python与数据结构[4] -> 散列表[1] -> 分离链接法的 Python 实现

    分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...

  3. 分离链接法(Separate Chaining)

    之前我们说过,对于需要动态维护的散列表 冲突是不可避免的,无论你的散列函数设计的有多么精妙.因此我们解决的重要问题就是:一旦发生冲突,我们该如何加以排解? 我们在这里讨论最常见的两种方法:分离链接法和 ...

  4. 解决hash冲突之分离链接法

    解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...

  5. POJ2549【hash分离链接法】

    题意: 给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d. 思路: 没想到可以用hash搞/ 这个就是数据结构里的分离链接法~ 解决hash冲突的方法:将所有关键字为 ...

  6. 使用python实现哈希表、字典、集合

    哈希表 哈希表(Hash Table, 又称为散列表),是一种线性表的存储结构.哈希表由一个直接寻址表和一个哈希函数组成.哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标. 简单哈希函数: ...

  7. 用python实现哈希表

    哈哈,这是我第一篇博客园的博客.尝试了一下用python实现的哈希表,首先处理冲突的方法是开放地址法,冲突表达式为Hi=(H(key)+1)mod m,m为表长. #! /usr/bin/env py ...

  8. 217。数据中是否有重复元素(哈希表/set简法)

    给定一个整数数组,判断是否存在重复元素. 如果任意一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 1: 输入: [1,2,3,1] 输出: t ...

  9. HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)

    1. ListNode 及 HashTable 的类型声明 声明 typedef int ElementType; typedef unsigned int Index; struct ListNod ...

随机推荐

  1. Linux中信号量的实现

    如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量.本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务. 信号量定义如下: struct semap ...

  2. 基于.NetCore开发博客项目 StarBlog - (3) 模型设计

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  3. js归并排序实现

    let arr = [3,4,2,8,1,1,2,2,3,3,4,5]; const merge = function(L,M,R) { let arr2=[]; let i=0; let p1 = ...

  4. Django/MySql数据库基本操作&ORM操作

    数据库配置: #第一步在settings里面 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbna ...

  5. javase集合 温故而知新

    复习javase集合 1.为什么要有集合? 数组长度需要在初始化时确定大小,数据结构单一.因此集合出现了 2.数组和集合的区别 区别一:数组既可以存储基本数据类型,又可以存储引用类型,集合只能存储引用 ...

  6. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  7. (Bezier)贝塞尔曲在路径规划的运用

    前言 之前被安排了活,一个局部区域机器运动控制的工作,大致是一个机器位于一个极限区域时候,机器要进入一个特殊的机制,使得机器可以安全的走出来.其中用到了bezier曲线进行优化路径,今天写一下,正好也 ...

  8. 拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)

    拯救一切强迫症 - 读<编写可维护的 JavaScript>(一) 本文写于 2020 年 4 月 24 日 我在小学的时候就有接触过编程,所以读大一的时候 C 语言还算是轻车熟路.自然会 ...

  9. 今天才发现ThinkPad的触摸板简直好用!傻乎乎的自己

    最近经常看到这句话,天下武功,唯快不破. 今天才发现ThinkPad的触摸板简直好用! 今天才发现,傻乎乎的自己. 前一阵鼠标不好用了,没有滚轮,一直傻瓜式操作点击浏览器的滚动条... 遇到没有滚动条 ...

  10. 面试官:BIO、NIO、AIO是什么,他们有什么区别?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,感觉上次的公司氛围不 ...