data structure lesson09

Page 1

!"#

แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา พงษวุฒิ ดวงศรี รายละเอียดของเนือ้ หา ตอนที่ 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 ใหเปรียบเทียบในสวนที่เหมือนกัน และตางกัน


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.