在路上、

   最近一段时间态度都比较懒散。在没有被授课,让我们主动去探索的时候,没有领会真正的意图。讲解线程同步问题的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这只是初步的皮毛,还需要继续、这才只是开始。后面会继续补充。

                                                                                               ——菜鸟的成长之路

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值