python 长度queue_python:常见的数据结构
? Python中常見的數(shù)據(jù)結(jié)構(gòu)可以統(tǒng)稱為容器。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。線性數(shù)據(jù)結(jié)構(gòu)分類:棧(stack)--先進后出、 隊列(queue)-先進先出、雙端隊列(deque)、鏈表(LinkedList)。
常見的數(shù)據(jù)類型又分為:數(shù)字、字符串、元組、列表、字典、集合。
可變數(shù)據(jù)類型
列表、字典、集合 不可哈希 不可變數(shù)據(jù)類型元組、數(shù)字、字符串 可哈希 可哈希對象是對象擁有__hash__(self)內(nèi)置函數(shù)的對象。對于可哈希的對象執(zhí)行這個函數(shù)將會返回一個整數(shù)。 可哈希對象判斷相等的唯一條件就是兩者 的哈希值相等。下面通過一個例子來說明: tuple_a = (1, 2, 3) # 元組a dict_b = {"a": 1, "b": 2} # 字典b dict_c = {"b": 2, "a": 1} # 字典c print(tuple_a.__hash__) print(dict_b.__hash__) print(id(str(sorted(dict_b)))) print(id(str(sorted(dict_c)))) print(hash(str(sorted(dict_b)))) print(hash(str(sorted(dict_c)))) >>> <method-wrapper '__hash__' of tuple object at 0x00000275A3DF6C18>>>> None>>> 2704397351728 >>> 2704397351728 >>> -589638267386482414 >>> -589638267386482414我們可以輸出結(jié)果中元組返回了一個對象的'__hash__'method,而字典返回的結(jié)果None;字典是不能hash的, 但是我們可以將字典轉(zhuǎn)成字符串再進行hash,sorted是將字典進行排序, 返回的結(jié)果顯示兩者轉(zhuǎn)成字符串后的id跟hash值都是一樣的,間接的說明了字典b跟字典c也是相等的 (補充:sorted:適用于任何可迭代容器)哈希有啥作用?
它是一個將大體量數(shù)據(jù)轉(zhuǎn)化為很小數(shù)據(jù)的過程,甚至可以僅僅是一個數(shù)字,以便我們可以用在固定的時間復(fù)雜度下查詢它,所以,哈希對高效的算法和數(shù)據(jù)結(jié)構(gòu)很重要。Python 中基于hash的2個數(shù)據(jù)類型是dict and set , 之前說dict查詢速度快,為何快? 說set天生去重,怎么做到的?其實都是利用了hash的特性,我們下面來剖析dict 為何查詢速度超快,且不受dict大小影響 ?
解析:假設(shè)我要存14億人的基本信息
data = {
"張三":[23742364782642342323234,28,"山東濟南"],
"李四":[12124234232311214458271,25,"北京昌平"],
"王五":[23030293483727384383929,33,"山東濟南"],
"趙六":[42302033030302482634674,28,"河北保定"],
... ...
}
dict 的每個key 都要先經(jīng)過hash生成一段固定長度的hash值,假設(shè)生成的hash值如下dict會把這些數(shù)字按大小排序好放在一個列表里kd = [53, 67, 81, 99]
當(dāng)我們想查找"趙六"的信息時, 會把“趙六”先hash, 得到99這個值,然后拿這個值去到kd列表里找,想象這個列表有14億個值 ,如何快速找到99? 二分法就行 ,只要找到了99的位置,就可以定位到趙六對應(yīng)的value的值了。 通過2分法查找,每次數(shù)據(jù)量都會少一半,這樣查找最多31次(2**31=2147483648)就能從20億信息里找到這個人的信息。當(dāng)然 dict 真實的查找算法比這個還要復(fù)雜些, 我只是通過這個例子讓大家理解下為何基于hash的數(shù)據(jù)類型查找速度會快很多。
set去重是因為每存一個值到set里時, 都要先經(jīng)過hash,然后通過得出的這個hash值算出應(yīng)該存在set里的哪個位置,存的時候會先檢查那個位置上有沒有值 ,有的話就對比是否相等,如果相等,則不再存儲此值。 如果不相等(即為空),則把新值存在這。
總結(jié)
以上是生活随笔為你收集整理的python 长度queue_python:常见的数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue本地没事放到服务器上无限循环,解决
- 下一篇: 如何卸载服务器的系统,卸载服务器的操作系