1. 程式人生 > >C++實現哈希映射(與map二叉樹映射,線性映射比較)

C++實現哈希映射(與map二叉樹映射,線性映射比較)

oid ace 哈希 fin cto span ast cast c++實現

practice1.h(包含線性映射)

#ifndef PRACTICE1_H_INCLUDED
#define PRACTICE1_H_INCLUDED

#include<vector>

template<class Key,class Value>

class LinerMap //線性映射
{
 public:
     LinerMap(int size=101):arr(size)
     {

         currentSize=0;
     }
     void Put(const Key&k,const Value & v)
     {

         arr[currentSize]
=DataEntry(k,v); currentSize+=1; } Value Get(const Key & k) { //線性查找 for(size_t i=0;i<currentSize;i++) { if(arr[i].key==k) return arr[i].value; else return 2333; } } 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 // PRACTICE1_H_INCLUDED

hashmap.h文件

#ifndef HASHMAP_H_INCLUDED
#define HASHMAP_H_INCLUDED #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 hashVal=0; const char *keyp=reinterpret_cast<const char *>(&k);//轉換成字符 for (size_t i=0;i<sizeof(Key); i++) hashVal=37*hashVal+keyp[i]; return hashVal; }//哈希函數不能太過於復雜 不然影響執行速度 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 // PRACTICE1_H_INCLUDED

practice.cpp文件

#include<iostream>
#include<map>//映射,二叉樹映射(字典),不是哈希映射
#include "practice1.h"
#include<string>


#include<hash_map>//不是c++的國際標準裏
#include "hashmap.h"
using namespace std;

int main()
{
    //二叉搜索樹
    map<string,int> m;//字典
    m["bill"]=98;
    //保存了許多

    //cout<<m["bill"]<<endl;
    //速度是logn
    //哈希是O(1)

    //數組的優點  查詢特別快

    //線性查找
//    LinerMap<string,int> lm;
//
//    lm.Put("bill",80);
//
//    lm.Put("jack",100);
//
//    cout<<lm.Get("bill")<<endl;



   //哈希映射

   HashMap<string,int>myHMap;
//   cout<<myHMap.hash("bill")<<endl;//得到bill的哈希值
//   cout<<myHMap.myhash("bill")<<endl;
   //哈希值特別大可以再對數組的容量進行一次取余
//   myHMap.Put("bin",999);
//   cout<<myHMap.myhash("bin")<<endl;
//   myHMap.Put("jack",100);
//   cout<<myHMap.myhash("jack")<<endl;
//
//   cout<<myHMap.Get("jack")<<endl;




    //c++制作好的哈希映射
    hash_map<string,int> hm;
    hm["libin"]=15;
    cout<<hm["libin"]<<endl;

    return 0;
}

C++實現哈希映射(與map二叉樹映射,線性映射比較)