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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringCloud微服务架构分析

    SpringCloud微服务架构分析微服务框架微服务是一种架构风格,一个大型复杂软件应用应该由一个或多个微服务组成。系统中的各个微服务都可以被独立部署,每个服务仅关注于完成一件任务就行了,在所有情况下,每个任务都代表着一个小的业务能力。微服务架构其实就是一种架构风格,我们将整个项目划分为多个独立的小项目,也就是我们俗称的微服务,可以理解为每个微服务都单独处理某个功能模块,可以独立开发、测试、部署、监控和扩展,甚至可以用不同的编程语言开发它们。它有利于我们平时项目的开发,解决了一体化架构项目难以扩展,开发周期长,故障级联等问题…

    2022年6月15日
    31
  • 华为c++面试题和答案汇总_C语言经典笔试题

    华为c++面试题和答案汇总_C语言经典笔试题《几道华为经典C语言面试题》由会员分享,可在线阅读,更多相关《几道华为经典C语言面试题(6页珍藏版)》请在人人文库网上搜索。1、1、找错voidtest1()charstring10;char*str1=;strcpy(string,str1);这里string数组越界,因为字符串长度为10,还有一个结束符0。所以总共有11个字符长度。string数组大小为10,这里越界了。PS:使用st…

    2022年8月28日
    1
  • 线性代数行列式方程求解(正交矩阵的行列式)

    线性代数行列式求值算的可真是让人CPU疼,但计算机是不累的,所以用一个c++程序帮助你验证求解行列式的值吧。本文介绍了三种算法,虽然还没有完成–.–

    2022年4月13日
    154
  • 图片怎么一键重命名_多个图片重命名并按指定的顺序

    图片怎么一键重命名_多个图片重命名并按指定的顺序其主要功能是将某个目录下的指定文件复制到另一个目录下,同时:1.对于目录结构,可以选择将原各级子目录合并成一个目录,或保持原目录结构。2.对于文件名,可以选择(1).保持原文件名不变,但在重名时自动更名;(2).将所有文件重新编号,新文件名=前缀+分隔字符+编号,前缀可以指定,或用子目录名为前缀;(3).去掉原文件名的头几个字符;(4).在文件名开头添加指定的字符串;(5).在第n个字符后添加…

    2022年9月5日
    2
  • js解压gzip数据_gzip 压缩

    js解压gzip数据_gzip 压缩微信小程序开发交流qq群173683895承接微信小程序开发。扫码加微信。GZIP压缩,GZIP解压需要用到pako.js文件:下载地址:https://download.csdn.net/download/qq_35713752/10627338使用方法:JS压缩和解压:varpako=require(‘../../utils/pako.min.js…

    2022年9月7日
    0
  • java代码块

    java代码块

    2021年9月29日
    49

发表回复

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

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