data structure lesson09

18
!"# แผนการสอนประจําบทเรียน รายชื ่ออาจารยผู จัดทํา พงษวุฒิ ดวงศรี รายละเอียดของเนื ้อหา ตอนที่ 9.1 การคนหาขอมูลอยางงาย (2 คาบ) เรื ่องที 9.1.1 บทบาทหนาที่ของการคนหาขอมูล เรื ่องที 9.1.2 วิธีการคนหาขอมูลเบื้องตน ตอนที่ 9.2 การคนหาขอมูลวิธีอื่น เรื ่องที 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เรื ่องที 9.2.1 การคนหาขอมูลโดยวิธีการเปรียบเทียบ แนวคิด 1. การคนหาขอมูลเปนขบวนการที ่สําคัญ และใชมากในการประมวลผลขอมูล 2. การคนหาขอมูลยังคงเปนปญหา และยังมีการศึกษาคนควา 3. การคนหาขอมูล มีการใชงานมากระหวางการประมวลผล ซึ่งไมเหมือนการเรียงลําดับขอมูล ดังนั้นควรเลือกวิธีการคนหาขอมูลใหถูกตอง และเหมาะสมกับงานนั้น 4. สําหรับในบทนี ้ขอเสนอวิธีการคนหาขอมูลเบื ้องตน ซึ่งเปนที่นิยมและใชกันอยางแพรหลาย วัตถุประสงค หลังจากศึกษาบทเรียนที่ 9 แลว นักศึกษาสามารถ 1. อธิบายบทบาทและหนาที่ของการคนหาขอมูลได 2. อธิบายคุณลักษณะเฉพาะ ของการคนหาขอมูลแตละวิธีได 3. เขียนขั้นตอนการคนหาขอมูลวิธีการตาง ตามที่ไดรับมอบหมายได 4. นําไปประยุกตเขียนโปรแกรม สําหรับการคนหาขอมูลในลักษณะตางๆตามที่ไดรับมอบหมาย ได กิจกรรมการเรียนการสอน กิจกรรมที ่นักศึกษาตองทําสําหรับการเรียนการสอน ไดแก

Upload: suhatt-jantorn

Post on 11-Mar-2016

215 views

Category:

Documents


0 download

DESCRIPTION

ตอนที่ 9.2 การคนหาขอมูลวิธีอื่น ๆ เรื่องที่ 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เรื่องที่ 9.2.1 การคนหาขอมูลโดยวิธีการเปรียบเทียบ แผนการสอนประจําบทเรียน สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน หัวเรื่อง เรื่องที่ 9.1.1 บทบาทหนาที่ของการคนหาขอมูล เร

TRANSCRIPT

Page 1: data structure lesson09

!"#

แผนการสอนประจําบทเรียน

รายช่ืออาจารยผูจัดทํา พงษวุฒิ ดวงศรี

รายละเอียดของเนือ้หา

ตอนที ่9.1 การคนหาขอมูลอยางงาย (2 คาบ) เร่ืองท่ี 9.1.1 บทบาทหนาที่ของการคนหาขอมูล เร่ืองท่ี 9.1.2 วิธีการคนหาขอมูลเบื้องตน

ตอนที ่9.2 การคนหาขอมูลวิธีอื่น ๆ เร่ืองท่ี 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เร่ืองท่ี 9.2.1 การคนหาขอมูลโดยวิธีการเปรียบเทียบ

แนวคดิ 1. การคนหาขอมูลเปนขบวนการท่ีสําคัญ และใชมากในการประมวลผลขอมูล 2. การคนหาขอมูลยังคงเปนปญหา และยังมีการศึกษาคนควา 3. การคนหาขอมูล มีการใชงานมากระหวางการประมวลผล ซึ่งไมเหมือนการเรียงลําดับขอมูล ดังนั้นควรเลือกวิธีการคนหาขอมูลใหถูกตอง และเหมาะสมกับงานนั้น ๆ

4. สําหรับในบทน้ีขอเสนอวิธีการคนหาขอมูลเบ้ืองตน ซึ่งเปนที่นิยมและใชกันอยางแพรหลาย

วัตถุประสงค หลังจากศึกษาบทเรียนที่ 9 แลว นักศึกษาสามารถ

1. อธิบายบทบาทและหนาที่ของการคนหาขอมูลได 2. อธิบายคุณลักษณะเฉพาะ ของการคนหาขอมูลแตละวิธีได 3. เขียนขั้นตอนการคนหาขอมูลวิธีการตาง ๆ ตามที่ไดรับมอบหมายได 4. นําไปประยุกตเขียนโปรแกรม สําหรับการคนหาขอมูลในลักษณะตางๆตามที่ไดรับมอบหมายได

กิจกรรมการเรียนการสอน กิจกรรมท่ีนักศึกษาตองทําสําหรับการเรียนการสอน ไดแก

Page 2: data structure lesson09

!"$

1. ศึกษาเอกสารชดุวิชา/โฮมเพจชุดวิชา ตอนที่ 9.1 และตอนที ่9.2 2. ทํากิจกรรมของบทเรียนที่ 9 3. ทําแบบประเมินผลของบทเรียนที่ 9

เอกสารประกอบการสอน 1. เอกสารชดุวิชา

สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร

ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน

Page 3: data structure lesson09

!""

ตอนท่ี 9.1 การคนหาขอมูลอยางงาย

หัวเรื่อง เร่ืองท่ี 9.1.1 บทบาทหนาที่ของการคนหาขอมูล เร่ืองท่ี 9.1.2 วิธีการคนหาขอมูลเบื้องตน

