哈希(hash) 之 开放地址法(poj)

来源:互联网 发布:linux 司机售票员问题 编辑:程序博客网 时间:2024/05/22 09:48
#include <iostream>#include<stdio.h>using namespace std;const int size=20345677;const int M=1000000000;const int key=1357;typedef struct Hash{    int val;    int cp;}Hash;Hash hash[size];// 线性探测再散列,为啥全部加M呢,因为 n 可能为-2 的28次方void insert(int n){哈希表(散列表)开放寻址法:包括 线性探查(如本文);二次探查(加平方);双重散列。把关键字从非自然数转化为自然数N,字符串的一般用ELFHash()更搞笑;开放地址法在删除方面不如链接法(链表法),他不能够随意的删掉一个元素而不做任何处理,否则查找同一个映射的元素将失败开放地址法是将所有的元素都放在散列表中,装载因子绝对不会超过1. int t=n; n=(n+M)%size; while(hash[n].val!=M&&hash[n].val!=t) {  n=(n+key)%size; } hash[n].val=t; hash[n].cp++;}int search(int n){ int t=n; n=(n+M)%size; while(hash[n].val!=M&&hash[n].val!=t) {  n=(n+key)%size; } if(hash[n].val==M) return 0; else return hash[n].cp;}int main(){ int n; int i,j; int a[4005],b[4005],c[4005],d[4005]; scanf("%d",&n); int z=0; for(i=0;i<n;i++) {        scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); } for(i=0;i<size;i++) {    hash[i].val=M;    hash[n].cp = 0; } for(i=0;i<n;i++)        for(j=0;j<n;j++)  {   insert(a[i]+b[j]);  }  for(i=0;i<n;i++)   for(j=0;j<n;j++)   {    z+=search(-(c[i]+d[j]));   }   printf("%d\n",z);   return 0;}

0 0
原创粉丝点击