________ _Searching_ by hcj

VIEWS: 64 PAGES: 10

									การค้นหา (Searching)
การค้นหา (Searching) เป็นขบวนการที่นามาใช้กับคอมพิวเตอร์ เพื่อใช้ในการค้นหา ข้อมูลที่ต้องการ อัลกอริทึมของการค้นหา คือ อัลกอริทึมซึ่งรับอาร์กิวเมนต์ (argument) Q และพยายามหา ระเบียนซึ่งมีคีย์ (key) คือ a อัลกอริทึมนี้ให้ค่าของทั้งระเบียน หรือให้ค่าพอยน์เตอร์ที่ชี้ไปยังระเบียน กรณีที่หาคีย์ไม่พบ ก็จะให้ผลลัพธ์เป็น ระเบียนนิล (nil record) หรือนิล พอยน์เตอร์ (nil pointer) การค้นหาที่ประสพผลสาเร็จ เรียกว่า การค้นคืน (retrieval) ในการค้นหาข้อมูล คีย์ของระเบียน เป็นสิ่งบอกความแตกต่างของระเบียน คีย์ภายใน (Internal key) เป็นคีย์ที่อยู่ภายใน ระเบียนที่ตาแหน่งซึ่งกาหนดไว้ จากจุดเริ่มต้นของระเบียน คีย์ภายนอก (Exteral key) เป็นคีย์ที่เก็บไว้ในตารางของคีย์ซึ่ง รวมถึงพอยน์เตอร์ซึ่งชี้ไปยังระเบียน คีย์ปฐมภูม(Primary key) เป็นคีย์ซึ่งมีเอกลักษณ์ (unique) ซึ่งแต่ละระเบียนจะมีคีย์ไม่ซ้ากัน ิ ดรรชนีของแถวลาดับ เป็นคีย์ภายนอกที่มีลักษณะเฉพาะ (unique external key) สาหรับ คีย์ทุติยภูมิ (Secondary key) เป็นคีย์ของระเบียนที่ไม่เป็นเอกลักษณ์ ได้แก่ 2 ระเบียนมีคีย์ตัวเดียวกัน เช่น คีย์ชื่อจังหวัด ในระเบียนของที่อยู่ วิธีการค้นหา 1. การค้นหาแบบเรียงลาดับ (Sequential Search) 2. การค้นหาแบบทวิภาค (Binary Search) 3. การค้นหาแบบดรรชนีเรียงลาดับ (Index Sequential Search) การค้นหาแบบเรียงลาดับ (Sequential Search) 1. ใช้กับข้อมูลที่เก็บไว้ในแถวลาดับหรือลิงค์ลิส (linked list) 2. กรณีที่ใช้แถวลาดับ k ซึ่งมีคีย์จานวน n และ r เป็นแถวลาดับของระเบียนให้ k(i) นั้นเป็นคีย์ของ r(i) เมื่อค้นพบข้อมูลได้ค่า integer i (เมื่อ k(i) = key) และถ้าไม่พบให้ค่าเป็นศูนย์ อัลกอริทึมของการค้นหา มีดังนี้

found := false; i := 1; while (i < n) and (not found) do if key = k(i) then begin search := i ; found := true end else i := i+1; if not found then search := 0 และเมื่อต้องการเพิ่มระเบียนชื่อ (rec) ลงไปในแถวลาดับ สามารถทาโดย if not found then begin n := n+1; {increase the table size} k(n) := key; {insert the new key and} r(n) := rec; {rec} search := n end

ตัวอย่างการค้นหาแบบเรียงลาดับ

การค้นหาแบบทวิภาค (Binary Search)

เป็นวิธีที่ดีที่สุดในการค้นคว้า ตารางที่จัดแบบเรียงลาดับ (sequential table) โดยที่ไม่ต้องใช้ดรรชนีช่วย (auxiliary indices) โดยทั่วไปแล้วจะมีการเปรียบเทียบ อาร์กิวเมนท์ (argument) กับ คีย์ของสมาชิกตัวกลาง ในตาราง ถ้าคีย์เท่ากับสมาชิกนั้น การค้นหาจบลง แต่ถ้าไม่เท่ากันก็มีการค้นหาที่ส่วนบนหรือส่วนล่างของตาราง อัลกอริทึมของการค้นหาแบบทวิภาค found := false; low := 1; hi =n; while (low < hi) and (not found) do begin mid := (low+hi) div 2; if key = k(mid) then found := true else if key < k(mid) then hi := mid-1 else low := mid+1 end; {while do begin} if found then search := mid else search := 0

