来自百度
其实说白了,哈希表就是希望利用地址计算的方法来直接寻址,找到我们所需的数据存储位置,可是我们的数据都是不定的,例如字符串,结构体或者类对象,这些都不能像整数,自身就可以用来作为寻址index。
但是我们可以通过一定的算法将数据转换程我们需要的Key,然后利用这个key在我们的数组中寻址
举个简单的例子:假设我们现在需要制作一个字符串的存储,希望能够快速查找!O(1)最理想
1、那么对于字符串我们先将其转换成key,这个key和我们的value对应,(但是这里不是一一对应,所以存在冲突现象,后面解释怎么解决,方法很多)
我们假设所有字符的ascii值相加作为key,但是这个值很大,我们将其规范到0-49,也就是
while(key >= 50)
key = key % 50;
下面是具体getKey函数
int getKey(char* value){
int key = 0;
int len = strlen(value);
while(len>0){
key += (*value);
len--;
value++;
}
while(key >= 50)
key = key % 50;
return key;
}
2、前面说过,可能存在不同value同一个key,所以需要解决冲突
我这里采用简单的线性解决办法:
其他参见:
--------------------------------------------------------
bool addValue(char* value){
int key_origin = getKey(value);
int key = key_origin;
while(hashTable[key]!=0){
key = (key+1) % MAX;
if(key == key_origin){
cout<<"the hash table is full!!"<<endl;
return false;
}
}
hashTable[key] = value;
return true;
}
基本上我们的表就建立好了
查找和删除其实就是基于addValue()改写即可,下面给完整代码哈
//============================================================================
// Name : HashMap.cpp
// Author : YLF
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
class HashMap{
public:
const static int MAX = 50;
void init(){
memset(hashTable,0,sizeof(hashTable));
}
bool addValue(char* value){
int key_origin = getKey(value);
int key = key_origin;
while(hashTable[key]!=0){
key = (key+1) % MAX;
if(key == key_origin){
cout<<"the hash table is full!!"<<endl;
return false;
}
}
hashTable[key] = value;
return true;
}
void delValue(char* value){
;
}
bool exist(char* value){
int key_origin = getKey(value);
int key = key_origin;
while(hashTable[key]!=0){
if(0 == strcmp(value, hashTable[key]))
return true;
key = (key+1) % MAX;
if(key == key_origin)
return false;
}
return false;
}
void printTable(){
int i=0;
for(;i<50;i++){
if(hashTable[i]!=0)
cout<<i<<":"<<hashTable[i]<<endl;
else
cout<<i<<":"<<"no data"<<endl;
}
}
private:
char* hashTable[MAX];
int getKey(char* value){
int key = 0;
int len = strlen(value);
while(len>0){
key += (*value);
len--;
value++;
}
while(key >= 50)
key = key % 50;
return key;
}
};
int main() {
HashMap* hm = new HashMap();
char* s1 = "ylf";
char* s2 = "dsb";
char* s3 = "zjq";
char* s4 = "sdf";
char* s5 = "ase";
//init hash table
hm->init();
//add value
hm->addValue(s1);
hm->addValue(s2);
hm->addValue(s3);
hm->addValue(s4);
hm->addValue(s5);
//print table
hm->printTable();
//search value
if(hm->exist("ase"))
cout<<"find "<<endl;
else
cout<<"not find"<<endl;
return 0;
}
输出
0:no data
1:no data
2:no data
3:no data
4:no data
5:no data
6:no data
7:no data
8:no data
9:no data
10:no data
11:no data
12:no data
13:dsb
14:ase
15:no data
16:no data
17:sdf
18:no data
19:no data
20:no data
21:no data
22:no data
23:no data
24:no data
25:no data
26:no data
27:no data
28:no data
29:no data
30:no data
31:ylf
32:no data
33:no data
34:no data
35:no data
36:no data
37:no data
38:no data
39:no data
40:no data
41:zjq
42:no data
43:no data
44:no data
45:no data
46:no data
47:no data
48:no data
49:no data
find