最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Python字典的底層實(shí)現(xiàn)原理

 更新時(shí)間:2023年02月10日 08:41:17   作者:Generalzy  
這篇文章主要介紹了關(guān)于Python字典的底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

字典是否是有序

在Python3.6之前,字典是無(wú)序的,但是Python3.7+,字典是有序的。

在3.6中,字典有序是一個(gè)implementation detail,在3.7才正式成為語(yǔ)言特性,因此3.6中無(wú)法確保100%有序。

字典的查詢、添加、刪除的時(shí)間復(fù)雜度

字典的查詢、添加、刪除的平均時(shí)間復(fù)雜度都是O(1),相比列表與元祖,性能更優(yōu)。

字典的實(shí)現(xiàn)原理

Python3.6之前的無(wú)序字典

字典底層是維護(hù)一張哈希表,可以把哈希表看成一個(gè)列表,哈希表中的每一個(gè)元素又存儲(chǔ)了哈希值(hash)、鍵(key)、值(value)3個(gè)元素。

enteies = [
    ['--', '--', '--'],
    [hash, key, value],
    ['--', '--', '--'],
    ['--', '--', '--'],
    [hash, key, value],
]

帶入具體的數(shù)值來(lái)介紹

# 給字典添加一個(gè)值,key為hello,value為word
# my_dict['hello'] = 'word'

# hash表初始如下
enteies = [
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
]

hash_value = hash('hello')  # 假設(shè)值為 12343543 

index = hash_value & ( len(enteies) - 1)  # 假設(shè)index值計(jì)算后等于3

# 下面會(huì)將值存在enteies中
enteies = [
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    [12343543, 'hello', 'word'],  # index=3
    ['--', '--', '--'],
]

# 繼續(xù)向字典中添加值
# my_dict['color'] = 'green'

hash_value = hash('color')  # 假設(shè)值為 同樣為12343543
index = hash_value & ( len(enteies) - 1)  # 假設(shè)index值計(jì)算后同樣等于3

# 下面會(huì)將值存在enteies中
enteies = [
    ['--', '--', '--'],
    ['--', '--', '--'],
    ['--', '--', '--'],
    [12343543, 'hello', 'word'],  # 由于index=3的位置已經(jīng)被占用,且key不一樣,所以判定為hash沖突,繼續(xù)向下尋找
    [12343543, 'color', 'green'],  # 找到空余位置,則保存
]

enteies表是稀疏的,隨著我們插入的值不同,enteies表會(huì)越來(lái)越稀疏(enteies也是一個(gè)會(huì)動(dòng)態(tài)擴(kuò)展長(zhǎng)度的,每一此擴(kuò)展長(zhǎng)度,都會(huì)重新計(jì)算所有key的hash值),所以新的字典實(shí)現(xiàn)就隨之出現(xiàn)。

Python3.7+后的新的實(shí)現(xiàn)方式

Python3.7+帶入數(shù)據(jù)演示

# 給字典添加一個(gè)值,key為hello,value為word
# my_dict['hello'] = 'word'

# 假設(shè)是一個(gè)空列表,hash表初始如下
indices = [None, None, None, None, None, None]
enteies = []

hash_value = hash('hello')  # 假設(shè)值為 12343543
index = hash_value & ( len(indices) - 1)  # 假設(shè)index值計(jì)算后等于3

# 會(huì)找到indices的index為3的位置
indices = [None, None, None, 0, None, None]
# 此時(shí)enteies會(huì)插入第一個(gè)元素
enteies = [
    [12343543, 'hello', 'word']
]

# 我們繼續(xù)向字典中添加值
my_dict['haimeimei'] = 'lihua'

hash_value = hash('haimeimei')  # 假設(shè)值為 34323545
index = hash_value & ( len(indices) - 1)  # 假設(shè)index值計(jì)算后等于 0

# 會(huì)找到indices的index為0的位置
indices = [1, None, None, 0, None, None]
# 此時(shí)enteies會(huì)插入第一個(gè)元素
enteies = [
    [12343543, 'hello', 'word'],
    [34323545, 'haimeimei', 'lihua']
]

查詢字典

# 下面是一個(gè)字典與字典的存儲(chǔ)
more_dict = {'name': '張三', 'sex': '男', 'age': 10, 'birth': '2019-01-01'}

# 數(shù)據(jù)實(shí)際存儲(chǔ)
indices = [None, 2, None, 0, None, None, 1, None, 3]
enteies = [
    [34353243, 'name', '張三'],
    [34354545, 'sex', '男'],
    [23343199, 'age', 10],
    [00956542, 'birth', '2019-01-01'],
]

print(more_dict['age'])  # 當(dāng)我們執(zhí)行這句時(shí)

hash_value = hash('age')  # 假設(shè)值為 23343199
index = hash_value & ( len(indices) - 1)  # index = 1

entey_index = indices[1]  # 數(shù)據(jù)在enteies的位置是2
value = enteies[entey_index]  # 所以找到值為 enteies[2]

時(shí)間復(fù)雜度

字典的平均時(shí)間復(fù)雜度是O(1),因?yàn)樽值涫峭ㄟ^(guò)哈希算法來(lái)實(shí)現(xiàn)的,哈希算法不可避免的問(wèn)題就是hash沖突,Python字典發(fā)生哈希沖突時(shí),會(huì)向下尋找空余位置,直到找到位置。

如果在計(jì)算key的hash值時(shí),如果一直找不到空余位置,則字典的時(shí)間復(fù)雜度就變成了O(n)了。

