C++数据结构 20 哈希

哈希(hash_map)是最快的数据结构算法,但是插入数据是以无序的方式插入的,所以数据是没有排序的.

二叉树(tree_map)比哈希慢点(O(LogN)),但是二叉树是以排序方式插入的(大的数据在根的右边,小的数据在根的左边)。

哈希不是标准的stl,但是VS里面可以直接包含<hash_map>直接使用

代码:

#ifndef __LinearMap_H__
#define __LinearMap_H__

#include <vector>

using namespace std;


template<class Key,class Value>
class LinearMap    //线性映射
{
   private:
     //  int Size;
     int CurrentSize;
     struct DateEntry
       {
          Key key;
          Value value;
         DateEntry(const Key &k=Key(),const Value &v=Value()):key(k),value(v){};
       };
       vector<DateEntry> arr;
   public:

       LinearMap(const int s=101):arr(s)
       {
         CurrentSize=0;
       }
       void Put(const Key & k,const Value & v)
       {
          arr[CurrentSize]=DateEntry(k,v);
          CurrentSize++;
       }
       Value Get(const Key &k)  //提供键值 返回v
       {
          for(size_t i=0;i<CurrentSize;i++)
          {
              if(arr[i].key==k)
                return arr[i].value;
          }
          return 0;
       }
};






#endif // __LinearMap_H__

#ifndef __HashMap_H__
#define __HashMap_H__

#include <vector>

using namespace std;


template<class Key,class Value>
class HashMap    //线性映射
{
   private:
     //  int Size;
     int CurrentSize;
     struct DateEntry
       {
          Key key;
          Value value;
         DateEntry(const Key &k=Key(),const Value &v=Value()):key(k),value(v){};
       };
       vector<DateEntry> arr;
   public:

       HashMap(const int s=101):arr(s)
       {
         CurrentSize=0;
       }
       void Put(const Key & k,const Value & v)
       {
          int pos = myHash(k);
          arr[pos]=DateEntry(k,v);
          ++CurrentSize;

       }
       Value Get(const Key &k)  //提供键值 返回v
       {
            int pos = myHash(k);
            if(arr[pos].key==k)
                return arr[pos].value;
            else
                return 0;
       }
       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 hashValue=Hash(k);
         hashValue%=arr.size();
         return hashValue;
       }
};






#endif // __LinearMap_H__


#include <iostream>
#include "LinearMap.h"
#include "HashMap.h"
#include <string>
#include <map>  //二叉树映射  红黑树 排序
#include <hash_map>  //哈希映射 无排序
using namespace std;

int main()
{
   // cout << "Hello world!" << endl;
   LinearMap<string,int> a;
   a.Put("Bill",12);
   a.Put("dell",45);
   a.Put("Tom",78);
   cout<<a.Get("Tom")<<endl;
   HashMap<string,int> p;
  a.Put("Bill",999);
   a.Put("dell",888);
   a.Put("Tom",777);
   cout<<p.Get("dell")<<endl;

   hm["Tom"]=12;
   hm["Bill"]=100;
   cout<<hm["Tom"]<<endl;
    return 0;
}

代码有点问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值