Lecturers : Boontee Kruatrachue. Room no. 913 Kritawan Siriboon

Slides:



Advertisements
งานนำเสนอที่คล้ายกัน
ครั้งที่ 12 การค้นหาข้อมูล (Searching)
Advertisements

บทที่ 5 การดำรงชีวิตของพืช
การเขียนคำสั่งควบคุม การทำงานขั้นพื้นฐาน
การเขียนโปรแกรมภาษาปาสคาล โดยใช้โครงสร้างหลักทั้ง 3 โครงสร้าง
กาญจนา ทองบุญนาค สาขาวิชาคอมพิวเตอร์ คณะวิทยาศาสตร์และเทคโนโลยี
หน่วยที่ 5 การเวียนเกิด
DATA STRUCTURE AND ALGORITHM Linked List.
QueueQueue Lecturer : Kritawan Siriboon, Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley.
Queue Sanchai Yeewiyom School of Information & Communication Technology University of Phayao.
ตัวแปร และชนิด ข้อมูล. ตัวแปร การกำหนดตัวแปรเป็นการใช้ ชื่อตัวแปรแทน ตำแหน่งบนหน่วยความจำ สำหรับเก็บ ข้อมูลระหว่างการ ประมวลผล ซึ่งอาจเป็นข้อมูลนำเข้า.
ครั้งที่ 7 รีจิสเตอร์ (REGISTER). รีจิสเตอร์ (Register) รีจิสเตอร์เป็นวงจรความจำที่ใช้ในการเก็บค่า ทางไบนารี่ ใช้ในการเก็บค่าในระหว่างการ ประมวลผลโดยใช้ฟลิป.
บทที่ 6 การใช้คำสั่ง อ. สุรินทร์ทิพ ศักดิ์ภูวดล สำนักวิชาเทคโนโลยีสารสนเทศและ การสื่อสาร.
เทคนิคการใช้ Microsoft Excel. 1. การตีตารางในรูปแบบต่าง ๆ 2. การแทรกภาพในตาราง 3. การตกแต่งข้อมูลด้วย Format Cells 4. การคำนวณ บวก ลบ คูณ หาร 5. การย่อ.
การเลือกข้อมูลจาก List การกำหนดเงื่อนไขการป้อนข้อมูลด้วย Data Validation การใส่ Comment / แสดง / แก้ไข / ลบ.
LOGO ภาษาซี 1.1 อ. กฤติเดช จินดาภัทร์. LOGO ตัวอย่างโค้ดภาษาซี
การออกแบบโครงสร้างข้อมูล การออกแบบโครงสร้างข้อมูล หมายถึง กรณีสร้างตารางใหม่ด้วย ออกแบบตาราง (Table Design) เพื่อต้องการกำหนด โครงสร้างด้วยตนเอง โดยมีขั้นตอนการ.
คำสั่งควบคุมการทำงาน
Queue Lecturer : Kritawan Siriboon, Room no. 913
เกม คณิตคิดเร็ว.
Burin Rujjanapan Updated:
บทที่ 5 การใช้คำสั่ง Select Case , For Next และ Do While
Lecturers : Boontee Kruatrachue. Room no. 913 Kritawan Siriboon
stack #2 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
รายการ(List) [1] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
บทที่ 8 แฮช (Hash).
บทที่ 5 อินพุตและเอาต์พุต
อนุกรมอนันต์และการลู่เข้า
การประยุกต์ Logic Gates ภาค 2
โครงสร้างข้อมูลและอัลกอริทึมเบื้องต้น
Lecturers : Boontee Kruatrachue. Room no. 913 Kritawan Siriboon
การจัดการระบบฐานข้อมูล ภาษาที่ใช้ในระบบจัดการฐานข้อมูล
การวิเคราะห์และออกแบบขั้นตอนวิธี
Tree 2.
Trees (2) University of Phayao Sanchai Yeewiyom
รายการ(List) [3] ผู้สอน อาจารย์ ยืนยง กันทะเนตร
STACK สแตก(stack) เป็นโครงสร้างข้อมูลแบบเชิงเส้น ที่มีการใส่ข้อมูลเข้า และนำข้อมูลออกเพียงด้านเดียว ดังนั้น ข้อมูลที่เข้าไปอยู่ใน stack ก่อนจะออกจาก stack.
QUEUE คิวจะมีโครงสร้างแบบเชิงเส้นเหมือน stack แต่แตกต่างตรงที่ queue มีตัวชี้ 2 ตัวคือ หัว(Head) และหาง(Tail) โดยการใส่ข้อมูลเข้าและนำข้อมูลออก จะมีลักษณะ.
stack #1 ผู้สอน อาจารย์ ยืนยง กันทะเนตร
SPEI R & R Studio Program User Manual.
B92 Protocol Alice สุ่ม string a string a (data bits)
ชุดที่ 1 ไป เมนูรอง.
คำสั่ง Create , Insert, Delete, Update
บทที่ 3 แฟ้มข้อมูลและฐานข้อมูล
Data storage II Introduction to Computer Science ( )
Linked List (ต่อ) Lecturer : Kritawan Siriboon, Room no. 913
ต้นไม้เอวีแอล (AVL Tree)
บทที่ 10 การค้นหาข้อมูล (Searching)
Week 5 C Programming.
Hashing Sanchai Yeewiyom
สมการพหุนาม ที่มีความซับซ้อนมากขึ้น
บทที่7 ทฤษฎีกราฟเบื้องต้น
การสร้างแบบสอบถาม และ การกำหนดเงื่อนไข.
Data storage II Introduction to Computer Science ( )
Data Structures and Algorithms 2/2561
BASIC STATISTICS MEAN / MODE / MEDIAN / SD / CV.
บทที่ 9 การเรียงลำดับข้อมูล (Sorting)
Data Structures and Algorithms 2/2561
Data Structures & Algorithms Using Python
บทที่ 7 การประมวลผลอาร์เรย์
หัวใจหยุดเต้น หยุดหายใจ ปั๊มหัวใจ ทำอย่างไร ?
OPERATOR ภาษาปาสคาล (Pascal)
ค่ารูรับแสง - F/Stop ค่ารูรับแสงที่มีค่าตัวเลขต่ำใกล้เคียง 1 มากเท่าไหร่ ค่าของรูรับแสงนั้นก็ยิ่งมีความกว้างมาก เพราะเราเปรียบเทียบค่าความสว่างที่ 1:1.
2 โครงสร้างข้อมูลแบบสแตก (STACK).
3 โครงสร้างข้อมูลแบบคิว (QUEUE).
Chapter 3 : Array.
Array: One Dimension Programming I 9.
ฟังก์ชันของโปรแกรม Computer Game Programming
การเติบโตของฟังก์ชัน (Growth of Functions)
4 โครงสร้างข้อมูลแบบลิงค์ลิสต์ (LINKED LIST).
การเขียนโปรแกรมด้วยภาษาไพทอน การเขียนโปรแกรมแบบทางเลือก
ใบสำเนางานนำเสนอ:

