一、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()

最新文章

  1. 实现代理设置proxy
  2. 分布式搜索引擎Elasticsearch的查询与过滤
  3. java.lang.UnsupportedClassVersionError出错
  4. Debian使用相关
  5. Android 综合揭秘 —— 全面剖释 Service 服务
  6. Jquery下拉效果
  7. 15+ 易响应的CSS框架快速开启你的敏捷网站项目
  8. Codeforces Round #343 (Div. 2) C. Famil Door and Brackets
  9. cocos2d-x图片变灰或者变亮
  10. innobackupex --slave-info参数的含义和适用场景
  11. Performance tuning library cache lock & single-task message
  12. PHP图的绘制1
  13. JVM启动过程——JVM之一
  14. xWorks下的硬盘启动方法
  15. Java笔试
  16. Cetos 中添加bbr服务
  17. zookeeper 入门知识
  18. c语言中几个常见的库函数strlen、strcmp、strcat、strcpy、strncpy、memset、memcpy、memmove、mmap
  19. (CoreText框架)NSAttributedString 2
  20. 《JavaWeb从入门到改行》fileupload,没毛病

热门文章

  1. C语言超全学习路线(收藏让你少走弯路)
  2. js call与bind和apply的区别
  3. XCTF练习题---MISC---Test-flag-please-ignore
  4. 使用 docker-compose 部署 golang 的 Athens 私有代理
  5. 【ACM程序设计】最小生成树 Prim算法
  6. 电脑UEFI启动是什么?
  7. numpy学习Ⅱ
  8. 关于position的relative和absolute分别是相对于谁进行定位的
  9. css属性补充与JS数据类型
  10. 【单片机】CH32V103v8t6开发板调试笔记