`
欧阳晓
  • 浏览: 46605 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

挂链式---hash表的实现

阅读更多

 一、什么是hash表,它的作用?

简而言之:hash表就是将数据依特定算法直接指定到一个地址上。hashCode方法实际上返回的就是对象存储的物理地址。那你就会想到为什么不用数组和链表来存储这些数据呢?

先来看一下数组和链表他们的优势:

数组:对数据的查询的比较方便

链表:对数据进行插入和删除比较方便

而往往我们对数据同时要进行插入、删除、查找,这时候你就应该想到hash表的作用了,因为他的实现形式-----数组+链表。

二、实现hash表需要注意的地方

1、Hash冲突
2、衡量一个HASH
3、冲突因子
4、重新增加hash,重新散列
5、弱引用的回收

三、自己实现链式hash表的步骤:

1认识链式hash表的形式

 

如图:

    数组            链表

2、获得hash值

由于自己写出不同数据类型的hash值算法比较难,我们就调用JDK提供的hashCode()来计算hash值

3、添加新的元素

当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址(挂链法)。

4、删除一个元素

首先,判断元素的位置,分为在首位置、挂链上面。如果,在首位置就直接删除,而在挂链上的话,则需要遍历找到这个值再将其删除。

5、rehash

当元素的个数+5>hash长度的时候,就rehash

6、打印所有元素

7、性能测试

我的是与list比较同时插入1000000个数的速度快慢和查询一个元素的速度

写道
package cn.netjava.hash;
//节点类
public class Node {
private Object value;//节点的值
private Node next;//链表中指向下一结点的引用

public Node(Object value){this.value=value;}
//得到值
public Object getValue(){return value;}
//得到下一个节点
public Node getNext(){return next;}
//设置下一个节点
public void setNext(Node next){this.next=next;}
}

package cn.netjava.hash;

public class HashCode {
private Node[] HashList;//哈希链表
private int size=0; //数组的长度
private int Have=0; //元素个数

//构造方法的创建
public HashCode(int size){
HashList=new Node[size];
this.size=size;
}

//获得大小
public int getSize(){
return size;
}
//获得哈希编码
public int getHashCode(Object data){
return data.hashCode()*1024%size;
}
//增加元素
public void add(Object data){
int index=getHashCode(data);//得到hash码相应的下标
//创建新的节点
Node newN=new Node(data);
if(HashList[index]==null){
HashList[index]=newN;
}else{
//否则就加入到其下拉链表中
Node Next=HashList[index];
if(Next.getValue().equals(data)){
//重复则不添加
return;
}
while(Next.getNext()!=null){
//递归到最后为空的链表
if(Next.getValue().equals(data)){
//重复则不添加
return;
}
Next=Next.getNext();
}
Next.setNext(newN);//设置为其下拉链表
}
Have++;//统计元素个数
if(Have+5>size){
reHash();
}
}
//取得其中的一个数
public void find(Object data){
int index=getHashCode(data);
Node node=HashList[index];
while(node.getNext()!=null){
if(node!=null&&node.getValue().equals(data)){
System.out.println("查找成功!!!");
return;
}
}
}
//删除一个
public void remove(Object node){
int index=getHashCode(node);
//当在首节点的时候
if(HashList[index].getValue()==node){
if(HashList[index].getNext()==null){
HashList[index]=null;//没有挂链就直接移除
}else{
//有挂链
HashList[index]=HashList[index].getNext();
}
return;
}
//要删除的数在挂链中
Node temp=HashList[index];
Node last=null;
while(!temp.getValue().equals(node)&&temp!=null){
last=temp;
temp=temp.getNext();
}

if(temp!=null&&temp.getValue().equals(node)&&last!=null){
last.setNext(temp.getNext());
}
}
//再一次hash
public void reHash(){
Node[] TempList=HashList;
size=size*2;
HashList=new Node[size];
Have=0;
//在hash放入原来hashlist中去
for(int i=0;i<size/2;i++){
if(TempList[i]!=null){
add(TempList[i].getValue());
//加入挂链中的内容
while(TempList[i].getNext()!=null){
TempList[i]=TempList[i].getNext();
add(TempList[i].getValue());
}
}
}
}
//打印全部的出来
public void printAll(){
for(int i=0;i<size;i++){
Node temp=HashList[i];
while(temp!=null){
System.out.println(temp.getValue()+"-----"+temp.hashCode());
temp=temp.getNext();
}
}
}
}

package cn.netjava.hash;

import java.util.List;
import java.util.LinkedList;

public class Test {

public static void main(String[] args) {
HashCode code=new HashCode(100000);
Long startTime=System.currentTimeMillis();
for(int i=1;i<=100000;i++){
code.add(i*4);
}
Long endTime=System.currentTimeMillis();
System.out.println("hash insert time--->"+(endTime-startTime));
code.remove(12);
Long startTime2=System.currentTimeMillis();
code.find(24);
Long endTime2=System.currentTimeMillis();
System.out.println("hash find time--->"+(endTime2-startTime2));
//code.printAll();
System.out.println("-------华丽的分割线-------");
List<Integer> list = new LinkedList<Integer>();

Long startTime1=System.currentTimeMillis();
for(int i=1;i<=100000;i++){
list.add(i);
}
Long endTime1=System.currentTimeMillis();
System.out.println("list insert time--->"+(endTime1-startTime1));

Long startTime4=System.currentTimeMillis();
list.get(24);
Long endTime4=System.currentTimeMillis();
System.out.println("list get time--->"+(endTime4-startTime4));
}
}

 

       对hash的原理和运用还有深入!!!

 

  • 大小: 10.3 KB
  • 大小: 5.1 KB
2
5
分享到:
评论

相关推荐

    网站提供挂链

    【网站提供挂链】是指网站为用户或站长提供的一个服务,允许他们将自己的链接挂在网站上,以提升其网站的曝光度、流量或者搜索引擎排名。挂链通常被用作一种网络营销策略,通过与其他网站建立链接关系,可以提高自身...

    挂链工具

    在IT行业中,"挂链工具"通常指的是用于网站优化,特别是搜索引擎优化(SEO)的一类软件或服务。这类工具的主要功能是帮助用户管理和优化他们网站的外部链接,也就是我们常说的"外链"。外链对于提升网站的搜索引擎...

    FTP扫描工具挂链专用

    FTP扫描工具有时会被滥用,用于在未授权的情况下在FTP服务器上放置恶意链接,这种行为被称为黑帽SEO,会对被挂链的网站和网络环境带来负面影响。 为了有效利用FTP扫描工具,用户需要了解以下知识点: 1. **FTP协议...

    黑链专用ftp挂链工具

    为了实现这一目的,黑链操作者们常常借助各种辅助工具,其中包括所谓的"黑链专用ftp挂链工具"。 这种工具运用了FTP(File Transfer Protocol)协议,它是一种网络上常用的文件传输协议,能够允许用户远程管理服务器...

    FTP批量挂链工具 批量挂黒链

    FTP批量挂链工具是一种针对网站管理的工具,主要用于在多个FTP服务器上快速部署特定的链接代码,例如“黑链”。这种工具通常被用于SEO优化、网站推广或是非法的黑帽SEO活动,因为“挂黒链”指的是在网站上不透明地...

    SEO挂链工具SEO挂链工具

    SEO(Search Engine Optimization)挂链工具是用于提升网站在搜索引擎排名的一种辅助软件。它通过自动或半自动的方式在互联网上创建指向目标网站的链接,以此提高网站的可见性和权重。在SEO领域,链接被认为是投票,...

    电信设备-多功能移动手机挂链.zip

    2. **功能详解**:逐一解析挂链的各项功能,如SIM卡读取功能如何帮助用户在没有备用手机的情况下更换SIM卡,数据传输功能如何实现手机与其他设备的便捷互联,以及应急电源功能的容量和充电效率等。 3. **技术规格**...

    黑链工具包,全自动挂链,查链,PR查询,分类,自动补链

    黑链工具包,可以查询弱口令FTP,并实现全自动挂链,查链,PR查询,分类,掉链自动补链等等功能,是目前最好用,最稳定的黑链工具.

    批量扫描工具和批量挂链工具

    这是一种seo的工具,但不建议使用。望大家适量用吧。

    苹果FTP批量扫描,附带批量挂链软件

    FTP批量扫描技术是一种网络工具,主要用于自动化地查找和连接FTP服务器,从而实现快速搜索和管理大量FTP站点。在IT行业中,这项技术常被用于网站管理员、SEO专家或网络安全专业人士进行大规模的数据采集、备份或者...

    型芯烘干工(出装窑工)安全技术操作规程.docx

    - 吊运作业需两人协作,确保安全挂链。 - 禁止使用不安全的工具吊运工件。 - 避免在钢丝绳附近停留,防止断裂伤人。 - 吊运型芯时,链条应均匀分布。 - 及时替换有裂纹的型芯板或架子,防止事故。 - 清理烘干...

    ftp暴力破解 挂链工具

    ftp暴力破解 挂链工具 暴力破解功能异常强大 ,挂链工具有时候需要配合手动比较好,提高网站权重的必备shi

    网站SEO黑链智能收集批量挂链软件V6.16+注册机

    网站SEO黑链智能收集批量挂链软件V6.16+注册机

    FTP密探+批量挂链.zip

    FTP密探+批量挂链

    拷贝具有随机指针节点的链表,

    描述中提到的“挂链过程next易混易错”是指在构建新链表的过程中,正确连接next指针可能会出现混淆和错误。这通常是由于在处理随机指针的同时还要处理常规的next指针,需要仔细管理两个指针的关系,以避免逻辑上的...

    FTP密探%2B自动挂链完美破解

    FTP密探%2B自动挂链完美破解FTP密探%2B自动挂链完美破解

    批量扫描工具和批量挂链工具1

    它使得文件的上传变得简单快捷,进而实现了挂链操作的自动化。 然而,正如在描述中提到的“ftp 黑链”标签所示,所有提到的这些工具和技术在使用时都需要谨慎。所谓“黑链”通常指的是不道德或非法的链接策略,与...

    FTP挂链工具

    FTP挂链工具是一种用于在互联网上进行文件传输的软件应用,它使得用户能够方便地将本地计算机上的文件上传到远程服务器,或者从服务器下载文件到本地。FTP(File Transfer Protocol)是互联网上的一种标准协议,专门...

    大学生创新创业训练计划-项目申报书(仅供参考).doc

    项目通过创新产品“说不出的挂链”,利用环保材料记录并表达个人秘密,改善人际关系,传播正能量。 5. **项目内容与关键问题** - 研究内容:基于市场营销学理论,开发以水晶滴胶制作的个性化饰品,如项链、手链等...

    苹果FTP批量查链挂链工具

    苹果FTP批量查链挂链工具是一款专为苹果用户设计的高效工具,主要用于自动化地检查FTP服务器的连接状态和挂链情况。在IT行业中,FTP(File Transfer Protocol)是一种广泛使用的网络协议,允许用户通过网络传输文件...

Global site tag (gtag.js) - Google Analytics