第1章數(shù)據(jù)結(jié)構(gòu)和算法

http://localhost:8888/notebooks/%E7%AC%AC%E4%B8%80%E7%AB%A01.ipynb

1.序列類型(6個(gè),常見列表與元組)

1.1列表list——方括號 & 逗號隔開 & 允許不同類型數(shù)據(jù)項(xiàng)并存

①截?。旱谝粋€(gè)索引為0,list[0]、list[N:]、list[-N]

②修改:list.append()、del list[N]、list1+list2、list*N、N in list、for i in [n,m,l,...]

③函數(shù):比較兩個(gè)列表(比較是否同類型數(shù)據(jù)、比較數(shù)字、數(shù)字是最小的、長的大、平局返回0、-1后者大、1前者大)cmp(list1,list2)、len(list)、max(list)、min(list)、list(seq)

④方法:末尾追加list.append(obj)、統(tǒng)計(jì)obj出現(xiàn)次數(shù)list.count(obj)、追加多個(gè)值list.extend(seq)、找出obj第一個(gè)匹配項(xiàng)的索引值list.index(obj)、插入特定位置list.insert(index,obj)、移除并輸出(默認(rèn)-1)list.pop([index=-1])、移除第一個(gè)匹配項(xiàng)list.remove(obj)、反向列表list.reverse()、排序(cmp規(guī)定排序方式、key為指定的進(jìn)行比比較的元素如def takeSecond(elem) return elem[1]、reverse=True降序,默認(rèn)False升序、無返回值)、list.sort(cmp=None,key=None,reverse=False)、清空列表list.clear()、復(fù)制列表list.copy()

1.2元組tuple——小括號或引號 & 逗號隔開 & 元素不可修改

只包含一個(gè)元素時(shí),需要在元素后面添加逗號,否則括號會被當(dāng)作運(yùn)算符使用

索引從0開始,可截取、組合

del tuple、len(tuple)、max(tuple)、min(tuple)、tuple(seq)、截取&修改同列表

1.3集合set:無序的不重復(fù)元素序列 & 集合內(nèi)值唯一(可應(yīng)用于去重復(fù)set(list),但不能保證元素間順序不變)

set={,,}、set(value)、obj in set、&^|-、for x in set、添加元素s.add()、添加元素且參數(shù)可以是列表,元組,字典等s.update()、指定移除不存在報(bào)錯(cuò)s.remove(x)、指定移除不存在不報(bào)錯(cuò)s.discard()、隨機(jī)移除s.pop()、統(tǒng)計(jì)個(gè)數(shù)len(s)、清空s.clear()、返回兩個(gè)集合組成的新集合,但會移除兩個(gè)集合的重復(fù)元素x.symmetric_difference(y)、返回兩集合并集s.union()、返回兩集合交集s.intersection()、返回兩交集的差集s.difference()、移除集合中的元素,該元素在指定的集合也存在s.difference_update()、判斷兩個(gè)集合是否包含相同的元素,如果沒有返回 True,否則返回 False,判斷集合 y 中是否有包含 集合 x 的元素,s.isdisjoint()、判斷集合 x 的所有元素是否都包含在集合 y 中x.issubset(y)

1.4字典dictionary——花括號 & 冒號隔開 & 可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο?/b>

鍵必須是唯一且不可變的(字符串、數(shù)字、元組),value=dict[key]

刪除鍵del dict[key]、清空字典dict.clear() 、刪除字典del dict、統(tǒng)計(jì)個(gè)數(shù)len(dict)、以可打印的字符串表示str(dict)、刪除字典內(nèi)所有元素radiansdict.clear()、返回字典的淺復(fù)制radiansdict.copy()、創(chuàng)建字典,以序列seq中元素做字典的鍵,val為字典所有鍵對應(yīng)的初始值radiansdict.fromkeys()、返回指定鍵的值,如果值不在字典中返回default值radiansdict.get(key,default=None)、和get()類似, 但如果鍵不存在于字典中,將會添加鍵并將值設(shè)為default,radiansdict.setdefault(key,default=None)以列表返回可遍歷的(鍵, 值) 元組數(shù)組radiandict.items()、返回一個(gè)迭代器,可以使用 list() 來轉(zhuǎn)換為列表radiansdict.keys()、返回一個(gè)迭代器,可以使用 list() 來轉(zhuǎn)換為列表radiansdict.values()、把字典dict2的鍵/值對更新到dict里radiandict.update(dict2)、刪除特定鍵對應(yīng)的值返回被刪除的值若無返回default,pop(key[,default])、隨機(jī)返回并刪除字典中的最后一對鍵和值popitem()、判斷鍵存在否key in dict

1.2其他概念

1.2.1可迭代對象

https://www.cnblogs.com/wswang/p/6047994.html

https://blog.csdn.net/liangjisheng/article/details/79776008

1.2.2*表達(dá)式:

當(dāng)函數(shù)的參數(shù)不確定時(shí),可以使用*args 和**kwargs,*args 沒有key值,**kwargs有key值。

1.2.3三元條件判斷表達(dá)式(and or/if else)

https://www.cnblogs.com/yunlong-study/p/8915949.html

1.2.4遞歸https://www.cnblogs.com/zhangxinqi/p/8007537.html

遞歸算法是一種直接或間接調(diào)用自身算法的過程,但不是Python的強(qiáng)項(xiàng)。

解決問題的特點(diǎn):

(1)遞歸就是在過程或函數(shù)里調(diào)用自身

(2)在使用遞歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。

(3)遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運(yùn)行效率較低,所以一般不提倡用遞歸算法設(shè)計(jì)程序。

