CS50 2013 Week5 學習筆記

2021-08-07 23:53:50 字數 2964 閱讀 3848

本以為這節課很難。但是課中講的array、linked list、stack、queue、binary search tree、hash table,剛好以前都看到過。

前面課程中提到過。

比如int a[8];語句。 定義乙個能儲存8個整型資料的陣列a,系統會為陣列a分配一片連續的儲存空間(例如,1201~1232),陣列中元素按下標從小到大排列,每個元素占用相應的4個位元組。

另外,陣列名a是常量,代表陣列占用儲存空間的起始位址(這裡1201)。

隨後,可以對陣列元素賦值,如a[1] = 2;,將2寫到位址1205對應的儲存空間裡。

這時候輸出列表,發現第二個元素為2,其他的沒賦值元素好奇怪,暫時沒有弄清楚。如下圖:

首先,需要有乙個指標指向列表的第乙個元素,知道鍊錶從哪兒開始的。

然後,每個元素除了資料域儲存資料,還有指標域指向下乙個元素。

然後,不需要連續的儲存空間,只要有指標儲存下乙個元素的位址就行。

鍊錶的最後乙個元素指標指向null,標誌這鍊錶的結尾。

例如,如果要在上述鍊錶中搜尋乙個元素02:

首先通過頭指標檢視頭指標指向的元素值是否等於02,

發現不等於,檢視指標指向的下乙個元素值是否等於02

… 最後發現有個元素等於02,返回true。

如果直到指標指向null,都沒有發現搜尋元素,返回false。

鍊錶中增加元素(到鍊錶開頭),如下圖:

複製頭指標的位址,使要增加的元素同樣指向第乙個元素。

使頭指標指向要增加的這個元素。

其餘的鍊錶操作還有增加元素到鍊錶中間、刪除元素等。

這個遇到好多次了,能說出一些:

last in,first out。

每次增加元素會放在棧頂,每次也只能取出棧頂的元素。

佇列,first in, first out。

像正常的排隊買東西一樣,佇列最前面的先買。最前面的買到了,第二個買。

然後,重要的乙個概念:

假如佇列只有8個位置。(capacity)

現在8個位置都有人排隊。(size)

第乙個人買完後,又來了乙個人排隊。

一般的做法是所有的人前移乙個位置,留出最後乙個位置給新來的人。

更巧妙的做法,可以新來的人直接站在第乙個位置。只要第二個人的位置變成佇列的開頭就行了。

大致如下圖:

樹結構,看下邊的 binary search tree,每次比較搜尋值與當前節點值,能確定下次往左搜尋還是往右搜尋。不用遍歷所有資料了。

首先有乙個指標指向tree結構的根節點,知道二叉樹從哪兒開始的。

根節點有兩個指標,左邊的指標指向的子節點的值小於根節點的值,右邊子節點的值大於根節點的值。

同樣,下面的子節點一樣會有乙個或兩個字節點。

例如,搜尋66:

首先開始時指標指向的值為55, 66大於55,看55右邊的指標。

55右邊的指標指向77, 66小於77,看77左邊的指標。

77左邊的指標指向66,等於66,返回true,完成了搜尋。

使用二叉樹搜尋,最重要的是二叉樹的結構要平衡。

比如,下面的二叉樹結構,符合搜尋二叉樹的定義。只是這樣的二叉樹和鍊錶差不多,看不出二叉樹搜尋的優勢了。

標準ascii碼用7位二進位制數表示128個可能的字元。

例如 65 代表a 等等。

所有的字母都占用一樣的記憶體或許不太理想。

當然,可以自己按照字母出現的頻率來編碼。字母出現頻率高,相應的編碼也簡單,方便使用和儲存(morse code)。

比如 一段文字 aaaeeebbccccdddddddd。

a出現的頻率為15%,b 10%,c 20%,d 40%,e 15%。

按照最小的兩個數互相結合成乙個新的數的原理。如下:

首先,五個數中最小的兩個數是 10%和15%,結合後變成25%。

現在,四個數中最小的兩個數是 15%和20%,結合後變成35%。

然後,三個數中最小的兩個數是 25%和35%,結合後變成60%。

60%和40%結合成了1。

到了編碼環節,按照節點左邊編碼為0,右邊編碼為1。

a的編碼為001,b的編碼為000,c的編碼為011,d的編碼為1,e的編碼為010。

(暫時沒看到多大的優勢,3個二進位制數能表示8個字元,這裡只有e編碼為乙個二進位制數,其他4個字元還是3個二進位制數表示。如果需要編碼的字元多了,會很明顯的優勢,出現頻率高的字元編碼也少,就不用占用那麼多記憶體了。)

最後放上資料結構的定義:

data structure

資料結構

CS50 2016 Week 0 學習筆記

今天開始從第一課開始學習了。week 0 和大學裡許多的第一節課一樣,只是簡單介紹這門課,沒有太多乾貨。有幾個知識點,比較重要。機器語言,即計算機能直接理解的語言,只有0 和 1 二進位制數 通過字元編碼,能用不同的數字表示不同的字元,能用二進位制數來表示我們熟悉的字元。乙個位元組儲存8個二進位制數...

CS50 2016 Week 2 學習筆記

這一課先講了除錯程式 debug 然後講了 正確性 設計 風格,最後講了陣列的概念。核心思想是程式報錯後,能找到哪兒錯了,怎麼錯的。如果是語法錯誤,根據報錯資訊,大概能找到怎麼錯的。如果是邏輯錯誤,可以自己在腦海中過一遍程式執行的流程,看哪兒有邏輯錯誤,或者自己在可能有問題的地方寫測試 c語言軟體中...

CS50 2016 Week3 學習筆記

上一課講了陣列,這節課順利過渡到了陣列的查詢 排序。即查詢演算法 排序演算法。關於查詢演算法,除了常見的linear search binary search 還有好多好多。下面是常見的七大查詢演算法 順序查詢 二分查詢 插值查詢 斐波那契查詢 樹表查詢 分塊查詢 雜湊查詢 排序演算法,除了氣泡排序...