Chinaunix

标题: 请教一个关于Hash算法中除留余数的问题 [打印本页]

作者: bluetune    时间: 2006-10-17 11:39
标题: 请教一个关于Hash算法中除留余数的问题
昨天在用代码实现一个hash算法的时候,突然想到,为什么除留余数法中除数要用质数?虽然各种教科书上都说质数可以减少地址冲突,但为什么会这样?我写了一小段代码,测试了一下,结果是除数是不是质数都没关系。为简单,桶数和除数是一样的。很困惑,请高手指点。
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

typedef vector<int> vInt;

int main()
{
        int        BucketNum = 10;
        int        tmpBucketNum;
        vector<vInt *>        vBuckets;
        vInt        *pvInt, *ptvInt;
        vector<int>::iterator        iterInt;
       
        for (int i=0; i<BucketNum; i++)
        {
                pvInt = new vInt;
                vBuckets.push_back(pvInt);
        }

        for (int i=0; i<100; i++)
        {
                tmpBucketNum = i%BucketNum;
                ptvInt = vBuckets[tmpBucketNum];
                (*ptvInt).push_back(i);
        }

        for (int i=0; i<BucketNum; i++)
        {
                cout << endl << "*******Bucket:" << i << endl;
                ptvInt = vBuckets[i];
               
                for (iterInt=(*ptvInt).begin(); iterInt < (*ptvInt).end(); iterInt ++)
                {
                        cout << *iterInt << "\t";
                }
        }
       
        return 0;
}
作者: bluetune    时间: 2006-10-17 15:43
标题: 自己顶--测试结果
*******Bucket:0
0       10      20      30      40      50      60      70      80      90
*******Bucket:1
1       11      21      31      41      51      61      71      81      91
*******Bucket:2
2       12      22      32      42      52      62      72      82      92
*******Bucket:3
3       13      23      33      43      53      63      73      83      93
*******Bucket:4
4       14      24      34      44      54      64      74      84      94
*******Bucket:5
5       15      25      35      45      55      65      75      85      95
*******Bucket:6
6       16      26      36      46      56      66      76      86      96
*******Bucket:7
7       17      27      37      47      57      67      77      87      97
*******Bucket:8
8       18      28      38      48      58      68      78      88      98
*******Bucket:9
9       19      29      39      49      59      69      79      89      99
作者: bluetune    时间: 2006-10-17 17:52
标题: 自己顶--从测试结果看,不是质数也可以使数据分布得很均匀
不明白为什么教科书里要求用质数
作者: bluetune    时间: 2006-10-18 08:46
标题: 自己顶--真的没人知道吗?
??
作者: bluetune    时间: 2006-10-18 11:49
标题: 自己顶--找到结果了
http://jpkc.ncwu.edu.cn/sjjg/new/content/ch8/ch8-03-05.htm
其实比较关键的是处理的数据,我本来以为示例代码的数据够散了,但实际应用中的数据是多种多样的,很有可能有大量包含同因子的数据,因此选择质数是必要的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2