zoukankan      html  css  js  c++  java
  • 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("
    finding  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('
    ',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()
  • 相关阅读:
    听说在新的一年里你的证书过期了
    css 清楚浮动的8种方式
    Majority Element:主元素
    HDOJ 5296 Annoying problem LCA+数据结构
    hdu 5318 The Goddess Of The Moon 矩阵高速幂
    友盟页面统计
    用html语言写一个功课表
    苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
    Atitit.mssql 数据库表记录数and 表体积大小统计
    jeecms 代码生成 Tools
  • 原文地址:https://www.cnblogs.com/justLittleStar/p/13506883.html
Copyright © 2011-2022 走看看