计算完美HASH

 

// 计算完美HASH

#include "stdafx.h"
#include <windows.h>
#include <algorithm>
#include <iostream>

using namespace std;

// HASH函数为 data%HashSize
// 返回完美HASH的尺寸
// 失败返回0
unsigned int GetPerfectHash(const unsigned int* pData, size_t iNum, size_t iMaxHashSize);

int _tmain(int argc, _TCHAR* argv[])
{
 unsigned int data[] = {204, 83, 111, 103, 46, 115, 82, 145};
 size_t nNum = sizeof(data)/sizeof(data[0]);
 size_t iHashSize = GetPerfectHash(data, nNum, nNum*3);
 cout << "// HashSize = " << iHashSize << endl;
 if(iHashSize != 0)
 {
  for(size_t i=0; i<nNum; ++i)
  {
   cout << "// hash(" << data[i] << ") = " << data[i]%iHashSize << endl;
  }
 }

 return 0;
}

unsigned int  GetPerfectHash(const unsigned int* pData, size_t iNum, size_t iMaxSize)
{
 if(pData == 0)
  return 0;

 if(iNum <= 1)
  return iNum;

 if(iMaxSize < iNum)
  iMaxSize = iNum;

 bool* pConflict = new bool[iMaxSize];

 for(size_t nHashSize = iNum; nHashSize<=iMaxSize; ++nHashSize)
 {
  fill(pConflict, pConflict+nHashSize, false);

  bool bFindPerfect = true;
  for(size_t i=0; i<iNum; ++i)
  {
   unsigned int iHash = pData[i] % nHashSize;
   if(pConflict[iHash])
   {
    bFindPerfect = false;
    break;
   }
   pConflict[iHash] = true;
  }

  if(bFindPerfect)
  {
   delete[] pConflict;
   return  nHashSize;  
  }
 }

 delete[] pConflict;
 return 0;
}

// 运行结果:
// HashSize = 22
// hash(204) = 6
// hash(83) = 17
// hash(111) = 1
// hash(103) = 15
// hash(46) = 2
// hash(115) = 5
// hash(82) = 16
// hash(145) = 13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值