• [DOJ练习] 散列查找实验(闭散列/开散列)


    散列查找实验(闭散列)

    请设计一个整型闭散列表,散列函数为除留余数法,处理冲突时的探查方法为线性探查法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,如果找到了输出位置,如果没找到,输出“none”并把该待查值插入到散列表中,如果散列表满输出“full”。

    输入描述

    各个命令以及相关数据的输入格式如下:
    第一行输入闭散列表的长度n
    第二行输入除留余数法的模m
    第三行输入关键码的个数num
    第四行输入num个整型关键码
    第五行输入三个待查整型值

    输出描述

    输出三行,每行格式为: 
    如果找到待查值,输出找到待查值的位置,如果没找到,输出“none”,并将待查值插入到散列表中,如果散列表满,则输出“full”,每个待查值占一行

    输入样例

    11 11 9
    2 6 8 9 13 17 10 12 20
    3 7 11

    输出样例

    none
    none
    full

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    const int N = 1010;
    int n,m,k;
    int h[N],e[N],ne[N],idx,site[N];
    
    void add(int a, int b){
    	e[idx]=b, ne[idx]=h[a], h[a]=idx++;
    }
    int main()
    {
    	cin >> n >> m >> k;
    	
    	memset(h, -1, sizeof h);
    	int x;
    	for(int i = 0; i < k; i++)
    	{
    		cin >> x;
    		add(x%m, x);
    	}
    
    	int total=k;
    	for(int i = 0; i < 3; i++)
    	{
    		cin >> x;
    		int j = h[x%m];
    		for(;j != -1; j = ne[j])
    		{
    			if(e[j]==x){
    				cout << x%m;
    				break;
    			}
    		}
    		if(j == -1){
    			if(total<n){
    				cout << "none";
    				add(x%m, x);
    				total++;
    			}else{
    				cout << "full";
    			}
    		}
    	}
    	return 0;
    }

    散列查找实验(开散列)

    请设计一个整型开散列表,散列函数为除留余数法,其中散列表的长度、除留余数法的模和关键码的个数由键盘输入,再根据输入由键盘输入所有的关键码。分别对三个待查值在散列表中进行查找,输出查找结果采用头插法。

    输入描述

    各个命令以及相关数据的输入格式如下:
    第一行输入闭散列表的长度n
    第二行输入除留余数法的模m
    第三行输入关键码的个数num
    第四行输入num个整型关键码
    第五行输入三个待查整型值

    输出描述

    输出三行,每行格式为: 
    如果找到待查值,输出找到待查值的位置,先输出待查值在散列表指针数组中的下标,
    再输出待查值在关键码链表中的位置,从1开始,如果没找到,输出“none”,并把待查值
    插入到开散列表中

    输入样例

    11 11 9
    2 6 8 9 13 17 10 12 20
    11 13 9

    输出样例

    none
    2 1
    9 2

    和邻接表构造方法一样

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    const int N = 1010;
    int n,m,k;
    int h[N],e[N],ne[N],idx;
    
    void add(int a, int b){
    	e[idx]=b, ne[idx]=h[a], h[a]=idx++;
    }
    int main()
    {
    	cin >> n >> m >> k;
    	
    	memset(h, -1, sizeof h);
    	int x;
    	for(int i = 0; i < k; i++)
    	{
    		cin >> x;
    		add(x%m, x);
    	}
    
    	for(int i = 0; i < 3; i++)
    	{
    		cin >> x;
    		int cnt = 0;
    		int j = h[x%m];
    		for(;j != -1; j = ne[j])
    		{
    			cnt ++;
    			if(e[j]==x){
    				cout << x%m << " " << cnt;
    				break;
    			}
    		}
    		if(j == -1){
    			cout << "none";
    			add(x%m, x);
    		}
    	}
    	return 0;
    }

    本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799033.html

  • 相关阅读:
    C# 发送匿名邮件
    上传大文件,Web.config中的配置
    老话题关于文章自动分页
    scrollLeft,scrollWidth,clientWidth,offsetWidth到底指的哪到哪的距离
    转成静态页面,由于ie网址或路径原因,Atlas失效。
    让图片自适应大小的方法
    textoverflow 全兼容
    ISAPI_rewrite中文手册
    ISAPI_Rewrite集
    无限级下拉列表框控件
  • 原文地址:https://www.cnblogs.com/Knight02/p/15799033.html
Copyright © 2020-2023  润新知