自己实现一个简单的散列表
来源:互联网 发布:代理商查询系统源码 编辑:程序博客网 时间:2024/06/07 15:33
需求
自己实现一个简单的散列表,使用平方探测(quadratic probing).
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
代码
import java.util.StringJoiner;public class QuadraticProbingHashTable<T> { public QuadraticProbingHashTable() { this(DEFAULT_TABLE_SIZE); } public QuadraticProbingHashTable(int size) { allocateArray(size); makeEmpty(); } private void makeEmpty() { currentSize = 0; for (int i = 0; i < array.length; i++) { array[i] = null; } } public int size() { return currentSize; } public boolean isEmpty() { return currentSize == 0; } public boolean contains(T t) { int currentPos = findPos(t); return isActive(currentPos); } public void insert(T t) { int currentPos = findPos(t); if (isActive(currentPos)) return; array[currentPos] = new HashEntry<T>(t); currentSize++; if (currentSize > array.length / 2) rehash(); } private void rehash() { HashEntry<T>[] oldArray = array; allocateArray(nextPrime(oldArray.length * 2)); currentSize = 0; for (int i = 0; i < oldArray.length; i++) { if (oldArray[i] != null && oldArray[i].isActive) { insert(oldArray[i].element); } } } public void remove(T t) { int currentPos = findPos(t); if (isActive(currentPos)){ array[currentPos].isActive = false; currentSize--; } } @Override public String toString() { StringJoiner joiner = new StringJoiner(", ", "[", "]"); for (int i = 0; i < array.length; i++) { if (array[i] != null && array[i].isActive) { joiner.add(array[i].element.toString()); } } return joiner.toString(); } private static class HashEntry<T> { T element; boolean isActive; public HashEntry(T element) { this(element, true); } public HashEntry(T element, boolean isActive) { this.element = element; this.isActive = isActive; } } private static final int DEFAULT_TABLE_SIZE = 11; private HashEntry<T>[] array; private int currentSize; @SuppressWarnings("unchecked") private void allocateArray(int size) { array = new HashEntry[nextPrime(size)]; } private boolean isActive(int currentPose) { return array[currentPose] != null && array[currentPose].isActive; } private int findPos(T t) { int offset = 1; int currentPos = myhash(t); while (array[currentPos] != null && !array[currentPos].element.equals(t)) { currentPos += offset; offset += 2; if (currentPos >= array.length) currentPos -= array.length; } return currentPos; } private int myhash(T t) { int hashVal = t.hashCode(); hashVal %= array.length; if (hashVal < 0) hashVal += array.length; return hashVal; } private static int nextPrime(int n) { if (n % 2 == 0) n++; while (!isPrime(n)) n += 2; return n; } private static boolean isPrime(int n) { if (n == 2 || n == 3) return true; if (n == 1 || n % 2 == 0) return false; for (int i = 3; i * i <= n; i += 2) if (n % i == 0) return false; return true; }}
阅读全文
1 0
- 自己实现一个简单的散列表
- 初识kotlin,实现一个简单的列表
- 自己实现一个简单的布谷鸟散列
- 自己写的一个hibernate简单实现
- 自己实现一个简单的Promise
- 自己实现一个最简单的数据库
- 自己实现一个最简单的数据库
- 自己实现一个最简单的数据库
- 自己实现一个简单版的HashMap
- 自己实现一个简单的ftp软件
- 自己实现一个简单的AVL树
- 自己实现一个简单的RPC框架
- 自己实现一个简单的读写锁
- 自己实现一个简单的ArrayList
- 散列表的简单实现
- 自己实现一个简单数据库
- 实现一个最简单图片列表所引发的问题
- bones脚本篇 - 实现一个简单的列表
- 安卓上裁剪m4a | 铃声是怎么制作出来的
- 1006换个格式输出整数 (15)
- pythonWeb -- Django开发- 模型Model 和 数据库的操作
- 203. Remove Linked List Elements(Java)
- 高级表单与表格、BFC研究
- 自己实现一个简单的散列表
- PoEdu_Python_Lesson010_类的特性
- 简析设计模式之策略模式
- 如何判断JVM是运行在Client模式还是Server模式?
- tf-idf关键词提取算法
- 【MySQL】(2)MySQL基础语法
- 精彩的网文汇总分享
- 2017.07.22工作日记
- Python学习04_图像数据类型及颜色空间转换