散列表

匿名 (未验证) 提交于 2019-12-03 00:36:02

一.散列表(Hash Table)

1.用来实现字典操作的一组有效数据结构

2.直接寻址表(直接寻址):数组T[0...m-1],可以存放动态集合的元素

 1 class direct_address_table:  2     ‘‘‘直接寻址表‘‘‘  3     def __init__(self, T=[], size=0):  4         if len(T) == 0:  5             self.T = [None for i in range(size)]  6         else:  7             self.T = T  8         self.size = size  9     ‘‘‘对于节点‘‘‘ 10     def search(self, k): 11         return self.T[k] 12  13     def insert(self, x): 14         self.T[x.key] = x 15  16     def delete(self, x): 17         self.T[x.key] = None 18  19 class Node: 20     def __init__(self, key): 21         self.key = key 22  23 T=[] 24 dat=direct_address_table(T,10) 25 x=Node(2) 26 print(dat.insert(x))
直接寻址表

3.散列表:利用散列函数(hash function)h,把原来具有关键字k的元素存放在槽k中变成该元素放在h(k)中

冲突:两个关键字映射到同一个槽中

 1 class chained_hash:  2     ‘‘‘链接法散列,查找和插入时都要判断槽中有没有元素‘‘‘  3     def __init__(self, T=[], size=0):  4         if len(T) == 0:  5             self.T = [None for i in range(size)]  6         else:  7             self.T = T  8         self.size = size  9     def search(self, k): 10         if self.T[self.hash_h(k)] != None: 11             x = self.T[self.hash_h(k)].list_search(k) 12             return x 13         return None 14     def insert(self, x): 15         if self.T[self.hash_h(x.key)] == None: 16             self.T[self.hash_h(x.key)] = DoublyLinkedList(x) 17         else: 18             self.T[self.hash_h(x.key)].list_insert(x) 19     def delete(self, x): 20         self.T[self.hash_h(x.key)].list_delete(x) 21     def hash_h(self, key): 22         ‘‘‘hash函数‘‘‘ 23         return key % 12 24  25 class Node: 26     def __init__(self, key): 27         self.key = key 28 class DoublyNode: 29     def __init__(self, n_prev, n_next, key): 30         self.prev = n_prev 31         self.next = n_next 32         self.key = key 33  34 class DoublyLinkedList: 35     def __init__(self, head): 36         self.head = head 37  38     def list_search(self, k): 39         x = self.head 40         while x != None and x.key != k: 41             x = x.next 42         return x 43  44     def list_insert(self, x): 45         x.next = self.head 46         if self.head != None: 47             self.head.prev = x 48         self.head = x 49         x.prev = None 50  51     def list_delete(self, x): 52         if x.prev != None: 53             x.prev.next = x.next 54         else: 55             self.head = x.next 56         if x.next != None: 57             x.next.prev = x.prev 58  59 T=[] 60 x=DoublyNode(None,None,13) 61 ch=chained_hash(T,12) 62 ch.insert(x) 63 x=DoublyNode(None,None,25) 64 ch.insert(x) 65 y=ch.search(25) 66 print(y.key) 67  68 ch.delete(y) 69 print(ch.T[1].head) 70 print(ch.T[1].head.key) 71 print(ch.T[1].head.next) 72 ----------------------------------------- 73 25 74 <__main__.DoublyNode object at 0x039C78B0> 75 13 76 None
链接法散列

散列函数的选择:1)除法散列法:h(k)=k mod m ;2)乘法散列法:h(k)=[m(kA mod 1)] ; 3)全域散列法

(2)开放寻址法:所有元素都存放在散列表中,通过探查,找到空槽放置关键字

 1 class open_address_hash:  2     ‘‘‘开放寻址散列,散列表T和一个关键字k‘‘‘  3     def __init__(self, T=[], size=0):  4         if len(T) == 0:  5             self.T = [None for i in range(size)]  6         else:  7             self.T = T  8         self.size = size  9  10     def hash_insert(self, k): 11         ‘‘‘插入关键字k,返回k的插槽或已满标志‘‘‘ 12         i = 0 13         while i < self.size: 14             j = self.hash_h1_h2(k, i)#搜寻空槽并插入 15             if self.T[j] == None: 16                 self.T[j] = k 17                 return j 18             else: 19                 i += 1 20         return "hash table overflow" 21  22     def hash_search(self, k): 23         ‘‘‘查找,如果槽j包含了关键字k,则返回j,否则返回NOne‘‘‘ 24         i = 0 25         j = self.hash_h1_h2(k, i) 26         while self.T[j] != None and i < self.size: 27             j = self.hash_h1_h2(k, i) 28             if self.T[j] == k: 29                 return j 30             else: 31                 i += 1 32         return None 33  34     def hash_h1_h2(self, k, i): 35         ‘‘‘hash 函数‘‘‘ 36         return ((k % self.size + i * (1 + k % (self.size - 2)))) % self.size 37  38 T=[] 39 oah=open_address_hash(T,13) 40 print(oah.hash_insert(79)) 41 print(oah.hash_insert(69)) 42 print(oah.hash_search(50)) 43 ------------------------------ 44 1 45 4 46 None
开放地址散列

原文:https://www.cnblogs.com/yu-liang/p/9226447.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!