แนวคดิ 1. การคนหาขอมูลเปนขบวนการท่ีสําคัญ และใชมากในการประมวลผลขอมูล 2. การคนหาขอมูลยังคงเปนปญหาและยังคงมีการศึกษาคนควา 3. การคนหาขอมูล มีการใชงานมากระหวางการประมวลผล ซึ่งไมเหมือนการเรียงลําดับขอมูล ดังนั้นควรเลือกวิธีการคนหาขอมูลใหเหมาะสมกับงานนั้น ๆ

4. สําหรับในบทน้ีขอเสนอวิธีการคนหาขอมูลเบ้ืองตน ซึ่งเปนที่นิยมและใชกันอยางแพรหลาย

วัตถุประสงค หลังจากที่ศึกษาตอนที่ 9.2 แลว นักศึกษาสามารถ

1. อธิบายบทบาทและหนาที่ของการคนหาขอมูลได 2. อธิบายคุณลักษณะเฉพาะ ของการคนหาขอมูลแตละวิธีได 3. เขียนขั้นตอนการคนหาขอมูลแตละวิธี ตามที่ไดรับมอบหมายได 4. นําไปประยุกตเขียนโปรแกรม สําหรับการคนหาขอมูลในลักษณะตางๆตามที่ไดรับมอบหมายได

เรื่องที่ 9.1.1 บทบาทหนาที่ของการคนหาขอมูล

การคนหาขอมูล (Searching) เปนกระบวนการท่ีสําคัญย่ิง ในการประมวลผลขอมูลดวยคอมพวิเตอร การคนหาขอมูลในปจจุบัน ยังคงเปนปญหาและยังมีการศึกษาคนควา ตัวอยางการคนหาขอมูล ที่พอจะคุนเคย ไดแก การคนหาเสนทางท่ีส้ันท่ีสุดสําหรับการเดินทาง การคนหาทางเดินของหุนยนต การคนหาทางเดินของหมากรุก หรือ พัสซัล (Puzzle) ตาง ๆ การคนหาลักษณะของหลักการกลายพันธ (Genetic Algorithm) การคนหาความเหมือนกันของรูปภาพ หรือการรูจํา เปนตน ส่ิงเหลาน้ีลวนเปนความทาทายในการคนหา นอกจากนี้ในปจจุบันยังไดนําความรูทางดานสถิติและระบบผูเชียวชาญ มาชวยในการคนหา และการพยากรณเหตุการณท่ีจะเกิดข้ึนในอนาคต เชนในสาขาวิชา เดตามายนิ่ง (Data Mining) สําหรับการคนหาที่จะศึกษาในบทนี้เปนเพียงการคนหาขอมูลเบื้องตน การคนหาเพ่ือหาระเบียน หรือ เขตขอมูล ที่มีการจัดเก็บในแฟมขอมูล หรือในแถวลําดับ มีหรือไม ซึ่งในการคนหา จะตองมีการกําหนด เขตขอมูล เพ่ือทําหนาท่ีเปนคียหลัก หรือดัชนี ในการคนหา ซ่ึงอาจเปน รหัส ซ่ือ-สกุล หรือเขตขอมูลอื่นๆ ท่ีสนใจ และสามารถระบุระเบียนขอมูลได การคนหาจะหาไดรวดเร็ว หรือมีประสิทธิภาพเพียงใด ขึ้นอยูกับหลัก

Page 4: data structure lesson09

!"%

การ การคนหาเปนสําคัญ สําหรับขั้นตอนวิธีการคนหาขอมูลเบื้องตน ที่จะกลาวถึงนี้ คิดวาจะเปนประโยชนในการใชงาน และเปนพ้ืนฐานในการเรียนรูตอไป

เรื่องที่ 9.1.2 วิธีการคนหาขอมูลเบื้องตน

ดังไดกลาวมาขางตน การคนหาขอมูลจะมีประสิทธิภาพมากนอยเพียงใด ขึ้นอยูกับขั้นตอนวิธีการคนหาขอมูลเปนสําคัญ การคนหาขอมูลมีหลายวิธ ี แตละวิธีก็มีขอดีขอเสียดวยกันทั้งสิ้น และยังเหมาะสมเฉพาะงาน สําหรับในบทนี้ขอเสนอวิธีการคนหาขอมูล 3 วิธีดังนี้

Sequential Search

การคนหาขอมูลตามลําดับ เปนการคนหาท่ีละคา ตามลําดับของขอมูลในแฟมขอมูลจนกวาจะพบ หรือถาไมพบก็คนหาคาถัดไปเรื่อย ๆ จนกวาจะหมดขอมูล การคนหาขอมูลวิธีนี้ เปนการคนหาในลักษณะเชงิเสน เปนวิธีที่งายที่สุด และก็เปนวิธีที่ดอยประสิทธิภาพกวาวิธีอื่น แตก็เหมาะสมสําหรับการประมวลผลขอมูลกับบางประเภท เชน งานกลุม (Bach Processing) งานสํารองขอมูล (Backup) งานปรับปรุงแกไขขอมูลใหทันสมัย (Update) หรืองานประจํา (Routine) ขั้นตอนในการคนหาขอมูลมีดังนี้

