!"!
แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา
ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ์
หัวขอของเนื้อหา ตอนที่ 6.1 ชนิดขอมูลแบบคิว เรือ่ งที่ 6.1.1
การกําหนดคุณลักษณะเฉพาะของคิว
เรือ่ งที่ 6.1.2
การสรางคิวดวยอะเรย
เรือ่ งที่ 6.1.3
การสรางคิวดวยลิงคลสิ ต
เรือ่ งที่ 6.1.4
การใชคิว
ตอนที่ 6.2 การประยุกตใชคิว เรือ่ งที่ 6.2.1
ระบบการใหบริการตาง ๆ
แนวคิด 1. ชนิดขอมูลแบบคิวมีการประยุกตใชมากในวิทยาการคอมพิวเตอร 2. ชนิดขอมูลแบบคิวมีโครงสรางขอมูลแบบเชิงเสน (linear) 3. ชนิดขอมูลแบบคิวมีคุณสมบัติเฉพาะคือสมาชิกขอมูลที่เขาไปในคิวกอนจะออกกอน (First In First Out หรือ FIFO) 4. การดําเนินงานกับคิวไดแก การสรางคิว (create) การนําสมาชิกขอมูลเขาคิว (enqueue) การ นําสมาชิกขอมูลออกจากคิว (dequeue) การทดสอบวาคิววางหรือไม (empty) การทดสอบวา คิวเต็มหรือไม (full) การทําใหคิวเปนคิววาง (clear) 5. การที่จะใหผูใชเขาใจคุณสมบัติของคิวที่ตรงกัน จะตองมีการออกแบบคุณสมบัตขิ องคิว โดยการ เขียนคุณลักษณะเฉพาะ (specification) ของคิวที่เราตองการอยางชัดเจน 6. เมือ่ มีการเขียนคุณลักษณะเฉพาะทีช่ ดั เจนแลว ผูสรางจะสามารถสรางคิวตามที่ออกแบบไวได โดยรายละเอียดของการสรางจะซอนจากผูใช 7. ในการสรางคิว ผูส รางตองดําเนินการสองสิง่ ใหญๆ คือ เลือกการแทนทีข่ อ มูลของคิวและสราง การดําเนินงานโดยใชการแทนทีข่ อ มูลทีเ่ ลือกแลว 8. ในการสรางคิว ผูส รางสามารถเลือกใชการแทนทีข่ อ มูลของคิวแบบอะเรยหรือลิงคลสิ ตกไ็ ด
!"# 9. ในการใชชนิดขอมูลแบบคิว ผูใชเพียงแตใชตามคุณลักษณะเฉพาะที่ออกแบบใชเทานั้น ไมตอง สนใจวาผูสรางจะเลือกการแทนที่ขอมูลของคิวอยางไร และสรางมาดวยวิธีการอยางไร วัตถุประสงค หลักจากศึกษาบทเรียนที่ 6 แลว นักศึกษาสามารถ 1. บอกถึงคุณลักษณะเฉพาะของคิวได วาคิวมีชนิดขอมูลสมาชิกเปนอยางไร มีโครงสรางขอมูล อยางไร และสามารถดําเนินงานอะไรกับคิวไดบา ง 2. สรางคิวโดยใชการแทนที่ขอมูลแบบอะเรยได 3. สรางคิวโดยใชการแทนที่ขอมูลแบบลิงคลิสตได 4. บอกตัวอยางการประยุกตใชคิวในสาขาวิทยาการคอมพิวเตอรได กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 6.1 และตอนที่ 6.2 2. ทํากิจกรรมของบทเรียนที่ 6 3. ทําแบบประเมินผลของบทเรียนที่ 6 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน
!"$ ตอนที่ 6.1 ชนิดขอมูลแบบคิว หัวเรื่อง เรือ่ งที่ 6.1.1 การกําหนดคุณลักษณะเฉพาะของคิว เรือ่ งที่ 6.1.2 การสรางคิวดวยอะเรย เรือ่ งที่ 6.1.3 การสรางคิวดวยลิงคลสิ ต เรือ่ งที่ 6.1.4 การใชคิว แนวคิด 1. การกําหนดคุณลักษณะเฉพาะของคิวมีความสําคัญมากในการสื่อสารระหวางผูสรางคิวและผูใช คิว โดยที่ผูใช ใชโดยทราบขอกําหนดจากคุณลักษณะเฉพาะทีก่ าํ หนดและผูส รางไดสรางตาม คุณลักษณะเฉพาะทีก่ าํ หนด 2. ผูใชไมตองสนใจรายละเอียดของการสราง ผูใชเพียงแตทราบวาคิวมีคุณสมบัติอยางไรและ สามารถดําเนินงานอะไรกับคิวไดบา ง ในการดําเนินงานแตละอยาง ผูใชตองใหขอมูลเขา อยางไรและผูใชจะไดผลลัพธอะไรหลังจากใชการดําเนินงานนั้นๆ 3. ผูสรางสามารถที่จะสรางคิวโดยใชการแทนที่ขอมูลแบบอะเรยหรือลิงคลิสตก็ได โดยไมมีผลตอ การเรียกใชของผูใช วัตถุประสงค หลังจากที่ศึกษาตอนที่ 6.1 แลว นักศึกษาสามารถ 1. 2. 3. 4.
เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบคิว และบอกการดําเนินงานทีส่ าํ คัญของคิวได สรางคิวดวยอะเรยได สรางคิวดวยลิงคลสิ ตได ทดสอบการใชงานคิวได
เรื่องที่ 6.1.1 การกําหนดคุณลักษณะเฉพาะของคิว ในการกําหนดคุณลักษณะเฉพาะของคิวจะประกอบดวย 3 สวนใหญๆ คือ - การกําหนดวาสมาชิกขอมูลของคิวที่ใชมีชนิดขอมูลเปนอะไร - การกําหนดวาสมาชิกของคิวมีโครงสรางหรือความสัมพันธกันอยางไร - การกําหนดวาเราสามารถดําเนินงานอะไรกับคิวไดบา ง โดยรายละเอียดของคุณลักษณะเฉพาะของคิวจะเปนดังนี้
!"% คุณลักษณะเฉพาะ 6.1 คุณลักษณะเฉพาะของชนิดขอมูลแบบคิว สมาชิก :
สมาชิกของคิวจะมีชนิดเปนอยางไรก็ได แตในที่นี้สมมุติใหมีชนิดเปน StdElement
โครงสราง :
คิวจะมีโครงสรางแบบเชิงเสน และอันดับของการนําสมาชิกเขาออกจากคิวมีความ สําคัญ คือ สมาชิกที่เขาไปอยูในคิวกอนจะออกจากคิวกอนสมาชิกที่เขาไปในคิวทีหลัง นัน่ คือการเขากอนออกกอน ( First In First Out หรือ FIFO )
การดําเนินงาน: มีการดําเนินงานทั้งหมด 6 การดําเนินงาน ไดแก สัญลักษณ :
ให Q-pre เปนสถานะของคิวกอนการดําเนินงาน ให Q-post เปนสถานะของคิวหลังการดําเนินงาน
Crete Pre: Post:
ไมมี มีคิววางเกิดขึ้น
Enqueue (E : StdElement) Pre:
คิวยังไมเต็ม
Post:
คิวจะมี E เปนสมาชิกลาสุดของคิว และ E จะถูกใสลงในทายคิว (tail)
Serve (VAR E : StdElement) Pre:
คิวตองไมวาง
Post:
E เปนสมาชิกแรกสุด (head) ของ Q-pre คิวหลังการดําเนินงานหรือ Q-post จะไมมี E เปนสมาชิกอีกตอไป
Empty : boolean Pre:
ไมมี
Post:
ถา คิวไมมีสมาชิกอยูเลย แลว Empty จะเปนจริง ไมเชนนั้น Empty จะเปนเท็จ
Full : boolean Pre:
ไมมี
Post:
ถา คิวมีสมาชิกเต็ม แลว Full จะเปนจริง ไมเชนนั้น Full จะเปนเท็จ
Pre:
ไมมี
Post:
คิวจะเปนคิววาง
Clear
Length : Integer Pre: Post:
ไมมี Length จะเปนจํานวนสมาชิกในคิว
!"& ตัวอยาง 6.1 ตัวอยางการดําเนินงานกับคิว ตารางขางลางนี้แสดงสถานของคิวหลังการดําเนินงาน (Q-post) และผลลัพธทเ่ี กิดจากการดําเนิน งาน (Output) ของลําดับของการดําเนินงาน (Operation) ตาง ๆ กับคิว ในที่นี้สมมติใหสมาชิกของคิวมีชนิด เปน StdElement โดยมีคียเปน char และจะแสดงเพียงสวนคียของขอมูลสมาชิกของคิวเทานั้น No.
Operation
Input
Q-Post
Output
1.
Create
[]
2.
Empty
[]
3.
Enqueue
A
[A]
4.
Enqueue
B
[A,B]
5.
Empty
6.
Enqueue
C
[A,B,C]
7.
Enqueue
D
[A,B,C,D]
8.
Dequeue
[B,C,D]
A
9.
Length
[B,C,D]
3
[A,B]
true
False
กิจกรรม 6.1 ฝกการเขียนคุณลักษณะเฉพาะของคิว คุณลักษณะเฉพาะของการดําเนินงาน Dequeue มีเงื่อนไขเริ่มตน (pre) วาคิวตองไมวาง หากเรา เอาเงือ่ นไขเริม่ ตนนีอ้ อกไป นั่นคือคิวจะเปนคิววางก็ได ถาคิวเปนคิววาง การดําเนินงานของ Dequeue ก็ไม สําเร็จซึง่ จะสงผลลัพธออกทางพารามิเตอร Fail จงเขียนคุณลักษณะเฉพาะของการดําเนินงาน Dequeue ใหมตามขอกําหนดขางตน กิจกรรม 6.2 เปรียบเทียบการดําเนินงานของสแตกและคิว การดําเนินงานของคิว Enqueue เปรียบเทียบไดกบั การดําเนินงานอะไรของสแตก และ การ ดําเนินงานของคิว Dequeue เปรียบเทียบไดกบั การดําเนินงานอะไรของสแตก เรื่องที่ 6.1.2 การสรางคิวดวยอะเรย การสรางคิวดวยอะเรย หมายถึง การแทนที่ขอมูลของคิวดวยอะเรย ซึง่ เปนการจัดสรรเนือ้ ทีห่ นวย ความจําแบบสแตติก นัน่ คือ มีการกําหนดขนาดของคิวลวงหนาวามีขนาดเทาใดและจะมีการจัดสรรเนื้อที่ หนวยความจําใหเลย ภาพประกอบที่ 6.1 แสดงการดําเนินงานของคิวของตัวอยางที่ 6.1 ที่มีการแทนที่ขอ มูลดวยอะเรยขนาด 4 (สมมติใหสมาชิกของคิวมีชนิดเปน StdElement ที่มีคียเปน char)
!"' 0 Create
1
2
3
4
Q
N 0
Hea d 0
Tail
Hea d 0
Tail
Hea d 0
Tail
Hea d 0
Tail
Hea d 0
Tail
Hea d 1
Tail
0
↑↑ Head Tail
Enqueue
Enqueue
0
1
Q
A
↑ Head
↑ Tail
0
1
2
Q
A
B
↑ Head
Enqueue
2
N
3
4
N 2
0
1
2
3
Q
A
B
C
4
N 3
1
2
3
4
N
Q
A
B
C
D
4
Q
2
3
↑ Tail
0
0
1
↑ Tail
↑ Head
Dequeue
4
1
↑ Head
Enqueue
3
4
↑ Tail 1
2
3
4
N
B
C
D
4
4
!"( ↑ Head
↑ Tail
ภาพประกอบ 6.1 ภาพแสดงการนําสมาชิกเขาและออกจากคิวที่สรางดวยอะเรย
!") UNIT
QueueUA1;
{*********} INTERFACE {*********} CONST TYPE
MaxSize = 100; Computer=RECORD Serial_No:String[5]; Cpu:string[10]; Ram:string[10]; HardDisk:string[10]; CD_ROM:string[10]; END; VAR Q : ARRAY [1..MaxSize] OF Computer; HEAD, Tail : 0..MaxSize; PROCEDURE Create; PROCEDURE Enqueue(E:Student); PROCEDURE Dequeue(VAR E:Student); FUNCTION Empty : boolean; FUNCTION Full : boolean; PROCEDURE Clear; FUNCTION Length : integer;
{*********} IMPLEMENTATION {*********} PROCEDURE Create; BEGIN Head := 0; Tail := 0; END; PROCEDURE Enqueue(E:Student); BEGIN Tail := Tail + 1; Q[Tail] := E; END; PROCEDURE Dequeue(VAR E:Student); BEGIN Head := Head + 1; E := Q[Head]; END; FUNCTION Empty : boolean; BEGIN IF Tail = 0 THEN Empty := true
!"* ELSE END;
Empty := false;
FUNCTION Full : boolean; BEGIN IF Tail = MaxSize THEN Full := true ELSE Full := false; END; PROCEDURE Clear; BEGIN Tail := 0; Head := 0; END; FUNCTION Length : integer; BEGIN Length := Tail - Head; END; END.
โปรแกรม 6.1 การสรางคิวดวยอะเรย จากโปรแกรม 6.1 และตัวอยางการนําสมาชิกเขาและออกจากคิวของภาพประกอบ 6.1 จะเห็นได วา ณ สถานสุดทายหากเราทดสอบการดําเนินงาน Full เราก็จะได true ซึ่งในความเปนจริงแลวยังมีเนื่อที่ วางใน Q[1] ดังนั้นเพื่อแกปญหานี้และทําใหการสรางคิวดวยอะเรยมีประสิทธิภาพโดยที่ไมตองมีการเคลื่อน ยายขอมูล เราก็สามารถทําไดโดยทําใหเปนคิววงกลม ดังภาพประกอบที่ 6.2 และโปรแกรม 6.2 ไดแสดง คิววงกลม
!!"
ภาพประกอบ 6.2 คิววงกลม UNIT
QueueUA2;
{*********} INTERFACE {*********} CONST TYPE
MaxSize = 100; Computer=RECORD Serial_No:String[5]; Cpu:string[10]; Ram:string[10]; HardDisk:string[10]; CD_ROM:string[10]; END; VAR Q : ARRAY [1..MaxSize] OF Computer; HEAD, Tail : 0..MaxSize; PROCEDURE Create; PROCEDURE Enqueue(E:Student); PROCEDURE Dequeue(VAR E:Student); FUNCTION Empty : boolean; FUNCTION Full : boolean; PROCEDURE Clear; FUNCTION Length : integer;
{*********} IMPLEMENTATION {*********}
!!! PROCEDURE Create; BEGIN Head := 0; Tail := 0; END; PROCEDURE Enqueue(E:Student); BEGIN Tail := Tail MOD MaxSize + 1; Q[Tail] := E; END; PROCEDURE Dequeue(VAR E:Student); BEGIN END; FUNCTION Empty : boolean; BEGIN END; FUNCTION Full : boolean; BEGIN IF (Tail MOD MaxSize) = Head THEN Full := true ELSE Full := false; END; PROCEDURE Clear; BEGIN END; FUNCTION BEGIN
Length : integer;
END; END.
โปรแกรม 6.2 การสรางคิววงกลมดวยอะเรย กิจกรรม 6.3 ฝกสรางคิว จงเขียนโปรแกรม 6.2 ใหสมบูรณ และใหตั้งชื่อไฟลเปน QueueAU.pas พรอมคอมไพลโปรแกรม
!!# เรื่องที่ 6.1.3 การสรางคิวดวยลิงคลิสต ในการสรางคิวดวยลิงคลสิ ต หมายถึงเราเลือกการแทนที่ขอมูลของคิวดวยลิงคลิสตซึ่งเปนการจัด สรรเนื้อที่หนวยความจําแบบไดนามิก นัน้ คือ หนวยความจําจะถูกจัดสรรเมื่อมีการขอใชจริง ๆ ระหวางการ ประมวลผลโปรแกรมผานตัวแปรชนิด pointer ในการสรางคิวดวยลิงคลิสตคิวจะไมมีวันเต็ม (ไมมีการ ดําเนินงาน Full) ตราบใดที่ยังมีเนื้อที่ของฮีปในหนวยความจํา สวนหนึ่งของโปรแกรมการสรางคิวดวยลิงค ลิสตไดแสดงในโปรแกรม 6.3 UNIT QueueUL; INTERFACE TYPE
1 2
Computer=RECORD Serial_No:String[5]; Cpu:string[10]; Ram:string[10]; HardDisk:string[10]; CD_ROM:string[10]; END; Node = RECORD El:Computer; Next:pointer; END; pointer = ^Node; VAR Head,Tail:pointer;
3 4 5 6 7 8 9 10 11 12 13 14 15
PROCEDURE PROCEDURE PROCEDURE FUNCTION FUNCTION PROCEDURE FUNCTION
16 17 18 19 20 21 22
Create; Enqueue(E:Computer); Serve(VAR E:Computer;VAR Fail:boolean); Empty:boolean; Full:boolean; Clear; Length:integer;
IMPLEMENTATION PROCEDURE Create; BEGIN Head:=nil; Tail:=nil; END; PROCEDURE Enqueue(E:Computer); VAR P:pointer; BEGIN new(P); P^.El:=E; IF Head=nil THEN
!!$ BEGIN Head:=P; Tail:=P; Tail^.Next:=nil; END ELSE BEGIN P^.Next:=Tail^.Next; Tail^.Next:=P; Tail:=P; END; END; PROCEDURE Serve(VAR E:Computer;VAR Fail:boolean); VAR P:pointer; BEGIN END; FUNCTION BEGIN
Empty:boolean;
END; PROCEDURE Clear; BEGIN END; FUNCTION Length:integer; VAR P:pointer; I:integer; BEGIN P:=Head; I:=0; IF Head<>nil THEN BEGIN WHILE P^.Next<>nil DO BEGIN P:=P^.Next; I:=I+1; END; Length:=I+1; END ELSE Length:=0; END; END.
โปรแกรม 6.3 การสรางคิวดวยลิงคลิสต
!!% กิจกรรม 6.4 ฝกการสรางคิวดวยลิงคลิสต 1. ในโปรแกรมที่ 6.3 โคตบรรทัดใดที่แสดงถึงการแทนที่ขอมูลคิวดวยลิงคลิสต 2. จงเขียนโปรแกรมใหสมบูรณ และใหชื่อวา QueueUL.pas พรอมคอมไพลโปรแกรมนี้ การเปรียบเทียบประสิทธิภาพการสรางคิวดวยอะเรยและลิงคลสิ ต ดวยวิธที าํ นองเดียวกับการเปรียบเทียบประสิทธิภาพการสรางสแตกดวยอะเรยและลิงคลสิ ตดงั ได เรียนมาแลวในเรื่องที่ 5.1.5 ของบทเรียนที่ 5 ประสิทธิภาพของการดําเนินงานของคิวทีส่ รางดวยอะเรยและ ลิงคลสิ ต ดังแสดงในตาราง 6.1 ตาราง 6.1 เปรียบเทียบประสิทธิภาพของการดําเนินงานของคิวที่สรางดวยอะเรยและลิงคลิสต การดําเนินงาน
สรางดวยอะเรย
สรางดวยลิงคลสิ ต
Create
O(1)
O(1)
Enqueue
O(1)
O(1)
Dequeue
O(1)
O(1)
Full
O(1)
-
Empty
O(1)
O(1)
Clear
O(1)
O(n)
Length
O(1)
O(n)