2012年2月13日月曜日

pythonでハッシュテーブル(チェイン法)を実装してみた

やってみた
#! /usr/local/bin/python
# -*- coding:utf-8 -*-
import linkedlist
class HashChain:
    
    def __init__(self,size=5):
        self.size=size # size is table size
        self.table=[]
        for i in range(size):
            obj=linkedlist.Linkedlist()
            self.table.append(obj)
    # hash function returns k mod 5(int)
    # k: string or int,float
    def hash(self,k):
        if type(k)==str:
            return len(k)%self.size
        else:
            return int(k%5)
    def insert(self,k):
        hash=self.hash(k)
        #search end point
        next_id=0
        pre_id=0
        while True:
            next_id=self.table[hash].obj[next_id].next
            if next_id==None:
                end_id=self.table[hash].obj[pre_id].id
                break
            else:
                pre_id=next_id
        self.table[hash].insert(k,end_id,None)
    def delete(self,k):
        hash=self.hash(k)
        self.table[hash].delete(k)
    def search(self,k):
        hash=self.hash(k)
        #serach id
        search_obj=self.table[hash].list_search(k)
        if search_obj==None:
            return 'no item'
        else:
            return self.table[hash].obj[search_obj.id].key


ハッシュ関数は乗数法でデフォルトは5の余りにしました.
数はそのまま割って余りを出して,文字列は文字列の長さをtableのサイズ(デフォルトが5)でわった余りにしました.前実装したlinledlistのクラスにバグが入っててちょっと苦労しました...
(import linkedlistで読み込んでるのは,前回作成したLinkedlistのクラスを記述したlinkedlist.pyというモジュールです)

0 件のコメント:

コメントを投稿