data structure lesson07

Page 1

!!"

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 7.1 ชนิดขอมูลแบบลิสต เรือ่ งที่ 7.1.1

การกําหนดคุณลักษณะเฉพาะของลิสต

เรือ่ งที่ 7.1.2

การสรางลิสตดว ยอะเรย

เรือ่ งที่ 7.1.3

การสรางลิสตดว ยลิงคลสิ ต

เรือ่ งที่ 7.1.4

การใชลสิ ต

ตอนที่ 7.2 การประยุกตใชลิสต เรือ่ งที่ 7.2.1

การใชลิสตในการจัดเก็บขอมูล

เรือ่ งที่ 7.2.2

การใชลสิ ตในการเรียงลําดับขอมูล

แนวคิด 1. ชนิดขอมูลแบบลิสตมีการประยุกตใชมากในวิทยาการคอมพิวเตอร 2. ชนิดขอมูลแบบลิสตมีโครงสรางขอมูลแบบเชิงเสน (linear) 3. ชนิดขอมูลแบบลิสตมีคุณสมบัติเฉพาะคือเราสามารถนําขอมูลเขาในลิสตในตําแหนงใด ๆ ของ ลิสตกไ็ ด 4. การดําเนินงานกับลิสตไดแก การสรางลิสต (create) การนําสมาชิกขอมูลเขาลิสต (insert) การ นําสมาชิกขอมูลออกจากลิสต (delete) การทดสอบวาลิสตวา งหรือไม (empty) การทดสอบวา ลิสตเต็มหรือไม (full) การทําใหลสิ ตเปนลิสตวา ง (clear) และการดําเนินการอืน่ ๆ ที่เกี่ยวกับ ลิสต 5. การที่จะใหผูใชเขาใจคุณสมบัติของลิสตที่ตรงกัน จะตองมีการออกแบบคุณสมบัติของลิสต โดย การเขียนคุณลักษณะเฉพาะ (specification) ของลิสตที่เราตองการอยางชัดเจน 6. เมือ่ มีการเขียนคุณลักษณะทีช่ ดั เจนแลว ผูส รางสามารถสรางลิสตตามทีอ่ อกแบบไวได โดยราย ละเอียดของการสรางจะซอนจากผูใช 7. ในการสรางลิสต ผูส รางตองดําเนินการสองสิง่ ใหญๆ คือ เลือกการแทนทีข่ อ มูลของลิสตและ สรางการดําเนินงานโดยใชการแทนทีข่ อ มูลทีเ่ ลือกแลว


!!# 8. ในการสรางลิสต ผูส รางสามารถเลือกใชการแทนทีข่ อ มูลของลิสตแบบอะเรยหรือลิงคลสิ ตกไ็ ด 9. ในการใชชนิดขอมูลแบบลิสต ผูใชเพียงแตใชตามคุณลักษณะเฉพาะที่ออกแบบไวเทานั้น ไม ตองสนใจวาผูสรางจะเลือกการแทนที่ขอมูลของลิสตอยางไร และสรางมาดวยวิธีการอยางไร วัตถุประสงค หลักจากศึกษาบทเรียนที่ 7 แลว นักศึกษาสามารถ 1. บอกถึงคุณลักษณะเฉพาะของลิสตได วาลิสตมีชนิดขอมูลสมาชิกเปนอยางไร มีโครงสรางขอมูล อยางไร และสามารถดําเนินงานอะไรกับลิสตไดบา ง 2. สรางลิสตโดยใชการแทนที่ขอมูลแบบอะเรยได 3. สรางลิสตโดยใชการแทนทีข่ อ มูลแบบลิงคลสิ ตได 4. บอกตัวอยางการประยุกตใชลิสตในสาขาวิทยาการคอมพิวเตอรได กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 7.1 และตอนที่ 7.2 2. ทํากิจกรรมของบทเรียนที่ 7 3. ทําแบบประเมินผลของบทเรียนที่ 7 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน


