最神奇的数据结构 哈希
哈希可以用来做哈希集也可以用来做哈希映射
今天我们讲一讲哈希映射
哈希也叫作散列
哈希的速度非常非常快
O(1)>O(logn)>O(n)>O(nlogn)>O(n2)>O(n3)>O(2n)>O(n!)
哈希
O(1)
二叉树
O(logN)
线性查找
O(N)
冒泡排序
O(N2)
数组的优点:
可以快速的进行地址运算
取a[98765]和取a[8]的速度是一样的。
在头文件中添加HashMap.h在源文件中添加main.cpp
//HashMap.h
#ifndef HASHMAP_H
#define HASHMAP_H
#include<vector>
template<class Key,class Value>
class HashMap{//哈希映射
public:
HashMap(int size = 101) :arr(size){
currentSize = 0;
}
void Put(const Key & k, const Value & v){
int pos = myhash(k);
arr[pos] = DataEntry(k, v);
++currentSize;
}
Value Get(const Key & k){
int pos = myhash(k);
if (arr[pos].key == k)
return arr[pos].value;
else
return Value();
}
unsigned hash(const Key & k)const{
unsigned int hashValue = 0;
const char * keyp = reinterpret_cast<const char *>(&k);
for (size_t i = 0; i < sizeof(Key); i++)
hashValue = 37 * hashValue + keyp[i];
return hashValue;
}
int myhash(const Key & k)const{
unsigned hashVal = hash(k);
hashVal %= arr.size();
return hashVal;
}
private:
struct DataEntry
{
Key key;
Value value;
DataEntry(const Key & k = Key(), const Value & v = Value()) :key(k), value(v){}
};
std::vector<DataEntry>arr;
int currentSize;
};
#endif
//main.cpp
#include<iostream>
#include<map>//映射,也叫字典,二叉树映射
#include<string>
#include"HashMap.h"
#include<hash_map>
using namespace std;
int main(){
cout << "测试哈希映射:" << endl;
map<string, int> m;
m["Bill"] = 98;
m["Tom"] = 67;
m["Mary"] = 100;
//...继续保存
cout << m["Tom"] << endl;
//我的哈希映射
cout << "我的哈希映射:" << endl;
HashMap<string, int> myHMap;
cout << myHMap.hash("Bill") << endl;
cout << myHMap.myhash("Bill") << endl;
myHMap.Put("Bill", 999);
myHMap.Put("Tom", 888);
myHMap.Put("Mary", 777);
cout << myHMap.Get("Bill") << endl;
cout << "使用C++做好的hash_map:" << endl;
hash_map<string, int> hm;
hm["Bill"] = 9999;
hm["Tom"] = 8888;
hm["Mary"] = 7777;
cout << hm["Tom"] << endl;
system("pause");
return 0;
}
总结:hash非常快,利用数组可以快速计算地址,但是hash不能进行排序,所以如果需要排序,我们就使用二叉树映射(tree_map)它的速度使 O(logn) ,如果不需要排序就使用hash。