370 likes | 599 Views
โครงสร้างข้อมูล (Data Structure). การค้นหาข้อมูล (Searching). การค้นหาข้อมูล (Searching).
E N D
โครงสร้างข้อมูล (Data Structure) การค้นหาข้อมูล (Searching)
การค้นหาข้อมูล (Searching) • การค้นหาข้อมูลจะมีประสิทธิภาพมากน้อยเพียงใด ขึ้นอยู่กับขั้นตอนวิธีการค้นหาข้อมูลเป็นสำคัญ การค้นหาข้อมูลมีหลายวิธี แต่ละวิธีก็มีข้อดีข้อเสียด้วยกันทั้งสิ้น และยังเหมาะสมเฉพาะงาน ซึ่งในจะแสดงวิธีการค้นหาข้อมูล 3 วิธีด้วยกันคือ • การค้นหาแบบลำดับ (Sequential search) • การค้นหาแบบทวิภาค (Binary search) • การค้นหาแบบแฮช (Hashing search)
การค้นหาแบบลำดับ (Sequential search) • Sequential search เป็นกรรมวิธีค้นหาข้อมูลที่ง่ายที่สุด และสามารถกระทำบนโครงสร้างข้อมูลที่ถูกจัดเรียงหรือไม่ก็ได้ • หลักการของ Sequential search คือ เอาค่าข้อมูลที่ต้องการหาตำแหน่งในโครงสร้างไปไล่เทียบข้อมูลในโครงสร้างทีละตัวตามลำดับ
การค้นหาแบบลำดับ (Sequential search) • KEY = 54 (มีข้อมูล) 25 32 48 3 3 7 7 12 12 25 32 48 54 78 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 i = i + 1 i = i + 1 found not found not found not found not found not found not found i = 6 Comparison time(s) 2 3 1 4 5 6 7
การค้นหาแบบลำดับ (Sequential search) • KEY = 99 (ไม่มีข้อมูล) 3 7 12 25 32 48 54 78 3 7 12 25 32 48 54 78 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 i = i + 1 i = i + 1 not found not found not found not found not found not found not found not found Comparison time(s) NOT FOUND…!!! 3 2 1 6 5 4 8 7
การค้นหาแบบลำดับ (Sequential search) • จำนวนครั้งของการเปรียบเทียบ • หาเจอเมื่อเปรียบเทียบครั้งแรกเจอ = O (1) • ไม่มีข้อมูลนั้นอยู่ = O (n) • ค่าเฉลี่ยของจำนวนครั้งของการค้นหาเมื่อไฟล์ขนาด N คือ O (N/2)
การค้นหาแบบลำดับ (Sequential search) • ขั้นตอนวิธีข้างต้นของการค้นหาแบบเรียงลำดับจะเหมาะกับการค้นหาค่าในชุดข้อมูลที่ไม่ได้เรียง • แต่ถ้าข้อมูลเรียงเรียบร้อยแล้ว จะมีข้อเสียบางประการคือ กรณีที่ค้นหาไม่พบ แม้ว่าเมื่อค้น target ในชุดข้อมูลจนถึงตัวที่มีค่ามากกว่า target แล้ว การค้นหายังไม่ยุติการค้น ยังคงวนรอบเพื่อเปรียบเทียบข้อมูลจนถึงตัวสุดท้ายในชุดข้อมูล ทำให้เสียเวลา
การค้นหาแบบลำดับ (Sequential search) • การปรับปรุงประสิทธิภาพการค้นหาแบบลำดับ • การค้นหาข้อมูลแบบลำดับด้วยเทคนิคการเรียงลำดับข้อมูล เรียงลำดับข้อมูลจากน้อยไปหามาก • การค้นหาข้อมูลแบบลำดับด้วยเทคนิคเซล์ฟรีออร์เดอร์ริ่ง (Self Reordering)ปรับปรุงขั้นตอนวิธีการค้นหา โดยการค้นหาข้อมูลจะหยุดทำการค้นหาเมื่อพบว่าคีย์ที่ใช้ค้นมีค่าน้อยกว่าข้อมูลในชุดข้อมูล
การค้นหาแบบลำดับแบบปรับปรุงการค้นหาแบบลำดับแบบปรับปรุง • KEY = 29 (ไม่มีข้อมูล) 3 7 12 25 32 48 54 78 3 7 12 25 32 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 not found not found not found not found K[i] > key Stop..!! Comparison time(s) NOT FOUND…!!! 1 2 3 4 5
การค้นหาแบบทวิภาค (Binary Search) • เป็นการค้นหากับข้อมูลที่ถูกเรียงลำดับแล้ว • ปัญหากรณีที่ข้อมูลจำนวนมากจะต้องเสียเวลาในการเรียง • ขั้นตอนในการค้นหาข้อมูลมีดังนี้ • กำหนด หรือรับข้อมูลที่ต้องการค้นหา • แบ่งครึ่งแฟ้มข้อมูลหรือแถวลำดับข้อมูล • ทำการเปรียบเทียบข้อมูลในแฟ้มข้อมูลหรือแถวลำดับข้อมูล โดยแบ่งครึ่งลงไปเรื่อยๆ จนกว่าจะพบหรือไม่สามารถแบ่งได้อีกต่อไป นั้นหมายความว่าไม่พบข้อมูลนั้นแน่นอน
2 4 5 9 12 20 27 0 1 2 3 4 5 6 low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) Key = 20 ครั้งที่ 1 เปรียบเทียบค่า key = 20 กับข้อมูลที่อยู่กึ่งกลางของ list พบว่า ค่า key มีค่ามากกว่าค่ากึ่งกลางของข้อมูล ดังนั้นไปค้นหาข้อมูลต่อในส่วนที่ 2 9 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 mid = (low+upper)/2 = (0+6)/2 = 3
low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 2 เปรียบเทียบค่า key = 20 กับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 2 20 mid = (low+upper)/2 = (4+6)/2 = 5 ข้อมูลส่วนที่ 2 ข้อมูลส่วนที่ 1 FOUND…!! ค่า key = 20 ที่ต้องการค้นหามีค่าตรงกับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 2 หมายความพบข้อมูลที่ต้องการ
2 4 5 9 12 20 27 0 1 2 3 4 5 6 low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) Key = 7 ครั้งที่ 1 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของ list พบว่า ค่า key มีค่าน้อยกว่าค่ากึ่งกลางของข้อมูล ดังนั้นไปค้นหาข้อมูลต่อในส่วนที่ 1 9 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 mid = (low+upper)/2 = (0+6)/2 = 3
low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 2 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 1 4 mid = (low+upper)/2 = (0+2)/2 = 1 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 Key มีค่ามากกว่าค่ากึ่งกลางของข้อมูลส่วนที่ 1นี้ ดังนั้นไปค้นหาต่อที่ข้อมูลส่วนที่ 2
low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 3 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของข้อมูล 4 NOT FOUND…!! ข้อมูลที่ค้นหา เปรียบเทียบค่า 5 กับค่า 7 เนื่องจาก key = 7 ไม่เท่ากับ 5 แต่มีค่ามากกว่าจึงต้องค้นหนต่อไป แต่ปรากฏว่าไม่มีค่าระหว่าง 5 กับ 7 อีกแล้วเพราะฉะนั้นสรุปได้ว่า ไม่พบข้อมูล 7 ในข้อมูลชุดนี้
การค้นหาแบบทวิภาค (Binary Search) • กระบวนการทำงานแบบ Binary Search จะพบว่าเมื่อมีการเปรียบเทียบแต่ละครั้งจะมีการตัดข้อมูลในตารางออกไปได้ทีละครึ่งหนึ่งเสมอ ดังนั้นถ้าเริ่มต้นมีจำนวนข้อมูล n ตัว • จำนวนข้อมูลที่นำมาเพื่อค้นหาค่าที่ต้องการหลังการเปรียบเทียบแต่ละครั้งจะเป็นดังนี้ ครั้งที่ 2 = n/2 (หรือ n/21) ครั้งที่ 3 = n/4 (หรือ n/22) ครั้งที่ 4 = n/8 (หรือ n/23)
การค้นหาแบบทวิภาค (Binary Search) • การเปรียบเทียบจะได้ว่า n/2k < 1 หรือ n < 2k จะได้ log2 n < k • จำนวนการเปรียบเทียบของ Binary Search คือ O(log2 n )
การค้นหาแบบแฮช (Hashing search) • เป็นวิธีการค้นหาข้อมูลที่ใช้การแปลงคีย์ (Key) ให้เป็นตำแหน่ง(Address) ที่อยู่ในพื้นที่เก็บข้อมูล โดยใช้เทคนิคการสร้างตารางมาเพื่อเก็บคีย์ดังกล่าว • การแปลงคีย์ให้เป็นแอดเดรส คือ การแปลงข้อมูลให้ไปอยู่ในตารางแอดเดรสที่เตรียมไว้ซึ่งตารางนี้เรียกว่า ตารางแฮช (Hash Table) • การแปลงค่านี้ต้องอาศัยฟังชัน H(k) เป็นตัวช่วยในการหาแอดเดรสของค่าคีย์ k (ค่า H(k) คือ แอดเดรสของคีย์ K นั้นเอง)
การค้นหาแบบแฮช (Hashing search) • การค้นหาด้วยวิธีนี้จะไม่ขึ้นอยู่กับจำนวนข้อมูล • อาศัยหลักการคำนวณตำแหน่งที่เก็บข้อมูลจากคีย์ที่กำหนด นั่นคือจะต้องหา Hashing Function ที่เหมาะสม • บางครั้ง Hashing Function จะคำนวณค่า key ที่ต่างกันแต่ให้ค่าตำแหน่งเพื่อเก็บข้อมูลที่เดียวกัน ซึ่งเหตุการณ์ที่เกิดขึ้นในลักษณะนี้เรียกว่าการชนกันของคีย์ (Collision)
การค้นหาแบบแฮช (Hashing search) hash function อย่างง่าย hash(key) = key MOD TableSize • TableSizeคือ ขนาดของตารางที่จัดเก็บควรเลือกค่าที่เป็นจำนวนเฉพาะ (Prime Number)
การค้นหาแบบแฮช (Hashing search) • ชุดตัวเลข 9, 17, 22, 14, 13, 5 ถ้ากำหนดแฮชชิ่งฟังก์ชั่นด้วยสมการ H(K) = K MOD 9 ค่าที่ได้จากแฮชชิ่งฟังก์ชั่นแสดงได้ดังนี้ H(9) = 0 H(17) = 8 H(22) = 4 H(14) = 5 H(13) = 4 H(8) = 8 คีย์ 17 ได้ตำแหน่งแอดเดรสตรงกับคีย์ 8 คีย์ 22ได้ตำแหน่งแอดเดรสตรงกับคีย์ 13 ลักษณะเช่นนี้เรียกว่าเกิดการชนกันของคีย์
การค้นหาแบบแฮช (Hashing search) • การแก้ปัญหาการชนกันของคีย์ (Collision) ทำโดยการเก็บค่าคีย์ใน Hash tableแบบ • Chaining • Open Addressing
Chaining • วิธี Chaining เป็นวิธีการแก้ไขปัญหาของการชนกันที่ดีที่สุด มีการใช้ linked list เข้ามาช่วย โดยมีการแบ่งเนื้อที่ออกเป็น 2 ส่วน ส่วนแรกจะเก็บ address ส่วนที่สองจะเก็บค่าข้อมูลทั้ง list ที่มี address เดียวกัน
Chaining Key={0, 81, 64, 25, 36, 49, 4, 1, 9, 16} H(x) = x MOD 10
Open addressing • open addressing วิธีการนี้เราจะค้นหาค่าตำแหน่งถัดไปที่ยังว่าง แล้วนำข้อมูลที่ได้มาในภายหลังไปเก็บไว้ • แบ่งออกเป็น 3 ประเภท • Open addressing with Linear Probing • Open addressing with Quadratic Probing • Open addressing with Double Hashing
Open addressing Key {89, 18, 49, 58, 69} Hash function: hash(x) = x MOD 10 Collision resolution strategy: f(i) = i ( i แทน ครั้งที่หา ) hi(x) = (hash(x)+f(i)) mod 10) Open addressing with Linear Probing
49 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (9+12) mod 10 = 0 58 MOD 10 = 8 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (8+12) mod 10 = 9 (ชน) = (8+22) mod 10 = 2 69 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (9+12) mod 10 = 0 (ชน) = (9+22) mod 10 = 3 Open addressing Key {89, 18, 49, 58, 69} Hash function: hash(x) = x MOD 10 Collision resolution strategy: f(i) = i2 hi(x) = (hash(x)+f(i2)) mod 10) Open addressing with Quadratic Probing
49 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (9+( 1 * (7- (49 mod 7)) mod 10 = (9+7) mod 10 = 6 58 MOD 10 = 8 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (8+( 1 * (7- (58 mod 7)) mod 10 = (8+5) mod 10 = 3 69 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (9+( 1 * (7- (69 mod 7)) mod 10 = (9+1) mod 10 = 0 Open addressing Key {89, 18, 49, 58, 69} Hash functions: hash(x) = x MOD 10 hash2(x) = 7 - (x MOD 7) Collision resolution strategy: f(i) = i * hash2(x) Open addressing with Double Hashing
Open addressing • รูปแบบของ hash2(x) ที่นิยม คือ hash2(x) = R - (x MOD R) เมื่อ R คือ จำนวนเฉพาะ (Prime Number) ที่น้อยกว่า TableSize