!!$ ตอนที่ 7.1 โครงสรางขอมูลแบบลิสต หัวเรื่อง เรือ่ งที่ 7.1.1

การกําหนดคุณลักษณะเฉพาะของลิสต

เรือ่ งที่ 7.1.2

การสรางลิสตดว ยอะเรย

เรือ่ งที่ 7.1.3

การสรางลิสตดว ยลิงคลสิ ต

เรือ่ งที่ 7.1.4

การใชลสิ ต

แนวคิด 1. การกําหนดคุณลักษณะเฉพาะของลิสตมคี วามสําคัญมากในการสือ่ สารระหวางผูส รางลิสตและผู ใชลิสต โดยที่ผูใช ใชโดยทราบขอกําหนดจากคุณลักษณะเฉพาะทีก่ าํ หนดและผูส รางไดสราง ตามคุณลักษณะเฉพาะทีก่ าํ หนด 2. ผูใชไมตองสนใจรายละเอียดของการสราง ผูใชเพียงแตทราบวาลิสตมีคุณสมบัติอยางไรและ สามารถดําเนินงานอะไรกับลิสตไดบา ง ในการดําเนินงานแตละอยาง ผูใชตองใหขอมูลเขา อยางไร และผูใ ชจะไดผลลัพธอะไรหลังจากใชการดําเนินงานนัน้ ๆ 3. ผูส รางสามารถทีจ่ ะสรางลิสตโดยใชการแทนทีข่ อ มูลแบบอะเรยหรือลิงคลสิ ตกไ็ ด โดยไมมีผล ตอการเรียกใชของผูใช วัตถุประสงค หลังจากที่ศึกษาตอนที่ 7.1 แลว นักศึกษาสามารถ 1. 2. 3. 4.

เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบลิสต และบอกการดําเนินงานทีส่ าํ คัญของลิสตได สรางลิสตดว ยอะเรยได สรางลิสตดว ยลิงคลสิ ตได ใชลิสตได

เรื่องที่ 7.1.1 การกําหนดคุณลักษณะเฉพาะของลิสต มาถึงบทเรียนนี้แลว หวังวานักศึกษาจะไดเห็นความสําคัญของการกําหนดคุณลักษณะเฉพาะของ ชนิดขอมูล (หรือการออกแบบชนิดขอมูล) ซึ่งมีความสําคัญตอการสรางและการใชชนิดขอมุล ในทํานองเดียว กันการกําหนดคุณลักษณะเฉพาะของลิสตจะประกอบดวย 3 สวนใหญๆ คือ - การกําหนดวาสมาชิกขอมูลของลิสตที่ใชมีชนิดขอมูลเปนอะไร - การกําหนดวาสมาชิกของลิสตมีโครงสรางหรือความสัมพันธกันอยางไร - การกําหนดวาเราสามารถดําเนินงานอะไรกับลิสตไดบา ง


!!% ตามทีไ่ ดเกริน่ นําในเรือ่ งที่ 1.1.2 แลววา ในวิชานี้เราจะศึกษาชนิดขอมูลที่มีโครงสรางขอมูลแบบ เชิงเสน 3 ชนิด ดวยกัน ไดแก ชนิดขอมูลแบบสแตก ชนิดขอมูลแบบคิว และชนิดขอมูลแบบลิสต ในคุณ ลักษณะเฉพาะ 5.1 ของบทเรียนที่ 5 เราจะเห็นไดวาการนําสมาชิกเขาในสแตก (Push) และออกจากสแตก (Pop) จะเกี่ยวของเฉพาะกับสมาชิกบนสุด (top) หรือสมาชิกลาสุดของสแตกเทานัน้ สวนชนิดขอมูลแบบคิว การนําสมาชิกเขาในคิว (Enqueue) จะดําเนินการกับสมาชิกตัวสุดทายของคิว (tail) หรือการนําสมาชิกออก จากคิว (Dequeue) จะดําเนินการกับสมาชิกตัวแรกของคิว (head) ดังนัน้ อันดับของสมาชิกตัวอืน่ ๆ จะไมมี ความสําคัญ แตในการจัดเก็บ เปลีย่ นแปลง หรือเรียกใชขอมูลในการประยุกตในงานตาง ๆ เราจะตอง สามารถดําเนินการกับสมาชิกขอมูลตัวใดก็ได ดังนั้นอันดับของขอมูลจะมีความสําคัญ และเราสามารถจะนํา ขอมูลเขาในลิสต (Insert) หรือนําขอมูลออกจากลิสต (Delete) ณ ตําแหนงใดของลิสตกได ดังนัน้ เราจะ กําหนดรายละเอียดของคุณลักษณะเฉพาะของลิสตดงั นี้ คุณลักษณะเฉพาะ 7.1 คุณลักษณะเฉพาะของลิสต สมาชิก

