[算法导论]哈希表 @ Python

直接寻址方式:

class HashTable:
    def __init__(self, length):
        self.T = [None for i in range(length)]

class Data:
    def __init__(self, key, satelite_data):
        self.key = key
        self.satelite_data = satelite_data

class Solution:
    def DIRECT_ADDRESS_SEARCH(self, T, k):
        return T[k]

    def DIRECT_ADDRESS_INSERT(self, T, x):
        T[x.key] = x

    def DIRECT_ADDRESS_DELETE(self, T, x):
        T[x.key] = None

 分离连接法:

class HashTable:
    def __init__(self, length):
        self.T = [None for i in range(length)]

class Data:
    def __init__(self, key, satelite_data):
        self.key = key
        self.satelite_data = satelite_data
        self.next = None

class Solution:
    def CHAINED_HASH_INSERT(self, T, x):
        '''insert x at the head of list T[h(x.key)]'''

        x.next = T[x.key].next
        T[x.key].next = x

    def CHAINED_HASH_SEARCH(self, T, k, satelite_data):
        '''search for an element with key k in list T[h(k)]'''

        tmp = T[k]
        while tmp.next.satelite_data != satelite_data:
            tmp = tmp.next

        return tmp

    def CHAINED_HASH_DELETE(self, T, x):
        '''delete x from the list T[h(x.key)]'''

        tmp = T[x.key]
        while tmp.next.satelite_data != x.satelite_data:
            tmp = tmp.next
        tmp.next = tmp.next.next

 开放定址法:

class HashTable:
    def __init__(self, length):
        self.T = [None for i in range(length)]

class Solution:
    def HASH_INSERT(self, T, k):
        i = 0
        m = len(T)
        while i < m:
            j = h(k, i)
            if T[j] == None:
                T[j] = k
                return j
            else:
                i = i + 1
        print "hash table overflow"

    def HASH_SEARCH(self, T, k):
        i = 0
        while True:
            j = h(k, i)
            if T[j] == k:
                return j
            i = i + 1
            if T[j] == None or i == m:
                break
        return None

    def h(self, k, i):
        '''linear probing'''

        return (k + i) % m

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值