这一篇是基于线性探测的散列表
2016-11-23 21:46
162 查看
//总感觉性能不如拉链法的散列表,java自带的那个实现也是用的拉链法
//测试类如下:
public class Fucktest{
public static void main(String[] args) {
tanceSanLieBiao sanlie=new tanceSanLieBiao();
int num=1;
char i = 'a';
for (; i <'z'+1; i++,num++) {
sanlie.put(String.valueOf(i),num);
}
i='a';
for(int tmp=1;tmp<27;tmp++){
System.out.println(sanlie.get(String.valueOf(i++)));
}
}
}
//实现类如下:
/**
* Created by eminem on 16-11-23.
*/
//基于线性探测法散列表
public class tanceSanLieBiao <String,Integer>{
//散列表(数组)长度
private int M=16;
//键值对数量
private int N;
private String[] keys;
private Integer[] valuse;
public tanceSanLieBiao(){
keys=(String[]) new Object[M];
valuse=(Integer[]) new Object[M];
}
public tanceSanLieBiao(int N){
keys=(String[]) new Object
;
valuse=(Integer[]) new Object
;
M=N;
}
private int hash(String key){
return (key.hashCode()&0x7fffffff)%M;
}
private void resize(int cap){
tanceSanLieBiao<String,Integer> tance=new tanceSanLieBiao<String,Integer>(cap);
for (int i=0;i<M;i++){
if(keys[i]!=null){
tance.put(keys[i],valuse[i]);
}
}
keys=tance.keys;
valuse=tance.valuse;
M=tance.M;
}
public void put(String key,Integer value){
if(N>M/2) resize(M*2);
int i;
for(i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
valuse[i]=value;
return;
}
}
keys[i]=key;
valuse[i]=value;
N++;
}
public Integer get(String key){
for(int i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
return valuse[i];
}
}
return null;
}
}
//没实现删除操作
//测试类如下:
public class Fucktest{
public static void main(String[] args) {
tanceSanLieBiao sanlie=new tanceSanLieBiao();
int num=1;
char i = 'a';
for (; i <'z'+1; i++,num++) {
sanlie.put(String.valueOf(i),num);
}
i='a';
for(int tmp=1;tmp<27;tmp++){
System.out.println(sanlie.get(String.valueOf(i++)));
}
}
}
//实现类如下:
/**
* Created by eminem on 16-11-23.
*/
//基于线性探测法散列表
public class tanceSanLieBiao <String,Integer>{
//散列表(数组)长度
private int M=16;
//键值对数量
private int N;
private String[] keys;
private Integer[] valuse;
public tanceSanLieBiao(){
keys=(String[]) new Object[M];
valuse=(Integer[]) new Object[M];
}
public tanceSanLieBiao(int N){
keys=(String[]) new Object
;
valuse=(Integer[]) new Object
;
M=N;
}
private int hash(String key){
return (key.hashCode()&0x7fffffff)%M;
}
private void resize(int cap){
tanceSanLieBiao<String,Integer> tance=new tanceSanLieBiao<String,Integer>(cap);
for (int i=0;i<M;i++){
if(keys[i]!=null){
tance.put(keys[i],valuse[i]);
}
}
keys=tance.keys;
valuse=tance.valuse;
M=tance.M;
}
public void put(String key,Integer value){
if(N>M/2) resize(M*2);
int i;
for(i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
valuse[i]=value;
return;
}
}
keys[i]=key;
valuse[i]=value;
N++;
}
public Integer get(String key){
for(int i=hash(key);keys[i]!=null;i=(i++%M)){
if(keys[i].equals(key)){
return valuse[i];
}
}
return null;
}
}
//没实现删除操作
相关文章推荐
- 线性探测再散列和平方探测再散列(二次探测再散列)算法
- 散列表2: 基于探测法的散列表
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 详细图解什么叫平方探查法即二次探测再散列和线性探测再散列(数据结构 哈希函数 哈希冲突)
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 哈希散列冲突线性探测再散列算法
- 基于线性探测法的散列表
- 开放定址散列表(线性探测法)头文件C语言
- 开放定址散列表(线性探测法)实现文件C语言
- 再散列--开放定址散列表(线性探测法)加强版可再散列经优化头文件C语言
- 计算使用线性探测、平方探测以及双散列插入的长随机序列所需要的冲突次数
- 处理哈希冲突的闭散列方法-线性探测
- 开放定址散列表(线性探测法(双散列))头文件C语言
- 散列(开发地址法-线性探测法)
- 开放定址散列表(线性探测法(双散列))实现文件C语言
- 再散列开放定址散列表(线性探测法)加强版可再散列经优化实现文件C语言
- 散列表--线性探测法
- 散列表(三):冲突处理的方法之开地址法(线性探测再散列的实现)
- 散列表(三)冲突处理的方法之开地址法: 线性探测再散列的实现
- 4C的练习5-39 整型关键字的散列映射 <线性探测法>