:

สมาชิกของลิสตจะมีชนิดเปนอยางไรก็ได แตในที่นี้สมมุติใหมีชนิดเปน StdElement

โครงสราง :

ลิสตจะมีโครงสรางแบบเชิงเสน นั่นคือสมาชิกแตละตัวจะมีอันดับตั้งแต 1, 2, 3, 4,….,n และการดําเนินงานทีเ่ กิดขึน้ กับลิสตสมารถจะเกิดกับสมาชิตวั ใดก็ได การดําเนินงาน : มีการดําเนินงานดังนี้ Create, Insert, Delete, Retrieve, Update, FindFirst, FindNext, Empty, FindKey โดยมีรายละอียดดังนี้ สัญลักษณ : ให L-pre เปนสถานะของลิสตกอ นการดําเนินงาน ให L-post เปนสถานะของลิสตหลังการดําเนินงาน ให C -pre แทน สมาชิกตัวปจจุบัน กอนการดําเนินงาน ให I_Current เปนอันดับของสมาชิกตัวปจจุบัน ให C –next แทน สมาชิกถัดจากตัวปจจุบัน กอนการดําเนินงาน ให C –prior แทน สมาชิกกอนตัวปจจุบัน กอนการดําเนินงาน {สรางลิสตขน้ึ เปนลิสตวา ง}

Create Pre:

ไมมี

Post:

สรางลิสตขน้ึ ซึง่ เปนลิสตวา ง

Insert ( E : StdElemant ) {ใส E หลังสมาชิกตัวปจจุบัน } Pre:

ลิสตยังไมเต็ม

Post:

E เปนสมาชิกอยูในลิสตหลังสมาชิกตัวปจจุบันของ L-pre และ E จะเปนสมาชิกตัวปจจุบัน ของ L-post {ลบสมาชิกตัวปจจุบันออกจากลิสต}

Delete Pre:

ลิสตตอั งไมเปนลิสตวา ง


!!& Post:

C-pre ตองไมอยูในลิสต ถา C-pre เปนสมาชิกตัวแรก แลว C-next จะเปนสมาชิกตัวแรก ไมเชนนั้น C-next จะ เปนสมาชิกตอจาก C-prior

ถา ลิสตไมเปนลิสตวา ง แลว สมาชิกตัวแรกจะเปนสมาชิกตัวปจจุบัน ไมเชนนั้น ไมมีสมาชิกตัวปจจุบัน Retrieve (VAR E : StdElement) {ดึงขอมูลของตัวปจจุบันมาใช} Pre:

ลิสตตอ งไมเปนลิสตวา ง

Post:

E มีคาเทากับคาของสมาชิกตัวปจจุบัน

Update (E : StdElement) {เปลี่ยนแปลงคาขอมูลตัวปจจุบัน} Pre:

ลิสตตอ งไมเปนลิสตวา ง

Post:

สมาชิกตัวปจจุบันจะมีคาเทากับ E {ใหสมาชิกตัวแรกเปนสามาชิกตัวปจจุบัน}

