zoukankan      html  css  js  c++  java
  • PAT 1145 1078| hashing哈希表 平方探测法

    pat 1145:

    参考链接

    Quadratic probing (with positive increments only) is used to solve the collisions.:平方探测法解决冲突

    哈希表:H(key)求余数、二次平方探测法解决冲突、求平均查找长度AVL = 所有次数和/n

    需要注意点:处理冲突统计查找次数时,如果查找到哈希表最后一个也失败了,那么次数要+1.

    #include<bits/stdc++.h>
    using namespace std;
    
    /*
    哈希表:H(key)求余数、二次平方探测法解决冲突、求平均查找长度AVL = All/n 
    */ 
    const int maxn = 1e5+5;
    int Tsize,n,m;
    int a[maxn];
    int b[maxn];
    int hashTable[maxn];
    
    bool isPrime(int x){
    	if(x < 2) return false;
    	for(int i=2;i<=sqrt(x);i++){
    		if(x%i == 0) return false;
    	}
    	return true;
    }
    
    int HashKey(int key){
    	return key%Tsize;
    }
    
    int main(){
    	memset(hashTable,-1,sizeof(hashTable));
    	cin>>Tsize>>n>>m;
    	while(isPrime(Tsize) == false) Tsize++;
    	for(int i=0;i<n;i++) cin>>a[i];
    	for(int i=0;i<m;i++) cin>>b[i];
    	//插入 
    	for(int i=0;i<n;i++){
    		bool flag = false;
    		for(int j=0;j<Tsize;j++){
    			int idx = (HashKey(a[i]) + j*j) % Tsize;//平方探测法解决冲突 
    			if(hashTable[idx] == -1){
    				hashTable[idx] = a[i];
    				flag = true;
    				break;
    			}
    		}
    		if(flag == false){
    			printf("%d cannot be inserted.
    ",a[i]);
    		}
    	}
    	//查找
    	int cnt = 0;
    	for(int i=0;i<m;i++){
    		bool flag = false;
    		for(int j=0;j<Tsize;j++){
    			cnt++;
    			int idx = (HashKey(b[i]) + j*j) % Tsize;//平方探测法解决冲突 查找下标 
    			if(hashTable[idx] == b[i] || hashTable[idx] == -1 ){
    				flag = true;
    				break;
    			}
    		}
    		if(flag == false) cnt++;
    	}
    	printf("%.1f",cnt*1.0/m);
    	return 0;
    }
    

    pat 1078 同上

    数组存hash表、hash函数求余、平方探测法解决冲突,并且首先哈希表长度为素数。

    #include<bits/stdc++.h>
    using namespace std;
    
    int Tsize,n;
    const int maxn = 1e4+10;
    int a[maxn];
    int table[maxn];
    
    bool isPrime(int x){
    	if(x < 2) return false;
    	for(int i=2;i<=sqrt(x);i++){
    		if(x%i == 0) return false;
    	}
    	return true;
    }
    
    int getHash(int key){
    	return key%Tsize;
    }
    
    int main(){
    	cin>>Tsize>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	while(isPrime(Tsize) == false) Tsize++;
    	bool first = true;
    	for(int i=1;i<=n;i++){
    		bool search = false;
    		for(int j=0;j<Tsize;j++){
    			int hashIdx = (getHash(a[i]) + j*j)%Tsize;
    			if(table[hashIdx] == 0){
    				if(first) {
    					cout<<hashIdx;
    					first = false;
    				}
    				else cout<<" "<<hashIdx;
    				search = true;
    				table[hashIdx] = a[i];
    				break;
    			}
    		}
    		if(search == false){
    			if(first){
    				first = false;
    				cout<<"-";
    			}
    			else{
    				cout<<" -";
    			}
    		}
    	}
    	return 0;
    }
    

    另补充哈希冲突的处理方法 和 装填因子:


  • 相关阅读:
    ubuntu15.10下各种编译环境的搭建(工作平台大转移)
    win7+ubuntu15.10的安装
    Qt之串口通信
    读C++代码必备专业名词
    好书好网站积累着有空看
    大数学家与中小学教育相关的资料(持续更新)
    《x的奇幻之旅》读书笔记
    冯·诺依曼为后生解围
    从一道简单的几何题说起
    Steiner-Lehmus 定理
  • 原文地址:https://www.cnblogs.com/fisherss/p/11211904.html
Copyright © 2011-2022 走看看