1. กําหนดเขตขอมูลใหเปน คียหลัก หรือดัชนีในการคนหาขอมูล 2. อานขอมลู คาแรกจากแถวลําดับหรือแฟมขอมูล นํามาเปรียบเทียบกับขอมูล ดัชนี ถาตรงกัน แสดงวาการคนหาประสบความสําเร็จ แตถาไมพบใหอานคาถัดไป นํามาเปรียบเทียบใหม ทําเชน น้ีไปเร่ือย ๆ จนกวาจะพบ หรือ หมดขอมูล

ในการคนหาหากโชคดีจะพบครั้งแรก แตถาโชคไมดีจะพบที่คาสุดทาย หรือโชครายอาจไมพบเลย สําหรับกรณีที่ไมพบ หรือพบท่ีคาสุดทาย จํานวนครั้งในการคนหาจะเทากับจํานวนของขอมูล สมมุติให N : จํานวนขอมูล ∴ จํานวนครั้งในการคนหาแลวพบครั้งแรก = 1 คร้ัง จํานวนครั้งที่คนหาแลวพบที่คาสุดทาย หรือไมพบเลย = N คร้ัง ดังน้ัน จํานวนครั้งในการคนหาโดยเฉลี่ย = (จํานวนครั้งที่คนหาแลวพบที่คาแรก + จํานวนครั้งที่คนหาแลวพบที่คาสุดทาย) /2

จํานวนครั้งในการคนหาโดยเฉลี่ย = (1 + N) /2 = N/2 +1/2 จะเห็นวาจํานวนครั้งในการคนหาขอมูลโดยเฉลี่ย ขึ้นอยูกับฟงกชัน Big O(N)

Algorithm (การการคนหาขอมูลตามลําดับ) กําหนดให Item : ตัวแปรเก็บคาที่ตองการคนหา (ดัชนี)

Max : ตัวแปรเก็บจํานวนขอมูลทั้งหมด A[Max] : ตัวแปรเก็บขอมูลเก็บในแถวลําดับ

Page 5: data structure lesson09

!"&

SequentialSearch (Var : A[Max], Item)

Begin

Count := 0;

i := 1;

while (i ≤ Max) Do !egin If (A[i] = Item) Then

Begin

Write (" Found Data at " ,i );

Count := Count +1;

End;

i := i + 1;

End;

If(Count = 0) Then Write(" Not Found ");

Else Write(" Found ", Count, ” Times”);

End.

Binary Search

เปนการคนหารขอมูลอีกวิธีที่มีประสิทธิภาพ และเปนที่นิยมใชกันอยางแพรหลาย โดยเฉพาะการสราง Index Table แตวิธีนี้ ขอมลูจะตองเรียงกันกอน จึงสามารถใชงานได ดังนั้นถาขอมูลมีจํานวนมาก ๆ การเรียงลําดับขอมูลก็อาจเปนปญหาและใชเวลา ดังไดกลาวมาแลวในบทที ่8 ขั้นตอนในการคนหาขอมูลมีดังนี้

1. กําหนด หรือรับขอมูลที่ตองการคนหา 2. แบงครึ่งแฟมขอมูล หรือแถวลําดับขอมูล 3. นําขอมูลที่ตองการคนหา จากขอ 1. มาเปรียบเทียบกับขอมูล ที่ตําแหนงตรงกลาง ซ่ึงไดจากการ แบงขอมูลในขอ 2. ถามีคาเทากัน แสดงวาการคนหาประสบความสําเร็จ แตถาไมเทากันใหตรวจดูวาขอมูลที่ตองการคนหา มีคานอยกวาหรือมากกวาคาตรงกลาง ถานอยกวาใหนําคาในสวนแรกมาแบงครึ่ง เพ่ือนํามาเปรียบเทียบใหม แตถาไมใชใหนําคาในสวนหลังมาแบงครึ่ง และนํามาเปรียบเทียบใหม เชนเดียวกัน

4. ทําการเปรียบเทียบขอมูลในแฟมขอมูลหรือแถวลําดับขอมูล โดยแบงครึ่งลงไปเรื่อยๆ จนกวาจะพบหรือไมสามารถแบงไดอีกตอไป นั้นหมายความวาไมพบขอมูลแนนอน

Algorithm (การการคนหาขอมูลแบบไบนาร่ี) กําหนดให Item : ตัวแปรเก็บคาที่ตองการคนหา

Max : ตัวแปรเก็บจํานวนขอมูลทั้งหมด A[Max] : ตัวแปรเก็บขอมูลเก็บในแถวลําดับ

L : ตัวแปรเก็บตําแหนงแรกของสวนขอมูลที่ตองการคนหา H : ตัวแปรเก็บตําแหนงสุดทายของสวนขอมูลที่ตองการคนหา

Page 6: data structure lesson09

!"'

BinarySearch (Var : A[Max] , Item)

Begin

L := 1;

U := Max;

While (L ≤ U) Do Begin

i := (L+U) /2 ;

If (item < A[i]) Then U := i - 1 ;

Else If (item > A[i]) Then L := i +1 ;

Else

Begin

Write(" Found Data at ", i );

End;

End;

Write (" Not Found Data");

End.

ถา 2i = Max, ดังน้ัน i คือจํานวนครั้งที่คนหา สําหรับกรณีพบคร้ังสุดทายพอดี (worst case)

Page 7: data structure lesson09

!"(

ตอนท่ี 9.2 การคนหาขอมูลวิธีอื่น ๆ

หัวเรื่อง เร่ืองท่ี 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เร่ืองท่ี 9.2.1 การคนหาขอมูลโดยวิธีการเปรียบเทียบ