Lecturers : Boontee Kruatrachue. Room no. 913 Kritawan Siriboon Lecturers : Boontee Kruatrachue Room no. 913 Kritawan Siriboon Room no. 913 Text : Data Structures & Algorithm Analysis in C, C++,… Mark Allen Weiss, Addison Wesley Searching

Searching Terminology Search, Record, Table/File Key Internal Key (Embedded Key) External Key Successful Search/Unsuccessful Search Internal Search / External Search 5601 Ann 85 5602 Ben 93 5603 Dan 50 ... record table/file Key2 Rec Ann Ben Dan ... Harry Elka Ron Zu Key2 Rec 35 ... 38 50 85 86 93 95 5601 Ann 85 5602 Ben 93

Search Unordered Table Search Ordered Table Array List & Tree Search Searching Search Unordered Table Sentinel Search Move to Front Transposition Search Ordered Table Array List & Tree Search - Sequential Search (Linear Search) - Index Sequential Search - B-Tree - Binary Search Binary Search Tree - AVL (Hight Balanced) Tree Hashing - Heap

Searching Unorder List rec 19 56 2 7 25 18 ... 40 1 2 3 4 5 6 ... n pos pos = n+1; i = 1; loop (i<>pos) if (key == rec[i].key) pos = i; else i = i+1; end if endloop if (i<=n) search = i; search = 0; found = false; //Typical version i= 1; loop (i<=n) and (not found) if (key == rec[i].key) { foundIndex = i; found = true; else i= i +1; end if end loop //More efficient version

