決定數據(Data)的順序和位置
數據儲存在電腦的記憶體中,而記憶體如下圖所示,呈現箱子排成一列的形狀,每個箱子都存有一個數據。
當數據儲存在記憶體中時,決定數據的順序和位置的,就是「資料結構」(Data Structure)。
以電話簿的資料結構為例
依序上往下追加
在手機不盛行的年代,記下朋友電話就只能用紙筆記錄,通常都會每得到一組電話號碼,都由上往下依序寫在紙上。
姓名 | 電話號碼 |
---|---|
楊美珍 | 0987-654-321 |
駱欣怡 | 0912-345-678 |
許如木 | 0956-781-234 |
林秀昌 | 0943-218-765 |
… | … |
當要找「王珮雯」的電話時,因為資訊只是單純的以先後順序排列,所以不知道「王珮雯」的電話寫在哪裡,只能從_頭_開始尋找
(或是從_最後_開始,或是_隨機_尋找,但是非常耗時)
如果只有幾組電話或許可以馬上找到,但是當有數百、數千時可就非常麻煩了…ヾ(´∀`)ノ
依姓名的聲母順序管理
若換用注音(ㄅ、ㄆ、ㄇ)來管理電話號碼,因為姓名依照聲母順序排列,所以這類數據具有「結構」
姓名 | 電話號碼 |
---|---|
林(ㄌㄧㄣˊ)秀昌 | 0943-218-765 |
駱(ㄌㄨㄛˋ)欣怡 | 0912-345-678 |
許(ㄒㄩˇ)如木 | 0956-781-234 |
楊(ㄧㄤˊ)美珍 | 0987-654-321 |
… | … |
注意到,因「林秀昌」與「駱欣怡」聲母一樣(皆為ㄌ),因此再以第二個注音做排序
如此一來,從姓氏第一個字就大概能推測出位在電話簿何處位置,能較輕鬆找到對方電話號碼了
我想新增號碼怎麼辦?
今天認識了一位李(ㄌㄧˇ)安琪,要把電話號碼加進電話簿時,必須加在電話簿的第一順位
因此必須把所有電話號碼皆往下移動一行,才能將李安琪的電話插入電話簿第一行
依序進行「電話號碼皆往下移動一行」,假設每10秒可移動1筆資料,1分鐘才可移動6筆資料,一小時也才不過360筆資料….
各自優缺點
依序上往下追加:追加數據時相當容易,但查找費力。反之,根據姓名的聲母順序便於查找,但是不利於追加數據
一本電話簿,多種紀錄方式,各自精采,要用哪一種,取決於怎麼使用電話簿。
頻繁增加資訊卻不太需要查找(使用前者) vs 建立完成後幾乎不再更新 (使用後者)
試著結合兩者
例如將注音(ㄅ、ㄆ、ㄇ…)每一個聲母分成獨立的表格,在同一個表格中則採用依序上往下追加聯絡資訊。
ㄌ 表
姓名 | 電話號碼 |
---|---|
駱欣怡 | 0912-345-678 |
林秀昌 | 0943-218-765 |
… | … |
ㄒ 表
姓名 | 電話號碼 |
---|---|
許如木 | 0956-781-234 |
… | … |
ㄧ 表
姓名 | 電話號碼 |
---|---|
楊美珍 | 0987-654-321 |
… | … |
像這樣,新增聯絡資訊時,只要加在該聲母開頭的表格最末行就好,查找電話時,也只需查找該聲母表格
(不過,因為各表格並無特別順序,因此該表仍需整份檢索,但比起整本電話簿查找已省去不少時間)
在資料結構下工夫,就能提高記憶體使用效率
資料結構的邏輯與上述電話簿相同。當數據儲存在記憶體中,根據目的妥善結構化數據,就能提高使用效率。
Reference
- 演算法圖鑑
- Algorithms: Explained and Animated
此一系列筆記為閱讀演算法圖鑑後心得,畢竟不是本科系出身,希望能透過撰寫電子檔過程中,對於資料結構、演算法等有進一步認識╰(´︶`)╯♡