แนวคดิ 1. การคนหาขอมูลเปนขบวนการท่ีสําคัญ และใชมากในการประมวลผลขอมูล 2. การคนหาขอมูลยังคงเปนปญหาและยังคงมีการศึกษาคนควา 3. การคนหาขอมูล มีการใชงานมากระหวางการประมวลผล ซึ่งไมเหมือนการเรียงลําดับขอมูล ดังนั้นควรเลือกวิธีการคนหาขอมูลใหเหมาะสมกับงานนั้น ๆ

4. สําหรับในบทน้ีขอเสนอวิธีการคนหาขอมูลเบ้ืองตน ซึ่งเปนที่นิยมและใชกันอยางแพรหลาย

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

เรื่องที่ 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี

การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เปนการคนหาอีกวิธีหน่ึง ที่ไดรับความนิยมและใชกันมาก โดยเฉพาะกรณีที่มีขอมูลเปนจํานวนมาก ๆ การคนหาดวยวิธีนี้ ก็เหมือนวิธีที่ผานมา อันดับแรกจะตองเรียงขอมูลกอน จึงจะสามารถคนหาได โดยปรกติขอมูลที่จัดเก็บในแฟมขอมูลจะประกอบดวยระเบียนขอมูลตาง ๆ และในแตละระเบียน ก็จะประกอบดวยหลาย ๆ เขตขอมูล ตัวอยางเชน ระเบียนขอมูลนิสิต จะประกอบดวย รหัส ชื่อ-สกุล ที่อยู วุฒิทางการศึกษา เปนตน ดังนั้นหากขอมูลมีเปนจํานวนมาก ๆ เชน ขอมลูภาษีอากร หรือ ขอมูลทะเบียนราษฎร การคนหาไมใช เปนส่ิงงาย โดยเฉพาะ ถาไมมีการจัดเก็บขอมูลท่ีเหมาะสม หรือ ดีพอ การเขาถึงขอมูลจะยากลําบาก ขาดประสิทธิภาพ เสียเวลา การคนหาขอมูล อาจเขาถึงขอมูล โดยอาศัย รหัส ชื่อ-สกุล หรือเขตขอมูลอื่น ๆ ของระเบียนขอมูล ตามแตความตองการของผูใช ซึ่งเขตขอมูลที่ใชในการดําเนินงานคนหานี้เรียกวา เขตขอมูลดัชนี และเขตขอมูลดัชนีเหลานี้ สวนมากจะแยกออกเปนแฟมขอมลูตางหาก ซึ่งเรียกวาแฟมดัชนี (Index File) สําหรับการจัดเก็บขอมูลในแฟมดัชนี จะจัดเก็บเขตขอมูลดัชนี และที่อยู (Address) ของระเบียนน้ัน ๆ ลงในแฟมดัชนีพรอมกัน การสรางแฟมดัชนีจะดําเนินในขั้นตอนการเตรียมการ เชนเดียวกับการเรียงขอมูลในแฟมขอมูลหลัก จะตองเรียงตาม

Page 8: data structure lesson09

!%)

เขตขอมูลดัชนี กอนการคนหา และการคนหาขอมูลจะคนหาในแฟมดัชนีตามลําดับ เพื่อตรวจดูวางขอมูลที่ตองการ อยูในชวงใดของแฟมขอมูลหลัก จากตัวอยางดานลาง ถาสมมุติใหแฟมขอมูลหลัก ประกอบดวยระเบียนขอมูล 22 ระเบียน แตละระเบียนประกอบดวย 2 เขตขอมูลคือ รหัส และ ชื่อพนักงาน ขอมูลมีการเรียงเรียบรอยตามรหัส ดังนั้นจึงขอใช รหัส เปนดัชนีในการเขาถึงขอมูล และการสรางแฟมขอมูลดัชนีจะมีเขตขอมูลดัชนีแตละชวงเปนไปตาม สมการ ดังน้ี จํานวนระเบียนขอมูลในแตละชวง (ชวงใด ๆ) = M/N (ปดเศษทิ้ง) จํานวนระเบียนขอมูลในชวงสุดทาย = M - {(M/N ปดเศษทิ้ง ) x (N-1)} โดย M : จํานวนระเบียนขอมูลทั้งหมด ; N : จํานวนชวงของขอมูล จํานวนระเบียนขอมูลมีทั้งหมด 22 ระเบียน ถาใหชวง เขตขอมูลดัชนี มี 3 ชวง ดังนั้นแตละชวงจะครอบคุม 7 ระเบียน ยกเวนชวงสุดทาย 8 ระเบียน การคนหาขอมูลเริ่มตนจากการคนหาในแฟมขอมูลดัชนี เพื่อตรวจดูวา รหัส อยูในชวงไหนของเขตขอมูลดัชนี เชน ถาตองการคนหาพนักงานที่มีรหัส 40388 มีชื่อวาอะไร การคนหาจะเริ่มตนที่เขตขอมูลดัชนีชวงแรก ซึ่งมีคาระหวาง 40045 – 40182 จะเห็นวา รหัส 40388 ไมอยูในชวงนี้ ดังนั้นจึงทําการคนหาในชวงถัดไป คือชวงที่ 2 ซึ่งก็ไมอยูในชวงนี้เชนกัน สําหรับในชวงที ่3 เขตขอมูลดัชนี มีคาระหวาง 40322 – 40411 จะเห็นวา รหัส ที่ตองการคนหาอยูในชวงนี้ ดังน้ันจึงเริ่มการคนหาในแฟมขอมูลหลัก โดยอาศัยที่อยูของระเบียน ของเขตขอมูลดัชนี 40322 ซ่ึงก็คือ เริ่มตนคนหาที่ตําแหนง 360 ในแฟมขอมูลหลัก และจะทําการคนหาตามลําดับที่ละระเบียน จากรหัส 40322 , 40333, 40344, … ไปเร่ือยๆ จนพบชื่อ “อัครเดช” ที่รหัส 40388 ลําดับระเบียนท่ี 18 สําหรับกรณีไมมีขอมูลที่ตองการคนหา เชน ตองการหาพนักงานที่มีรหัส 40380 การคนหาจะยุติเมื่อคาในแฟมขอมูล รหัส 40388 ใหญกวาคาที่ตองการคนหา

