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     }
时间: 2024-10-05 22:33:48

opendressinghash //use resize array的相关文章

二叉堆

容易证明: 一棵高为h的完全二叉树有2^h 到 2^(h+1)-1个结点. 这就意味着,完全二叉树的高是[logN] 特点: 任意位置i: 左儿子在位置2i上,右儿子在位置2i+1上,父亲在i/2上 一个堆数据结构将由一个Comparable数组和一个代表当前堆的大小的整数组成: 优先队列的接口: 1 template <typename Comparable> 2 class BinaryHeap 3 { 4 public: 5 explicit BinaryHeap ( int capac

QString,QByteArray和QBitArray之间的转换

1:QBitArray2QString :也可以转化为整型, 测试程序: 测试输出结果是否和移位结果相同: [cpp] view plaincopyprint? QBitArray x; int bit; bit = 10; x.resize(32); x.fill(false); x.setBit(bit,true); QBitArray b; b = this->BitArrayInvert(x); ui->textEdit->setPlainText(this->bitArr

算法Sedgewick第四版-第1章基础-018一解决不能声明泛型数组的两咱方法(强转或反射)

1. 1 /****************************************************************************** 2 * Compilation: javac ResizingArrayStackWithReflection.java 3 * Execution: java ResizingArrayStackWithReflection < input.txt 4 * Dependencies: StdIn.java StdOut.jav

算法-MergeSort

1 #include <iostream> 2 #include <vector> 3 #include <iterator> 4 5 using namespace std; 6 7 int COMPARE_COUNT = 0; 8 9 void merge_sort(vector<int> &array, vector<int> &aux, int lo, int hi) 10 { 11 if ( lo >= hi )

优先队列(堆)的7种操作

1.优先队列有两项基本操作:插入(insert)和删除最小项(deleteMin),后者的工作是找出.返回和删除优先队列中最小的元素.而insert操作则等价于enqueue(入队),deleteMin则等价于dequeue(出队).补充:C++提供2个版本的deleteMin,一个删除最小项,另一个在删除最小项的同时在通过引用传递的对象中存储所删除的值. 2.优先队列的类接口 template <typename Comparable> class BinaryHeap { public:

PrincetonAlgorithm I - Assignment2 Deques and Randomized Queues

Programming Assignment2 - Deque and Randomized Queues Review Assignment Specification 课程笔记 Subtext: Modular Programming Stacks and Queues are fundamental data types Value: collection of objects Basic Operation: insert, remove, iterate. Difference: wh

matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量等内容)

MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] 等差数列 ymap = repmat( linspace( -regionH/2, regionH/2, regionH)', 1, regionW); %转置 %compute the angle of the vector p1-->p2 vecp1p2 = labelData(2,:) -

数据结构--优先队列(堆排序)

数据结构--优先队列(堆排序) 优先队列:不是先进先出啦,下面的代码是大顶堆,大的先出. 在之前理解堆排序的基础上,在来理解优先队列. 还是用这个公式: leftNo = parentNo*2+1 rightNo = parentNo*2+2 parentNo = (nodeNo-1)/2 每次进队列是从最后进,在慢慢上浮. 每次出队列,堆顶先出,在把队尾调到堆顶,在下浮. 上代码 package sy181002; import java.util.Arrays; /** * 优先队列 * *

数据结构( Pyhon 语言描述 ) &mdash; &mdash;第9章:列表

概念 列表是一个线性的集合,允许用户在任意位置插入.删除.访问和替换元素 使用列表 基于索引的操作 基本操作 数组与列表的区别 数组是一种具体的数据结构,拥有基于单个的物理内存块的一种特定的,不变的实现. 列表是一种抽象的数据类型,可以由各种方式表示,数组只是其中一种方式 基于内容的操作 基本操作 基于位置的操作 相对于游标位置执行,这个操作允许程序员在通过移动游标在列表中导航.其可通过列表迭代器来实现 列表迭代器是附加到列表的后备储存 列表迭代器游标的位置 第一项之前 相领两项之间 最后一项之