码迷,mamicode.com
首页 > 其他好文 > 详细

Rehashing

时间:2016-07-23 07:27:57      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

The size of the hash table is not determinate at the very beginning. If the total size of keys is too large (e.g. size >= capacity / 10), we should double the size of the hash table and rehash every keys. Say you have a hash table looks like below:

size=3capacity=4

[null, 21, 14, null]
       ↓    ↓
       9   null
       ↓
      null

The hash function is:

int hashcode(int key, int capacity) {
    return key % capacity;
}

here we have three numbers, 9, 14 and 21, where 21 and 9 share the same position as they all have the same hashcode 1 (21 % 4 = 9 % 4 = 1). We store them in the hash table by linked list.

rehashing this hash table, double the capacity, you will get:

size=3capacity=8

index:   0    1    2    3     4    5    6   7
hash : [null, 9, null, null, null, 21, 14, null]

Given the original hash table, return the new hash table after rehashing .

 Notice

For negative integer in hash table, the position can be calculated as follow:

  • C++/Java: if you directly calculate -4 % 3 you will get -1. You can use function: a % b = (a % b + b) % b to make it is a non negative integer.
  • Python: you can directly use -1 % 3, you will get 2 automatically.
Example

Given [null, 21->9->null, 14->null, null],

return [null, 9->null, null, null, null, 21->null, 14->null, null]

 1 /**
 2  * Definition for ListNode
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     /**
14      * @param hashTable: A list of The first node of linked list
15      * @return: A list of The first node of linked list which have twice size
16      */    
17     public ListNode[] rehashing(ListNode[] hashTable) {
18         if (hashTable == null || hashTable.length == 0) return hashTable;
19         
20         ListNode[] newHT = new ListNode[hashTable.length * 2];
21         
22         for (int i = 0; i < hashTable.length; i++) {
23             ListNode current = hashTable[i];
24             while (current != null) {
25                 ListNode next = current.next;
26                 current.next = null;
27                 add(newHT, current);
28                 current = next;
29             }
30         }
31         return newHT;
32     }
33     
34     public void add(ListNode[] hashTable, ListNode node) {
35         int index = node.val % hashTable.length;
36         if (index < 0) {
37             index = hashTable.length + index;
38         }
39         if (hashTable[index] == null) {
40             hashTable[index] = node;
41         } else {
42             ListNode current = hashTable[index];
43             while (current.next != null) {
44                 current = current.next;
45             }
46             current.next = node;
47         }
48     } 
49 };

 

Rehashing

标签:

原文地址:http://www.cnblogs.com/beiyeqingteng/p/5697757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!