Page 9: data structure lesson09

!%!

แฟมขอมูลหลัก Address รหัส ชื่อ 100 40045 ชลธิรา 1 120 40056 วนิดา 2 140 40090 เนตรนภา 3 160 40115 พัชราพรรณ 4 180 40137 พิชญ 5 200 40182 ยุพิน 6 แฟมขอมูลดัชนี 220 40207 ยุวดี 7 รหัส Address 240 40218 เยาวลักษณ 8

40207 220 260 40230 รุงนภา 9 40322 360 280 40274 วิภารัตน 10 40425 520 300 40285 วิโรจน 11

320 40300 วิไลวรรณ 12 340 40311 สมพร 13 360 40322 สรอยสุดา 14 380 40333 ภูริดา 15 400 40344 สาวินี 16 420 40377 อรรถสิทธ์ิ 17 440 40388 อัครเดช 18* 460 40395 อังคณา 19 480 40405 นิรุต 20 500 40411 เกศศิรินทร 21 520 40425 จามรฤทธิ ์ 22

Algorithm (การคนหาขอมูลแบบเรียงลําดับ โดยอาศัยเขตขอมูลดัชนี) กําหนดให Data.dat : แฟมขอมูลหลัก

Index.dat : แฟมขอมูลดัชนี

Page 10: data structure lesson09

!%*

Item : ตัวแปรเก็บขอมูลที่ตองการคนหา Index0 : ตัวแปรเก็บเขตขอมูลดัชนีเริ่มตนของชวงขอมูล

Index1 : ตัวแปรเก็บเขตขอมูลดัชนีสุดทายของชวงขอมูล Addr : ตัวแปรเก็บที่อยูของระเบียนขอมูล

IndexSequencetialSearch (Var : Item)

Begin

flag := ‘N’;

OpenFile (Index.dat);

Read(Index0, Addr From Index.dat);

While(Read(Index1,Addr From Index.dat) Not EOF andflag = ‘N’)Do

Begin

If(Item < Index1) Then flag := ‘Y’;

Else Index0 := Index1;

End;

CloseFile (Index.dat)

If( flag = ‘Y’) Then

Begin

OpenFile (Data.dat);

Seek(Addr);

While(Read(Record from Data.dat) Not EOF and flag = ’Y’) Do

Begin

If(Record.Id = Item) Then

Begin

Write (“Found data : “,Record.Id, Record.Name);

End;

Else If ( Record.Id > Item) Then flag := ‘N’;

End;

End;

Write (“Not Found Data”);

End.

เรื่องที่ 9.2.2 การคนหาขอมูลโดยวิธีการเปรียบเทียบ

การคนหาดวยวิธีการเปรียบเทียบ หรือ Pattern Matching Search เปนวิธีที่มีประสิทธิภาพมากในการคนหาคําหรือ ขอความในแถวลําดับอักขระ หรือแฟมขอมูลชนิดอักขระ (Text file) ซึ่งแฟมขอมูลชนิดนี้ สามารถสรางไดจาก โปรแกรมประมวลผลคํา (Word Processing) ประเภทตาง ๆ ถาสมมุติใหขอมูลในแฟมมีดังน้ี หรือ

I Love Burapha Univesity

Page 11: data structure lesson09

!%#

ในกรณีแร ตองการแกไขใหเปน “University” อันดับแรกจะตองคน ด หรือบางกรณีอาจตองการคนหาเพ่ืออยากทราบวา เก็บโปรแกรมภาษาปาสคาล การคนหา คําจําเพาะ ล (Compile) โปรแกรม จะมีการคําเนินงานคนหาอยูตลเวลามาก

สําหรับสาจํา เชน

หรือ line 1 2 13 14 15 W r i t

การเปรีย

การเปรียบเทียวิธีที ่ 1 เปนวิธีกาอักขระหรือแฟมขอม สมมุติให P L S M

