- 浏览: 205198 次
- 性别:
- 来自: 长沙
最新评论
-
螺旋懒虫:
原本是想自己画点阵的,一来画的不标准,也不好解析(用excel ...
超级详细解析——字模 -
螺旋懒虫:
这个程序解决了我怎么加载点阵字库文件的问题,和怎么去拿到汉字对 ...
超级详细解析——字模 -
慕容墨风:
你好,我用你的测试程序发现数字提取不了
超级详细解析——字模 -
文之若素:
求代码,我最近在学这个,公司需要,呜呜呜,159374403 ...
初学EXTJS做的系统界面 -
csrhlu:
为什么我压缩之后文件还变大了呢? 而且解压eclipse下边会 ...
自己动手写压缩软件,超详细解释(哈夫曼实现)
前些天一直在纠结的 挂链 Hash表 趁着今天中午的时间 终于把其实现了。
总所周知的
两种线性结构的存储数据结构 链表 数组
两者的优点:
链表 对所存储的元素需要经常增加删除的,这个结构使用起来比较方便
数组 对经常需要对元素查询的,使用就方便,直接使用下标就可以了。
那问题是有没有结合两者优点的东西呢,有~!那就是HASH表
Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
挂链如下图所示:
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址(我所采用的是 其中的一种解决冲突的方法 挂连法)。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
package lesson1;
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()*32767%size;
}
//增加元素
public void add(Object data){
int index=getHashCode(data);//得到哈希码对应的元素下标
//创建新的节点
Node newN =new Node(data);
if(HashList[index]==null){//哈希数组的index为空
HashList[index]=newN;
}else{//否则就加入到其的下拉链表中
Node Next=HashList[index];
if(Next.getData().equals(data)){//重复则不添加了
return ;
}
while(Next.getNext()!=null){//递归找到最后为空的下来链表
if(Next.getData().equals(data)){//重复则不添加了
return ;
}
Next=Next.getNext();
}
Next.setNext(newN);//设置为其的下拉链表。即拉链法的核心
}
Have++;//统计元素个数
if(Have+5>size){
reHash();//再次哈希,降低冲突
}
}
//删除一个
public void remove(Object node){
int index=getHashCode(node);
if(HashList[index].getData()==node){//在首节点的情况
if(HashList[index].getNext()==null){
HashList[index]=null;//没有挂链的就直接移除了
}else{//有挂链
HashList[index]=HashList[index].getNext();
}
return ;
}
//要删除的在拉链中
Node temp = HashList[index];
Node last = null;
//boolean flag=false;
while(!temp.getData().equals(node)&&temp!=null){
last=temp;
temp=temp.getNext();
}
if(temp!=null&&temp.getData().equals(node)&&last!=null){
last.setNext(temp.getNext());
}
}
//再次哈希
public void reHash(){
Node[] TempList = HashList;
size = size *2;
HashList=new Node[size];
Have=0;
//在哈希放入原HashList中去
for (int i=0;i<size/2;i++){
if(TempList[i]!=null){
add(TempList[i].getData());
//加入挂链中的内容
while(TempList[i].getNext()!=null){
TempList[i]=TempList[i].getNext();
add(TempList[i].getData());
}
}
}
}
//打印全部的出来
public void printAll(){
for (int i=0;i<size;i++){
Node temp =HashList[i];
while(temp!=null){
System.out.println(temp.getData());
temp=temp.getNext();
}
}
}
}
//节点的定义
class Node{
private Object data;//节点的值
public Node next;//下一个节点
public Node(Object data){
this.data=data;
}
//得到值
public Object getData(){
return data;
}
//得到下一个节点
public Node getNext(){
return next;
}
//设置下一个
public void setNext(Node next){
this.next=next;
}
}
输入数据测试:
package lesson1;
public class hashMain {
public static void main(String[] args){
HashCode code = new HashCode(10);
code.add(10);
code.add(20);
code.add(1);
code.add(2);
code.add(3);
code.add(4);
code.add(5);
code.add(6);
code.add(7);
code.add(8);
code.add(9);
code.add(11);
code.add(11);
code.add(11);
code.add(11);
code.remove(20);
code.printAll();
}
}
得到:
3 6 9 1 4 7 10 2 5 8 11
效率是绝对是比链表高的,
感兴趣的可以自己测试下。
Hash表 在追求效率方便还是有比较大的用处的。
本人也是刚刚接触这个东西,有什么不足请大家多多指教~
评论
2. 这个方法可能会返回负数
public int getHashCode(Object data){ return data.hashCode()*32767%size; }
3. 得注意放入对象的hashCode及equals方法
2. 这个方法可能会返回负数
public int getHashCode(Object data){ return data.hashCode()*32767%size; }
3. 得注意放入对象的hashCode及equals方法
发表评论
-
《动感地下城》,让宅男变猛男
2011-10-03 11:11 1600动感地下城 写在之前: 好久都没有发表文章了, ... -
RGP游戏的非主流应用——虚拟地图
2011-06-30 01:02 6115RGP游戏的非主流应用——虚拟地图 写在之前: 本 ... -
一个项目完整制作过程的分享
2011-05-22 14:23 8217St书店管理系统 写在文章之前: 本项 ... -
一个项目完整制作过程的分享
2011-05-22 14:18 0St书店管理系统 写在文章之前: 本项 ... -
eclipse下的1245个图标
2011-05-19 17:23 2157eclipse下的1245个图标 大家随便拿写 ... -
超级详细解析——字模
2011-05-17 21:09 6726超级详细解析——字模 一、简介 汉字库: 即 ... -
JavaSE 的MV模式(国际化)
2011-05-14 12:13 2771JavaSE 的 MV 模式 ... -
分享一个绿色版本的 JAR TO EXE工具(附上一个视频教程)
2011-03-15 14:05 1564如题,使用灰常简单 附上一个视频教程: -
偶然玩分形 java测试
2011-03-09 13:54 2600分形世界 我从拉丁文形容词fractus(分裂的)造出了fr ... -
Oracle, SQL Server, My SQL数据分页查询语句汇总
2011-03-05 23:16 2026之前一直在学习SQL Server,然而其的分 ... -
小议MVC模式开发
2011-02-27 22:08 1288做web项目是所经常提到的mvc模式。 MVC是三个 ... -
菜鸟 利用VE、截图 快速打造仿QQ绚丽界面
2011-02-12 02:52 2954自绘菜鸟 利用VE、截图 快速打造仿QQ绚丽界面 ... -
JAVA的几个重要概念小总结
2011-01-17 12:20 1409JAVA的几个重要概念小总结 方法声明: 写一个方 ... -
几个文字编码小总结
2011-01-17 12:03 1203ASCII 我们入门学习是最 ... -
超详细解释常用网络命令
2011-01-15 12:10 1582常用网络命令 PING请求 Ping www.google ... -
达通杯 赛后感想
2010-12-23 13:09 3588比赛结束两三天了今天才抽出了时间写写心得。 其实想想自己 ... -
自己动手实现高压缩比压缩软件 超详细解释(LZW算法)
2010-12-07 17:27 5003Lzw 针对大量的子串多次重复出现的压缩 之前 ... -
自己动手写压缩软件,超详细解释(哈夫曼实现)
2010-12-04 10:58 19707说到文件压缩大家很容 ... -
JAVA BMP解码 超详细解释
2010-11-21 23:02 13401首先,对于BMP 格式的图片大家都不感觉到陌生吧。 ... -
五子棋 图片版
2010-11-16 12:45 5528近来发现自绘的东西怎么都比不了自己PS加载图片所作的界面好看。 ...
相关推荐
挂链工具的重要性在于,它们可以帮助SEO专业人员更有效地进行链接建设,节省手动操作的时间,并且能够以数据驱动的方式制定策略。但是,需要注意的是,过度依赖挂链工具或者采取不道德的挂链手段(如大规模群发低...
SEO挂链工具就是利用这一机制,帮助用户在多个平台快速创建这些链接,节省手动操作的时间和精力。然而,需要注意的是,过度或不合规的挂链可能被搜索引擎视为垃圾链接,反而导致网站被降权甚至被封禁。 接下来,...
"FTP挂链工具"就是这类操作的一种辅助软件,它利用FTP(File Transfer Protocol)协议,允许用户远程管理服务器上的文件,包括上传、下载、删除等操作。 FTP挂链工具的主要功能是帮助用户便捷地在目标服务器上植入...
FTP批量挂链工具是一种针对网站管理的工具,主要用于在多个FTP服务器上快速部署特定的链接代码,例如“黑链”。这种工具通常被用于SEO优化、网站推广或是非法的黑帽SEO活动,因为“挂黒链”指的是在网站上不透明地...
【网站提供挂链】是指网站为用户或站长提供的一个服务,允许他们将自己的链接挂在网站上,以提升其网站的曝光度、流量或者搜索引擎排名。挂链通常被用作一种网络营销策略,通过与其他网站建立链接关系,可以提高自身...
FTP批量扫描技术是一种网络工具,主要用于自动化地查找和连接FTP服务器,从而实现快速搜索和管理大量FTP站点。在IT行业中,这项技术常被用于网站管理员、SEO专家或网络安全专业人士进行大规模的数据采集、备份或者...
在这个文件中,我们可以期待看到如何用Java实现链表节点的类,这个类将包含数据字段、常规的next指针以及随机的random指针。复制链表的过程可能会采用迭代或递归的方法,具体取决于代码设计。关键步骤可能包括: 1....
FTP扫描工具有时会被滥用,用于在未授权的情况下在FTP服务器上放置恶意链接,这种行为被称为黑帽SEO,会对被挂链的网站和网络环境带来负面影响。 为了有效利用FTP扫描工具,用户需要了解以下知识点: 1. **FTP协议...
黑链工具包,可以查询弱口令FTP,并实现全自动挂链,查链,PR查询,分类,掉链自动补链等等功能,是目前最好用,最稳定的黑链工具.
ftp暴力破解 挂链工具 暴力破解功能异常强大 ,挂链工具有时候需要配合手动比较好,提高网站权重的必备shi
这是一种seo的工具,但不建议使用。望大家适量用吧。
苹果FTP批量查链挂链工具是一款专为苹果用户设计的高效工具,主要用于自动化地检查FTP服务器的连接状态和挂链情况。在IT行业中,FTP(File Transfer Protocol)是一种广泛使用的网络协议,允许用户通过网络传输文件...
网站SEO黑链智能收集批量挂链软件V6.16+注册机
【标题】:“批量扫描工具和批量挂链工具1”指的是在网络优化中使用的工具,主要用于提升网站权重和搜索引擎排名。这类工具通常包括两个主要功能:批量扫描和批量挂链。 【批量扫描工具】:批量扫描工具的主要作用...
FTP密探%2B自动挂链完美破解FTP密探%2B自动挂链完美破解
"苹果FTP密探扫描+挂链"工具是针对SEO(Search Engine Optimization,搜索引擎优化)的专业工具,它结合了FTP扫描和链接挂载的功能,帮助用户更好地管理和优化其网站的搜索引擎排名。 FTP扫描功能主要是对目标...
FTP挂链工具是一种用于在互联网上进行文件传输的软件应用,它使得用户能够方便地将本地计算机上的文件上传到远程服务器,或者从服务器下载文件到本地。FTP(File Transfer Protocol)是互联网上的一种标准协议,专门...
2. **功能详解**:逐一解析挂链的各项功能,如SIM卡读取功能如何帮助用户在没有备用手机的情况下更换SIM卡,数据传输功能如何实现手机与其他设备的便捷互联,以及应急电源功能的容量和充电效率等。 3. **技术规格**...
FTP密探+批量挂链
"手机挂链圆珠笔PPT小插图.rar" 是一个包含与文具相关的小插图素材的压缩文件,适合用于制作教育、商务或个人演示文稿,提升视觉效果并吸引观众注意力。 首先,我们要了解什么是RAR文件。RAR是一种流行的压缩文件...