data structure lesson06

Page 1

!"!

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา

ไกรสร วงศพราวมาศ และ สุณี รักษาเกียรติศักดิ์

หัวขอของเนื้อหา ตอนที่ 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)


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.