zoukankan      html  css  js  c++  java
  • PAT A1078 Hashing (25) [⼆次⽅探查法 素数 质数]

    题目

    题目链接 PAT A1078
    hash表,平方探测解决冲突,插入数据并返回插入位置
    注:hash表长必须为质数,若不为质数,需要转换为大于指定表长n的最小质数为表长

    解题思路

    平方探测hash函数H(key)=(key+d*d)%m;(d=0,1,2,..表长-1)
    1 若不冲突,插入返回位置
    2 若冲突,平方探测,有空位置,插入并返回位置
    3 若冲突,平方探测,探测一轮后i从0~表长-1,没有空位置,打印'-'

    易错点

    1 找到插入位置后,除了打印,还要将数据插入该位置或者标记该位置已占用

    单词语法

    Quadratic probing /kwɑˈdrætɪk/ 二次探测
    (with positive increments only) 只正序探测
    solve the collisions 解决冲突

    Code

    Code 01

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    bool isPrime(int x) {
    	if(x<=1)return false;
    	int sqr = (int)sqrt(1.0*x);
    	for(int i=2; i<=sqr; i++) {
    		if(x%i==0)return false;
    	}
    	return true;
    }
    int main(int argc,char * argv[]) {
    	int m,n,k;
    	scanf("%d%d",&m,&n);
    	while(!isPrime(m))m++;
    	int ht[m]= {0};
    	for(int i=0; i<n; i++) {
    		scanf("%d",&k);
    		int h = k%m;
    		//平方探测
    		int j;
    		for(j = 0; j<m&&ht[(h+j*j)%m]!=0; j++);
    		if(i!=0)printf(" ");
    		if(j>=m)printf("-"); //如果没有探测到位置 
    		else { //如果探测到位置 
    			int hq = (h+j*j)%m;
    			ht[hq]=k;
    			printf("%d",hq);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    安装 android sdk 时,dl.google.com 连不上各种尝试
    解决android SDK 安装过程中 packages 列表为空的问题
    Java 集合 -- Deque
    Java 集合 -- Queue
    Java 集合 -- Set
    Java 集合 -- Map
    Java 集合 -- List
    Java 语言进阶 -- 线程
    Java 语言基础知识
    Java 网络编程基础 -- TCP 编程
  • 原文地址:https://www.cnblogs.com/houzm/p/13337834.html
Copyright © 2011-2022 走看看