#! /usr/local/bin/python# -*- coding:utf-8 -*-class HashOpenAddress:def __init__(self,size=5):self.size=sizeself.table=[None]*sizedef hash(self,k):if type(k)==str:return len(k)%self.sizeelse:return int(k%self.size)# search hash value for kdef search_hash(self,k):hash=self.hash(k)if self.table[hash]==k:return hashelse:#search eqaul columncount=0while count<self.size:if hash!=self.size-1:hash+=1else:hash=0if self.table[hash]==k:return hashelse:count+=1if count>=self.size:return Nonedef insert(self,k):hash=self.hash(k)if self.table[hash]==None or self.table[hash]=='deleted':self.table[hash]=kelse:#searching nil columncount=0while count<self.size:#rehushif hash!=self.size-1:hash+=1else:hash=0if self.table[hash]==None or self.table[hash]=='deleted':self.table[hash]=kbreakelse:count+=1if count>=self.size:print 'table is max,no empty colmun'def delete(self,k):hash=self.search_hash(k)if hash!=None:self.table[hash]='deleted'else:print 'no item,so cannot delete'def search(self,k):hash=self.search_hash(k)if hash!=None:return self.table[hash]else:return 'no item'
ハッシュ関数は前回と同じく,tableサイズで割ったあまり(文字列ならば文字列の長さ)をつかっています。デフォルトは5でやってます
再ハッシュ化は単純にハッシュ関数に+1ずつしていって,目的のアドレスを見つけるまで再ハッシュ化するという形にしています。
0 件のコメント:
コメントを投稿