Computer Science/Data Structure
[python] 자료구조 - 오픈 해싱(Open Hashing)
JinungKim
2020. 2. 4. 16:38
오픈 해싱(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)