小魚要學數據結構與算法(基於python)—Day16散列函數設計、衝突解決方案、映射數據類型、排序查找小結

散列

在這裏插入圖片描述

一、知識概覽

本章主要講解散列函數設計、衝突解決方案、映射數據結構、排序查找小結知識概覽如下。

1.1 散列函數設計

對於數字類型主要有摺疊法和平方取中法。
散列函數設計

1.2 衝突解決方案

主要有兩種方法,一種是開放定址,一種是數據項鍊:
衝突解決方案
第一種方法,即開放定址詳解:
開放定址

1.3 映射抽象數據類型

在這裏插入圖片描述

1.4 排序查找小結

排序查找算法小結
關於算法選擇:
算法選擇

二、 代碼實現

2.1 非數項散列函數設計

# 非數項散列函數設計
def hash(astring, tablesize):
    sum = 0
    for pos in range(len(astring)):
        sum = sum + ord(astring[pos])
    return sum % tablesize


u3 = hash('hello', 11)
print(u3)

輸出

4

2.2 映射數據類型實現

# 實現ADT Map
class HashTable:
    def __int__(self):
        self.size = 11
        self.slots = [None] * self.size
        self.data = [None] * self.size

    def hashfunction(self, key):
        return key % self.size

    # 線性探測
    def rehash(self, oldhash):
        return (oldhash + 1) % self.size

    def put(self, key, data):
        hashvalue = self.hashfunction(key)
        ##key不存在,未衝突
        if self.slots[hashvalue] == None:
            self.slots[hashvalue] = key
            self.data[hashvalue] = data
        ##key已存在,替換val
        else:
            if self.slots[hashvalue] == key:
                self.data[hashvalue] = data
            else:
                # 散列衝突,再散列,直到找到空槽或者key
                nextslot = self.rehash(hashvalue)
                while self.slots[nextslot] != None and self.slots[nextslot] != key:
                    nextslot = self.rehash(nextslot)
                if self.slots[nextslot] == None:
                    self.slots[nextslot] = key
                    self.data[nextslot] = data
                else:
                    self.data[nextslot] = data

    def get(self, key):
        # 標記散列值爲查找起點
        startslot = self.hashfunction(key)
        data = None
        stop = False
        found = False
        position = startslot
        # 找key直到空槽或回到起點
        while self.slots[position] != None and not found and not stop:
            if self.slots[position] == key:
                found = True
                data = self.data[position]
            # 未找到key,再散列繼續找
            else:
                position = self.rehash(position)
                if position == startslot:
                    stop = True  # 回到起點,停
        return data

    def __getitem__(self, key):
        return self.get(key)

    def __setitem__(self, key, data):
        return self.put(key, data)


H = HashTable()
H[54] = "cat"
H[26] = "dog"
H[20] = "chicken"
print(H.slots)
print(H.data)
print(H[20])

咦???
輸出報錯,是哪裏有問題呢?讓我想想。。。。

AttributeError: 'HashTable' object has no attribute 'size'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章