java数据结构与算法-线性探测哈希表
来源:互联网 发布:eclipse打war包源码 编辑:程序博客网 时间:2024/05/16 14:22
哈希表 优点:速度快(查找和插入) 缺点:基于数组,不能有序的遍历 键值对:通过键来访问值 冲突:不同的关键字经过哈希化得到数组下标出现重复哈希表解决冲突的方案:
(1)开放地址法
线性探测:当指定位置以有数据,则继续往下找空位置
二次探测:第一次探测冲突后,第二次探测按固定间隔、或者1、2、3...的平方间隔去寻找空地址
再哈西法:第一次探测冲突后,第二次再次哈希寻找空地址
(2)链地址法:即数组元素是链表
一、线性探测哈希表代码如下:
package com.tool.wpn.quicksort;import android.util.Log;/** * Created by Xi on 2017/8/15. * 线性探测哈希表 */public class HashTableLin { private final String TAG="HashTableLin"; private DataItem[] hashArray; private int arraySize; private DataItem nonItem;//无元素,由于底层使用的数组,在真正删除元素时,也不是真正删除该内存空间,而是将其所含值改变,代表删除该元素 public HashTableLin(int size){ arraySize=size; hashArray=new DataItem[arraySize]; nonItem=new DataItem(-1); } public void displayTable(){ StringBuilder sb=new StringBuilder(); sb.append("["); for(int i=0;i<arraySize;i++){ if(i==arraySize-1){ if(hashArray[i]!=null) { sb.append(hashArray[i].getKey() + ""); }else { sb.append("** "); } } else { if(hashArray[i]!=null) { sb.append(hashArray[i].getKey() + ""); }else { sb.append("** "); } sb.append(","); } } sb.append("]"); Log.v("HashTableLin",sb.toString()); } /** * 将传入的key经过hash算法,这里使用的普通除以数组大小求余的方法,而实际不是这么简单 * @param key * @return */ public int hashFunc(int key){ return key%arraySize; } /** * 插入元素 */ public void insert(DataItem item){ int key=item.getKey(); int hashVal=hashFunc(key); while(hashArray[hashVal]!=null && hashArray[hashVal].getKey()!=-1){//位置被占用 //继续寻找位置 hashVal++; hashVal=hashVal%arraySize; } hashArray[hashVal]=item;//找到位置 } /** * 删除元素 */ public DataItem delete(int key){ int hashVal=hashFunc(key); while(hashArray[hashVal]!=null){ if(hashArray[hashVal].getKey()==key){//找到要删除的数据 DataItem temp=hashArray[hashVal]; hashArray[hashVal]=nonItem; return temp; } hashVal++; hashVal=hashVal%arraySize; } return null;//没有找到 } /** * 查找元素 */ public DataItem find(int key){ int hashVal=hashFunc(key); while(hashArray[hashVal]!=null){ if(hashArray[hashVal].getKey()==key){ return hashArray[hashVal];//找到元素 } hashVal++; hashVal=hashVal%arraySize; } return null;//没有找到 }}
package com.tool.wpn.quicksort;/** * Created by Xi on 2017/8/15. * 线性探测哈希表所使用元素 */public class DataItem { private int iData; public DataItem(int key){ iData=key; } public int getKey(){ return iData; } @Override public String toString() { return "DataItem-key值为:"+iData; }}
二、主函数调用如下:
private void hashLin(){ int size=20; HashTableLin hashTable=new HashTableLin(size); hashTable.insert(new DataItem(10)); hashTable.insert(new DataItem(50)); hashTable.insert(new DataItem(60)); hashTable.insert(new DataItem(11)); hashTable.insert(new DataItem(21)); hashTable.insert(new DataItem(54)); hashTable.displayTable(); DataItem dataItem = hashTable.find(12);//查找12 if(dataItem==null){ Log.v(TAG,"can't find"); }else{ Log.v(TAG,"find-"+dataItem.toString()); } DataItem dataItemEl = hashTable.find(11);//查找1 if(dataItemEl==null){ Log.v(TAG,"can't find"); }else{ Log.v(TAG,"find-"+dataItemEl.toString()); } DataItem delete = hashTable.delete(11);//删除11 if(delete==null){ Log.v(TAG,"can't delete"); }else{ Log.v(TAG,"delete-"+delete.toString()); } hashTable.displayTable(); }
源码下载地址:点击打开链接
再哈希法哈希表 点击打开链接
链地址法哈希表 点击打开链接
阅读全文
0 0
- java数据结构与算法-线性探测哈希表
- 【数据结构】哈希表的线性探测算法
- 数据结构与算法之散列(线性/平方/双平方探测法)<八>
- C++数据结构--.哈希表线性探测开放寻址法与独立表链地址法
- 基于java的数据结构学习手记16-线性探测哈希表实现
- 哈希表线性探测&二次探测
- 线性探测哈希表的java代码
- Java版常见数据结构与算法1 -- 数据结构 --线性表
- 数据结构:哈希表(除留取余法--线性探测法)
- 哈希表---线性探测法
- 哈希表线性探测再散列
- 哈希表-线性探测
- 数据结构与算法 线性表
- 数据结构与算法------线性查找
- 数据结构与算法--线性表
- 数据结构与算法---线性表
- 数据结构与算法--线性表
- Javascript数据结构算法之散列(霍纳算法,开链法,线性探测-寻址法)
- HDU2053 Switch Game
- NTP和RTP时间戳
- 为什么还是说信息没填写完整呢
- 汉诺塔问题
- Proc
- java数据结构与算法-线性探测哈希表
- Android SmsManager 短信群发
- Java构造方法的作用
- 实现热部署时记得设置eclipse开发工具
- [hihocoder1324]希尔伯特曲线
- 树链
- java inerview summary
- 2017百度之星 资格赛1003度度熊与邪恶大魔王
- Oracle笔记