1078 Hashing

关键在于这句:Quadratic probing (with positive increments only) is used to solve the collisions.开始不懂二次探测,因此做不出来。所谓二次探测就是如果num%mSize被占坑了,就看看(num+1*1)%mSize有没有被占,还是被占,看(num+2*2)%mSize……如果一直到(num+(mSize-1)*(mSize-1))%mSize都被占,说明真的插不进去了。

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>

using namespace std;
typedef long long LL;

const int maxn = 10007;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;

bool isPrime(int n){//判断一个十进制数是否为素数 
	if(n<=1)return false;
	for(int i=2;i<=(int)sqrt(1.0*n);i++){
		if(n%i==0)return false;
	}
	return true;
}

int main(){

	int mSize,n;
	scanf("%d%d",&mSize,&n);
	
	if(!isPrime(mSize)){//不是素数,换成大于它的最小素数 
		for(int i=mSize;i<=maxn;i++){//maxn = 10^4+7是一个素数 
			if(isPrime(i)){
				mSize = i;
				break;
			}
		}
	}
	
	bool hashTable[maxn] = {0};
	int num;
	for(int i=0;i<n;i++){
		scanf("%d",&num);
		if(!hashTable[num%mSize]){
			printf("%d",num%mSize);
			hashTable[num%mSize] = true;
		}else{//二次探测
			bool noFound = true;
			for(int j=0;j<mSize;j++){
				int index = num+j*j;
				if(!hashTable[index%mSize]){
					printf("%d",index%mSize);
					hashTable[index%mSize] = true;
					noFound = false;
					break;
				}
			} 
			if(noFound)printf("-");//满足if内的条件说明一直j加到mSize-1也没找到空位 
		}
			
		if(i!=n-1)printf(" "); 
	}
	
	
	 
	return 0;
}

上一篇:TypeError: Unicode-objects must be encoded before hashing


下一篇:一致性Hash(Consistent Hashing)