Findfirst Pre:

ลิสตตอ งไมเปนลิสตวา ง

Post:

สมาชิกตัวแรกจะเปนสมาชิกปจจุบัน

Findnext (VAR Fall : boolean)

{ใหสมาชิกตัวถัดไปเปนสมาชิกตัวปจจุบัน}

Pre:

ลิสตตอ งไมเปนลิสตวา ง

Post:

ถา C-pre ไมใชสมาชิกตัวสุดทาย แลว C-next จะเปนสมาชิกปจจุบัน และ Fail จะเปนเท็จ ไมเชนนั้น Fail จะเปนจริง {ทดสอบวาเปนลิสตวา งหรือไม}

Empty : boolean Pre:

ไมมี

Post:

ถา ลิสตไมมีสมาชิกเลย แลว Empty จะเปนจริง ไมเชนนั้น Empty จะเปนเท็จ

FindKey (Tkey : Keytype; VAR Fail : boolean)

{คนหาสมาชิกตามคียที่กําหนด}

Pre:

ไมมี

Post:

ถาลิสตมีสมาชิกที่มีคียเปน Tkey แลว สมาชิกตัวปจจุบัน จะเปนสมาชิกตัวที่มีคียเปน Tkey และ Fail จะเปนเท็จ ไมเชนนั้น Fail จะเปนจริง

หมายเหตุ ในบทเรียนนีจ้ ะยังไมสามารถสรางการดําเนินงานของ FindKey ได เนือ่ งเราตองรูจ กั วิธกี ารของ การคนหาขอมูล (searching) แบบตาง ๆ กอน ซึ่งจะเรียนกันในบทเรียนที่ 9


!'( กิจกรรม 7.1 ฝกเขียนคุณลักษณะเฉพาะ 1. จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน FindLast เพื่อใหสมาชิกตัวสุดทายของลิสตเปน สมาชิกตัวปจจุบัน 2. จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน ShowList โดยใหมีการพิมพสมาชิกของลิสต ออกมาและลิสตยังมีสมาชิกเหมือนเดิม กิจกรรม 7.2 ฝกการดําเนินการกับลิสต ในตารางขางลางนี้จงแสดงสถานของลิสตหลังการดําเนินงาน (L-post และ I_Current) และผลลัพธท่ี เกิดจากการดําเนินงาน (Output) ของลําดับของการดําเนินงาน (Operation) ตาง ๆ กับลิสต ในที่นี้สมมติให สมาชิกของลิสตมีชนิดเปน StdElement โดยมีคียเปน char และจะแสดงเพียงสวนคียของขอมูลสมาชิกของ ลิสตเทานัน้ No.

Operation

Input

L-Post

I_Current

Create

[]

0

Empty

[]

0

Insert

A

Insert

B

Output true

Empty Insert

C

FindFirst Insert

D

Delete Update

E

FindNext Retrieve กิจกรรม 7.3 เปรียบเทียบการดําเนินงานของสแตก คิว และ ลิสต จากคุณลักษณะเฉพาะของการดําเนินงานของสแตก คิว และลิสต ในคุณลักษณะเฉพาะที่ 5.1, 6.1, และ 6.1 จงเติมตารางเปรียบเทียบการดําเนินงานตอไปนี้ของสแตก คิว และลิสต หากคุณลักษณะเฉพาะ ของสแตกและคิวที่กําหนดมากอนหนานี้ ไมมกี ารดําเนินงานทีเ่ ทียบเคียงได จงพิจารณาวาเราจะสรางการ ดําเนินงานที่สมเหตุสมผลสําหรับขอมูลของสแตกและคิวเพิ่มมาไดหรือไม จงใหเหตุผล และถาทําไดจงเขียน คุณลักษณะเฉพาะของการดําเนินงานของสแตกและคิวทีเ่ พิม่ ขึน้ มา


!'! No.

List

Queue

Stack