ข้ันตอนการคน เร่ิมตนดวยขอมูล ซ่ึงก็คือ St[1มาเปรียบเทียบ แเปรียบเทียบกับอักขP[i=1] โดย i = 1,2เทากับ St[n] จะเปร

ก ตองการแกไขคําใหถูกตอง เชนคํา “Univesity” หาวาคํานี้อยูที่ไหนกอน จึงทําการเปลี่ยนแปลงแกไขไมีคํานี้อยูหรือไม สําหรับกรณีท่ีสอง เปนแฟมขอมูล (Key Word) หรือ คําส่ังตาง ๆ ในระหวางการคอมไพ

Program Exam1 Begin Var writeline : integer; writeline := 10; Writeln(“ Line No. = “, writeline); End

อดเวลา ดังนั้นหากไมมีวิธีการที่เหมาะสม การคอมไพลภาษา ก็จะไมมีประสิทธิภาพ ใช

ยอักขระ (String) จะมีการจัดเก็บตัวอักษรในลักษณะแถวลําดับเรียงกันไปในหนวยความ St : String[20] = “I love Burapha”; : String[40] = “Writeln(writeline)”; 3 4 5 6 7 8 9 10 11 12 16 17 18

e l n ( w r i t e l i n e )

บเทียบและการคนหาคํา ในแฟมขอมูลชนิดอักขระ

บและการคนหาคํา มีหลายวิธ ี ในที่นี้จะยกมาเพียงสองวิธี รคนหาขอมูลดวยการนํา คําหรือขอความที่ตองการคนหามาเปรียบเทียบหาในแถวลําดับูล โดยจะเปรียบเทียบทีละอักขระจนกวาจะพบ หรือหมดขอมูล : ตัวแปรเก็บ คํา หรือขอความที่ตองการคนหา ซึ่งจะเรียกวา แพทเทิน (Pattern) : ตัวแปรเก็บความยาวของคํา หรือความยาวของขอความที่ตองการคนหา t : ตัวแปรเก็บขอความในแฟมขอมูล หรือแถวลําดับขอมูล ax : ตัวแปรเก็บความยาวของขอความในแฟมขอมูล หรือแถวลําดับขอมูล

หามีดังน้ี การนําอักขระแรกของ แพทเทิน ซ่ึงก็คือ P[1] มาเปรียบเทียบกับ อักขระแรกในแฟม] ถาตรงกันใหนําอักขระถัดไปของแพทเทิน และของแฟมขอมูล ซ่ึงก็คือ P[2] และ St[2] ตถาไมเทากันจะเริ่มตนใหมทันที โดยการนําอักขระแรกของ แพทเทิน ซ่ึงก็คือ P[1] มาระที่สองในแฟมขอมูล ซ่ึงก็คือ St[2]. ดังนั้นจึงสรุปไดวา ถาเริ่มตนจาก แพทเทิน ที ่ ,3, . . . L จะเปรียบเทียบกับ St[n=1] โดยเริ่มตนที่ n = 1,2,3, . . . Max-L+1 ถา P[i] ียบเทียบอักขระ P[i+1] กับ St[n+1] ถัดไป ทําเชนน้ีไปเร่ือย ๆ จน i = L แสดงวาพบ

Page 12: data structure lesson09

!%$

คํา หรือขอความที่ตองการคนหา แตถาพบอักขระที่ไมเทากัน ไมวาจะที่ตําแหนงใด ก็จะเริ่มตนทําการคนหาใหมทันที โดยเริ่มจากการเปรียบเทียบอักขระที่ P[i] กับ St[n+1] และทําการเปรียบเทียบไปเร่ือย ๆ จนกวาจะพบ หรือหมดขอมูล จะเห็นวาการคนหาดวยวิธีนี้ เปนการคนหาแบบ ตรงไปตรงมา งาย แตถาขอมูลมีเปนจํานวนมาก ๆ หรือการคนหามาก ๆ วิธีนี้จะไมมีประสิทธิภาพมากนัก

Ex ถาขอความในแฟมขอมูลเก็บในตัวแปร St มีคาดังนี้ “cdcdcd . . . c10d10” หรือ (cd)10 ตองการคนหาคํา P = “aaba” มีในขอความขางตนหรือไม c d c d c d c d c d c d c d c d c d c d o o o a a b a

ในการคนหา การเปรียบเทียบเพียงอักขระแรก ก็สามารถบอกไดวาไมพบ แตจํานวนครั้งในการคนหาตองทําถึง 17 เที่ยว เนื่องจากขอความมีความยาว 20 อักขระ และแพทเทินมีความยาว 4 อักขระ โดยแตละเทียวคนหาเพียง คร้ังเดียว ∴ จํานวนครั้งที่ตองการคนหาทั้งหมด C = 1 + 1 + 1 + 1 + . . . + 1 = 17 x 1 = 17 คร้ัง สําหรับน้ีเปนกรณีท่ีโชคดีท่ีสุด (Best Case) แตถาเปนกรณีที่โชครายที่สุด (Worst Case) การคนหาจะ

มากวานี้มาก เชน ถา St = “aaaa . . . a20” หรือ (aa)10 และ P = “aaab” จํานวนครั้งที่ตองการคนหาทั้งหมด C = (1x4) + (1x4) + (1x4) + . . . + (1x4)17 = 17 x 4 = 68 คร้ัง ทั้งนี้เนื่องมาจากผิดตรงตําแหนงที่ 4 หรืออักขระสุดทายของแพทเทิน น้ันเอง

กําหนดใหจํานวนครั้งที่ตองการคนหาทั้งหมดคือ C(n) = r (S – r + 1) (i) โดยที่ r คือจาํนวนอักขระในแพทเทิน P

S คือจํานวนอักขระใน St n คือจํานวนอักขระทั้งหมด

ดังน้ัน n = r + S หรือ S = n - r แทน S เขา (i) C(n) = r (n – 2r + 1) (ii)

C′ = dC/dr = n – 4r + 1 = 0 (สําหรับกรณีที่ใหคามากที่สุด) ดังน้ันจะได r = (n + 1)/4 (iii)

แทน (iii) เขา (ii) ก็จะได C(n) = (n + 1)2/8 หรือก็คือ Big O ≅≅≅≅ O(n2) ดังนั้นวิธีนี้จึงไมดีนัก จํานวนครั้งที่คนหาจะเปลี่ยนแปลงรวจเร็วเปนกําลังสองเมื่อเทียบกับจํานวนขอมูล

Page 13: data structure lesson09

!%"

วิธีที ่ 2 เปนวิธีการคนหาที่ตรงกันขามกับวิธีแรก กลาวคือจะนําขอมูลจาก สายอักขระ หรือแฟมขอมูล มาเปรียบเทียบกับคําหรือขอความที่ตองการคนหา โดยในขั้นแรกจะตองนําคํา หรือขอความที่ตองการคนหามาสราง ตาราง หรือ กราฟเปรียบเทียบ ซ่ึงจะตองอาศัยหลักการของ Finite State มาคนหาที่ละอักขระ ท่ีละสถานะจนครบ หรือถึงสถานะสุดทาย จึงถือวาการคนหาประสบความสําเร็จ ดังนั้นจึงเรียกวิธีนี้วา “Search with Pattern Matching”

ตัวอยาง 9.1

กําหนดใหคําที่ตองการคนหาคือ P = “aaba” จงสรางตาราง และ กราฟเปรียบเทียบ วิธีทํา จากโจทย แพทเทิน มี เซต อักขระดังน้ี : ^ (วาง), a และ b สามารถแยกสถานะตาง ๆ ของ แพทเทินไดดังน้ี

สถานะที ่1, หนึ่งอักขระ ประกอบดวย 4 สถานะ : ^, a, a, b, a สถานะที ่2, สองอักขระ ประกอบดวย 3 สถานะ : aa, ab, ba สถานะที ่3, สามอักขระ ประกอบดวย 2 สถานะ : aab, aba สถานะที ่4, ส่ีอักขระ ประกอบดวย 1 สถานะ (สถานะสุดทาย) : aaba

แตสถานะที่ถูกตองและตองการคือ สถานะที ่1 : a สถานะที ่2 : aa สถานะที ่3 : aab สถานะที ่4 : aaba (สถานะสุดทาย) การคนหาขอมูล จะเริ่มจากการแยกทีละ อักขระ จากสายอักขระ หรือแฟมขอมูล มาเปรียบเทียบ

กับอักขระในคําหรือขอความที่ตองการคนหา หากเทากันจะขยับไปยังสถานะถัดไป มิเชนนั้นจะตองถอยกลับมาหนึ่งสถานะ เพื่อเปรียบเทียบใหม ทําเชนน้ีไปเร่ือย ๆ จนกวาจะครบ หรือหมดขอมูล

จากตัวอยาง ถาขอมูล Input เปน a ไดผลลัพธดังน้ี Input สถานะเร่ิมตน Function Finite State - Q0 ^ - a Q0 f(^,a) Q1 : (a) a Q1 f(Q1,a) Q2 : (aa) (i) a Q2 f(Q2,a) Q2 : (aa) a Q2 f(aa,a) Q2 : (aa)

Page 14: data structure lesson09

!%%

จาก (i) ถาขอมูล Input เปน a จะไมสามารถผาน Q2 (สถานะที ่2) ไปยัง Q3 (สถานะที ่3) ได เน่ืองจาก aaa ไมใชสถานะที่ 3 ซ่ึงสถานะท่ี 3 คือ aab, เม่ือไมสามารถผานสถานะท่ี 3 ตองตัด อักขระ ดานซายท้ิงแลวกลับไปยังสถานะกอนหนาน้ี (สถานะที ่2) เพ่ือทําการเปรียบเทียบใหม ซึ่งอักขระที่เหลื่อมีอยูในสถานะที่ 2 ดังนั้นจึงอยูในสถานะที่ 2

Page 15: data structure lesson09

!%&

ถาขอมูล Input เปน b เขามา Input สถานะเร่ิมตน Function Finite State

b Q0 ^ Q0

b Q0 f(^,b) Q 0 b Q0 f(^,b) Q0

หรือ b Q1 f(Q1,b) Q0

ดังนั้นถาขอมูล Input เปน b จะไมผานแมสถานะแรก (Q0) ไดเลย จาก (i) ถาขอมูล Input เปน b

Input สถานะเร่ิมตน Function Finite State

b Q2 f(Q2,b) Q3 : (aab) (ii) b Q3 f(aab,b) Q0 (ไมสามารถผาน Q3ได)

x Q2 f(aab,x) Q0 ( เริ่มตนใหมที่ Q0 ) จาก(ii) a Q3 f(Q3,a) P = Q4 : (aaba)

จากขอมูลดังกลาวขางตนจึงสามารถสราง ตาราง และ กราฟเปรียบเทียบ ไดดังน้ี

A B X Q0 Q1 Q0 Q0 Q1 Q2 Q0 Q0 Q2 Q2 Q3 Q0 Q3 P Q0 Q0

ตารางเปรียบเทียบ

หมายเหตุ - ถาเปนอักษรตัวอ่ืนๆ ที่ไมใช a หรือ b สมมุติใหเปนตัวแปร X จะกลับไปที่ สถานะ Q0 ทุกกรณี

Page 16: data structure lesson09

!%'

ขอสังเกต ถาขอมูลที่ Input มาไมใชสมาชิกของ เซตอักขระ ที่อยูในคํา หรือขอความที่ตองการคนหา จะเริ่มตนคนหาใหมทันทีที่สถานะแรก (Q0) ความยุงยากของวิธีนี้อยูที่การสราง Algorithm เพราะคําท่ีตองการคนหา มีหลากหลายรูปแบบ นั้นคือจะมี ตาราง หรือ กราฟเปรียบเทียบ ที่เปนลักษณะเฉพาะตัวไมเหมือนกัน สําหรับการคนหาคํา หรือขอความใน สายอักขระ หรือแฟมขอมูลมีหลักการดังนี้

1. แยกคําท่ีตองการคนหาเปนสถานะตาง ๆ โดยเอาเฉพาะสถานะท่ีถูกตอง เชน จากตัวอยางจะไดสถานะท่ีถูกตองคือ a, aa, aab, aaba

2. นําอักขระจาก สายอักขระ หรือแฟมขอมูลมาตอกันและทําการเปรียบเทียบ ถาถูกตองใหไปสถานะถัดไป แตถาไมถูกตองใหตัดอักขระซายสุดออก แลวเปรียบเทียบกับสถานะกอนหนาน้ัน ถายังไมพบก็ใหตัดอักขระ และถอยกลับมาเร่ือย ๆ จนกวาจะพบสถานะที่ถูกตอง หรือเร่ิมตนคนหาใหม

3. ถา อักขระ ที่เขามา ไมอยูใน เซตของอักขระ ของคําที่ตองการคนหา ใหเริ่มตนใหมทันที 4. ดําเนินการตามขอ 2 และ 3 ไปเร่ือย ๆ จนกวาจะถึงสถานะสุดทาย ซึ่งก็คือเปาหมายที่ตองการคนหา

Algorithm กําหนดให Pattn : ตัวแปรเก็บ แพทเทิน ของคํา หรือขอความที่ตองการคนหา

LnPattern : ตัวแปรเก็บคาความยาวของ แพทเทิน Str : ตัวแปรเก็บ สายอักขระ LnStr : ตัวแปรเก็บคาความยาวของสายอักขระ

Search_with_Pattern(Var Pattn, Str)

Begin

(* การสรางสถานะตาง ๆ สําหรับการคนหา *) LnPattern := Length(Pattn);

For ( i := 1 to LnPattern ) Do

Begin

StatuStrg[i] := Copy(Pattn,1,i);

End;

(* การเริ่มตนคนหา *) Count := 0; (* นับจํานวนคร้ังทีพ่บ *)

LnStr := Length(Str);

dumyStr := "";

i := Index := 1;

Page 17: data structure lesson09

!%(

While ( Index ≤ LnStr) Do Begin

token := Str[Index];

dumyStr := Concat(dumyStr,token);

If(dumyStr = StatuStrg[i] ) Then (* พบสถานะ *) Begin

If (i = LnPattern) Then

Begin (*พบคําที่ตองการ*) Count := Count +1;

i := 1; (* เริ่มตนใหม *) dumyStr := "";

End;

Else i := i+1; (* ขยับสถานะ *) End;

Else (* ไมพบสถานะ *) Begin

i := i - 1;

flag := ‘n';

while ( i>0 and flag ='n') Do

Begin (*การตัดดานซายของขอความเพื่อคนหาใหม *) dumyStr := Delete(dumyStr,1,1);

If (dumyStr = StatuStrg[i] ) Then flag = 'y';

Else i = i - 1;

End;

End;

If (flag='n') Then i := 1;

(* ไมเจอสถานะใด, เริ่มตนคนหาใหม *) Index := Index + 1;

End;

If (count = 0) Then

Write("Not Found");

Else

Write("Not Found", Count, "Times");

End.

ประโยชนและการประยุกตใชงานของการคนหาเปรียบเทียบคําในดานตางพอสรุปไดดังนี้

- การคนหาขอมูลในลักษณะน้ีเปนการคนหาแบบ O(n) ใชในการแปรภาษาคอมพิวเตอร (Compiler) คนหาคําใน Dictionary Hypertext ใน Home page

Page 18: data structure lesson09

!&)

คนหาคําใน Word Processing คนหาคําใน พระไตรปฎกฉบับ คอมพวิเตอร

กิจกรรม 9.1 1. จงเขียนโมดูล (Module) เพื่อทําการคนหาขอมูลในแฟมขอมูลแบบ Sequential Search 2. จงแสดงลักษณะการคนหาขอมูล คา 51, แบบ Binary Search ของชุดขอมูล : 9, 22, 25,

18, 74, 20, 35, 2, 42, 32, 51, 47, 2, 1, 5, 65 3. จงเขียนโมดูล เพ่ือทําการสรางแฟมขอมูลดัชนี 4. จงเขียนโมดูลเพื่อหาขอมูลจากแฟมขอมูลหลักโดยอาศัยแฟมขอมูลดัชนีที่ไดจากขอ 3. 5. จงเปรียบเทียบการคนหาขอมูลแบบ Binary Search และ Index Sequential Search 6. กําหนดให P = “ABABCB”; St = “ACABAABABABABXABABCBBA” จงสรางตาราง และ

กราฟเปรียบเทียบ 7. จะมีการเปรียบเทียบทั้งหมดกี่ครั้ง ทั้งสองวิธี 8. จงเขียนโมดูล เพื่อคนหาคําใด ๆ ในแฟมขอมูลทั้งสองวิธี โดยสามารถกําหนดคําหรือขอความ

ที่ตองการคนหา ตามความตองการได ขอเสนอแนะ - จากโมดูล ที่เขียนขึ้น ควรนําไปเขียนโปรแกรมเพื่อหาประสบการจริง

- การคนหาแบบ Binary Search อันดับแรกตองเรียงขอมูลกอน - การเปรียบเทียบ การคนหาขอมูลแบบ Binary Search และ Index Sequential Search ใหเปรียบเทียบในสวนที่เหมือนกัน และตางกัน