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个待查关键字,分别输出:

0或1(0—不成功,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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 高级C/C++编译技术之读书笔记(一)之编译/链接

    本节思维导图1.计算机体系结构抽象2.进程内存映射布局(1)代码节:供CPU执行的机器指令码(.text节)(2)数据节:供CPU操作的数据,通常来说,初始化数据(.data)、未初始化数

    2021年12月28日
  • 线程池面试题一般会怎么问?线程池面试题总结及答案整理

    线程池面试题一般会怎么问?线程池面试题总结及答案整理对于广大程序员来说,线程池一定不会陌生,因为大部分程序员面试时总会被问到关于线程池的问题,今天总结了一些关于线程池的各种面试可能问到的题目,希望对大家有所帮助。一、线程池是什么?答:线程池,是一种多线程处理形式,在处理过程中将任务添加到队列中,然后在创建线程后自动启动这些任务。比如把线程池看成一个容器,集中管理线程。线程使用完不会销毁,会先储存在线程池中。二、线程池有几种?答:常见的线程池有四种。newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超过处理需要,

    2022年5月5日
  • delphi字符函数Copy,Pos,Quotedstr

    delphi字符函数Copy,Pos,Quotedstr———————————————————————————————-Posfunction  Returnstheindexvalueofthefirstcharacterinaspecifiedsubstringthatoccursin

    2022年10月17日
  • maven配置报错以及The JAVA_HOME environment variable is not defined correctly的解决方法

    maven配置报错以及The JAVA_HOME environment variable is not defined correctly的解决方法版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.csdn.net/postedit/83212263maven配置报错以及TheJAVA_HOMEenvironmentvariableisnotdefinedcorrectly的解决方法1、什么是MavenMaven是一个项目管理和整合的工具。Maven为开发者提供了一套完整的构建生命周期框…

    2022年5月27日
  • 如何分析系统平均负载过高的原因_线上cpu负载过高如何排查

    如何分析系统平均负载过高的原因_线上cpu负载过高如何排查前言我相信你应该用过uptime命令查询系统负载的情况,或者在各种监控终端上看到过系统load这一项,但是每次问别人到底什么是系统load?系统load到达多少算过高?又有哪些原因会造成系统load过载?我发现很少有人能回答清楚,大多数都觉得系统load过载就表示CPU使用率过载、然而实际上并不完全这样的,本文就来仔细分析一下到底有哪些原因会造成系统load过载!uptime命令还是先来看看uptime命令,…

    2022年9月13日
  • 通俗理解运行时异常和非运行时异常(一般异常)[通俗易懂]

    通俗理解运行时异常和非运行时异常(一般异常)[通俗易懂]一,异常的概念Java异常类层次结构图:Throwable:有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。例如,Java虚拟机运行错误

    2022年9月30日

发表回复

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

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