本以為這節課很難。但是課中講的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 還有好多好多。下面是常見的七大查詢演算法 順序查詢 二分查詢 插值查詢 斐波那契查詢 樹表查詢 分塊查詢 雜湊查詢 排序演算法,除了氣泡排序...