首頁  >  文章  >  後端開發  >  詳解拉鍊法實現字典的範例

詳解拉鍊法實現字典的範例

高洛峰
高洛峰原創
2017-03-26 16:53:521817瀏覽

字典:

也叫散列表,最大的特點是透過key來找出其對應的值其時間複雜度是O(1).

Python中怎麼用列表實作字典?

用列表實作字典最大的問題就是解決hash衝突,如果在列表中透過計算不同的key得到相同的相同了位置,這時候該怎麼辦?

最簡單的辦法就是使用拉鍊法.

詳解拉鍊法實現字典的範例

拉鍊法:就是在一個列表中每個位置再添加一個列表,這樣就算是有hash衝突也能夠儲存進去,當選取的hash函數夠好,

#num的數夠大,就能夠保證清單中的每一個清單裡面只有一個元素。根據key計算的元素所在的位置,然後來取值就能達

到O(1)的時間。

class MyDict:
    def __init__(self, num=100):  # 指定列表大小
        self._num = num
        self._lst = []
        for _ in range(self._num):
            self._lst.append([])

    def update(self, key, value):  # 添加 key-value
        key_index = hash(key) % self._num
        for i, (k, v) in enumerate(self._lst[key_index]):
            if key == k:
                self._lst[key_index][i] = [key, value]
                break
        else:
            self._lst[key_index].append([key, value])

    def get(self, key):  # 根据指定的 key 弹出值
        key_index = hash(key) % self._num
        for k, v in self._lst[key_index]:
            if k == key:
                return v
        else:
            raise KeyError('No such {} key'.format(key))

    def pop(self, key):  # 根据 key 弹出元素 并且删除
        key_index = hash(key) % self._num
        for i, (k, v) in enumerate(self._lst[key_index]):
            if k == key:
                result = v
                self._lst.pop[self._num](i)
                return result
        else:
            raise KeyError('No such {} key'.format(key))

    def __getitem__(self, key):  # 可以通过下标来取值
        key_index = hash(key) % self._num
        for k, v in self._lst[key_index]:
            if k == key:
                return v
        else:
            raise KeyError('No such {} key'.format(key))

    def keys(self):  # 取得所有的key
        for index in range(self._num):
            for k, v in self._lst[index]:
                yield k

    def values(self):  # 取得所有的 value
        for index in range(self._num):
            for k, v in self._lst[index]:
                yield v

    def items(self):  # 取得所有的条目
        for index in range(self._num):
            for item in self._lst[index]:
                yield item

透過key查到的時間,可見下圖

詳解拉鍊法實現字典的範例

#

以上是詳解拉鍊法實現字典的範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn