1. 关于java中Hash表用字符串对应数组的做法
这样输出
2. 哈希表设计的用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="chengquan";
NameList[9].py="luqing";
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;i<NAME_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; i<NAME_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;r<20;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; i<15; 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; i<30; 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; i<40; 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; i<50; 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;
}
}
}
3. Java的哈希表!
以下为本人劳动成果,供参考(已打包成jar文件).
4. java:哈希表的原理与用法
Hashtable,原理嘛就不知道了。只知道说其是提供了两个集合之间映射的能力,并且拥有每个元素的查询时间近乎恒定的特性。两个集合之间映射的能力,简单的说,就是像是存放系统属性的Properties类一样(该类继承自Hashtable),Properties类中将String映射到String,你可以用setProperty(String key, String value)把一对值对(key,value)存入Properties中,用getProperty(String key) 取得key对应的value值。用System.getProperties()你可以获得一个系统属性的哈希表,直接println出来你就可以看到整个哈希表所构成的集合了。第一个元素应该是java.runtime.name=Java(TM) SE Runtime Environment这个。这里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在这里你也可以调用System.getProperties().getProperty("java.runtime.name")得到字符串"Java(TM) SE Runtime Environment"。这就是哈希表所提供的功能了,将一个元素映射到另一个元素,这之间的映射所构成的集合就是哈希表了。
你可以自己看看API文档,里面有详细的解说,不过嘛,嘿嘿,中文版的那个翻译啊,哎,惨不忍睹啊,感触最多的是——主谓宾都难找啊。
5. java里哈希表作用是什么
哈西表其实就是一个键值对的集合,通常可以往哈西表中存入键和值,通过键获取值
6. java 哈希表查找
化为线性表,hash函数,你可以想一想为什么这么快呢?
因为他利用了所存数据的结构,就拿用hash表存字符串来说,他正是利用了字符串的结构,比如举个例子,hash(str)=27*27*str[2]+27*str[1]+str[0],通过这个就区分出了abc和acb的不同了
但是hash函数也有缺点,一点点变动对于他的影响都是很大的,首先开辟更大的内存空间和数据不说,还要从新定义hash函数
凡事有利有弊
7. java 用哈希表解决
publicclassTest{
privatestaticMap<Teacher,Student>map;
publicstaticvoidmain(String[]args){
map=newHashMap<Teacher,Student>();
map.put(newTeacher("a_teacher"),newStudent("a_student",11,"boy"));
map.put(newTeacher("b_teacher"),newStudent("b_student",12,"boy"));
map.put(newTeacher("c_teacher"),newStudent("c_student",13,"girl"));
map.put(newTeacher("d_teacher"),newStudent("d_student",14,"girl"));
test("b_teacher");
}
publicstaticvoidtest(StringteacherName){
Teacherteacher=newTeacher(teacherName);
Studentstudent=map.get(teacher);
System.out.println(student);
}
}
classTeacher{
privateStringname;
publicTeacher(Stringname){
super();
this.name=name;
}
publicTeacher(){
super();
}
@Override
publicinthashCode(){
returnthis.name.hashCode();
}
@Override
publicbooleanequals(Objectobj){
if(objinstanceofTeacher){
Teacherother=(Teacher)obj;
if(this.name.equals(other.name)){
returntrue;
}else{
returnfalse;
}
}else{
thrownewRuntimeException("类型转换错误");
}
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
classStudent{
privateStringname;
privateintage;
privateStringsex;
publicStudent(){
super();
}
publicStudent(Stringname,intage,Stringsex){
super();
this.name=name;
this.age=age;
this.sex=sex;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
@Override
publicStringtoString(){
return"Student[name="+name+",age="+age+",sex="+sex+"]";
}
}