一、數(shù)據(jù)結(jié)構(gòu)
1. 什么是數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)是指相互之間存在著一種或多種關(guān)系的數(shù)據(jù)元素的集合和該集合中數(shù)據(jù)元素之間的關(guān)系組成
2. 數(shù)據(jù)結(jié)構(gòu)的分類
傳統(tǒng)上,我們把數(shù)據(jù)結(jié)構(gòu)分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
(1). 邏輯結(jié)構(gòu):是指數(shù)據(jù)對象中數(shù)據(jù)元素之間的相互關(guān)系,也是我們今后最需要關(guān)注和討論的問題。
1.集合結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)中的元素之間除了“同屬一個(gè)集合” 的相互關(guān)系外,別無其他關(guān)系;

集合結(jié)構(gòu).jpg
2.線性結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)中的元素存在一對一的相互關(guān)系;

線性結(jié)構(gòu).jpg
3.樹形結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)中的元素存在一對多的相互關(guān)系;

樹形結(jié)構(gòu).jpg
4.圖形結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)中的元素存在多對多的相互關(guān)系。

圖形結(jié)構(gòu).jpg
(2). 物理結(jié)構(gòu):指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)空間的存放形式。
1.順序存儲(chǔ)結(jié)構(gòu):是把數(shù)據(jù)元素存放在地址連續(xù)的存儲(chǔ)單元里,其數(shù)據(jù)間的邏輯關(guān)系和物理關(guān)系是一致的。

順序存儲(chǔ)結(jié)構(gòu).jpg
2.鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):是把數(shù)據(jù)元素存放在任意的存儲(chǔ)單元里,這組存儲(chǔ)單元可以是連續(xù)的,也可以是不連續(xù)的。

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu).jpg
3. 常用的數(shù)據(jù)結(jié)構(gòu)
| 數(shù)據(jù)結(jié)構(gòu) | 優(yōu)點(diǎn) | 缺點(diǎn) |
|---|---|---|
| 數(shù)組 | 插入塊,如果知道下標(biāo),可以非常快的存取 | 刪除和查找慢,大小固定 |
| 有序數(shù)組 | 比無序的數(shù)組查找快 | 刪除和插入慢,大小固定 |
| 棧 | 提供后進(jìn)先出的取存方法 | 取存其他項(xiàng)很慢 |
| 隊(duì)列 | 提供先進(jìn)先出的取存方法 | 取存其他項(xiàng)很慢 |
| 鏈表 | 插入快,刪除快 | 查找慢 |
| 二叉樹 | 查找,插入,刪除都快(如果樹保持平衡) | 刪除算法復(fù)雜 |
| 紅-黑樹 | 查找,是插入,刪除都快。樹總是平衡的 | 算法復(fù)雜 |
| 2-3-4樹 | 查找,是插入,刪除都快。樹總是平衡的。類似的樹對磁盤存儲(chǔ)有用 | 算法復(fù)雜 |
| 哈希表 | 如果關(guān)鍵字已知存取幾塊。插入快 | 刪除慢,如果不知道關(guān)鍵字則存取很慢,對存儲(chǔ)空間使用不充分 |
| 堆 | 插入,刪除快,對最大數(shù)據(jù)項(xiàng)的存取很快 | 對其他數(shù)據(jù)項(xiàng)存取慢 |
| 圖 | 對現(xiàn)實(shí)世界建模 | 有些算法慢切復(fù)雜 |

數(shù)據(jù)結(jié)構(gòu).jpg
4. 數(shù)據(jù)結(jié)構(gòu)的應(yīng)用表現(xiàn)
1. 對現(xiàn)實(shí)世界數(shù)據(jù)的存儲(chǔ)
2. 程序員的工具
3. 對現(xiàn)實(shí)世界進(jìn)行建模
二、算法
1. 什么是算法
算法(Algorithm)是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,
算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制。
2. 算法的特征
一個(gè)算法應(yīng)該具有以下五個(gè)重要的特征:
有窮性(Finiteness)
算法的有窮性是指算法必須能在執(zhí)行有限個(gè)步驟之后終止;
確切性 (Definiteness)
算法的每一步驟必須有確切的定義;
輸入項(xiàng) (Input)
一個(gè)算法有0個(gè)或多個(gè)輸入,以刻畫運(yùn)算對象的初始情況,所謂0個(gè)輸入是指算法本身定出了初始條件;
輸出 (Output)
一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對輸入數(shù)據(jù)加工后的結(jié)果。沒有輸出的算法是毫無意義的;
可行 (Effectiveness)
算法中執(zhí)行的任何計(jì)算步驟都是可以被分解為基本的可執(zhí)行的操作步,即每個(gè)計(jì)算步都可以在有限時(shí)間內(nèi)完成(也稱之為有效性)。
3. 算法設(shè)計(jì)的要求
正確性
算法的正確性是指算法至少應(yīng)該具有輸入、輸出和加工處理無歧義性、能正確反映問題的需求、能夠得到問題的正確答案。
大體分為以下四個(gè)層次:
算法程序沒有語法錯(cuò)誤。
算法程序?qū)τ诤戏ㄝ斎肽軌虍a(chǎn)生滿足要求的輸出。
算法程序?qū)τ诜欠ㄝ斎肽軌虍a(chǎn)生滿足規(guī)格的說明。
算法程序?qū)τ诠室獾箅y的測試輸入都有滿足要求的輸出結(jié)果。
可讀性
算法設(shè)計(jì)另一目的是為了便于閱讀、理解和交流。
我么寫代碼的目的,一方面是為了讓計(jì)算機(jī)執(zhí)行,但還有一個(gè)重要的目的是為了便于他人閱讀和自己日后閱讀修改。
健壯性
當(dāng)輸入數(shù)據(jù)不合法時(shí),算法也能做出相關(guān)處理,而不是產(chǎn)生異常、崩潰或莫名其妙的結(jié)果。
時(shí)間效率高和存儲(chǔ)量低
生活中,每個(gè)男人都希望找一個(gè)賢惠的老婆,她們溫柔又體貼,美麗又大方,還會(huì)做著一手的好菜。
好算法就猶如好老婆,應(yīng)該具備時(shí)間效率高和存儲(chǔ)量低的特點(diǎn)。
所以在設(shè)計(jì)算法的時(shí)候我們應(yīng)該盡量思考這兩方面的問題!
4. 算法的評價(jià)標(biāo)準(zhǔn)
1. 時(shí)間復(fù)雜度
就是常用的大O表示法,一般大O表示法是評判算法優(yōu)劣的主要依據(jù)具體的描述可以查閱百度百科
2. 空間復(fù)雜度
在當(dāng)前硬件設(shè)備便宜的當(dāng)下,一般都會(huì)犧牲空間復(fù)雜度來換取時(shí)間