DS哈希查找—二次探测再散列

DS哈希查找—二次探测再散列题目描述定义哈希函数为H(key)=key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。输入测试次数t每组测试数据格式如下:哈希表长m、关键字个数nn个关键字查找次数kk个待查关键字输出对每组测试数据,输出以下信息:构造的哈希表信息,数组中没有关键字的位置输出NULL对k个待查关键字,分别输出:…

大家好,又见面了,我是你们的朋友全栈君。

题目描述

定义哈希函数为H(key) = key%11。输入表长(大于、等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字。

输入

测试次数t

每组测试数据格式如下:

哈希表长m、关键字个数n

n个关键字

查找次数k

k个待查关键字

输出

对每组测试数据,输出以下信息:

构造的哈希表信息,数组中没有关键字的位置输出NULL

k个待查关键字,分别输出:

010—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

样例输入

1

12 10

22 19 21 8 9 30 33 4 41 13

4

22

15

30

41

样例输出

22 9 13 NULL 4 41 NULL 30 19 8 21 33

1 1 1

0 3

1 3 8

1 6 6

思路:

取key的方式:先取余,若不冲突则直接存,若冲突则加上偏移量(1²,-1²,2²,-2²……),然后在长为m的hash表中循环滚动,最后确定key

key第一次取value%11

如果位置冲突,key取:value % 11 + 1²,如果key超过hash表的长度m,key取key-m,如果key的值为负,key取key+m

如果位置冲突,key取:value % 11 + (-1²),如果key超过hash表的长度m,key取key-m,如果key的值为负,key取key+m

如果位置冲突,key取:value % 11 + (2²),如果key超过hash表的长度m,key取key-m,如果key的值为负,key取key+m

如果位置冲突,key取:value % 11 + (-2²),如果key超过hash表的长度m,key取key-m,如果key的值为负,key取key+m

以此类推下去取key

code:

#include <iostream>
using namespace std;

void test()
{
    int m,n;
    cin>>m>>n;
    int *hashh;
    hashh = new int [m];
    for(int i=0;i<m;i++)
        hashh[i]=-100000;
    int value,key,flag,temp_key,d,symb,num;
    for(int i=0;i<n;i++)                //建hash表
    {
        cin>>value;
        key=value%11;
        temp_key=key;
        d=1;                            //偏移量
        symb=1;                         //符号
        num=0;                          //hash次数
        while(1)
        {
            if(hashh[temp_key]==-100000)
            {
                hashh[temp_key]=value;
                break;
            }
            else
            {                                    //滚动取key
                num++;
                temp_key=key+symb*(d*d);    //更新key
                symb*=-1;                //更新符号
                if(num%2==0)            //每2次需要更新1次偏移量
                    d++;
                if(temp_key>m)            //key超过hash表长度
                    temp_key -= m;
                else if(temp_key <0)      //key的值为负数
                    temp_key += m;
            }
        }
    }
    for(int i=0;i<m;i++)
    {
        if(hashh[i] == -100000)
            cout<<"NULL";
        else
            cout<<hashh[i];
        if(i != m-1)
            cout<<' ';
    }
    cout<<endl;

    int search_num,search_time;
    cin>>search_num;
    for(int i=0;i<search_num;i++)            //查找
    {
        search_time=0;
        cin>>value;
        key=value%11;
        temp_key=key;
        d=1;
        symb=1;
        flag=0;
        num=0;
        while(1)
        {
            search_time++;
            if(hashh[temp_key]==value)
            {
                flag=1;
                cout<<1<<' '<<search_time<<' '<<temp_key+1<<endl;
                break;
            }
            else
            {                                    //和建表一样的更新方法
                if(hashh[temp_key]==-100000)
                    break;
                num++;
                temp_key=key+symb*(d*d);
                symb*=-1;
                if(num%2==0)
                    d++;
                if(temp_key>m)
                    temp_key -= m;
                else if(temp_key <0)
                    temp_key += m;
                if(num>m/2)
                    break;
            }
        }
        if(flag==0)
            cout<<0<<' '<<search_time<<endl;
    }
    delete[] hashh;
}
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
        test();
	}

	return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146468.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月15日 上午8:20
下一篇 2022年5月15日 上午8:20


相关推荐

  • [python]异步 async

    [python]异步 async#-*-encoding:utf-8-*-“””ankus@ModifyTime@Author@Version@Description————————————–2021/12/314:02xlgui21.0asynciopy3.8异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的,不用等待它结束,可以继续做

    2022年7月27日
    6
  • beego——XSRF过滤

    beego——XSRF过滤跨站请求伪造,简称XSRF,是Web应用中常见的一个安全问题。当前防范XSRF的一种通用的方法,是对每一个用户都记录一个无法预知的token数据,然后要求所有提交的请求(POST/PUT/DELETE)中都必须带有这个token数据。如果此数据不匹配,那么这个请求就可能是被伪造的关于XSRF攻击的详细内容可以参考博客:https://www.cnblogs.com/yangmin…

    2022年5月19日
    39
  • flyme开放平台_uniapp重定向

    flyme开放平台_uniapp重定向#功能概述[Fly.js](https://github.com/wendux/fly)一个基于Promise的、强大的、支持多种JavaScript运行时的http请求库.有了它,您可以使用一份http请求代码在浏览器、微信小程序、Weex、Node、ReactNative、快应用中都能正常运行。同时可以方便配合主流前端框架,最大可能的实现WriteOnceRunEverywh…

    2025年8月28日
    8
  • docker打开2375「建议收藏」

    docker打开2375「建议收藏」在进行dockerswarm进行管理集群节点时,需要打开端口。1、$pwd/etc/docker创建daemon.json$catdaemon.json{“hosts”:[“tcp://0.0.0.0:2375″,”unix:///var/run/docker.sock”]}2、cat/usr/lib/systemd/system/docker.servic…

    2022年4月29日
    168
  • Vue上传文件到springboot

    Vue上传文件到springboot<el-uploadclass=”upload-demo”ref=”upload”accept=”image/png,image/jpg,image/jpeg”:file-list=”fileLists”:on-preview=”handlePreview”…

    2022年10月16日
    8
  • Enterprise Library 3.1 介绍「建议收藏」

    Enterprise Library 3.1 介绍「建议收藏」EnterpriseLibrary3.1是Microsoftpatterns&practicesEnterpriseLibrary的一个新的发行。EnterpriseLibrary是一个应用程序块的集合。这些可重用的软件组件为帮助开发者解决普通企业开发的挑战而设计。这个EnterpriseLibrary发行包括了二个新的应用程序块,一个用于创建应用程序块和提供程序的软

    2022年10月20日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号