盡管已經學了幾年,對它們也可以說大致懂得。但是,作為非計算機專業的人員,還是不會比計算機專業人員懂得多。既然沒有受過專門的學習訓練,自然會有三天打魚兩天曬網的感覺,一天可能冒出一個念頭。于是乎,寫寫現在的念頭,一點也沒有直接抄襲其他地方的資料,還是用自家的話說比較讓自己懂!可能有錯,但是不要怕,先錯著,以后理解透了自然會在意識上修正。
因為上次選修過算法與數據結構,受到課名的影響,雖然教材是《數據結構教程》,但總是以為自己學的是算法。實際上,自己在學習數據結構。
〇、引言
用一個比喻描述。圖書館里的書好比數據,圖書的擺放好比數據結構。要更好地管理圖書就必須更好地擺放圖書!比如,我可能這么擺放:
方案1:
所有的書架上放在一個大房間中,依次擺放:古典文學,西方文學,中國文學,歷年諾貝爾文學,天文學,地理學,中國歷史,外國歷史,信息,自動化,通信,電子電氣...依次列舉,這里還假設各個書架上的書不會有相同的,它們是并列關系,雖然有些牽強。(數組)
? ? ? 如果我要找一本《圍城》,那么我先到第一個書架上看看有沒有這本書,發現沒有又到下一個書架看,直到找到這本書。(搜索,線性搜索)
方案2:
我先將大房子分成兩個房間,分別稱為社會科學圖書,自然科學圖書。然后兩個房間又各自分為:歷史、地理、政治;理科,工科。依次按照類別分。(樹,各種樹)
如果我要找本《數據結構教程》,我先悠哉悠哉地走進自然科學圖書房間,然后輕輕地抬頭,看看房間牌子,進入工科房間。。。依次,很快找到這本書。(樹的搜索logn時間復雜度)
這就是數據結構的神奇。
那什么是算法?這個只能牽強地接著比喻。我想學武功。我進入武功秘籍的圖書房間之后,我抱著一大堆書跑出來。打開一看,有降龍十八掌,九陰真經,九陽神功,易筋經,乾坤大挪移,少林龍爪手,太極拳,醉拳,佛山無影腳,七傷拳。我暫時沒想好學什么武功,因為各有厲害的地方,有學的時間長不傷身,有的速成但傷身,有的需要內力,有的速度快殺傷力弱,有的殺傷力強但速度極慢。有的雖然不是最厲害的,但簡單易學。
同樣地,算法也有好壞之分:有的不能保證收斂,有的能收斂速度慢。有的雖然速度快,但需要內存大。有的雖然不是局部最優解,但是簡單容易,有的是原址的,有的不是原址的。
一、數據結構
類別
棧:
隊列:
鏈表:單鏈表、雙鏈表
各種樹:AVL樹、2-3樹、B樹、紅黑樹、AA樹、treap樹、帶權平衡樹、k近鄰樹、伸展樹、跳表...各種各樣的樹,很有意思
散列表:鏈接法、開放尋址法
主要研究下述的操作,希望更少的時間復雜度來操作:
建立
查詢
插入
刪除
二、算法
舉例
最優化理論中各種:
動態規劃:
整數規劃:
各種非凸算法:遺傳算法,蟻群算法,粒子群算法,模擬退火算法
...
研究目標:
希望算法收斂且速度快,全局最優,代碼簡單易懂,內存更好,原址,魯棒性好