Create Insert Delete Empty Full Clear Length Retrieve Update FindFirst FindNext FindPrev FindlLast ShowList เรื่องที่ 7.1.2 การสรางลิสตดว ยอะเรย การสรางลิสตดว ยอะเรย หมายถึง การแทนที่ขอมูลของลิสตดวยอะเรย ซึง่ เปนการจัดสรรเนือ้ ที่ หนวยความจําแบบสแตติก นัน่ คือ มีการกําหนดขนาดของลิสตลวงหนาวามีขนาดเทาใดและจะมีการจัดสรร เนื้อที่หนวยความจําใหเลย ตัวอยางของการสรางลิสตดวยอะเรยไดแสดงในโปรแกรม 7.1 UNIT ListUA; INTERFACE CONST MaxSize=100; TYPE KeyType=1..MaxSize; DataType = RECORD Name:string[15]; Math:integer; Stat:integer; Comp:integer; END; StdElement = RECORD Key:KeyType; Data:DataType;


!'' VAR

END; L:ARRAY[1..Maxsize] OF StdElement; Total,Current:0..MaxSize;

PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE

Create; Insert(E:StdElement); Delete; Retrieve(VAR E:StdElement); Update(E:StdElement); FindFirst; FindNext(VAR Fail:boolean); Empty:boolean; FindKey(TKey:Keytype;VAR Fail:boolean);

IMPLEMENTATION PROCEDURE Create; BEGIN Current:=0; Total:=0; END; PROCEDURE Insert(E:StdElement); VAR I:integer; BEGIN IF Current=Total THEN BEGIN Current:=Current+1; L[Current]:=E; END ELSE BEGIN I:=Total; WHILE I<>Current DO BEGIN L[I+1]:=L[I]; I:=I-1; END; L[I+1]:=E; Current:=Current+1; END; Total:=Total+1; END; PROCEDURE Delete; VAR I:integer; BEGIN IF Total<>0 THEN BEGIN I:=Current;


!') WHILE I<>Total DO BEGIN L[I]:=L[I+1]; I:=I+1; END; Total:=Total-1; IF Total=0 THEN Current:=0 ELSE Current:=1; END ELSE Current:=0; END; PROCEDURE Retrieve(VAR E:StdElement); BEGIN END; PROCEDURE Update(E:StdElement); BEGIN END; PROCEDURE FindFirst; BEGIN END; PROCEDURE FindNext(VAR Fail:boolean); BEGIN END; FUNCTION BEGIN

Empty:boolean;

END; END.

โปรแกรม 7.1 การสรางลิสตดว ยอะเรย จากตัวอยางของโปรแกรม 7.1 จะเห็นไดวา การสรางลิสตดว ยอะเรยจะไมเหมาะกับการดําเนินงาน Insert และ Delete เนื่องดวยจะตองมีการเคลื่อนยายขอมูลซึ่งมีประสิทธิภาพเปน O(n) แตหากเราใชการแทน ที่ขอมูลดวยลิงคลิสตจะใชเวลาคงที่คือ O(1) ดังนัน้ การสรางลิสตดว ยลิงคลสิ ตจะเหมาะสมกวา


!'* กิจกรรม 7.4 ฝกปฏิบัติการสรางลิสตดวยอะเรย จงเขียนโปรแกรม 7.1 ใหสมบูรณ (โดยยังไมตองทําการดําเนินงาน FindKey เนือ่ งดวยจะเปนการ คนกาขอมูลซึ่งจะเรียนวิธีการตาง ๆ .ในบทเรียนที่ 9) และใหชื่อวา prog7_1.pas พรอมทั้งคอมไพล โปรแกรม เรื่องที่ 7.1.3 การสรางลิสตดวยลิงคลิสต ในการสรางลิสตดว ยลิงคลสิ ต หมายถึงเราเลือกการแทนทีข่ อ มูลของลิสตดว ยลิงคลสิ ตซง่ึ เปนการจัด สรรเนื้อที่หนวยความจําแบบไดนามิก นัน้ คือ หนวยความจําจะถูกจัดสรรเมื่อมีการขอใชจริง ๆ ระหวางการ ประมวลผลโปรแกรมผานตัวแปรชนิด pointer ในการสรางลิสตดว ยลิงคลสิ ตลสิ ตจะไมมวี นั เต็ม (ไมมีการ ดําเนินงาน Full) ตราบใดที่ยังมีเนื้อที่ของฮีปในหนวยความจํา สวนหนึง่ ของโปรแกรมการสรางลิสตดว ยลิงค ลิสตไดแสดงในโปรแกรม 7.2 UNIT ListUL;

