分离链接法:
public class SeparateChainingHashTable<AnyType>{
private static final int DEFAULT_TABLE_SIZE=101;
private List<AnyType> []theLists;
private int currentSize;

public SeparateChainingHashTable()
{this(DEFAULT_TABLE_SIZE);}

public SeparateChainingHashTable(int size){
theLists=new LinkedList[nextPrime(size)];
for(int i=0;i<theLists.length;i++)
theLists[i]=new LinkedList<AnyType>();
}

public void makeEmpty(){
for(int i=0;i<theLists.length;i++)
theList[i].clear();
current=0;
}

public boolean contains(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
return whichList.contains(x);
}

public void insert(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
if(!whichList.contains(x)){
whichList.add(x);
if(++currentSize>theLists.length)
rehash();
}
}

public void remove(AnyType x){
List<AnyType> whichList=theLists[myhash(x)];
if(whichList.contains(x)){
whichList.remove(x);
currentSize--;
}
}

public void rehash(){
List<AnyType> [] oldLists=theLists;
theList=new List[nextPrime(2*theList.length)];
for(int j=0;i<theList.length;j++)
theList[i]=new LinkedList<AnyType>();
currentSize=0;
for(int i=0;i<oldLists.length;i++)
for(AnyType item:oldLists[i])
insert(item);
//这里调用的自己写的类的insert方法,而不是对oldList对象进行add
}
}

public int myhash(AnyType x){
int hashVal=x.hashCode();
hashVal=hashVal%theLists.length;
if(hashVal<0)
hashVal=hashVal+theLists.length;
return hashVal;
}
---------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
平方探测:

public class QuadraticProbingHashTable<AnyType>{
private static final int DEFAULT_TABLE_SIZE=11;
private HashEntry<AnyType> [] array;
private int currentSize;

public static class HashEntry<AnyType>{
public AnyType element;
public boolean isActive;
public HashEntry(AnyType e)
{this(e,true);}
public HashEntry(AnyType e,boolean i)
{element=e;isActive=i;}
}

public QuadraticProbingHashTable()
{this(DEFAULT_TABLE_SIZE);}

public QuadraticProbingHashTable(int size)
{allocateArray(size);makeEmpty();}

public void allocateArray(int arraysize)
{array=new HashEntry(arraysize);}

public void makeEmpty(){
currentSize=0;
for(int i=0;i<array.length;i++)
array[i]=null;
}

public boolean contains(AnyType x){
int currentPos=findPos(x);
return isActive(currentPos);
}

public int findPos(AnyType x){
int offset=1;
int currentPos=myhash(x);
//使用平方探测法进行散列
while(array[currentPos]!=null&&
!array[currentPos].element.equal(x)){
currentPos=currentPos+offset;
offset=offset+2;
if(currentPos>array.length)
currentPos=currentPos-array.length;
}
return currentPos;
}

public boolean isActive(int currentPos){
return array[currentPos]!=null&&
array[currentPos].isActive;
}

public void insert(AnyType x){
int currentPos=findPos(x);
if(isActive(currentPos))
return;
array[currentPos]=new HashEntry<AnyType>(x,true);
if(++currentSize>array.length/2)
rehash();
}

private void rehash(){
HashEntry<AnyType> []oldArray=array;
allocateArray(nextPrime(2*oldArray.length))
currentSize=0;
for(int i=0;i<oldArray.length;i++)
if(oldArray[i]!=null&&oldArray[i].isActive)
insert(oldArray[i].element);
}

public void remove(AnyType x){
int currentPos=findPos(x);
if(isActive(currentPos))
array[currentPos].isActive=false;
}

}

