91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python算法教程第二章知識點:計時模塊、字典與散哈希表、

發布時間:2020-07-08 08:23:44 來源:網絡 閱讀:463 作者:qq5b6d5cea82940 欄目:編程語言

微信公眾號:geekkr
本文目錄:一、計時模塊;二、字典與散哈希表;三、圖與樹的實現;四、成員查詢;五、插入對象
</br>
一、計時模塊(timeit、cProfile)

import timeit
timeit.timeit('x = 1 + 2')

既然學習算法,那么來計算程序所耗費的時間是重要的,但是需要注意:timeit()計時函數會多次運行相關的代碼段并求得平均值,以提高計時的精準度,所以,我們需要預防早先的執行操作影響之后代碼的執行。舉個栗子:若我們執行排序算法,則只有第一次執行代碼時是在隨機的情況下計時,剩余的數千次運行則都在有序列表的前提下運行,這會導致最終的計時結果偏低。所以,可以嘗試使用cProfile模塊。

import cProfile
cProfile.run('函數名')

cProfile(或profile)能夠將各函數的計時結果打印出來。
</br>
</br>
</br>
二、字典與散哈希表(hashing)
哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。可以猜到,哈希表被用于Python中字典(dict)類型與集合(set)類型的實現,且我們對其元素的訪問也只是耗費常數級的時間。而Python中的hash()函數則用于獲取一個對象(字符串或者數值等)的哈希值。
</br>
</br>
</br>
三、圖與樹的實現
鄰接列表可以視為圖結構的表達方式。

# 舉個鄰接列表的栗子

a, b, c, d, e, f, g, h = range(8)
N = [
    {b, c, d, e, f}, # a節點所指向的節點,如果想要加權則利用字典類型改為{b:2, c:1, …}
    {c, e}, # b …
    aegqsqibtmh,
    {e},
    {f},
    {c, g, h},
    {f, h},
    {f, g}
]

b in N[a]
len(N[f])
N[a][b]

同時,鄰接矩陣也是圖的一種常見的表示方式。

# 舉個鄰接矩陣的栗子

a, b, c, d, e, f, g, h = range(8)
N = [[0,1,1,1,1,1,0,0],
     [0,0,1,0,1,0,0,0],
     [0,0,0,1,0,0,0,0],
     [0,0,0,0,0,1,0,0],
     [0,0,1,0,0,0,1,1],
     [0,0,0,0,0,1,0,1],
     [0,0,0,0,0,1,1,0]]

N[a][b] # Neighborhood membership, answer is 1
sum(N[f]) # Degree, answer is 3

二叉樹的表示方式。

class Tree:
    def __init__(self, left, right):
        self.left = left
        self.right = right

t = Tree(Tree('a', 'b'), Tree('c', 'd'))
t.right.left # answer is 'c'

多路搜索樹的表達方式。

class Tree:
    def __init__(self, kids, next=None):
        self.kids = kids
        self.next = next

t = Tree(Tree('a', Tree('b', Tree('c', Tree('d')))))
t.kids.next.next.kids # answer is 'c'

</br>
</br>
</br>
四、成員查詢

from random import randrange
L = [randrange(10000) for i in range(1000)]

1 in L # 第一種查詢操作

S = set(L)
1 in S # 第二種查詢操作

看起來第二種查詢操作多此一舉,但要知道,在數列中查詢成員所耗費的時間是線性級的,而在集合中則是常數級的。
</br>
</br>
</br>
五、插入對象

# 比較兩段代碼

# 第一段代碼
s = ''"
for chunk in string_producer():
    s += chunk

# 第二段代碼
chunks = []
for chunk in string_producer():
    chunks.append(chunk)
s = ' '.join(chunks)

相比較之下,第二段代碼是更為高效的解決方案。因為在執行第一段代碼時,我們每次執行“+=”時都需要新建一個字符串并對其進行轉移性質的賦值,以至于其時間復雜度為平方級。同樣,在對數列進行相加操作時,使用extend()函數要比sum()函數高效得多。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

确山县| 邹平县| 佛教| 邢台市| 江达县| 稻城县| 休宁县| 交口县| 宝应县| 济源市| 弋阳县| 大丰市| 二连浩特市| 循化| 呼和浩特市| 兖州市| 若尔盖县| 庆云县| 汾西县| 兴城市| 剑河县| 烟台市| 长阳| 兴安县| 芮城县| 晋宁县| 泰州市| 石屏县| 博客| 额尔古纳市| 天水市| 通河县| 尤溪县| 财经| 屯留县| 广汉市| 巧家县| 彭阳县| 屏东县| 辽宁省| 乐亭县|