(4)在遞歸調(diào)用的過程中系統(tǒng)為每一層的返回點(diǎn)、局部量等開辟了棧來存儲,遞歸次數(shù)過多容易造成棧溢出等。

遞歸算法所體現(xiàn)的“重復(fù)”一般有三個(gè)要求:

(1)每次調(diào)用在規(guī)模上都有所縮小(通常是減半)

(2)是相鄰兩次重復(fù)之間有緊密的聯(lián)系,前一次要為后一次做準(zhǔn)備(通常前一次的輸出作為后一次的輸入)

(3)在問題的規(guī)模極小時(shí)必須用直接給出解答而不再進(jìn)行遞歸調(diào)用,因而每次遞歸調(diào)用都是有條件的(以規(guī)模位達(dá)到直接解答的大小為條件)無條件遞歸調(diào)用將會成為死循環(huán)而不能正常結(jié)束。

1.2.5復(fù)雜度https://blog.csdn.net/mycoolx/article/details/6538350

一個(gè)算法的評價(jià)主要從時(shí)間復(fù)雜度和空間復(fù)雜度來考慮。?

一個(gè)算法中的語句執(zhí)行次數(shù)稱為語句頻度或時(shí)間頻度。記為T(n)。?一般情況下,算法中基本操作重復(fù)執(zhí)行的次數(shù)是問題規(guī)模n的某個(gè)函數(shù),用T(n)表示,若有某個(gè)輔助函數(shù)f(n),使得當(dāng)n趨近于無窮大時(shí),T(n)/f(n)的極限值為不等于零的常數(shù),則稱f(n)是T(n)的同數(shù)量級函數(shù)。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進(jìn)時(shí)間復(fù)雜度,簡稱時(shí)間復(fù)雜度。?

空間復(fù)雜度是指算法在計(jì)算機(jī)內(nèi)執(zhí)行時(shí)所需存儲空間的度量。記作: S(n)=O(f(n)) 。我們一般所討論的是除正常占用內(nèi)存開銷外的輔助存儲單元規(guī)模。

常見算法時(shí)間復(fù)雜度:

O(1): 表示算法的運(yùn)行時(shí)間為常量

O(n): 表示該算法是線性算法

O(㏒2n): 二分查找算法

O(n2): 對數(shù)組進(jìn)行排序的各種簡單算法,例如直接插入排序的算法。

O(n3): 做兩個(gè)n階矩陣的乘法運(yùn)算

O(2n): 求具有n個(gè)元素集合的所有子集的算法

O(n!): 求具有N個(gè)元素的全排列的算法

優(yōu)<---------------------------<劣

O(1)<O(㏒2n)<O(n)<O(n2)<O(2n)

時(shí)間復(fù)雜度按數(shù)量級遞增排列依次為:常數(shù)階O(1)、對數(shù)階O(log2n)、線性階O(n)、線性對數(shù)階O(nlog2n)、平方階O(n2)、立方階O(n3)、……k次方階O(nk)、指數(shù)階O(2n)。

push和pop的復(fù)雜度是O(logN)

1.2.6堆

堆是一個(gè)二叉樹,其中每個(gè)父節(jié)點(diǎn)的值都小于或者等于其所有子節(jié)點(diǎn)的值。整個(gè)堆的最小元素總是位于二叉樹的根節(jié)點(diǎn)

1.2.7lambda匿名函數(shù)

https://baijiahao.baidu.com/s?id=1594710285340462950&wfr=spider&for=pc

1.2.8class類https://blog.csdn.net/wklken/article/details/6313265

兩個(gè)下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問

在類內(nèi)部的方法中使用時(shí)?self.__private_attrs

類的專有方法:

__init__? 構(gòu)造函數(shù),在生成對象時(shí)調(diào)用

__del__?? 析構(gòu)函數(shù),釋放對象時(shí)使用

__repr__ 打印,轉(zhuǎn)換

__setitem__按照索引賦值

__getitem__按照索引獲取值

__len__獲得長度

__cmp__比較運(yùn)算

__call__函數(shù)調(diào)用

__add__加運(yùn)算

__sub__減運(yùn)算

__mul__乘運(yùn)算

__div__除運(yùn)算

__mod__求余運(yùn)算

__pow__稱方

1.2.9計(jì)算程序運(yùn)行時(shí)間

https://www.cnblogs.com/rookie-c/p/5827694.html

1.2.10列表&棧&隊(duì)列https://blog.csdn.net/nfr413/article/details/78448954

棧結(jié)構(gòu),其實(shí)就是一個(gè)后進(jìn)先出的一個(gè)線性表,只能在棧頂壓入或彈出元素。用列表表示棧,則向棧中壓入元素,可以用列表的append()方法來實(shí)現(xiàn),彈出棧頂元素可以用列表的pop()方法實(shí)現(xiàn)。

隊(duì)列,其實(shí)就是一個(gè)先進(jìn)先出的線性表,只能在隊(duì)首執(zhí)行刪除操作,在隊(duì)尾執(zhí)行插入操作。用列表表示隊(duì)列,可以用append()方法實(shí)現(xiàn)在隊(duì)尾插入元素,用pop(0)方法實(shí)現(xiàn)在隊(duì)首刪除元素。

1.2.11字典dict

zip()將字典的鍵和值反轉(zhuǎn),zip創(chuàng)建了一個(gè)迭代器,內(nèi)容只被消費(fèi)一次既只執(zhí)行一次。因?yàn)樽值涞奶幚碇粚︽I進(jìn)行處理,而非值;結(jié)合sorted()進(jìn)行排序

可哈希的對象:

1.3.12flat file 平面文件

https://blog.csdn.net/weixin_38300566/article/details/84841602

1.2.13slice()切片

slice(n,N)? [n,N)

del items[a] 會刪除items中的數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容