关于hash冲突的解决的更多相关文章

  1. hash 冲突及解决办法。

    hash 冲突及解决办法. 关键字值不同的元素可能会映象到哈希表的同一地址上就会发生哈希冲突.解决办法: 1)开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列.沿 ...

  2. Hash冲突的解决--暴雪的Hash算法

    Hash冲突的解决--暴雪的Hash算法https://usench.iteye.com/blog/2199399https://www.bbsmax.com/A/kPzOO7a8zx/

  3. Cuckoo Hash——Hash冲突的解决办法

    参考文献: 1.Cuckoo Filter hash算法 2.cuckoo hash 用途: Cuckoo Hash(布谷鸟散列).问了解决哈希冲突的问题而提出,利用较少的计算换取较大的空间.占用空间 ...

  4. Hash冲突的解决方法

    虽然我们不希望发生冲突,但实际上发生冲突的可能性仍是存在的.当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时.冲突就难免会发 生.另外,当关键字的实际取值大于哈希表的长度时,而且表中 ...

  5. Hash冲突以及解决

    哈希函数:它把一个大范围的数字哈希(转化)成一个小范围的数字,这个小范围的数对应着数组的下标.使用哈希函数向数组插入数据后,这个数组就是哈希表. 冲突 当冲突产生时,一个方法是通过系统的方法找到数组的 ...

  6. hash冲突解决和javahash冲突解决

    其实就是四种方法的演变 1.开放定址法 具体就是把数据的标志等的对长度取模 有三种不同的取模 线性探测再散列 给数据的标志加增量,取模 平方探测再散列 给数据的标志平方,取模 随机探测再散列 把数据的 ...

  7. Map之HashMap的get与put流程,及hash冲突解决方式

    在java中HashMap作为一种Map的实现,在程序中我们经常会用到,在此记录下其中get与put的执行过程,以及其hash冲突的解决方式: HashMap在存储数据的时候是key-value的键值 ...

  8. hash冲突随笔

    一:hash表 也叫散列表,以key-value的形式存储数据,就是将需要存储的关键码值通过hash函数映射到表中的位置,可加快访问速度. 二:hash冲突 如果两个相同的关键码值通过hash函数映射 ...

  9. 链表法解决hash冲突

    /* @链表法解决hash冲突 * 大单元数组,小单元链表 */ #pragma once #include <string> using namespace std; template& ...

随机推荐

  1. python基础 - 元组操作

    元组 tuple 元组是不可变对象. 元组初始化 t = tuple() t = () t = tuple(range(1,7,2)) t = (1,2,3,4,5,1) t = (1,) t = ( ...

  2. 深入理解Java的堆内存和线程内存

    我们都知道Java对象都是在堆中创建的(开启逃逸分析的情况除外),比如一个线程中有一段这样的代码: public class A{ public int xxx; } 通过A a = new A(); ...

  3. 寒假集训——搜索 B - Sudoku

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream&g ...

  4. CF 932E Team Work

    原题题面 题目大意:求\(\sum\limits_{i=0}^{n}C_{n}^{i}i^{k}\). 我们根据套路\(n^{k}=\sum\limits_{i=0}^{k}C_{n}^{i}i!S_ ...

  5. 全文索引搜索whoosh

    问题 Whoosh是python中解决索引查找的模块,在讨论索引查找的文章已经对有关索引查找进行了阐述,此处具体说明Whoosh模块的应用. 思路说明 Whoosh的安装 这里有具体内容(链接被被阉割 ...

  6. luogu P4146 序列终结者

    嘟嘟嘟 这是一道splay基础题. 最坑的一点是,因为有些节点可能没有左儿子或右儿子,所以必须把t[0].Max赋成-INF! 因为这个调了半天,看来回头复习复习splay是对的-- #include ...

  7. 分布式服务化系统一致性(分布式事务、ACID、BASE、CAP)原理与解决方案

    https://blog.csdn.net/rickiyeat/article/details/70224722

  8. 【转】玩玩你的Windows防火墙——穿透与防御

    前言:在防火墙专区,我经常看见朋友们讨论,“某某防火墙的性能如何”,亦或是,“某某防火墙的防御能力如何”.实际上,一个防火墙所履行的基本职责便是“网络访问控制”,即放行我们允许的通信,阻止我们未允许的 ...

  9. curl实例-通过新浪股票接口获取股票信息

    在学习curl的过程中,我们知道curl是相当于一个简单的浏览器,通过往对应的服务上面发送数据信息,返回服务器的响应结果,这个在Java里面主要是使用封装好的httpclient来进行操作,但是自己认 ...

  10. Windows下面安装并运行composer的步骤

    在composer官网下载得到:https://getcomposer.org/download/ Composer-Setup.exe 安装时注意:安装过程中,会提示你选择php安装目录.一直到ph ...