!"#
แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา พงษวุฒิ ดวงศรี รายละเอียดของเนือ้ หา ตอนที่ 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.
อธิบายบทบาทและหนาที่ของการคนหาขอมูลได อธิบายคุณลักษณะเฉพาะ ของการคนหาขอมูลแตละวิธีได เขียนขั้นตอนการคนหาขอมูลวิธีการตาง ๆ ตามที่ไดรับมอบหมายได นําไปประยุกตเขียนโปรแกรม สําหรับการคนหาขอมูลในลักษณะตางๆตามที่ไดรับมอบหมาย ได
กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก
!"$ 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 9.1 และตอนที่ 9.2 2. ทํากิจกรรมของบทเรียนที่ 9 3. ทําแบบประเมินผลของบทเรียนที่ 9 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน
!"" ตอนที่ 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) สําหรับการคนหาที่จะศึกษาในบทนี้เปนเพียงการคนหาขอมูลเบื้องตน การคนหาเพือ่ หาระเบียน หรือ เขตขอ มูล ที่มีการจัดเก็บในแฟมขอมูล หรือในแถวลําดับ มีหรือไม ซึ่งในการคนหา จะตองมีการกําหนด เขตขอมูล เพือ่ ทําหนาทีเ่ ปนคียห ลัก หรือดัชนี ในการคนหา ซึง่ อาจเปน รหัส ซือ่ -สกุล หรือเขตขอมูลอื่นๆ ทีส่ นใจ และสามารถระบุระเบียนขอมูลได การคนหาจะหาไดรวดเร็ว หรือมีประสิทธิภาพเพียงใด ขึ้นอยูกับหลัก
!"% การ การคนหาเปนสําคัญ สําหรับขั้นตอนวิธีการคนหาขอมูลเบื้องตน ที่จะกลาวถึงนี้ คิดวาจะเปนประโยชน ในการใชงาน และเปนพืน้ ฐานในการเรียนรูต อ ไป เรื่องที่ 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] : ตัวแปรเก็บขอมูลเก็บในแถวลําดับ
!"& 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 : ตัวแปรเก็บตําแหนงสุดทายของสวนขอมูลที่ตองการคนหา
!"' BinarySearch (Var : Begin L := 1; U := Max;
A[Max] , Item)
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)
!"( ตอนที่ 9.2 การคนหาขอมูลวิธีอื่น ๆ หัวเรื่อง เรือ่ งที่ 9.2.1
การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี
เรือ่ งที่ 9.2.1
การคนหาขอมูลโดยวิธีการเปรียบเทียบ
แนวคิด 1. การคนหาขอมูลเปนขบวนการทีส่ าํ คัญ และใชมากในการประมวลผลขอมูล 2. การคนหาขอมูลยังคงเปนปญหาและยังคงมีการศึกษาคนควา 3. การคนหาขอมูล มีการใชงานมากระหวางการประมวลผล ซึ่งไมเหมือนการเรียงลําดับขอมูล ดังนั้นควรเลือกวิธีการคนหาขอมูลใหเหมาะสมกับงานนั้น ๆ 4. สําหรับในบทนีข้ อเสนอวิธกี ารคนหาขอมูลเบือ้ งตน ซึ่งเปนที่นิยมและใชกันอยางแพรหลาย วัตถุประสงค หลังจากที่ศึกษาตอนที่ 9.2 แลว นักศึกษาสามารถ 1. อธิบายคุณลักษณะเฉพาะ ของการคนหาขอมูลแตละวิธีได 2. เขียนขั้นตอนการคนหาขอมูลแตละวิธี ตามที่ไดรับมอบหมายได 3. นําไปประยุกตเขียนโปรแกรม สําหรับการคนหาขอมูลในลักษณะตางๆตามที่ไดรับมอบหมาย ได เรื่องที่ 9.2.1 การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี การคนหาขอมูลแบบเรียงลําดับโดยอาศัยดัชนี เปนการคนหาอีกวิธหี นึง่ ที่ไดรับความนิยมและใช กันมาก โดยเฉพาะกรณีที่มีขอมูลเปนจํานวนมาก ๆ การคนหาดวยวิธีนี้ ก็เหมือนวิธีที่ผานมา อันดับแรกจะ ตองเรียงขอมูลกอน จึงจะสามารถคนหาได โดยปรกติขอมูลที่จัดเก็บในแฟมขอมูลจะประกอบดวยระเบียนขอ มูลตาง ๆ และในแตละระเบียน ก็จะประกอบดวยหลาย ๆ เขตขอมูล ตัวอยางเชน ระเบียนขอมูลนิสติ จะ ประกอบดวย รหัส ชื่อ-สกุล ที่อยู วุฒิทางการศึกษา เปนตน ดังนั้นหากขอมูลมีเปนจํานวนมาก ๆ เชน ขอมูลภาษีอากร หรือ ขอมูลทะเบียนราษฎร การคนหาไมใช เปนสิง่ งาย โดยเฉพาะ ถาไมมีการจัดเก็บขอ มูลทีเ่ หมาะสม หรือ ดีพอ การเขาถึงขอมูลจะยากลําบาก ขาดประสิทธิภาพ เสียเวลา การคนหาขอมูล อาจเขาถึงขอมูล โดยอาศัย รหัส ชื่อ-สกุล หรือเขตขอมูลอื่น ๆ ของระเบียนขอมูล ตามแตความตองการ ของผูใช ซึ่งเขตขอมูลที่ใชในการดําเนินงานคนหานี้เรียกวา เขตขอมูลดัชนี และเขตขอมูลดัชนีเหลานี้ สวน มากจะแยกออกเปนแฟมขอมูลตางหาก ซึ่งเรียกวาแฟมดัชนี (Index File) สําหรับการจัดเก็บขอมูลในแฟม ดัชนี จะจัดเก็บเขตขอมูลดัชนี และที่อยู (Address) ของระเบียนนัน้ ๆ ลงในแฟมดัชนีพรอมกัน การสราง แฟมดัชนีจะดําเนินในขั้นตอนการเตรียมการ เชนเดียวกับการเรียงขอมูลในแฟมขอมูลหลัก จะตองเรียงตาม
!%) เขตขอมูลดัชนี กอนการคนหา และการคนหาขอมูลจะคนหาในแฟมดัชนีตามลําดับ เพื่อตรวจดูวางขอมูล ที่ตองการ อยูในชวงใดของแฟมขอมูลหลัก จากตัวอยางดานลาง ถาสมมุติใหแฟมขอมูลหลัก ประกอบ ดวยระเบียนขอมูล 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 ใหญกวาคาที่ตองการคนหา
!%! แฟมขอมูลหลัก 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 : แฟมขอมูลดัชนี
!%* 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 หรือ
!%# Program Exam1 Begin ในกรณีแรก Var ตองการแก ไขคํา:ใหinteger; ถูกตอง เชนwriteline คํา “Univesity” writeline := 10; ตองการแกไขใหเปน “University” อันดับแรกจะตองคนหาวาคํานี้อยูที่ไหนกอน จึงทําการเปลี่ยนแปลงแกไขได หรือบางกรณีอาจตองการคนหา writeline); เพือ่ อยากทราบวา มีคําWriteln(“ นี้อยูหรือไมLine No. สําหรั=บ“,กรณี ทส่ี อง เปนแฟมขอมูลเก็บโปรแกรมภาษาปาสคาล การ คนหา คําจําเพาะ (Key EndWord) หรือ คําสัง่ ตาง ๆ ในระหวางการคอมไพล (Compile) โปรแกรม จะมีการคํา เนินงานคนหาอยูต ลอดเวลา ดังนั้นหากไมมีวิธีการที่เหมาะสม การคอมไพลภาษา ก็จะไมมีประสิทธิภาพ ใช เวลามาก สําหรับสายอักขระ (String) จะมีการจัดเก็บตัวอักษรในลักษณะแถวลําดับเรียงกันไปในหนวยความ จํา เชน St : String[20] = “I love Burapha”; line : String[40] = “Writeln(writeline)”;
หรือ 13
1 14 W r
2 15 i
t
3 16 e
l n
4 17
5 18 ( w
6 r
i
7 t
e
l
8
9
i
n e )
10
11
12
การเปรียบเทียบและการคนหาคํา ในแฟมขอมูลชนิดอักขระ การเปรียบเทียบและการคนหาคํา มีหลายวิธี ในที่นี้จะยกมาเพียงสองวิธี วิธีที่ 1 เปนวิธกี ารคนหาขอมูลดวยการนํา คําหรือขอความที่ตองการคนหามาเปรียบเทียบหาในแถวลําดับ อักขระหรือแฟมขอมูล โดยจะเปรียบเทียบทีละอักขระจนกวาจะพบ หรือหมดขอมูล สมมุติให P : ตัวแปรเก็บ คํา หรือขอความที่ตองการคนหา ซึ่งจะเรียกวา แพทเทิน (Pattern) L : ตัวแปรเก็บความยาวของคํา หรือความยาวของขอความที่ตองการคนหา St : ตัวแปรเก็บขอความในแฟมขอมูล หรือแถวลําดับขอมูล Max : ตัวแปรเก็บความยาวของขอความในแฟมขอมูล หรือแถวลําดับขอมูล ขัน้ ตอนการคนหามีดงั นี้ เริม่ ตนดวยการนําอักขระแรกของ แพทเทิน ซึง่ ก็คอื P[1] มาเปรียบเทียบกับ อักขระแรกในแฟม ขอมูล ซึง่ ก็คอื St[1] ถาตรงกันใหนําอักขระถัดไปของแพทเทิน และของแฟมขอมูล ซึง่ ก็คอื P[2] และ St[2] มาเปรียบเทียบ แตถาไมเทากันจะเริ่มตนใหมทันที โดยการนําอักขระแรกของ แพทเทิน ซึง่ ก็คอื P[1] มา เปรียบเทียบกับอักขระที่สองในแฟมขอมูล ซึง่ ก็คอื St[2]. ดังนั้นจึงสรุปไดวา ถาเริ่มตนจาก แพทเทิน ที่ P[i=1] โดย i = 1,2,3, . . . L จะเปรียบเทียบกับ St[n=1] โดยเริ่มตนที่ n = 1,2,3, . . . Max-L+1 ถา P[i] เทากับ St[n] จะเปรียบเทียบอักขระ P[i+1] กับ St[n+1] ถัดไป ทําเชนนีไ้ ปเรือ่ ย ๆ จน i = L แสดงวาพบ
!%$ คํา หรือขอความที่ตองการคนหา แตถาพบอักขระที่ไมเทากัน ไมวาจะที่ตําแหนงใด ก็จะเริ่มตนทําการคน หาใหมทันที โดยเริ่มจากการเปรียบเทียบอักขระที่ 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) ดังนั้นวิธีนี้จึงไมดีนัก จํานวนครั้งที่คนหาจะเปลี่ยนแปลงรวจเร็วเปนกําลังสองเมื่อเทียบกับจํานวนขอ มูล
!%" วิธีที่ 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)
a
Q2
f(Q2,a)
Q2 : (aa)
a
Q2
f(aa,a)
Q2 : (aa)
(i)
!%% จาก (i) ถาขอมูล Input เปน a จะไมสามารถผาน Q2 (สถานะที่ 2) ไปยัง Q3 (สถานะที่ 3) ได เนือ่ งจาก aaa ไมใชสถานะที่ 3 ซึง่ สถานะที่ 3 คือ aab, เมือ่ ไมสามารถผานสถานะที่ 3 ตองตัด อักขระ ดาน ซายทิง้ แลวกลับไปยังสถานะกอนหนานี้ (สถานะที่ 2) เพือ่ ทําการเปรียบเทียบใหม ซึ่งอักขระที่เหลื่อมีอยู ในสถานะที่ 2 ดังนั้นจึงอยูในสถานะที่ 2
!%& ถาขอมูล Input เปน b เขามา Input
สถานะเริม่ ตน
b
Q0
^
b
Q0
f(^,b)
b
Q0
f(^,b)
Q0
f(Q1,b)
Q0
b
หรือ
Q1
Function
Finite State Q0 Q0
ดังนั้นถาขอมูล Input เปน b จะไมผานแมสถานะแรก (Q0) ไดเลย จาก (i) ถาขอมูล Input เปน b Input b (ii) b จาก(ii) a
Q2
Finite State
f(Q2,b)
Q3 x
Function
สถานะเริม่ ตน
Q3 : (aab) Q0 (ไมสามารถผาน Q3ได)
f(aab,b) Q2
f(aab,x)
Q3
f(Q3,a)
Q0 ( เริ่มตนใหมที่ Q0 ) 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 ทุกกรณี
!%'
ขอสังเกต ถาขอมูลที่ Input มาไมใชสมาชิกของ เซตอักขระ ที่อยูในคํา หรือขอความที่ตองการคนหา จะ เริ่มตนคนหาใหมทันทีที่สถานะแรก (Q0) ความยุงยากของวิธีนี้อยูที่การสราง Algorithm เพราะคําทีต่ อ งการ คนหา มีหลากหลายรูปแบบ นั้นคือจะมี ตาราง หรือ กราฟเปรียบเทียบ ที่เปนลักษณะเฉพาะตัวไมเหมือน กัน สําหรับการคนหาคํา หรือขอความใน สายอักขระ หรือแฟมขอมูลมีหลักการดังนี้ 1. แยกคําทีต่ อ งการคนหาเปนสถานะตาง ๆ โดยเอาเฉพาะสถานะทีถ่ กู ตอง เชน จากตัวอยางจะ ไดสถานะทีถ่ กู ตองคือ a, aa, aab, aaba 2. นําอักขระจาก สายอักขระ หรือแฟมขอมูลมาตอกันและทําการเปรียบเทียบ ถาถูกตองใหไป สถานะถัดไป แตถาไมถูกตองใหตัดอักขระซายสุดออก แลวเปรียบเทียบกับสถานะกอนหนา นัน้ ถายังไมพบก็ใหตัดอักขระ และถอยกลับมาเรือ่ ย ๆ จนกวาจะพบสถานะที่ถูกตอง หรือเริม่ ตนคนหาใหม 3. ถา อักขระ ที่เขามา ไมอยูใน เซตของอักขระ ของคําที่ตองการคนหา ใหเริ่มตนใหมทันที 4. ดําเนินการตามขอ 2 และ 3 ไปเรือ่ ย ๆ จนกวาจะถึงสถานะสุดทาย ซึ่งก็คือเปาหมายที่ ตองการคนหา Algorithm กําหนดให
Pattn : ตัวแปรเก็บ แพทเทิน ของคํา หรือขอความที่ตองการคนหา LnPattern : ตัวแปรเก็บคาความยาวของ แพทเทิน Str : ตัวแปรเก็บ สายอักขระ LnStr : ตัวแปรเก็บคาความยาวของสายอักขระ
Search_with_Pattern(Var Begin
Pattn, Str)
(* การสรางสถานะตาง ๆ สําหรับการคนหา *) 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;
!%( While ( Index ≤ LnStr) Do Begin token := Str[Index]; dumyStr := Concat(dumyStr,token); If(dumyStr = StatuStrg[i] ) Begin If (i = LnPattern)
Then
(* พบสถานะ *)
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 Begin
flag ='n')
Do
(*การตัดดานซายของขอความเพื่อคนหาใหม *)
dumyStr := Delete(dumyStr,1,1); If (dumyStr = StatuStrg[i] ) Then Else i = i - 1; End; End; If (flag='n') Then i := 1;
flag = 'y';
(* ไมเจอสถานะใด, เริ่มตนคนหาใหม *) 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
!&) คนหาคําใน 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 ใหเปรียบเทียบในสวนที่เหมือนกัน และตางกัน