1!

INTERFACE CONST MaxSize=100; TYPE KeyType=1..MaxSize; DataType = RECORD Name:string[15]; Math:integer; Stat:integer; Comp:integer; END; StdElement = RECORD Key:KeyType; Data:DataType; END; Node = RECORD El:StdElement; Next:pointer; END; pointer = ^Node;

2 3 4 5 6 7 7 9 10 11 12 13 14 15 16 17 18 19

VAR

20

Head,Current:pointer;

PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE

Create; Insert(E:StdElement); Delete; Retrieve(VAR E:StdElement); Update(E:StdElement); FindFirst; FindNext(VAR Fail:boolean); Empty:boolean; FindKey(TKey:Keytype;VAR Fail:boolean);

21 22 23 24 25 26 27 28 29


!'" IMPLEMENTATION PROCEDURE Create; BEGIN Current:=nil; Head:=nil; END; PROCEDURE Insert(E:StdElement); VAR P:pointer; BEGIN new(P); P^.El:=E; IF Head=nil THEN BEGIN Head:=P; Current:=P; Current^.Next:=nil; END ELSE BEGIN P^.Next:=Current^.Next; Current^.Next:=P; Current:=P; END; END; PROCEDURE Delete; BEGIN END; PROCEDURE Retrieve(VAR E:StdElement); BEGIN E:=Current^.El; END; PROCEDURE Update(E:StdElement); BEGIN Current^.El:=E; END; PROCEDURE FindFirst; BEGIN Current:=Head; END; PROCEDURE FindNext(VAR Fail:boolean); BEGIN Fail:=False; IF Current^.Next<>nil THEN


!'# Current:=Current^.Next ELSE Fail:=True; END; FUNCTION Empty:boolean; BEGIN IF Head=nil THEN Empty:=True ELSE Empty:=False; END; END.

โปรแกรม 7.2 การสรางลิสตดวยลิงคลิสต กิจกรรม 7.5 ฝกการสรางลิสตดวยลิงคลิสต 1. ในโปรแกรมที่ 7.2 โคตบรรทัดใดที่แสดงถึงการแทนที่ขอมูลลิสตดวยลิงคลิสต 2. จงเขียนโปรแกรมใหสมบูรณ และใหชื่อวา prog7_2.pas พรอมคอมไพลโปรแกรมนี้ การเปรียบเทียบประสิทธิภาพการสรางลิสตดว ยอะเรยและลิงคลสิ ต ดวยวิธที าํ นองเดียวกับการเปรียบเทียบประสิทธิภาพการสรางคิวดวยอะเรยและลิงคลสิ ตดงั ไดเรียน มาแลวในบทเรียนที่ 6 ประสิทธิภาพของการดําเนินงานของลิสตทส่ี รางดวยอะเรยและลิงคลสิ ต ดังแสดงใน ตาราง 7.1 ตาราง 7.1 เปรียบเทียบประสิทธิภาพของการดําเนินงานของลิสตที่สรางดวยอะเรยและลิงคลิสต การดําเนินงาน

สรางดวยอะเรย

สรางดวยลิงคลสิ ต

Create

O(1)

O(1)

Insert

O(n)

O(1)

Delete

O(n)

O(1)

Full

O(1)

