Rehashing

来源:互联网 发布:淘宝话费红包怎么用 编辑:程序博客网 时间:2024/06/08 04:04

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=3, capacity=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=3, capacity=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.

java

/** * Definition for ListNode * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    /**     * @param hashTable: A list of The first node of linked list     * @return: A list of The first node of linked list which have twice size     */        public ListNode[] rehashing(ListNode[] hashTable) {        // write your code here        if (hashTable == null || hashTable.length == 0) {            return hashTable;        }        List<Integer> list = new ArrayList<>();        for (int i = 0; i < hashTable.length; i++) {            ListNode n = hashTable[i];            while (n != null) {                list.add(n.val);                n = n.next;            }        }        ListNode[] arr = new ListNode[2 * hashTable.length];        for (int i = 0; i < list.size(); i++) {            int temp = hashcode(list.get(i), 2 * hashTable.length);            if (arr[temp] == null) {                arr[temp] = new ListNode(list.get(i));            } else {                ListNode node = arr[temp];                while (node.next != null) {                    node = node.next;                }                node.next = new ListNode(list.get(i));            }        }        return arr;    }    private int hashcode(int key, int capacity) {        if (key >= 0) {            return key % capacity;        } else {            return (key % capacity + capacity) % capacity;        }    }}

优化后的一种做法

/** * Definition for ListNode * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    /**     * @param hashTable: A list of The first node of linked list     * @return: A list of The first node of linked list which have twice size     */        public ListNode[] rehashing(ListNode[] hashTable) {        // write your code here        if (hashTable == null || hashTable.length == 0) {            return hashTable;        }        ListNode[] arr = new ListNode[hashTable.length * 2];        for (int i = 0; i < hashTable.length; i++) {            ListNode node = hashTable[i];            if (node == null) {                continue;            } else {                while (node != null) {                    int temp = hashcode(node.val, hashTable.length * 2);                    if (arr[temp] == null) {                        arr[temp] = new ListNode(node.val);                    } else {                        ListNode n = arr[temp];                        while (n.next != null) {                            n = n.next;                        }                        n.next = new ListNode(node.val);                    }                    node = node.next;                }            }        }        return arr;    }    private int hashcode(int key, int capacity) {        if (key >= 0) {            return key % capacity;        } else {            return (key % capacity + capacity) % capacity;        }    }}
原创粉丝点击