zoukankan      html  css  js  c++  java
  • opendressinghash //use resize array

      1 public class opendressinghash<Key, Value> {
      2         private static final int INIT_CAPACITY = 4;
      3 
      4         private int n;          
      5         private int m;          
      6         private Key[] keys;      
      7         private Value[] vals;   
      8 
      9         public opendressinghash() {
     10             this(INIT_CAPACITY);
     11         }
     12 
     13         public opendressinghash(int capacity) {
     14             m = capacity;
     15             n = 0;
     16             keys = (Key[])   new Object[m];
     17             vals = (Value[]) new Object[m];
     18         }
     19 
     20        
     21         public int size() {
     22             return n;
     23         }
     24 
     25         
     26         public boolean isEmpty() {
     27             return size() == 0;
     28         }
     29 
     30        
     31         public boolean contains(Key key) {
     32             if (key == null) throw new NullPointerException("argument to contains() is null");
     33             return get(key) != null;
     34         }
     35 
     36        
     37         private int hash(Key key) {
     38             return (key.hashCode() & 0x7fffffff) % m;
     39         }
     40 
     41      
     42         private void resize(int capacity) {
     43             opendressinghash<Key, Value> temp = new opendressinghash<Key, Value>(capacity);
     44             for (int i = 0; i < m; i++) {
     45                 if (keys[i] != null) {
     46                     temp.put(keys[i], vals[i]);
     47                 }
     48             }
     49             keys = temp.keys;
     50             vals = temp.vals;
     51             m    = temp.m;
     52         }
     53 
     54         
     55         public void put(Key key, Value val) {
     56             if (key == null) throw new NullPointerException("first argument to put() is null");
     57 
     58             if (val == null) {
     59                 delete(key);
     60                 return;
     61             }
     62 
     63          
     64             if (n >= m/2) resize(2*m);
     65 
     66             int i;
     67             for (i = hash(key); keys[i] != null; i = (i + 1) % m) {
     68                 if (keys[i].equals(key)) {
     69                     vals[i] = val;
     70                     return;
     71                 }
     72             }
     73             keys[i] = key;
     74             vals[i] = val;
     75             n++;
     76         }
     77 
     78         public Value get(Key key) {
     79             if (key == null) throw new NullPointerException("argument to get() is null");
     80             for (int i = hash(key); keys[i] != null; i = (i + 1) % m)
     81                 if (keys[i].equals(key))
     82                     return vals[i];
     83             return null;
     84         }
     85 
     86       
     87         public void delete(Key key) {
     88             if (key == null) throw new NullPointerException("argument to delete() is null");
     89             if (!contains(key)) return;
     90 
     91             // find position i of key
     92             int i = hash(key);
     93             while (!key.equals(keys[i])) {
     94                 i = (i + 1) % m;
     95             }
     96 
     97             // delete key and associated value
     98             keys[i] = null;
     99             vals[i] = null;
    100 
    101             // rehash all keys in same cluster
    102             i = (i + 1) % m;
    103             while (keys[i] != null) {
    104                 // delete keys[i] an vals[i] and reinsert
    105                 Key   keyToRehash = keys[i];
    106                 Value valToRehash = vals[i];
    107                 keys[i] = null;
    108                 vals[i] = null;
    109                 n--;
    110                 put(keyToRehash, valToRehash);
    111                 i = (i + 1) % m;
    112             }
    113 
    114             n--;
    115 
    116             // halves size of array if it's 12.5% full or less
    117             if (n > 0 && n <= m/8) resize(m/2);
    118 
    119             assert check();
    120         }
    121 
    122      
    123        
    124         private boolean check() {
    125 
    126             // check that hash table is at most 50% full
    127             if (m < 2*n) {
    128                 System.err.println("Hash table size m = " + m + "; array size n = " + n);
    129                 return false;
    130             }
    131 
    132             // check that each key in table can be found by get()
    133             for (int i = 0; i < m; i++) {
    134                 if (keys[i] == null) continue;
    135                 else if (get(keys[i]) != vals[i]) {
    136                     System.err.println("get[" + keys[i] + "] = " + get(keys[i]) + "; vals[i] = " + vals[i]);
    137                     return false;
    138                 }
    139             }
    140             return true;
    141         }
    142 
    143 
    144      
    145     
    146     }
  • 相关阅读:
    Uploader 文件上传
    filters过滤器的使用
    Calendar中遇到的问题
    中科院之旅
    Python基础教程:列表推导式详解
    不会也要知道的,Python四种实现排序的方法
    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
    2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
    求协方差
    国外卡组织的 交换费-interchangefee(发卡行服务费) 和 银联对比
  • 原文地址:https://www.cnblogs.com/wujunde/p/6986641.html
Copyright © 2011-2022 走看看