哈希表的一些概念 代码(自己写)

首先,我们要明确一点是hash表是基于数组,这个数组是我们输入的数据项的数组

比如:我创建了一个数据项

package endual;

public class DataItem {

	private int iData ; //key值相当于这个数据项的ID ,这个相当于People信息的身份证号码
	private Object object ; //这个数据相当于人们要存放数据用的数据比如People的信息等等
	
	
	public Object getObject() {
		return object;
	}

	public void setObject(Object object) {
		this.object = object;
	}

	public DataItem(int iData) {
		super();
		this.iData = iData;
	}

	public int getiData() {
		return iData;
	}

	public void setiData(int iData) {
		this.iData = iData;
	}
	
	
}

 

这似乎很麻烦对吧,因为在创建的数组项中我们要输入关于这个数据项的ID,还要输入这个数据项的真的我们要存放的数据Object 这似乎不怎么好。

 

那么当然了,你可以将这个key值写入到object中,但是在哈希表的实现中,我们来取得这个key值的时候,要先取得object然后再取得key值了。你是否能理解???(你完全可以把我说的这些是废话,真的因为教科书上都没这么写)

 

然后是哈希表的部分代码

 

package endual;

public class HashTable {

	private DataItem[] hashArray ; //hash表是基于数组的
	private int arraySize ; //创建hash表的时候,要先确定这个量要多少大
	private DataItem nonItem ; //hash表有一个是无法填满的
	
	public HashTable(int arraySize) {
		super();
        this.arraySize = arraySize ; //输入的哈希表的大小
		this.hashArray = new  DataItem[this.arraySize] ; //创建输入创建哈希表的大小
		nonItem = new DataItem(-1) ; //用于删掉的数据项,将这个数据项放入到空的地方,如果遇到这个关键词是-1的那么说明这个数值的地方是空的
		
	}


。。。。。。
。。。。。。
。。。。。。
。。。。。。
 

 

   很抱歉你没有看到全部的代码,但我费尽心思的想让你先看下哈希表的理论,然后再去看代码,入门你喜欢直接看代码,那么你可以先去看,但是我保证你看的糊里糊涂呵呵。

 

 

哈希表的一些理论

 

 

哈希表是一种数据结构 基于数组的 

哈希表的 增加 删除 查找都是 1

确实 无法遍历 数组是定死的

哈希表是一种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。

不论哈希表中有多少的数据,插入和删除只需要接近常量的时间,1.

哈希表的使用就是一秒钟的时间。但是哈希表的速度明显是要比前面看到过的快的。并且编程的实现也是比较容易的。

哈希表也自己的确定的,那就是它的辅助空间是数组,数组创建后,空间是难以扩展的。所以我们在创建哈希表的时候,一定要

先考虑好到底有多个数据要被插入进来的。

还有也没有一种简单的方法来遍历表中的数据项的。

所以,如果不需要遍历这个数据项的,并且可以提前预测数据量的大小,那么哈希表在速度和易用性上是无与伦比的。

 

其实很简单的几句话。但是真的没有触及到哈希表创建的核心。

所以我为你准备了一个人博客

http://blog.csdn.net/v_july_v/article/details/6256463

 

于是代码来了

 

package endual;

public class HashTable {

	private DataItem[] hashArray ; //hash表是基于数组的
	private int arraySize ; //创建hash表的时候,要先确定这个量要多少大
	private DataItem nonItem ; //hash表有一个是无法填满的
	
	public HashTable(int arraySize) {
		super();
        this.arraySize = arraySize ; //输入的哈希表的大小
		this.hashArray = new  DataItem[this.arraySize] ; //创建输入创建哈希表的大小
		nonItem = new DataItem(-1) ; //用于删掉的数据项,将这个数据项放入到空的地方,如果遇到这个关键词是-1的那么说明这个数值的地方是空的
		
	}
	
	//用for循环的方法来遍历这个哈希表
	public void displayHashTable() {
		
		System.out.println("Table :") ;
		for(int j=0; j < this.arraySize; j++) {
			
			if(this.hashArray[j] != null) { //如果这个hashArray[j]数据项是存在的,那么我们去输出它的key值
				
				System.out.println(hashArray[j].getiData() + " ");
				
			}else {
				System.out.println("**");
			}
			
			System.out.println("**");
			
		}
		
	} //end 显示的方法
	
	public int hashFunc(int key) { //那么我们可以肯定的是key的值是很大的数多对吧,要不取余数的时候,不都是0 了啊
		
		return key % this.arraySize ; //取得余数
		
	} //取得hash值的转换函数(哈希函数)
	
	
	//插入数据了
	public void insert(DataItem item) {
	
		//假设table不是为空的
		int key = item.getiData() ; //取得数据项的关键值
		int hashVal = this.hashFunc(key) ; //通过hash函数的转换获得hash值
		
		//两个条件要同时的满足
		//1.数组中的这个hash值的位子啊,不能有东西
		//2.这个数组的如果为空,也就是有数据项,那么这个数据项的关键词不能-1
		while (hashArray[hashVal] != null && hashArray[hashVal].getiData() != -1) {
			
			hashVal++ ; //如果数组中有数据项的,那么我们到数组的下个标号下面去看。
			hashVal %= this.arraySize ; //再转回hashVal的,因为当前hashVal的已经有人用了,用了就占据了数据的位子了
		}
		
		this.hashArray[hashVal] = item ; //找到这个空的null,将值放进去

	} //end insert
	
	//删掉一个数据项,根据关键字
	public DataItem delete(int key) {
		
		DataItem item = null ;
		//我们先求得关键词的hash值
		
		int hashVal = this.hashFunc(key) ;
	    
		
		while(this.hashArray[hashVal] != null) { //遇见空的停止掉
			if(this.hashArray[hashVal].getiData() == key) {
				item = this.hashArray[hashVal] ; //那么这个就是我们要寻找的
				this.hashArray[hashVal] = this.nonItem ;
				return item ;
			}
			hashVal++ ;
			hashVal %= this.arraySize ; //这个是定值是不能在改变了的
		}

		return null ;

	} //end delete
	
	//find
	public DataItem find(int key) {
		
		DataItem item = null ;
		int hashVal = this.hashFunc(key) ;
		while(this.hashArray[hashVal] != null) { //遇见空的停止掉
			if(this.hashArray[hashVal].getiData() == key) {
				item = this.hashArray[hashVal] ; //那么这个就是我们要寻找的
				return item ;
			}
			hashVal++ ;
			hashVal %= this.arraySize ; //这个是定值是不能在改变了的
			
		}

		return null ;
	}
	
	

	
} //end calss
 

 

 

 

 

   测试的类

 

package endual;

public class HashTableApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		HashTable ht = new HashTable(30) ;
		DataItem d1 = new DataItem(56) ;
		DataItem d2 = new DataItem(562) ;
		DataItem d3 = new DataItem(536) ;
		DataItem d4 = new DataItem(526) ;
		DataItem d5 = new DataItem(556) ;
		ht.insert(d1) ;
		ht.insert(d2) ;
		ht.insert(d3) ;
		ht.insert(d4) ;
		ht.insert(d5) ;
		ht.displayHashTable() ;
	}

}
 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值