Sentinel Search O(n) Best Case 1 Worst Case n Avg Case (n+1)/2 rec 19 56 2 7 25 18 ... 40 Sentinel 1 2 3 4 5 6 ... n rec[n+1] = key; //adding sentinel i = 1; loop (key <> rec[i].key) i = i+1; end loop if (i<n) search = i; else search = 0; end if O(n) Best Case 1 Worst Case n Avg Case (n+1)/2 Sentinel rec 19 56 2 7 25 18 40

Move to Front Heuristic rec 19 56 2 7 25 18 40 rec 7 56 2 19 25 18 40 Move to Front แต่ละครั้งที่ search พบ ให้เลื่อน record นั้นขึ้นไปอยู่หน้าสุดของ list (ต้องเป็น linked list version) แนวคิด : ของอะไรที่ใช้แล้วมีแนวโน้มที่น่าจะถูกใช้อีกจึงเอามาไว้ข้างหน้า

Transposition Heuristic 19 56 2 7 25 18 ... 40 rec 19 56 7 2 25 18 ... 40 rec Transposition แต่ละครั้งที่ search พบ ให้สลับ record ที่ search พบขึ้นมาข้างหน้า 1 ตำแหน่ง แนวคิด : การใช้ครั้งเดียวไม่ได้แปลว่าจะใช้อีกครั้งหนึ่งเสมอไป แต่การสลับแบบนี้ หากใช้มากๆ ก็จะเลื่อนขึ้นมาอยู่ข้างหน้าเอง

Searching Unordered Table Sentinel Search Move to Front Transposition rec 19 56 2 7 25 18 ... 40 Sentinel Sentinel rec 19 56 2 7 25 18 40 rec 19 56 2 7 25 18 40 rec 7 56 2 19 25 18 40 19 56 2 7 25 18 ... 40 rec 19 56 7 2 25 18 ... 40 rec

Search Unordered Table Search Ordered Table Array List & Tree Search Searching Search Unordered Table Sentinel Search Move to Front Transposition Search Ordered Table Array List & Tree Search - Sequential Search (Linear Search) - Index Sequential Search - B-Tree - Binary Search Binary Search Tree - AVL (Hight Balanced) Tree Hashing - Heap

Sequential Search (Linear Search) 2 5 7 8 10 12 15 18 20 22 i h p O(n) Best Case 1 Worst Case n Avg Case (n+1)/2

Index Sequential Search B-Tree Order 5

