zoukankan      html  css  js  c++  java
  • 负载哈希

    class Array:
    def __init__(self, size=8, init=None):
    self._size = size
    self._items = [init] * size

    def __getitem__(self, index):
    return self._items[index]

    def __setitem__(self, key, value):
    self._items[key] = value

    def __len__(self):
    return self._size

    def clear(self, value=None):
    for i in range(len(self._items)):
    self._items[i] = value

    def __iter__(self):
    for i in self._items:
    yield i


    class Slot(object):
    def __init__(self, key, value,time=None):
    self.key, self.value, self.time = key, value, time


    class Hashtable:
    UNUSED = None
    EMPTY = Slot(None, None)

    def __init__(self):
    self._table = Array(8, Hashtable.UNUSED)
    self.length = 0

    def __len__(self):
    return self.length

    def _hash(self, value, M=13):
    if self.length >= 0.8 * len(self._table):
    self.rehash(len(self._table))
    index = hash(value) % M
    i = 1
    while True:
    while index >= len(self._table):
    self.rehash(len(self._table))
    if self._table[index] is not None and self._table[index] != Hashtable.EMPTY:
    index = (index + i * i) % M
    i += 1
    else:
    return index

    def find_key(self, key):
    for index, i in enumerate(self._table):
    if i != Hashtable.EMPTY and i != Hashtable.UNUSED:
    if i.key == key:
    return index
    return False

    def rehash(self, length):
    old_table = self._table
    self._table = Array(length * 2, Hashtable.UNUSED)
    for index, obj in enumerate(old_table, 0):
    self._table[index] = obj

    def add(self, key, value,time=None):
    index = self._hash(key)
    self._table[index] = Slot(key, value, time)
    self.length += 1

    def __iter__(self):
    for obj in self._table:
    if obj != Hashtable.UNUSED and obj != Hashtable.EMPTY:
    yield obj.key

    def remove(self, key):
    index = self.find_key(key)
    if not index:
    raise NameError
    self._table[index] = Hashtable.EMPTY
    self.length -= 1

    def clear(self):
    self.length = 0
    self._table = Array(8, Hashtable.UNUSED)

  • 相关阅读:
    configure: error: no acceptable cc found in $PATH
    SQL server的错误日志导致服务器C盘满
    域名/IP 正则表达式
    rpm 基本命令
    VB TO C#
    yum 的基本操作
    在服务器上怎么检查一个网站的在线连接数有多大。
    MSSQL2005不能连接远程有非法字符密码的数据库
    按账目类型和日期查看账目
    梦断代码读书笔记(二)
  • 原文地址:https://www.cnblogs.com/xuxingping/p/10946335.html
Copyright © 2011-2022 走看看