捲動以翻頁
Computer Science Principles · AP Computer Science Principles
位元、壓縮與資訊
電腦存放的一切,無論是數字、名字、照片還是歌曲,本質上都是一串位元的型樣。
位元(binary digit,二進位數字的縮寫)不是 0 就是 1。運算裝置以數位方式表示資料:任何值最底層的組成都是位元。
圖中以二進位計數。每個方塊是一個位元,紙色面代表 0,紅色面代表 1,下方是它的位值 128, 64, 32, 16, 8, 4, 2, 1。每一步加 1:最右邊的位元翻轉,凡是由 1 翻成 0 的地方,進位就向左傳一位,就像 00000111(7)變成 00001000(8)時一樣。
程式把資料值存放在變數、項目的串列,或獨立的常數中,並把它們當作輸入傳給程序,再取回輸出。不論形式為何,這些值都以位元儲存,再由程式轉換成人可以閱讀的形式。
本章是 AP Computer Science Principles 的大概念 2「資料」,占選擇題考試的 17–22%:二進位數(2.1)、資料壓縮(2.2)、從資料中擷取資訊(2.3)以及用程式處理資料(2.4)。
位元被歸組成抽象化
位元組是 8 個位元。位元組本身沒有意義:它的意義取決於讀取它的程式把它當作什麼。
抽象化是專注於主要概念以降低複雜度的過程。它隱藏與手邊問題無關的細節,並把相關而有用的細節整合在一起,讓你思考概念本身,而不是位元。
位元可以被歸組來表示抽象化,包括(但不限於)數字、字元和顏色。圖中把一個位元組 01000001 以三種方式讀取:
| 讀成 | 代表 |
|---|---|
| 二進位數 | 65 |
| 字元(ASCII 與 Unicode 碼 65) | 字母 A |
| 像素的亮度,0(黑)到 255(白) | 深灰色 |
所以同一串位元在不同情境下,可能表示不同型別的資料。彩色影像通常每個像素存三個這樣的數,紅、綠、藍各一個:3 位元組,24 位元。
位值,從右邊起編號,由 0 開始
進位制(包括二進位與十進位)用來表示資料。十進位(以 10 為基底)只用數字 0–9;二進位(以 2 為基底)只用 0 和 1。
和十進位一樣,數字的位置決定它的值:數值等於該數字乘以其位置的位值。位值是基底的位置次方,位置從最右邊的 0 開始編號,往左每次加 1。在十進位中,305 = 3 × 102 + 0 × 101 + 5 × 100。
在二進位中,每一位的值都是它右邊那一位的兩倍。對於 10110101:
| 位置 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
| 位值 | 27 = 128 | 26 = 64 | 25 = 32 | 24 = 16 | 23 = 8 | 22 = 4 | 21 = 2 | 20 = 1 |
| 位元 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
把位元為 1 的位置的位值加起來:128 + 32 + 16 + 4 + 1 = 181。位元為 0 就加 0。圖從左到右讀取;每個 1 都把它的位值丟進總和裡。
取放得下的最大位值
要把正整數寫成二進位,從最大的位值往下做:位值放得進剩下的數,就寫 1 並減掉它;放不進,就寫 0。
以八個位元表示 100:
| 位值 | 剩餘 | 放得下? | 位元 | 之後剩下 |
|---|---|---|---|---|
| 128 | 100 | no | 0 | 100 |
| 64 | 100 | yes | 1 | 36 |
| 32 | 36 | yes | 1 | 4 |
| 16 | 4 | no | 0 | 4 |
| 8 | 4 | no | 0 | 4 |
| 4 | 4 | yes | 1 | 0 |
| 2 | 0 | no | 0 | 0 |
| 1 | 0 | no | 0 | 0 |
所以 100 = 01100100:64 + 32 + 4 = 100。前面的 0 不影響大小,所以 01100100 和 1100100 是同一個數。
第二種方法:一再除以 2,再由最後一個餘數讀到第一個。100 ÷ 2 = 50 餘 0; 50 ÷ 2 = 25 餘 0; 25 ÷ 2 = 12 餘 1; 12 ÷ 2 = 6 餘 0; 6 ÷ 2 = 3 餘 0; 3 ÷ 2 = 1 餘 1; 1 ÷ 2 = 0 餘 1。往上讀:1100100。
圖中藍色長條是 100 剩下的部分;每個 1 都從長條上折下它的位值,並把它的方塊翻成紅色。
以及比較二進位數
一個位元有 2 種型樣。每多一個位元,數量就加倍:每個舊的型樣前面加 0 一次,再加 1 一次。所以 n 個位元有 2n 種型樣。
圖把它們建構出來:1 位元, 2; 2 bits, 4; 3 bits, 8; 4 bits, 16。一個位元組有 28 = 256 種型樣,即整數 0 到 255。最大的 n 位元數全是 1:2n − 1。
要讓 26 個字母各有自己的型樣,需要幾個位元?24 = 16 不夠;25 = 32 夠了:5 位元。
比較與排序。讓兩個數有相同的位元數(前面補 0),再從左邊開始掃描。第一個不同的位置決定結果:那個位置是 1 的數比較大,因為那一個位值比它右邊所有位的總和還大(2p > 2p − 1)。
01101100 和 01011111 在位置 5(32 的位)第一次不同,第一個數在那裡是 1:108 > 95,不管後面的位元是什麼。
溢位與捨入
在許多程式語言中,整數用固定數量的位元表示。這限制了整數值的範圍以及對它們進行的運算,並可能造成溢位或其他錯誤。
圖中的計數器(假設的)有 4 個位元:能存 0 到 15。把 15(1111)加 1 需要第五個位元;進位無處可去,計數器顯示 0。這就是溢位。
其他語言提供一種抽象化,整數的大小只受電腦記憶體大小的限制。考試參考表上的語言就是其中之一:它的整數不會溢位。
實數(有小數部分)也存在固定數量的位元中,這限制了它們的範圍以及對它們進行的運算,並可能造成捨入和其他錯誤:有些實數只能以近似值儲存。有 3 個小數位元時(圖中,假設的),只存在 1/8 = 0.125 的倍數;0.1 被存成 0.125,差了 0.025。
真實的語言用的位元多得多,所以誤差小得多,但並未消失:在許多語言中,0.1 + 0.2 的結果是 0.30000000000000004。實數的具體範圍限制不在本課程與考試的範圍內。
數位近似
類比資料的值隨時間平滑地改變,而不是以離散的間隔改變:音樂的音高與音量、一幅畫的顏色、短跑選手在比賽中的位置。
電腦儲存的是位元,所以只能近似類比資料。用數位資料近似真實世界的類比資料,是抽象化的一個例子。
類比資料可以用取樣來相當精確地以數位近似:以固定間隔測量類比訊號的值,每個測量值稱為樣本。每個樣本都經過測量,以算出儲存它所需的確切位元。
圖把同一個平滑訊號取樣兩次。第一次取 8 個樣本,每個四捨五入到 4 個等級之一(2 位元):8 × 2 = 16 位元,是粗糙的階梯。第二次取 16 個樣本,8 個等級(3 位元):16 × 3 = 48 位元,階梯更貼近曲線(它與訊號的平均距離減少了 43%)。
樣本越多、每個樣本的位元越多,近似就越接近,但儲存或傳送所需的位元也越多。再多有限個樣本也無法使它變得精確。
變小了,又能完全還原
資料壓縮可以縮小傳送或儲存的資料的大小(位元數)。無損演算法通常可以縮小它,同時保證能完整重建原始資料。
圖中這一列有 20 個像素,每個一位元組:20 位元組(假設的)。連續長度編碼把同一種顏色的每一段連續像素存成一個計數和一種顏色:7W 4R 6W 3B,4 段 × 2 位元組 = 8 位元組。
解碼寫出 7 white, 4 red, 6 white, 3 blue:和原來那一列一模一樣,每個像素都對得上。什麼都沒有遺失,所以位元變少不一定表示資訊變少。
縮小多少,同時取決於原始資料中冗餘的多寡與所用的壓縮演算法。很長的連續段壓縮得很好。每個像素就換一種顏色的一列(WRWRWR…)有 20 段長度為 1 的連續段:編碼後要 40 位元組,比原來的 20 還多。
還要更小,但只是近似
有損演算法可以大幅減少儲存或傳送的位元數,但只能重建原始資料的近似值。
圖中的 16 個像素(假設的亮度,每個一位元組)只保留每一對的平均值:8 位元組,大小減半。解碼時,每個像素都得到它那一對的平均值:16 個中有 14 個和原來不同,差距最多 10。灰色的幽靈是原來的值,而這 8 位元組裡沒有任何東西能把它們找回來:200、180 這一對和 190、190 這一對,平均值都是 190。
有損演算法通常能比無損演算法減少更多位元。選哪一種,取決於情況:
| 最重要的是什麼 | 通常選擇 |
|---|---|
| 品質,或能完全重建原始資料(程式檔、文字文件) | 無損 |
| 將資料大小或傳輸時間降到最小(在慢速連線上串流影片) | 有損 |
型樣,以及它們無法證明的事
資訊是從資料中擷取出來的事實與型樣的集合。資料提供了找出趨勢、建立關聯和解決問題的機會。
圖中畫出海邊小鎮 24 個假設的日子:賣出的冰淇淋對上曬傷的案例。一個上升,另一個也跟著上升:這是很強的相關性(相關係數 r = 0.86;1 代表完美的直線)。
冰淇淋不會造成曬傷。依溫度替這些日子上色,原因就顯現了:那 7 個炎熱的日子(紅色,27 °C 以上)帶來更多冰淇淋,也帶來更多陽光。在資料中發現的相關性不一定表示存在因果關係;要了解這個關係的確切性質,需要更多研究。
在這裡,光靠銷售紀錄無法顯示這一點。單一來源常常不包含得出結論所需的資料,必須將來自多個來源的資料(銷售、診所就診、天氣紀錄)合併。
關於資料的資料
中介資料是關於資料的資料。照片是資料;它的中介資料可能包括建立日期、檔案大小、尺寸和標籤。
對中介資料所做的更改與刪除,不會改變主要資料。圖中刪除了標籤「日落」;64 個像素沒有一個改變。
中介資料用於尋找、組織和管理資訊:相簿可以列出 6 月 14 日 拍的所有照片,或所有標記為「海灘」的照片,而不必看任何一個像素。中介資料提供額外的資訊,提高資料的有效利用,並讓資料得以被結構化和組織。
考試時,情境會給出蒐集到的資料與中介資料,並問能找出什麼。要問每個欄位記錄了什麼。只有日期和標籤的相簿,能回答「6 月拍了幾張照片?」,但不能回答「這張照片是在哪裡拍的?」:沒有任何欄位記錄地點。
使其一致,但不改變意義
無論大小,資料集都會帶來挑戰:需要清理資料、不完整的資料、無效的資料,以及需要合併資料來源。處理資料的能力取決於使用者及其工具的能力。
依資料蒐集的方式,資料可能不一致。使用者在開放欄位中輸入時,縮寫、拼法和大小寫的方式因人而異。圖中的註冊表單(假設的)對 2 個城市有 7 種不同的拼法。
清理用同一個詞取代所有等價的縮寫、拼法和大小寫,讓資料變得一致,而不改變它們的意義:5 筆資料被改寫,7 種拼法變成 2。現在,統計各城市註冊人數的程式就能算對了。
清理無法憑空補上缺少的資料。有一列沒有年齡(不完整),有一列給的是 −4(無效);它們會被標記起來,等待檢查或排除在分析之外,而不是用猜的。
更多資料不等於更好的資料
偏誤的問題,常常來自所蒐集資料的類型或來源。光是蒐集更多資料,並不能消除偏誤。
圖中的民調(假設的)只觸及母體的左半邊,例如某個網站的讀者。在整個母體中,41% 持紅色的意見。收到 30 份回答後,民調說是 80%;收到 60 份後,是 78%。回答多了一倍,卻仍是同樣錯誤的圖像,因為每一份回答都來自同一個不具代表性的來源。
大小仍然重要:資料集的大小會影響能從中擷取的資訊量。但大型資料集很難用單一電腦處理,可能需要平行系統,也就是許多處理器同時處理資料的各個部分。
處理資料集時,系統的可擴充性是一項重要的考量,因為系統的運算能力會影響資料集如何被處理與儲存。
處理串列的程式
程式可以用來處理資料以取得資訊。搜尋工具有助於有效率地找到資訊,而資料篩選系統是在資料中找出資訊與辨識型樣的重要工具。
篩選只保留符合某個條件的元素,例如只保留串列中的正數,或只保留報名樂隊的學生:
data ← [4, -2, 7, 0, -5, 3] positives ← [] FOR EACH n IN data { IF(n > 0) { APPEND(positives, n) } } 圖以紅色標出正在執行的那一行。每個 n 都會被測試;只有 n > 0 的才會被附加。positives 最後是 [4, 7, 3];0 不會被保留,因為 0 > 0 是 false。
轉換會改變每個元素,例如把串列中的每個元素加倍,或在每筆學生紀錄中加上家長的電子郵件。先有 doubled ← []:
FOR EACH n IN data { APPEND(doubled, 2 * n) } doubled 最後是 [8, −4, 14, 0, −10, 6]。洞見可以來自對資料的轉譯與轉換,而且用程式轉換資料時,型樣可能浮現。程式設計師也用程式來篩選與清理資料。
由多個數得出一個數,以及圖表
合併或比較資料,是把許多值化簡成一個答案:把一串數字加總,或找出 GPA 最高的學生。視覺化則是把資料集顯示成圖表、圖形或其他視覺表示。
某個社團記錄了 6 週的報名人數(假設的):signups ← [12, 18, 9, 22, 15, 20]。
total ← 0 most ← signups[1] FOR EACH n IN signups { total ← total + n IF(n > most) { most ← n } } DISPLAY(total) DISPLAY(most) 它顯示 96 22:6 週,總共 96 人報名,最多的一週有 22 人。most 從 signups[1](第一個值)開始,而不是 0,所以即使每個值都是負數,它仍然有效。程式執行時,圖把每一週畫成一根長條:圖表隨著資料被讀入而成形。
表格、圖解、文字和其他視覺工具,可以用來傳達從資料中得到的洞見與知識。試算表之類的程式,有助於有效率地組織資訊並找出趨勢。
程式的使用方式是迭代且互動的:看圖表、提出新問題、再次篩選或轉換。合併資料來源、對資料做分群(把相似的項目歸在一起)以及對資料做分類(把項目分入各類別),都是用程式從資料中獲得洞見與知識的一部分。