「JAVA哈希表数组实现」java哈希表遍历

博主:adminadmin 2023-03-22 11:58:07 501

本篇文章给大家谈谈JAVA哈希表数组实现,以及java哈希表遍历对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

哈希表不可以用数组来实现

哈希表都是用数组来实现的。

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表(数组)中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

数据结构(java版)哈希表的设计

1.什么是哈希表?

哈希表是一种数据结构,它提供了快速的插入操作和查找操作。其基于数组来实现。

2.哈希化

1)直接将关键字作为索引。

2)将单词转换成索引。

1将字母转换成ASCII码,然后进行相加

2幂的连乘

3压缩可选值

3.压缩后仍然可能出现的问题。

冲突:不能保证每个单词都映射到数组的空白单元。

解决办法:

1开放地址法

2链地址法

/**

* 员工信息类

* @author Administrator

*

*/

public class Info {

private String key;

private String name;

public Info(String key, String name) {

this.key = key;

this.name = name;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

import java.math.BigInteger;

public class HashTable {

private Info[] arr;

/**

* 默认的构造方法

*/

public HashTable() {

arr = new Info[100];

}

/**

* 指定数组初始化大小

*/

public HashTable(int maxSize) {

arr = new Info[maxSize];

}

/**

* 插入数据

*/

public void insert(Info info) {

arr[hashCode(info.getKey())] = info;

}

/**

* 查找数据

*/

public Info find(String key) {

return arr[hashCode(key)];

}

public int hashCode(String key) {

// int hashVal = 0;

// for(int i = key.length() - 1; i = 0; i--) {

// int letter = key.charAt(i) - 96;

// hashVal += letter;

// }

// return hashVal;

BigInteger hashVal = new BigInteger("0");

BigInteger pow27 = new BigInteger("1");

for(int i = key.length() - 1; i = 0; i--) {

int letter = key.charAt(i) - 96;

BigInteger letterB = new BigInteger(String.valueOf(letter));

hashVal = hashVal.add(letterB.multiply(pow27));

pow27 = pow27.multiply(new BigInteger(String.valueOf(27)));

}

return hashVal.mod(new BigInteger(String.valueOf(arr.length))).intValue();

}

}

public class TestHashTable {

public static void main(String[] args) {

HashTable ht = new HashTable();

ht.insert(new Info("a","张三"));

ht.insert(new Info("ct","李四"));

ht.insert(new Info("wangwu","王五"));

System.out.println(ht.find("a").getName());

System.out.println(ht.find("ct").getName());

}

}

JAVA创建一个哈希表储存数据并输出,要完整代码

我就不写了,给个提示吧:

建一个类,名字就叫员工,它有三个属性,分别是你要的三个数据,名字、工龄、工号。然后,每次put的时候这样:put('1234',员工1);以员工工号为key,类员工为value

哈希表设计的用Java代码

#include stdio.h

#include string.h

#include stdlib.h

//#include

#define HASH_LEN 50 //哈希表的长度

#define M 47

#define NAME_NO 30 //人名的个数

typedef struct NAME

{

char *py; //名字的拼音

int k; //拼音所对应的整数

}NAME;

NAME NameList[HASH_LEN];

typedef struct hterm //哈希表

{

char *py; //名字的拼音

int k; //拼音所对应的整数

int si; //查找长度

}HASH;

HASH HashList[HASH_LEN];

/*-----------------------姓名(结构体数组)初始化---------------------------------*/

void InitNameList()

{

NameList[0].py="chenghongxiu";

NameList[1].py="yuanhao";

NameList[2].py="yangyang";

NameList[3].py="zhanghen";

NameList[4].py="chenghongxiu";

NameList[5].py="xiaokai";

NameList[6].py="liupeng";

NameList[7].py="shenyonghai";

NameList[8].py="chengdaoquan";

NameList[9].py="ludaoqing";

NameList[10].py="gongyunxiang";

NameList[11].py="sunzhenxing";

NameList[12].py="sunrongfei";

NameList[13].py="sunminglong";

NameList[14].py="zhanghao";

NameList[15].py="tianmiao";

NameList[16].py="yaojianzhong";

NameList[17].py="yaojianqing";

NameList[18].py="yaojianhua";

NameList[19].py="yaohaifeng";

NameList[20].py="chengyanhao";

NameList[21].py="yaoqiufeng";

NameList[22].py="qianpengcheng";

NameList[23].py="yaohaifeng";

NameList[24].py="bianyan";

NameList[25].py="linglei";

NameList[26].py="fuzhonghui";

NameList[27].py="huanhaiyan";

NameList[28].py="liudianqin";

NameList[29].py="wangbinnian";

char *f;

int r,s0;

for (int i=0;iNAME_NO;i++)

{

s0=0;

f=NameList[i].py;

for (r=0;*(f+r) != NULL;r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字

s0=*(f+r)+s0;

NameList[i].k=s0;

}

}

/*-----------------------建立哈希表---------------------------------*/

void CreateHashList()

{

for (int i=0; iNAME_NO; i ++)

{

HashList[i].py="";

HashList[i].k=0;

HashList[i].si=0;

}

for (i=0; i NAME_NO ; i++)

{

int sum=0;

int adr=(NameList[i].k) % M; //哈希函数

int d=adr;

if(HashList[adr].si==0) //如果不冲突

{

HashList[adr].k=NameList[i].k;

HashList[adr].py=NameList[i].py;

HashList[adr].si=1;

}

else //冲突

{

do{

d=(d+((NameList[i].k))%10+1)%M; //伪散列

sum=sum+1; //查找次数加1

}while (HashList[d].k!=0);

HashList[d].k=NameList[i].k;

HashList[d].py=NameList[i].py;

HashList[d].si=sum+1;

}

}

}

/*-------------------------------------查找------------------------------------*/

void FindList()

{

printf("\n\n请输入姓名的拼音: "); //输入姓名

char name[20]={0};

scanf("%s",name);

int s0=0;

for (int r=0;r20;r++) //求出姓名的拼音所对应的整数(关键字)

s0+=name[r];

int sum=1;

int adr=s0 % M; //使用哈希函数

int d=adr;

if(HashList[adr].k==s0) //分3种情况进行判断

printf("\n姓名:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0);

else if (HashList[adr].k==0)

printf("无该记录!");

else

{

int g=0;

do

{

d=(d+s0%10+1)%M; //伪散列

sum=sum+1;

if (HashList[d].k==0)

{

printf("无记录! ");

g=1;

}

if (HashList[d].k==s0)

{

printf("\n姓名:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);

g=1;

}

}while(g==0);

}

}

/*--------------------------------显示哈希表----------------------------*/

void Display()

{

printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音 \n"); //显示的格式

for(int i=0; i15; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

printf("按任意键继续显示...\n"); //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)

getchar();

for( i=15; i30; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

printf("按任意键继续显示...\n");

getchar();

for( i=30; i40; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

printf("按任意键继续显示...\n");

getchar();

for( i=40; i50; i++)

{

printf("%d ",i);

printf("\t%d ",HashList[i].k);

printf("\t\t%d ",HashList[i].si);

printf("\t\t%d ",(HashList[i].k)%M);

printf("\t %s ",HashList[i].py);

printf("\n");

}

float average=0;

for (i=0;i NAME_NO;i ++)

average+=HashList[i].si;

average/=NAME_NO;

printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average);

}

/*--------------------------------主函数----------------------------*/

void main()

{

/* ::SetConsoleTitle("哈希表操作"); //Windows API函数,设置控制台窗口的标题

HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄

::SetConsoleTextAttribute(hCon, 10|0); //设置文本颜色

*/

printf("\n------------------------哈希表的建立和查找----------------------");

InitNameList();

CreateHashList ();

while(1)

{

printf("\n\n");

printf(" 1. 显示哈希表\n");

printf(" 2. 查找\n");

printf(" 3. 退出\n");

err:

char ch1=getchar();

if (ch1='1')

Display();

else if (ch1='2')

FindList();

else if (ch1='3')

return;

else

{

printf("\n请输入正确的选择!");

goto err;

}

}

}

关于JAVA哈希表数组实现和java哈希表遍历的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。