-

Empty

O(1)

O(1)

Clear

O(1)

O(n)

Length

O(1)

O(n)

Retrieve

O(1)

O(1)


!'$ Update

O(1)

O(1)

FindFirst

O(1)

O(1)

FindNext

O(1)

O(1)

FindPrev

O(1)

O(n)

FindlLast

O(1)

O(n)

ShowList

O(n)

O(n)

จากการเปรียบเทียบประสิทธิภาพของการดําเนินงานของลิสตทส่ี รางดวยอะเรยและลิงคลสิ ตใน ตาราง 7.1 จะเห็นไดวามี 2 การดําเนินงานคือ Insert และ Delete ซึ่งการแทนที่ขอมูลดวยอะเรยจะมีประ สิทธิภาพต่ํากวาการแทนที่ขอมูลดวยลิงคลิสต สวนการดําเนินงาน Clear, Length, FindPrev, และ FindLast นั้นการแทนที่ขอมูลดวยลิงคลิสตจะมีประสิทธิภาพต่ํากวาการแทนที่ขอมูลดวยอะเรย หากเราไมคืนหนวยความจําใหกับฮีป (dispose) เราก็สามารถที่จะเขียนโคตใหมีประสิทธิภาพเปน O(1) ไดสาํ หรับ Clear สวนการทีจ่ ะทําใหการดําเนินงาน Length มีประสิทธิภาพ O(1) เราก็ทาํ ไดโดยการ เพิ่มตัวแปรขึ้นอีก 1 ตัว มีชนิดเปน integer เพื่อนับจํานวนสมาชิกที่มีอยูในลิสต โดยจะตองมีการเพิ่มโคตใน Insert และ Delete และหากตองการให FindLast มีประสิทธิภาพ O(1) ก็สามารถทําไดโดยเพิ่มตัวแปร ชนิด pointer อีก 1 ตัวเก็บ Address (หรือชี้ไปที่) ของโหนดสุดทายของลิสต นั้นคือตัวแปรนี้จะตองเปลี่ยน คาถามีการ Insert หรือ Delete เมื่อ Current เปนโหนดสุดทาย สําหรับการดําเนินงาน FindPrev เราสามารถทําใหประสิทธิภาพเปน O(1) ไดถา เราเลือกการแทน ที่ขอมูลแบบ Doubly Linked List ซึ่งมีการแทนที่ขอมูลดังนี้ TYPE

pointer = ^Node Node = RECORD Prev : pointer El : StdElement; Next : pointer END VAR Head, Current : pointer

ลิสตทส่ี รางดวย Doubly Linked List แสดงใน ภาพประกอบ 7.1 Current Head

4

7

5

8

nil


!'% ภาพประกอบ 7.1 แผนภาพของลิสตที่สรางดวย Doubly Linked List กิจกรรม 7.6 ฝกการสรางลิงคลิสต 1. จงสรางการดําเนินงาน Clear, Length, FindLast ที่ใชการแทนที่ขอมูลดวยลิงคลิสตและมีประ สิทธิภาพ O(1) 2. จงสรางลิสตในโปรแกรมที่ 7.1 ใหม โดยใชการแทนที่ขอมูลแบบ Doubly Linked List 3. จงเปรียบเทียบประสิทธิภาพโดยรวมของการเลือกการแทนที่ขอมูลของลิสตทั้ง 3 แบบ นัน่ คือ การแทนทีล่ สิ ตดว ยอะเรย การแทนทีล่ สิ ตดว ย Simple Linked List และการแทนทีล่ สิ ตดว ย Doubly Linked List เรื่องที่ 7.1.4 การใชและการทดสอบลิสต ในทํานองเดียวกันกับเรือ่ งที่ 5.1.4 การใชและการทดสอบสแตก คือเมือ่ เราสรางลิสตขน้ึ มาแลว ไม วาจะเปนการแทนทีข่ อ มูลลิสตดว ยอะเรย (ListUA.TPU) หรือการแทนทีข่ อ มูลลิสตดว ยลิงคลสิ ต (ListUL.TPU) หรือการแทนทีข่ อ มูลลิสตดว ย Doubly Linked List (ListUDL.TPU) ผูใชสามารถจะเรียกใชการดําเนินงาน ของลิสตไดในรูปแบบเดียวกัน ไมขึ้นกับการแทนที่ขอมูลที่ใช กิจกรรม 7.7 การใชและการทดสอบลิสต จงใชตัวอยางของการทดสอบการใชงานของสแตกในเรื่องที่ 5.1.4 เขียนโปรแกรมเพือ่ ทดสอบการ ทํางานของลิสต โดยใหชนิดขอมูลสมาชิกของลิสตเปน Student และใหเก็บโปรแกรมนี้ชื่อ ListT.pas หมายเหตุ ใน ListT.pas ใหดาํ เนินการรันโปรแกรม 3 ครั้งโดยครั้งที่ 1 เรียกใช ListUA, ครั้งที่ 2 เรียกใช ListUL และครั้งที่ 3 เรียกใช ListUDL ใหเก็บโปรแกรมในไฟลชื่อ prog7_3.pas


