最近一段时间态度都比较懒散。在没有被授课,让我们主动去探索的时候,没有领会真正的意图。讲解线程同步问题的ppt也还差个收尾没有完成。学习这件事,总归是师傅领进门,修行在个人的事。认真虽然不一定会赢,但不认真,一定会输。态度,觉得你的路。
总结一下,这个星期零零碎碎时间感受到的hash表。最初的茫然无措,总感觉是个新的东西,认识,学起来会比较费劲。但总归不能被害怕所吓倒。慢慢走进hash的世界,才发现好熟悉的感觉。
hash表,回到本质,是种数据结构。而数据结构,本质上离不开,线性,和非线性结构。所以,hash表,也无非是两种结构的组合。初步自己简单实现了一种简单的hash方法——拉链法。在代码实现的时候,就会发现,其实原来写链表和队列的时候,其实早就写过的东西。先晒自己写的简单代码。
为了处理hash出的冲突关键值,我们将冲突的数据,借用结点,挂在储存在数组中数据链表上。
/**
* 源数据hash算法后的结点类
* @author Allen
*
*/
public class HashNode {
HashNode pre;/**前结点*/
HashNode next;/**后结点*/
public Object obj;/**结点数据对象*/
public HashNode(Object obj){
this.obj=obj;
}
}
时间有限,实现的功能只有添加,和查询。
/**
* hash表
* @author Allen
*
*/
public class HashMy {
public int length=100;/**默认长度*/
//public double factory=1.5;/**装载因子*/
HashNode[]arr=new HashNode[length];/**保存数据链表的数组*/
public int count=0;
/**
* 将数据hash得到关键值
* @param date 源数据
* @return 关键值
*/
public int hashmath(int date){
int key=0;
key=date%100;
return key;
}
/**
* 将数据hash后储存入数据结构
* @param date源数据
*/
public void puthash(int date){
HashNode node=new HashNode(date);
int index=hashmath(date);
if(arr[index]==null){//如果数组为空,新加一个链表在上边
arr[index]=node;
}else{//如果数组位上有结点,将冲突的数据放在数组中,原数据中的结点挂链在新结点后
node.next=arr[index];
arr[index].pre=node;
arr[index]=node;
}
}
/**
* 查询数据
* @param date需要查询的数据
*/
public void inquire(int date){
int index=hashmath(date);//先hash出关键值
//根据关键值找的对应的链表
HashNode node=arr[index];
int i=0;
while((Integer)node.obj!=date){
node=node.next;
System.out.print(i++);
}
}
/**
* 遍历链表
* @param root:链表根节点
*/
public void printlnNode(HashNode root){
++count;
if(null!=root)
{
Object data=root.obj;
System.out.println(data);
System.out.println("当前的循环次数加一 ```````"+count);
HashNode node=root.next;
printlnNode(node);
}
}
}
在这段代码中,你会发现数组和链表的结合。而这种有效的结合,也是拉链法的精髓之处。在这段代码的实现中,我觉得学到最有用的一个东西是,要学会突破思维定式,在讨论添加冲突新数据时,我们惯性的思考,如何将结点添加到链表的末尾,这个需要每次去遍历链表。这个就非常的耗时间。
而讨论的过程中,有个朋友就没有被惯性的思维所限制,他说出了一句话,让我一下茅厕顿开“为什么我们要往链表末尾去加,我们在头部加,不是很方便么?”是啊,其实链表的头尾长得一模一样,为何我们非要认定一个必定为头不能改变呢。所以在添加的时候,我采用的就是数据后推的方式。将新结点放在数组中,剩下的挂在它的后边,这样代码量上了很多,也少了很多不必要的步骤。
学习过程中,我们需要思维的碰撞,自己一个人的思维,总归是狭窄的。宇宙的形成,不也是碰撞才有的么。
在路上,需要学习的还很多。在路上,态度决定着方向。hash这只是初步的皮毛,还需要继续、这才只是开始。后面会继续补充。
——菜鸟的成长之路