常見(jiàn)的哈希沖突解決方法

1 開(kāi)放尋址法(open addressing)

開(kāi)放尋址法中,所有的元素都存放在散列表里,當(dāng)產(chǎn)生哈希沖突時(shí),通過(guò)一個(gè)探測(cè)函數(shù)計(jì)算出下一個(gè)候選位置,如果下一個(gè)獲選位置還是有沖突,那么不斷通過(guò)探測(cè)函數(shù)往下找,直到找個(gè)一個(gè)空槽來(lái)存放待插入元素。

2 再哈希法

這個(gè)方法是按順序規(guī)定多個(gè)哈希函數(shù),每次查詢的時(shí)候按順序調(diào)用哈希函數(shù),調(diào)用到第一個(gè)為空的時(shí)候返回不存在,調(diào)用到此鍵的時(shí)候返回其值。

3 鏈地址法

將所有關(guān)鍵字哈希值相同的記錄都存在同一線性鏈表中,這樣不需要占用其他的哈希地址,相同的哈希值在一條鏈表上,按順序遍歷就可以找到。

4 公共溢出區(qū)

其基本思想是:所有關(guān)鍵字和基本表中關(guān)鍵字為相同哈希值的記錄,不管他們由哈希函數(shù)得到的哈希地址是什么,一旦發(fā)生沖突,都填入溢出表。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python解析器安裝指南分享(Mac/Windows/Linux)

    Python解析器安裝指南分享(Mac/Windows/Linux)

    這篇文章主要介紹了Python解析器安裝指南(Mac/Windows/Linux),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 利用Python的Flask框架來(lái)構(gòu)建一個(gè)簡(jiǎn)單的數(shù)字商品支付解決方案

    利用Python的Flask框架來(lái)構(gòu)建一個(gè)簡(jiǎn)單的數(shù)字商品支付解決方案

    這篇文章主要介紹了利用Python的Flask框架來(lái)構(gòu)建一個(gè)簡(jiǎn)單的數(shù)字商品支付解決方案,文中用極簡(jiǎn)的代碼展示了一個(gè)flask框架下的支付模版,需要的朋友可以參考下
    2015-03-03
  • python自動(dòng)化辦公操作excel的示例詳解

    python自動(dòng)化辦公操作excel的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用python來(lái)實(shí)現(xiàn)自動(dòng)化辦公操作excel文件進(jìn)行各種樣式展示,并自動(dòng)發(fā)送文件給"老板"的郵箱,希望對(duì)大家有所幫助
    2024-03-03
  • 如何將Pycharm中調(diào)整字體大小的方式設(shè)置為

    如何將Pycharm中調(diào)整字體大小的方式設(shè)置為"ctrl+鼠標(biāo)滾輪上下滑"

    這篇文章主要介紹了如何將Pycharm中調(diào)整字體大小的方式設(shè)置為"ctrl+鼠標(biāo)滾輪上下滑",本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 淺析python 定時(shí)拆分備份 nginx 日志的方法

    淺析python 定時(shí)拆分備份 nginx 日志的方法

    本文給大家分享python 定時(shí)拆分備份 nginx 日志的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-04-04
  • Python模塊_PyLibTiff讀取tif文件的實(shí)例

    Python模塊_PyLibTiff讀取tif文件的實(shí)例

    今天小編就為大家分享一篇Python模塊_PyLibTiff讀取tif文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • 利用Python實(shí)現(xiàn)文檔批量重命名

    利用Python實(shí)現(xiàn)文檔批量重命名

    日常工作中總會(huì)遇到一些需要收集文件的情況,但往往最后收集回來(lái)的文件名稱會(huì)五花八門,下面小編就來(lái)為大家講講如何使用Python實(shí)現(xiàn)批量重命名操作吧
    2025-02-02
  • Python簡(jiǎn)單I/O操作示例

    Python簡(jiǎn)單I/O操作示例

    這篇文章主要介紹了Python簡(jiǎn)單I/O操作,結(jié)合實(shí)例形式分析了Python針對(duì)文件的I/O讀寫及cPickle模塊相關(guān)使用操作技巧,需要的朋友可以參考下
    2019-03-03
  • PyCharm搭建一勞永逸的開(kāi)發(fā)環(huán)境

    PyCharm搭建一勞永逸的開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了PyCharm搭建一勞永逸的開(kāi)發(fā)環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 基于Python開(kāi)發(fā)Office文檔圖片提取器

    基于Python開(kāi)發(fā)Office文檔圖片提取器

    這篇文章主要為大家詳細(xì)介紹了一個(gè)基于PyQt5開(kāi)發(fā)的桌面應(yīng)用,可以實(shí)現(xiàn)Office文檔圖片提取功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2025-01-01

最新評(píng)論

江都市| 达尔| 大关县| 黄龙县| 铜鼓县| 蒙城县| 平度市| 沅陵县| 金昌市| 奈曼旗| 翼城县| 北票市| 本溪市| 闸北区| 辽源市| 彩票| 新巴尔虎左旗| 瓦房店市| 河北省| 乌拉特前旗| 通州区| 墨脱县| 松原市| 泌阳县| 松江区| 平远县| 朝阳区| 南部县| 临江市| 靖西县| 兰坪| 阿拉善右旗| 重庆市| 定兴县| 沂南县| 澄城县| 商都县| 鄂伦春自治旗| 屯昌县| 济阳县| 潼南县|