Searching

Document Sample
Searching Powered By Docstoc
					การค้นหาข้อมูล (Searching)
การค้นหาข้อมูล (Searching) เป็นกระบวนการที่สาคัญยิ่ง ในการประมวลผลข้อมูลด้วยคอมพิวเตอร์ การค้นหาข้อมูลในปัจจุบัน ยังคงเป็นปัญหาและยังมีการศึกษาค้นคว้า ตัวอย่างการค้นหาข้อมูล ที่พอจะคุ้นเคย ได้แก่ การค้นหาเส้นทางที่สั้นที่สุดสาหรั บการเดินทาง การค้นหาทางเดินของหุ่นยนต์ การค้นหาทางเดินของหมากรุก หรือ พัสซัล (Puzzle) ต่าง ๆ การค้นหาลักษณะของหลักการกลายพันธ์ (Genetic Algorithm) การค้นหาความเหมือนกันของรูปภาพ หรือการรู้จา เป็นต้น สิ่งเหล่านี้ล้วนเป็นความท้าทายในการค้นหา นอกจากนี้ในปัจจุ บันยังได้นาความรู้ทางด้านสถิติและระบบผู้เชียวชาญ มาช่วยในการค้นหา และการพยากรณ์เหตุการณ์ที่จะเกิดขึ้นในอนาคต เช่นในสาขาวิชา เดตามายนิ่ง (Data Mining) สาหรับการค้นหาที่จะศึกษาในบทนี้เป็นเพียงการค้นหาข้อมูลเบื้องต้น การค้นหาเพื่อหาระเบียน หรือ เขตข้อมูล ที่มีการจัดเก็บในแฟ้มข้อมูล หรือในแถวลาดับ มีหรือไม่ ซึ่งในการค้นหา จะต้องมีการกาหนด เขตข้อมูล เพื่อทาหน้าที่เป็นคีย์หลัก หรือดัชนี ในการค้นหา ซึ่งอาจเป็น รหัส ซื่อ- สกุล หรือเขตข้อมูลอื่นๆ ที่สนใจ และสามารถระบุระเบียนข้อมูลได้ การค้นหาจะหาได้รวดเร็ว หรือมีประ สิทธิภาพเพียงใด ขึ้นอยู่กับหลักการ การค้นหาเป็นสาคัญ สาหรับขั้นตอนวิธีการค้นหาข้อมูลเบื้องต้น ที่จะกล่าวถึงนี้ คิดว่าจะเป็นประโยชน์ในการใช้งาน และเป็นพื้นฐานในการเรียนรู้ต่อไป การค้นหาข้อมูลจะมีประสิทธิภาพมากน้อยเพียงใด ขึ้นอยู่กับขั้นตอนวิธีการค้นหาข้อมูล เป็นสาคัญ การค้นหาข้อมูลมีหลายวิธี แต่ละวิธีก็มีข้อดีข้อเสียด้วยกันทั้งสิ้น และยังเหมาะสมเฉพาะงาน สาหรับในบทนี้ขอเสนอวิธีการค้นหาข้อมูล 2 วิธีดังนี้ 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 begin 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 แต่วิธีนี้ ข้อมูลจะต้องเรียงกันก่อน จึงสามารถใช้งานได้ ดังนั้นถ้าข้อมูลมีจานวนมาก ๆ การเรียงลาดับข้อมูลก็อาจเป็นปัญหาและใช้เวลา ขั้นตอนในการค้นหาข้อมูลมีดังนี้ 1. กาหนด หรือรับข้อมูลที่ต้องการค้นหา 2. แบ่งครึ่งแฟ้มข้อมูล หรือแถวลาดับข้อมูล 3. นาข้อมูลที่ต้องการค้นหา จากข้อ 1. มาเปรียบเทียบกับข้อมูล ที่ตาแหน่งตรงกลาง ซึ่งได้จากการ แบ่งข้อมูลในข้อ 2. ถ้ามีค่าเท่ากัน แสดงว่าการค้นหาประสบความสาเร็จ แต่ถ้าไม่เท่ากันให้ตรวจดูว่ าข้อมูลที่ต้องการค้นหา มีค่าน้อยกว่าหรือมากกว่าค่าตรงกลาง ถ้าน้อยกว่าให้นาค่าในส่วนแรกมาแบ่งครึ่ง เพื่อนามาเปรียบเทียบใหม่ แต่ถ้าไม่ใช่ให้นาค่าในส่วนหลังมาแบ่งครึ่ง และนามาเปรียบเทียบใหม่ เช่นเดียวกัน 4. ทาการเปรียบเทียบข้อมูลในแฟ้มข้อมูลหรือแถวลาดับข้อมูล โดยแบ่งครึ่งลงไปเรื่อยๆ จนกว่าจะพบหรือไม่สามารถแบ่งได้อีกต่อไป นั้นหมายความว่าไม่พบข้อมูลแน่นอน Ex สมมติว่าเรามีอาเรย์เก็บข้อมูลแบบเรียงลาดับกันเอาไว้ดังนี้ 1 1 2 5 3 11 4 17 5 23 6 29 7 35 8 52 9 71 10 93

เราต้องการค้นหาเลข 29 อยากรู้ว่าอยู่ช่องไหน เราจะใช้ขั้นตอนดังนี้

1. แบ่งอาเรย์นี้ออกเป็นสองส่วน โดยนา 10/2 จะได้เท่ากับ 5 2. ตรวจดูค่าที่อยู่ในช่องที่ [5] ซึ่งก็คือ 23 กับค่าที่ต้องการค้นหา (29) จะพบว่า 29>23 ดังนั้น เราจะไปพิจารณาซีกขวาโดยตัดซีกซ้ายออกไปได้เลย ไม่ต้องไปพิจารณาเพราะเป็นซีกที่มีแต่ค่ าที่น้อยกว่า 29 แน่นอน 3. แบ่งสมาชิก 5 ตัวในส่วนทางขวาออกเป็น 2 ส่วนอีก โดยนาเอา (10-5)/2+5 ก็จะได้เท่ากับ 7.5 (หรือประมาณ 8) เราก็จะไปพิจารณาช่องที่ [8] ของอาเรย์ จะพบว่า 29<52 ดังนั้น ตัดส่วนทางขวาออกได้เลย 4. แบ่งสมาชิกระหว่างตัวที่ 5 และ 8 เป็นสองส่วนอีก โดยใช้ (8-5)/2+5 = 6.5 หรือประมาณ 7 เช็คช่องที่ [7] จะพบว่า 29<35 ดังนั้นดูทางด้านซ้ายต่อไป 5. แบ่งสมาชิกตัวที่ 5 ถึง 7 เป็นสองส่วนหาตาแหล่งกึ่งกลางจะได้ (7-5)/2+5 ก็คือ 6 ดังนั้น เมื่อดูค่าในตาแหน่ง นี้แล้วก็จะได้ว่าเลข 29 อยู่ตาแหน่งนี้นี่เอง เพื่อความเข้าใจ ลองพิจารณาขั้นตอนที่ได้อธิบายไปตามรูปต่อไปนี้ 1 1 2 5 3 11 4 17 5 23 6 29 7 35 8 52 9 71 10 93

29>23 29<52 29<35 29= =29 Algorithm (การการค้นหาข้อมู ลแบบไบนารี่) กาหนดให้ Item : ตัวแปรเก็บค่าที่ต้องการค้นหา Max : ตัวแปรเก็บจานวนข้อมูลทั้งหมด

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

H

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

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)


				
DOCUMENT INFO
Shared By:
Categories:
Stats:
views:63
posted:1/22/2010
language:Thai
pages:5