ตัวอย่างการค้นหาแบบทวิภาค

การเปรียบเทียบ (Comparsion) ของการค้นหาแบบทวิภาคลดจานวนสมาชิก ที่จะค้นหาโดยแฟคเตอร์ 2 ดังนั้นจานวนคีย์ที่มากที่สุด ในการเปรียบเทียบประมาณ log2 n คีย์ การค้นหาแบบทวิภาค ใช้กับตารางที่เก็บไว้ในแถวลาดับ โดยที่แถวลาดับนั้นได้รับการสลับลาดับ และดรรชนีแถวลาดับต้องเป็น integer นอกจากนี้การค้นหาแบบนี้ใช้ได้ดีกับกรณีที่มี การลบและการเพิ่มข้อมูลในแถวลาดับจานวนไม่มาก การค้นหาแบบดรรชนีเรียงลาดับ (Indexed Sequential Search) ประกอบด้วยตารางช่วย (auxiliary table) เรียกว่าดรรชนี และแฟ้มข้อมูลเรียงลาดับ ในดรรชนีนั้นประกอบด้วยคีย์ (kindex) ซึ่งชี้ไประเบียนในแฟ้มข้อมูล ที่เกี่ยวข้องกับ kindex โดยสมาชิกที่อยู่ในดรรชนีและระเบียน ในแฟ้มข้อมูลนั้นต้องได้รับ การสลับลาดับ (sort) ข้อดี ของการค้นหาวิธีนี้คือ สามารถค้นหาสมาชิกในตารางโดยวิธีเรียงลาดับ โดยใช้เวลาในการค้นหาจะสั้นลง เพราะมีการค้นหาที่ดรรชนีก่อน แล้วจึงไปที่ตาราง กรณีที่ตารางมีขนาดใหญ่มาก ดังนั้นการใช้ตารางจึงไม่ได้ประสิทธิภาพ ที่สมบูรณ์ เพราะดรรชนีจะมีขนาดใหญ่ จึงได้มีการพัฒนาดรรชนีทุติยภูมิ (Secondary index) สาหรับการลบข้อมูลจากตารางทาได้ง่าย โดยทาเครื่องหมายไว้ที่ตาราง แต่ยังคงดรรชนีเดิมไว้ ส่วนการใส่ข้อมูลลงไปในตารางของดรรชนี (index sequentialtable) นั้นยุ่งยากเพราะต้องมี การเลื่อนข้อมูลในตารางเพื่อให้ข้อมูลในตารางนั้นเรียงลาดับ กรณีที่ดรรชนีมีขนาด1/8 ของขนาดของแฟ้มข้อมูล ดังนั้นทุก ๆ 8 ระเบียนสามารถแทนได้ด้วย index
K R 8 14 Index Kindex Pindex 321 592 8 16 26 38 72 115 [key] (record)

876

306 321 329 387 409 512 540 567 583 592 602 611 618 741 798 811 814 876

อัลกอริทึมในการทางาน ของแฟ้มข้อมูลดรรชนีเรียงลาดับ (Index Sequential File) ให้ k เป็นแถวลาดับประกอบด้วยคีย์ (key) จานวน n ตัว r เป็นแถวลาดับของระเบียน key เป็นสิ่งที่ต้องการค้นหา kindex เป็นแถวลาดับของคีย์ในดรรชนี pindex เป็นแถวลาดับของพอย์นเตอร์ในดรรชนี แฟ้มข้อมูลมีการเก็บข้อมูล แบบแถวลาดับโดยมีขนาด n และ indexsize เป็นขนาดของดรรชนี found := false; i : = 1; while ( i < indexsize) and (not found) do if kindex( i ) > key then found := true else i := i +1;

if i = 1 then lowlim := 1; else lowlim := pindex( i -1); if found then hilim := pindex( i ) -1 else hilim := n {search the table between positions lowlim and hilim} j := lowlim; found := false; while ( j < hilim) and (not found) do if k(j) = key then found := true else j := j+1; if found then search := j else search := 0


								
To top