without haste but without rest
[python] 자료구조 - 오픈 해싱(Open Hashing) 본문
오픈 해싱(Open Hashing)
오픈 해싱은 해시 테이블의 충돌 문제를 해결하는 대표적인 방법중 하나로 체이닝(Separate Chaining) 기법이라고도 한다. 만약 해시 값이 중복되는 경우, 먼저 저장된 데이터에 링크드 리스트를 이용하여 중복 해시 데이터를 연결한다.
파이썬에는 굳이 링크드 리스트를 안 쓰고 슬롯을 이중 리스트 구조로 활용해서 간단하게 구현할 수 있다.
# open hashing
class OpenHash:
def __init__(self, table_size):
self.size = table_size
self.hash_table = [0 for a in range(self.size)]
def getKey(self, data):
self.key = ord(data[0])
return self.key
def hashFunction(self, key):
return key % self.size
def getAddress(self, key):
myKey = self.getKey(key)
hash_address = self.hashFunction(myKey)
return hash_address
def save(self, key, value):
hash_address = self.getAddress(key)
if self.hash_table[hash_address] != 0:
for a in range(len(self.hash_table[hash_address])):
if self.hash_table[hash_address][a][0] == key:
self.hash_table[hash_address][a][1] = value
return
self.hash_table[hash_address].append([key, value])
else:
self.hash_table[hash_address] = [[key, value]]
def read(self, key):
hash_address = self.getAddress(key)
if self.hash_table[hash_address] != 0:
for a in range(len(self.hash_table[hash_address])):
if self.hash_table[hash_address][a][0] == key:
return self.hash_table[hash_address][a][0]
return False
else:
return False
def delete(self, key):
hash_address = self.getAddress(key)
if self.hash_table[hash_address] != 0:
for a in range(len(self.hash_table[hash_address])):
if self.hash_table[hash_address][a][0] == key:
if len(self.hash_table[hash_address]) == 1:
self.hash_table[hash_address] = 0
else:
del self.hash_table[hash_address][a]
return
return False
else:
return False
#Test Code
h_table = OpenHash(8)
h_table.save('aa', '1111')
h_table.read('aa')
data1 = 'aa'
data2 = 'ad'
print(ord(data1[0]))
print(ord(data2[0]))
h_table.save('ad', '2222')
print(h_table.hash_table)
h_table.read('aa')
h_table.read('ad')
h_table.delete('aa')
print(h_table.hash_table)
print(h_table.delete('Data'))
h_table.delete('ad')
print(h_table.hash_table)
'Computer Science > Data Structure' 카테고리의 다른 글
[python] 자료구조 - 트리(Tree) / 이진 탐색 트리(Binary Search Tree) (2) | 2020.02.05 |
---|---|
[python] 자료구조 - 클로즈 해싱(Close hashing) / Open Addressing (2) | 2020.02.04 |
[python] 자료구조 - 해시 테이블(Hash Table) (0) | 2020.02.04 |
[python] 자료구조 - 더블 링크드 리스트(Doubly Linked List) (0) | 2020.02.03 |
[python] 자료구조 - 링크드 리스트(Linked List) (0) | 2020.02.02 |
Comments