!'& ตอนที่ 7.2 การประยุกตใชลิสต หัวเรื่อง เรือ่ งที่ 7.2.1

การใชลิสตในการจัดเก็บขอมูล

เรือ่ งที่ 7.2.2

การใชลสิ ตในการเรียงลําดับขอมูล

แนวคิด 1. ชนิดขอมูลแบบลิสตมีการประยุกตใชมากมายในสาขาวิชาวิทยาการคอมพิวเตอร โดยเฉพาะ อยางยิ่งการใชลิสตในการจัดเก็บขอมูล ดังตัวอยางของการจัดเก็บขอมูลในตารางตาง ๆ ของ ระบบฐานขอมูลเชิงสัมพันธ เชน Access ในชุด Microsoft Office เปนตน 2. ในการเรียงลําดับขอมูล และการคนหาขอมูลอยางงงาย เราก็จะใชลิสตในการจัดเก็บขอมูลเพื่อ การดําเนินงาน วัตถุประสงค 1. เพื่อใหนักศึกษาสามารถเห็นตัวอยางการประยุกตใชชนิดขอมูลแบบลิสตในสาขาวิชาวิทยาการ คอมพิวเตอร เรื่องที่ 7.2.1 การใชลิสตในการจัดเก็บขอมูล ในการจัดเก็บขอมูลในระบบฐานขอมูลเชิงสัมพันธ เชน Access เราจะเห็นไดวา หากเราทําการเก็บ ขอมูลลงในตาราง การดําเนินงานพืน้ ฐานของขอมูลในตารางจะไดแก การใสขอ มูลลงในตาราง (Insert) การ ลบขอมูลออกจากตาราง (Delete) การเลือ่ นไปยังขอมูลทีต่ อ งการ เชน FindFirst, FindLast, FindNext, FindPrev เปนตน กิจกรรม 7.8 ฝกการเรียกการดําเนินงานของลิสต ลองใช Access สรางขอมูลชนิด Student ลงในตาราง และทดสอบการใชงานดวยการสราง Form เรื่องที่ 7.2.2 การใชลิสตในการเรียงลําดับขอมูล หากเรามีขอ มูลทีต่ อ งทําการเรียงลําดับ เราก็สามารถจะใชลสิ ตในการเก็บขอมูลเพือ่ การเรียงลําดับ ได วิธีการเรียงลําดับขอมูลแบบงายจะใชลิสตในการจัดเก็บขอมูล เชน วิธีการเรียงลําดับขอมูลแบบฟอง (bubble), แบบคัดเลือก (selection), และแบบแทรก (insertion) เปนตน ซึง่ จะไดกลาวถึงในรายละเอียดตอ ไปในบทเรียนที่ 8


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.