博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Rehashing
阅读量:4592 次
发布时间:2019-06-09

本文共 2888 字,大约阅读时间需要 9 分钟。

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   7hash : [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 list15      * @return: A list of The first node of linked list which have twice size16      */    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 };

 

转载于:https://www.cnblogs.com/beiyeqingteng/p/5697757.html

你可能感兴趣的文章
C#中怎样实现序列化和反序列化
查看>>
计算机网络(谢希仁版)——第二章回顾
查看>>
月薪20K的程序员整理的C语言的学习笔记,值得学习!
查看>>
Swing应用开发实战系列之二:设计日期选择面板窗口
查看>>
Swing应用开发实战系列之一:自定义JdbcTemplate
查看>>
Java随笔一:String类中方法split
查看>>
(转)使用LVS实现负载均衡原理及安装配置详解
查看>>
01整数规划
查看>>
a recipe kindly provided by Dimas for kikuchi
查看>>
icon design隐私条款
查看>>
移动端开发
查看>>
3. Elements of a Test Plan
查看>>
通过NuGet获取sqlite对应的.net的dll
查看>>
用户和用户组,以及文件和文件夹的权限
查看>>
H5 基于Web Storage 的客户端留言板
查看>>
linux添加字体
查看>>
Fastjson是一个Java语言编写的高性能功能完善的JSON库。
查看>>
一篇和Redis有关的锁和事务的文章
查看>>
delphi验证手机号码地址的正则表达式验证function
查看>>
sublime 我的快捷键
查看>>