一、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. Ubuntu22.04搭建PWN环境

    前言 最近尝试在Ubuntu最新的版本22.04版本上搭建PWN环境,有了之前在kali上搭建的经验,总的来说问题不大.但搭建的时候还是有不少地方出错了,好在搭建的过程中不断的拍摄快照,所以整个过程还 ...

  2. JS 中 对象 基础认识

    俗话说:"万物皆对象",在 Javascript  中除了原始值几乎所有的东西都可以看做对象: 布尔是对象( new 关键词定义) 数字是对象( new 关键词定义) 字符串是对象 ...

  3. 印尼医疗龙头企业Halodoc的数据平台转型之路:数据平台V1.0

    1. 摘要 数据是每项技术业务的支柱,作为一个健康医疗技术平台,Halodoc 更是如此,用户可以通过以下方式与 Halodoc 交互: 送药 与医生交谈 实验室测试 医院预约和药物 所有这些交互都会 ...

  4. CentOS 8及以上版本配置IP的方法,你 get 了吗

    接上篇文章讲了 Ubuntu 18及以上版本的配置方法,本文再来讲讲 CentOS 8 及以上版本配置 IP 的方法. Centos/Redhat(8.x) 配置 IP 方法 说明:CentOS 8 ...

  5. 面试官:ElasticSearch是什么,它有什么特性与使用场景?

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

  6. 基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理

    在前面介绍的SqlSugar的相关查询处理操作中,我们主要以单表的方式生成相关的实体类,并在查询的时候,对单表的字段进行条件的对比处理,从而返回对应的数据记录.本篇随笔介绍在一些外键或者中间表的处理中 ...

  7. mysql allow remote host

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEG ...

  8. 872. Leaf-Similar Trees - LeetCode

    Question 872. Leaf-Similar Trees Solution 题目大意: 如果两个二叉树的叶子节点相同就认为这两个二叉树相似.给两个二叉树判断是否相似. 思路: 用递归把两个二叉 ...

  9. 个人冲刺(一)——体温上报app(一阶段)

    任务:完成了体温上报app的整体页面布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?& ...

  10. 碎碎念软件研发02:敏捷之Scrum

    一.什么是 Scrum 1.1 Scrum 定义 Scrum 是敏捷开发方法之一,它使用比较广泛. 敏捷的其它开发方法还有 XP(极限编程).FDD(特性驱动开发).Crystal(水晶方法).TDD ...