2 5 7 8 10 12 15 18 20 22 O(log2 n) Binary Search a 2 1 r 10 12 18 20 1 2 3 4 5 6 7 8 9 a 2 5 7 8 10 12 15 18 20 22 2 1 binarySearch low = 1, high = dataSize   loop ( low <= high) mid = ( low + high ) / 2 if( a[ mid ] < target ) low = mid + 1 else if( a[ mid ] > x ) high = mid - 1 else low = hight + 1 end if end loop if (target == a[mid] return mid else return -1 binarySearch p = q = root   loop ( p is not null) if( target < p(data)) p = p->left; else if ( target > p(data)) p = p->right; else q = p p = null end if end loop if (target == q->data return q else return null r 10 12 18 20 5 7 2 8 22 15 O(log2 n)

Height-Balanced Tree, Heap 10 30 20 65 75 87 40 70 85 95 90 60 80 - \ / 45 55 50 x Short Side Long Side 21 13 31 24 65 26 32 16 68 19 Ascending heap (Min heap) Height Balanced Tree

Hashing concepts searches ก่อนๆ นี้ต้องเช็คเทียบหลายครั้งจึงพบหรือพบว่าไม่มี การเช็คเทียบแต่ละครั้ง เรียก probe ความต้องการของ hashing : ทำอย่างไรเราจะหาของได้ใน 1 probe ? จะรู้ได้อย่างไรว่ามันอยู่ที่ไหน ? มีของมาก เก็บอย่างไร ? เราต้องรู้ว่ามันอยู่ที่ไหน ต้องเก็บไว้เป็นที่ มีหลักการในการเก็บ

Hasing Function ตัวตนของแต่ละ record อยู่ที่ไหน ? อยู่ที่ key ของมัน ดังนั้นต้อง โยง key เข้ากับ ที่เก็บ (index) Hashing function key index hf(key) = index การโยง key ให้เป็นที่เก็บเรียก hashing algorithm ฟังก์ชั่นที่ใช้เรียกว่า hashing function เรา hash key ไปสู่ index Array ที่เก็บ records เรียก hash table.

Inserting & Retriving Data ถ้า key = index → สามารถ map ได้โดยตรง directly hf(key) = key key OtherData 1 2 CPU 3 ... จะ insert record key = 2 hash 2 ด้วย hashing function ได้ 2 hf(2) = 2 Insert record ใน slot index = 2 จะ retrieve record key = 2 hash 2 with ด้วย hashing function ได้ 2 hf(2) = 2 ไปหา record ใน slot index = 2 Hash table

hf(key) = key-54 01 1000 54091576 = 540 +915+76 hf(54 01 1004) = 4 Mapping Techniques Folding. แบ่ง key เป็นส่วนๆ summation(/subtraction/...) ส่วนนั้นๆ Modulo เพื่อให้อยู่ใน range Midsquare key2 หรือ part_of_key2 เอาตรงกลางมา 54011576 -> 576*576 = 331776 -> 177 54091576 = 540 +915+76 = 1531 = 531 //array size = 1000 Subtraction ถ้าทุก id นำหน้าด้วย 54011 Extraction เอาแค่บางส่วนของ key Summation, Division, ... hf(key) = key-54 01 1000 hf(54 01 1004) = 4 hf(54 01 1037) = 37 hf(54 01 1576) = 576 54 01 1576 -> 4156

(k[0] + 27 k[1] + 272 k[2]) % Tablesize Mapping String 1 - 2 Mapping String 1 Mapping String 2 (k[0] + 27 k[1] + 272 k[2]) % Tablesize string int string sum all ASCII chars int HashString1 k = address of first char HashVal = 0;   loop (*k != null) HashVal += *k++ endloop return HashVal mod TableSize HashString2 k = address of first char hv = (k[0]+27* k[1]+729* k[2]) % Tablesize; if (hv<0) // 27=26+blank return hv+= Tablesize else return hv end if ปัญหา: table ใหญ่ 10,000 => กระจาย distribute ไม่ดี ASCII 0-127, 8 chars => 127*8 =>[0-1,016] ถ้าคิด 26 ตัวไม่นับ blank คิดเฉพาะ 3 chars แรก ==> 17,576 combinations ==> แต่จริงๆแล้ว Eng. ไม่ random ดูตาม dic. ได้ 2,851 combinations = 28% (ของ 10,000) ดังนั้น table ใหญ่ ใช้ไม่เต็ม กระจายไม่ดี

Mapping String 3 Horner’s rule : Polynomial of 32 (324 k[0]+323k[1]+322k[2]+32k[3]+k[4]) % Tablesize int string HashString3 k = address of the rightmost char hv = 0; loop (*k != null) hv = (hv<<5) + *k++ end loop hv = hv % Tablesize return hv // hv<<1 = hv*2, // hv<<5=hv*25=hv*32 Mapping String 3 Horner’s rule : Polynomial of 32 if keysize = 5 iteration #1 : 32*0 + K[4] = K[4] iteration #2 : 32*K[4] + K[3] iteration #3 : 322*K[4] + 32*K[3] + K[2] iteration #4 : 323*K[4] + 322*K[3] + 32*K[2] + K[1] iteration #4 : 324*K[4] + 323*K[3] + 322*K[2] + 32*K[1] + K[0]

Mapping String string ยาวๆ ใช้เวลามาก ==> truncation 438 Washington NY = 438WaNY map -> array range

Collission, Synonym Collission เกิดเมื่อ hash แล้วได้ index ที่มีของอยู่แล้ว เช่น hf = (∑of all digits) mod 10 insert 2748 hash(2748) = 1 ว่าง ใส่ใน slot 1 ,, 2784 hash(2784) = 1 ไม่ว่าง collission ชน กับ 2748 ต้องหาที่เก็บใหม่ให้ Synonyms : 2748 และ 2784 เป็น synonyms set of keys ซึ่ง hash (map) ได้ค่าเดียวกัน ต้องหาที่เก็บ 2784 ใหม่ เพื่อแก้การชน Collission Resolutions Open Addressing Seperate Chainning Key OtherData ... 1 2748 2 3 .... 9 2784 ? (∑of all digits) mod 10 1 2748 2784

Preventing Collission Good Hashing Function อยู่ใน index range ==> mod tablesize ==> table size ควรเป็น prime. คำนวณ ง่าย รวดเร็ว กระจายดี กระจายทั่วถึง collision น้อย การคำนวณที่ใช้ทั้ง key แทนได้ดีกว่าที่ใช้บางส่วน

Collission Resolutions ... 1 2748 2 2784 3 7284 (∑of all digits) mod 10 1 2748 2784 7284 2784 Open Addressing (Closed Hashing) ที่เก็บใหม่อยู่ใน table เดิม ซึ่งแก้การชนไม่ได้ 100% เช่น2784 ชนกับ 2748 จึงหาที่ใหม่ให้ ในตัวอย่าง - ให้อยู่ถัดมา 1 ช่อง วิธีนี้เรียกว่า Linear Probing 7284 2784 2748 นอกจาก sorted(นิยม) linked list อาจใช้โครงสร้างอื่นได้ เช่น binary search tree hash table Seperate Chaining ที่เก็บใหม่อยู่นอก table เดิม แก้การชนได้ 100% ... 1 2748 2 1 2

Seperate Chaining (cont.) h(x) = x mod 10 Table size = 10 (not prime for simplicity) Load factor λ = จำนวน element ใน hash table / table size ในรูปตัวอย่าง λ = 10/10 = 1.0  จากการวิเคราะห์ : table size ไม่ค่อยสำคัญเท่าไหร่ ที่สำคัญคือ λ  general rule สำหรับ separate chaining hash table λ ~ 1 table size เป็น prime  ข้อเสียของ separate chaining คือ ใช้ linked list ซึ่งทำให้ช้าลง (allocate new node, implement 2nd data structure)  ข้อดี : 100% solved collission

Linear Probing ... 1 2151 2 2872 3 4553 4 9 1111 1111 array size = 10 probe ชนครั้งที่ i ลอง h(k) + f( i ) Linear Probing f(i) = i ลอง : h(k), h(k)+1, h(k)+2, h(k)+3,... Quadratic Probing f(i) = i2 ลอง : h(k), h(k)+1, h(k)+4, h(k)+9,... Rehash: hash อีกครั้งเพื่อให้ได้ที่ใหม่ h(1111) = 1 ชน probe sequence : 1, 1+1, 1+2, 1+3,... 1 2 3 ชน 4 ว่าง ทั้งหมด 4 probs ... 1 2151 2 2872 3 4553 4 9 hf(key) = key mod 10 1 ชน 1111 1+1 = 2 ชน 1+2 = 3 ชน 1+3 = 4 ว่าง 1111 Linear Probing การคำนวณง่าย search ง่าย มีแนวโน้มให้เกิด การกระจุกตัว (Clustering) ของ data -> collission array size = 10 (not prime for simplicity)

Quadratic Probing probe ชนครั้งที่ i ลอง h(k) + f( i ) Quadratic Probing f(i) = i2 ลอง : h(k), h(k)+1, h(k)+4, h(k)+9,... Linear Probing f(i) = i ลอง : h(k), h(k)+1, h(k)+2, h(k)+3,... h(1111) = 1 ชน probe sequence : 1, 1+1, 1+4, 1+9,... 1 2 5 ชน 10 mod 10 = 1 ว่าง ทั้งหมด 4 probs 1+9 = 10 mod 10 = 1 ว่าง ... 1 2151 2 2872 3 4 1544 5 1115 9 1111 hf(key) = key mod 10 1 ชน 1111 1+1 = 2 ชน 1+4 = 5 ชน Quadratic Probing มีการกระจาย(distributes) มากกว่า Linear Probing array size = 10 (not prime for simplicity)

Open Addressing (Closed Hashing) Open Addressing : พยายาม probing จนพบที่ว่าง สำหรับ key k 1st probe ลอง h(k) 2nd probe (ชนครั้งที่ 1) ลอง h(k) + f(1) 3rd probe (ชนครั้งที่ 2) ลอง h(k) + f(2) ith probe (ชนครั้งที่ i) ลอง h(k) + f( i ) ith probe ชนครั้งที่ i ลอง h(k) + f( i ) Linear Probing f(i) = i ลอง : h(k), h(k)+1, h(k)+2, h(k)+3,... Quadratic Probing f(i) = i2 ลอง : h(k), h(k)+1, h(k)+4, h(k)+9,... Double Hashing 2 hash functions

... 10 31 52 73 94 115 Primary Clustering Prob Sequences: Primary Clustering ปรากฎการณ์ที่ ครั้งแรกที่ชน hash คนละ key ไปตกที่คนละ slot แต่ต้องมาแย่งที่กันในที่สุดในการ rehash ครั้งถัดๆมา Solutions: ให้ rehash fn ขึ้นกับจำนวนครั้งที่ rehash ด้วย จะได้คนละ path เช่น Linear probing rhi = (h(k)+i) mod ... // rehash ครั้งที่ i ... 10 31 52 73 94 115 ← 21→ Primary Clustering: แย่ง slot 115 h(k) = (k+21) mod ... rh(i) = (i+21) mod ... //i = last hash value Prob Sequences: key 10 : 31 52 73 94 115 key 31 : 52 73 94 115 key 52 : 73 94 115 key 73 : 94 115 key 94 : 115 Linear Probing: ได้คนละ series ไม่แย่ง 115 กัน Prob Sequences: key 10 : 31 32 33 34 35 key 31 : 52 53 54 55 key 52 : 73 74 75 key 73 : 94 95 key 94 : 115

Secondary Clustering Double Hashing ปรากฎการณ์ที่ ครั้งแรกที่ชน hash คนละ key ไปตกที่ slot x เดียวกัน hash function ฟังก์ชั่นเดียว ใช้ค่า x ไปคำนวณที่เก็บใหม่ ได้ค่า series เดียวกันไปตลอด ต้องใช้ hash function ที่ 2 มาช่วยให้ไปตกที่ที่ใหม่ที่แตกต่างจาก hash function ที่ 1 เรียกวิธีนื้ว่า Double Hashing Double Hashing : 2 hash functions เช่น 1. ใช้ primary function i = h1(k) ถ้าไม่ว่าง rh(j, k) = (h1(k) + j * h2(k)) mod ... ไปเรี่อยๆ //เมื่อ rehash ครั้งที่ j ตราบใดที่ h2(k) ≠ h1(k) ไม่ collision อย่างไรก็ดี ไม่สามารถแก้ collision ได้ 100% แก้ 100% -> chaining

Primary & Secondary Clusterings Collission Resolutions Open Addressing (Closed Hashing) ที่เก็บใหม่อยู่ใน table เดิม ซึ่งแก้การชนไม่ได้ 100% Linear Probing, Quadratic Probing, ... แก้ได้เฉพาะ Primary Clustering Double Hashing แก้ Secondary Clustering ได้ Seperate Chainning ที่เก็บใหม่อยู่นอก table เดิม แก้การชนได้ 100% Primary Clustering ปรากฎการณ์ที่ ครั้งแรกที่ชน hash คนละ key ไปตกที่คนละ slot แต่ต้องมาแย่งที่กันในที่สุดในการ rehash ครั้งถัดๆมา Secondary Clustering ปรากฎการณ์ที่ ครั้งแรกที่ชน hash คนละ key ไปตกที่ slot x เดียวกัน hash function ฟังก์ชั่นเดียว ซึ่งใช้ค่า x ไปคำนวณที่เก็บใหม่ ได้ค่า series เดียวกันไปตลอด ต้องใช้ hash function ที่ 2 มาช่วยให้ไปตกที่ที่ใหม่ที่แตกต่างจาก hash function ที่ 1 เรียกวิธีนื้ว่า Double Hashing

Primary Clustering Solutions Primary Clustering ปรากฎการณ์ที่ ครั้งแรกที่ชน hash คนละ key ไปตกที่คนละ slot แต่ต้องมาแย่งที่กันในที่สุดในการ rehash ครั้งถัดๆมา Solutions: ให้ rehash fn ขึ้นกับจำนวนครั้งที่ rehash ด้วย จะได้คนละ path 1. Linear probing rhj = (h(k)+j) mod ... // rehash ครั้งที่ j key 10 : 31 32 33 34 key 31 : 52 53 54 55 2. rh(i, j) = (i + j) mod ... //rehash i ครั้งที่ j rh1 = (h(k) + 1) mod ... //rehash ครั้งที่ 1 rh2 = (rh1 + 2) mod ... //rehash ครั้งที่ 2 rh3 = (rh2 + 3) mod ... //rehash ครั้งที่ 3 key 10 : 31 32 34 37 key 31 : 52 53 55 58 * ทุกวิธีให้ path ที่ต่างกัน * ทุกวิธีไม่สามารถกำจัด secondary clustering ได้

Primary Clustering Solutions เมื่อ rehash ครั้งที่ j 3. Quadratic probing rhj = (h(k)+sqr(j))) mod ... key 10 : 31 32 35 40 key 31 : 52 53 56 61 4. rh(i,k) = (i + hkey) mod ... // เมื่อ hkey = 1+h(k) mod... 5. ใช้ random permutation ของเลขใดๆในช่วง 1..max p1, p2, p3, ... rhj = h(k) + pj) mod ...

Rehashing Rehashing ถ้า table แน่นเกินไปจะเริ่มทำให้แต่ละ operation ใช้เวลานาน และอาจ insert ไม่ได้สำหรับ open addressing แบบ quadratic แก้ได้โดย สร้าง table ขึ้นใหม่ ใหญ่ขึ้น 2 เท่า และนำ data จาก table เดิมทั้งหมดมา hash ใส่ table ใหม่ เรียกว่า rehashing (rehash อีกความหมายหนึ่งคือ hash อีกครั้งเมื่อ collission ) เมื่อใดบ้างที่ต้อง rehash ทันทีที่ table เต็ม เมื่อ insert ไม่ได้ (นโยบายเข้มงวด) table เต็มถึงระดับที่กำหนดไว้ (ถึงค่า load factor ที่กำหนด) (นโยบายเข้มงวดปานกลาง)

Rehashing Insert : 13, 15, 6, 24 Insert : 23 Over 70 % full 1 2 3 4 5 6 7 23 8 24 9 10 11 12 13 14 15 16 Rehashing สร้าง table ขึ้นใหม่ ขนาด 17 (ค่า prime ถัดไปที่ใหญ่ขึ้น 2 เท่า) insert data ใหม่ทั้งหมด ด้วย h(x) = x mod 17 แพง = O(n) 6 1 15 2 3 24 4 5 13 6 1 15 2 23 3 24 4 5 13 Insert : 13, 15, 6, 24 Insert : 23 Over 70 % full Rehashing h(x) = x mod 7, Linear Probing

54 70 61 83 15 34 = 5 = 0 = 6 = 1 Linear Probing h(key) = key mod 7 probe ชนครั้งที่ i ลอง h(k) + f( i ) Linear Probing f(i) = i ลอง : h(k), h(k)+1, h(k)+2, h(k)+3,... insert 1 54 2 70 61 83 15 34 54%7 3 70%7 61%7 83%7 15%7 34%7 = 5 4 = 0 = 6 = 1 5 6 probes: h(key) = key mod 7

54 72 61 33 70 = 5 = 2 = 1 = 0 Quadratic Probing h(key) = key mod 7 probe ชนครั้งที่ i ลอง h(k) + f( i ) Quadratic Probing f(i) = i2 ลอง : h(k), h(k)+1, h(k)+4, h(k)+9,... insert 1 54 2 72 61 33 70 54%7 3 72%7 61%7 1%7 33%7 70%7 = 5 4 = 2 = 1 = 0 5 6 probes: h(key) = key mod 7

70 83 54 61 15 34 = 5 = 0 = 6 = 1 Linear Probing h(key) = key mod 7 probe ชนครั้งที่ i ลอง h(k) + f( i ) Linear Probing f(i) = i ลอง : h(k), h(k)+1, h(k)+2, h(k)+3,... 70 insert 1 83 54 2 61 15 34 54%7 3 70%7 61%7 83%7 15%7 34%7 = 5 4 = 0 = 6 = 1 5 6 probes: h(key) = key mod 7

33 54 72 61 70 = 5 = 2 = 1 = 0 Quadratic Probing probe ชนครั้งที่ i ลอง h(k) + f( i ) Quadratic Probing f(i) = i2 ลอง : h(k), h(k)+1, h(k)+4, h(k)+9,... 33 insert 1 54 2 72 61 70 54%7 3 72%7 61%7 1%7 33%7 70%7 = 5 4 = 2 = 1 = 0 5 6 probes: Try : 5, 5+1=6, 5+4=9%7=2, 5+9=14%7=0 Try : 0, 0+1=1, 0+4=4, h(key) = key mod 7