算法题高性能数据查找

jiangfeng999 2009-07-16 09:12:41
现在我有好几个文本文件,这些文件中一共有几百万条数据。文件中每一行为一条记录,每条记录中都有一个字段作为关键字,可以唯一的标明一条记录。这个关键字由字符('0'-'9','A'-'Z','a'-'z')组成。把这些数据都读入内存中后,要按照这个关键字才查找记录。如何建立索引才使查找在常数时间复杂度内完成。
...全文
58 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bowfnfje 2009-07-16
  • 打赏
  • 举报
回复
hashMap STL里的
beyond071 2009-07-16
  • 打赏
  • 举报
回复
如果不涉及移植性的问题 楼主去查阅下非标准的std::hash_map的使用哈
jiangfeng999 2009-07-16
  • 打赏
  • 举报
回复
可以给一个详细一点的hash表检索的方案吗
光宇广贞 2009-07-16
  • 打赏
  • 举报
回复
连文件名并记录关键字一起散列,可保常数时间内找到记录。
ganenpingsohucom 2009-07-16
  • 打赏
  • 举报
回复
按关键字对纪录建立倒排文件,关键字本身可以用hash编码等手段
Walf_ghoul 2009-07-16
  • 打赏
  • 举报
回复
hash表是个不错的选择
beyond071 2009-07-16
  • 打赏
  • 举报
回复
想在常数下查找 估计要用hash表
jiangfeng999 2009-07-16
  • 打赏
  • 举报
回复
今天看了暴雪的hash查找算法,但是有几个地方不是很理解
1.散列值计算

unsigned long HashString(char *lpszFileName, unsigned long dwHashType)
{
unsigned char *key = (unsigned char *)lpszFileName;
unsigned long seed1 = 0x7FED7FED, seed2 = 0xEEEEEEEE;
int ch;

while(*key != 0)
{
ch = toupper(*key++);
seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);
seed2 = ch + seed1 + seed2 + (seed2 << 5) + 3;
}
return seed1;
}

貌似这段代码使用了time33算法,但seed1 = cryptTable[(dwHashType << 8) + ch] ^ (seed1 + seed2);这句话不理解,为什么种子1要这样计算呢?
2.cryptTable:上述代码中使用的cryptTable内部数据构造,为什么要这样构造

void prepareCryptTable()
{
unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;
for(index1 = 0; index1 < 0x100; index1++)
{
for(index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
{
unsigned long temp1, temp2;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;
seed = (seed * 125 + 3) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);
cryptTable[index2] = (temp1 | temp2);
}
}
}

3.冲突的概率是如何计算的

int GetHashTablePos(char *lpszString, MPQHASHTABLE *lpTable, int nTableSize)
{
const int HASH_OFFSET = 0, HASH_A = 1, HASH_B = 2;
int nHash = HashString(lpszString, HASH_OFFSET),
nHashA = HashString(lpszString, HASH_A),
nHashB = HashString(lpszString, HASH_B),
nHashStart = nHash % nTableSize,
nHashPos = nHashStart;
while (lpTable[nHashPos].bExists)
{
if (lpTable[nHashPos].nHashA == nHashA && lpTable[nHashPos].nHashB == nHashB)
return nHashPos;
else
nHashPos = (nHashPos + 1) % nTableSize;

if (nHashPos == nHashStart)
break;
}
return -1; //Error value
}
文章中说冲突的概率平均是1:18889465931478580854784,这是如何计算出来的呢

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