数据结构OJ实验14-哈希查找

news2024/12/29 8:37:30

A. DS哈希查找—线性探测再散列

题目描述

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

输入

测试次数t

每组测试数据为:

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

n个关键字

查找次数k

k个待查关键字

输出

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

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

对k个待查关键字,分别输出:0或1(0—不成功,1—成功)、比较次数、查找成功的位置(从1开始)

样例查看模式 

正常显示查看格式

输入样例1 

1\n
12 10\n
22 19 21 8 9 30 33 4 15 14\n
4\n
22\n
56\n
30\n
17\n

输出样例1

22 30 33 14 4 15 NULL NULL 19 8 21 9\n
1 1 1\n
0 6\n
1 6 2\n
0 1\n

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m;
int h[N];
int k;
void hasht(int x)
{
    int x1=x%11;//初始
    for(int i=0;i<m;i++)
    {
        int temp=(x1+i)%m;//再线性探测
        if(h[temp]==-1)
        {
            h[temp]=x;
            break;
        }
    }
}
void find(int x)
{
    int cnt=0;
    int idx=-1;
    bool ok=0;
    int x1=x%11;
    for(int i=0;i<m;i++)
    {
        cnt++;//查找次数
        int temp=(x1+i)%m;
        if(h[temp]==-1)
        {
            break;//找不到这个元素
        }
        if(h[temp]==x)
        {
            ok=1;
            idx=temp;
            break;
        }
    }
    if (ok)
			cout << ok << " " << cnt << " " << idx + 1 << endl;
		else
			cout << ok << " " << cnt << endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
       memset(h,-1,sizeof(h));//初始h
       cin>>m>>n;
       for(int i=0;i<n;i++)
       {
          int x;
          cin>>x;
          hasht(x);
       }
       for(int i=0;i<m;i++)
       {
        if(h[i]!=-1)
        {
            cout<<h[i];
        }
        else cout<<"NULL";
        if(i!=m-1)cout<<" ";
        else cout<<endl;
       }
       cin>>k;
       while(k--)
       {
        int x;
        cin>>x;
        find(x);
       }
    }
    return 0;
}

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

题目描述

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

输入

测试次数t

每组测试数据格式如下:

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

n个关键字

查找次数k

k个待查关键字

输出

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

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

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

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

样例查看模式 

正常显示查看格式

输入样例1 

1\n
12 10\n
22 19 21 8 9 30 33 4 41 13\n
4\n
22\n
15\n
30\n
41\n

输出样例1

22 9 13 NULL 4 41 NULL 30 19 8 21 33\n
1 1 1\n
0 3\n
1 3 8\n
1 6 6\n

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int m,n,t,k;
int h[N];
int d[N];
void init()
{
   d[0]=0;
   memset(d,0,sizeof(d));
   for(int i=1;i<m;i++)
   {
       if(i%2)
       {
        d[i]=pow((i+1)/2,2);
       }
       else
       {
        d[i]=-d[i-1];
       }
   }
}
void hasht(int x)
{
    int x1=x%11;
    for(int i=0;i<m;i++)
    {
        int temp=(x1+d[i]+m)%m;
        if(h[temp]==-1)
        {
            h[temp]=x;
            break;
        }
    }
}
void find(int x)
{
    int cnt=0;
    int idx=-1;
    bool ok=0;
    int x1=x%11;
    for(int i=0;i<m;i++)
    {
        cnt++;
        int temp=(x1+d[i]+m)%m;
        if(h[temp]==-1)break;
        if(h[temp]==x)
        {
            ok=1;
            idx=temp;
            break;
        }
    }
    if (ok)
			cout << ok << " " << cnt << " " << idx + 1 << endl;
	else
			cout << ok << " " << cnt << endl;
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>m>>n;
        init();
        memset(h,-1,sizeof(h));
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            hasht(x);
        }
        for(int i=0;i<m;i++)
       {
        if(h[i]!=-1)
        {
            cout<<h[i];
        }
        else cout<<"NULL";
        if(i!=m-1)cout<<" ";
        else cout<<endl;
       }
        cin>>k;
        while(k--)
        {
            int x;
            cin>>x;
            find(x);
        }
    }
    return 0;
}

C. DS哈希查找--链地址法(表头插入)

题目描述

给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表头插入

如果首次查找失败,就把数据插入到相应的位置中

实现哈希查找功能

输入

第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数

输出

每行输出对应数据的查找结果

样例查看模式 

正常显示查看格式

输入样例1 

6\n
11 23 39 48 75 62\n
6\n
39\n
52\n
52\n
63\n
63\n
52\n

输出样例1

6 1\n
error\n
8 1\n
error\n
8 1\n
8 2\n

AC代码

#include<bits/stdc++.h>
using namespace std;
list<int>l[11];
map<int,int>mp;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        l[x%11].push_front(x);
        mp[x]=1;
    }
    int k;
    cin>>k;
    while(k--)
    {
        int x;
        cin>>x;
        int d=x%11;
        if(mp[x]==0)
        {
            l[d].push_front(x);
            mp[x]=1;
            cout<<"error"<<endl;
        }
        else
        {
            cout<<d<<" ";
            int idx=0;
            for(auto t:l[d])
            {
                idx++;
                if(t==x)
                {
                    break;
                }
            }
            cout<<idx<<endl;
        }
    }
    return 0;
}

D. DS哈希查找与增补(表尾插入)

题目描述

给出一个数据序列,建立哈希表,采用求余法作为哈希函数,模数为11,哈希冲突用链地址法和表尾插入

如果首次查找失败,就把数据插入到相应的位置中

实现哈希查找与增补功能

输入

第一行输入n,表示有n个数据
第二行输入n个数据,都是自然数且互不相同,数据之间用空格隔开
第三行输入t,表示要查找t个数据
从第四行起,每行输入一个要查找的数据,都是正整数

输出

每行输出对应数据的查找结果,每个结果表示为数据所在位置[0,11)和查找次数,中间用空格分开

样例查看模式 

正常显示查看格式

输入样例1 

6\n
11 23 39 48 75 62\n
6\n
39\n
52\n
52\n
63\n
63\n
52

输出样例1

6 1\n
error\n
8 1\n
error\n
8 2\n
8 1

AC代码

#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
list<int>l[11];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        mp[x]=1;
        l[x%11].push_back(x);
    }
    int k;
    cin>>k;
    while(k--)
    {
        int x;
        cin>>x;
        int d=x%11;
        if(mp[x]==0)
        {
            mp[x]=1;
            l[d].push_back(x);
            cout<<"error"<<endl;
        }
        else
        {
            int idx=0;
            cout<<d<<" ";
            for(auto t:l[d])
            {
                idx++;
                if(t==x)
                {
                    break;
                }
            }
            cout<<idx<<endl;
        }
    }
    return 0;
}

E. DS哈希查找--Trie树

题目描述

Trie树又称单词查找树,是一种树形结构,如下图所示。

它是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

输入的一组单词,创建Trie树。输入字符串,计算以该字符串为公共前缀的单词数。

(提示:树结点有26个指针,指向单词的下一字母结点。)

输入

测试数据有多组

每组测试数据格式为:

第一行:一行单词,单词全小写字母,且单词不会重复,单词的长度不超过10

第二行:测试公共前缀字符串数量t

后跟t行,每行一个字符串

输出

每组测试数据输出格式为:

第一行:创建的Trie树的层次遍历结果

第2~t+1行:对每行字符串,输出树中以该字符串为公共前缀的单词数。

样例查看模式 

正常显示查看格式

输入样例1 

abcd abd bcd efg hig\n
3\n
ab\n
bc\n
abcde

输出样例1

abehbcficddggd\n
2\n
1\n
0

AC代码

#include<bits/stdc++.h>
using namespace std;
int sum=0;
int n;
class tri
{
public:
    bool flag=0;
    tri* next[26]={nullptr};

    void insertt(string s)
    {
        tri* node=this;
        for(int i=0;i<s.size();i++)
        {
            char c=s[i];
            if(node->next[c-'a']==nullptr)
            {
                node->next[c-'a']=new tri();
            }
            node=node->next[c-'a'];
        }
        node->flag=1;
    }

    int find(string pre)
    {
        tri* node=this;
        sum=0;
        for(int i=0;i<pre.size();i++)
        {
            char c=pre[i];
            if(node->next[c-'a']==nullptr)return 0;
            node=node->next[c-'a'];
        }
        dfs(node);
        return sum;
    }

    void dfs(tri* node)
    {
        tri* tr=new tri();
        tr=node;
        int tt=0;
        for(int i=0;i<26;i++)
        {
            if(tr->next[i])
            {
                dfs(tr->next[i]);
                tt=1;
            }
        }
        if(tt==0)
        {
            sum++;
            return;
        }
    }

    void bfs()
    {
        tri *node=new tri();
        node=this;
         queue<tri*>q;
         q.push(node);
         while(!q.empty())
         {
            tri *t=q.front();
            q.pop();
            for(int i=0;i<26;i++)
            {
                if(t->next[i])
                {
                    cout<<char('a'+i);
                    q.push(t->next[i]);
                }
            }
         }
    }
};
int main()
{
    tri *tree=new tri();
    string s;
    getline(cin,s);
    string k="";
    for(int i=0;i<s.size();i++)
    {
        if(s[i]!=' ')
        {
           k+=s[i];
           if(i==s.size()-1)
           {
             tree->insertt(k);
            k.clear();
           }
        }
        else 
        {
            tree->insertt(k);
            k.clear();
        }
    }
    tree->bfs();
    cout<<endl;
    cin>>n;
    while(n--)
    {
        string rr;
        cin>>rr;
        cout<<tree->find(rr)<<endl;
    }
    return 0;
}

F. 逆散列问题

题目描述

给定长度为 N 的散列表,处理整数最常用的散列映射是 H(x)=x%N。如果我们决定用线性探测解决冲突问题,则给定一个顺序输入的整数序列后,我们可以很容易得到这些整数在散列表中的分布。例如我们将 1、2、3 顺序插入长度为 3 的散列表HT[]后,将得到HT[0]=3HT[1]=1HT[2]=2的结果。

但是现在要求解决的是“逆散列问题”,即给定整数在散列表中的分布,问这些整数是按什么顺序插入的?

输入

输入的第一行是正整数 N(≤1000),为散列表的长度。第二行给出了 N 个整数,其间用空格分隔,每个整数在序列中的位置(第一个数位置为0)即是其在散列表中的位置,其中负数表示表中该位置没有元素。题目保证表中的非负整数是各不相同的。

输出

按照插入的顺序输出这些整数,其间用空格分隔,行首尾不能有多余的空格。注意:对应同一种分布结果,插入顺序有可能不唯一。例如按照顺序 3、2、1 插入长度为 3 的散列表,我们会得到跟 1、2、3 顺序插入一样的结果。在此规定:当前的插入有多种选择时,必须选择最小的数字,这样就保证了最终输出结果的唯一性。

样例查看模式 

正常显示查看格式

输入样例1

11\n
33 1 13 12 34 38 27 22 32 -1 21

输出样例1

1 13 12 21 33 34 38 27 22 32

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
struct key
{
    int data;
    int fact;
    int suppose;
    key(){}
    key(int d,int i,int n)
    {
        data=d;
        fact=i;
        suppose=d%n;
    }
};
int h[N];
key kk[N];
int st[N];
bool cmp(key a,key b)
{
	return a.data<b.data;
}
int main(){
	int n;
	cin>>n;
	int m=0; 
	for(int i=0;i<n;i++)
    {
		cin>>h[i];
		if(h[i]==-1) st[i]=1;	
		else
        {
			kk[m]=key(h[i],i,n);
			m++; 
		} 
	}
	sort(kk,kk+m,cmp);
	while(1)
    {
		int flag=0;
		for(int i=0;i<m;i++)
        {
			if(kk[i].fact==kk[i].suppose&&st[kk[i].fact]==0){
				cout<<kk[i].data<<" ";
				st[kk[i].fact]=1;
				break;
			}
			int tag=1;
			int d=kk[i].fact-kk[i].suppose;
			if(d<0) d=d+n;
			for(int j=kk[i].suppose,k=0;k<d;j++,k++)
            {
				
				if(st[j%n]==0)
                {
					tag=0;
				}
			}
			if(tag==1&&st[kk[i].fact]==0)
            {
				cout<<kk[i].data<<" ";
				st[kk[i].fact]=1;
				break;
			}
		}
		for(int i=0;i<n;i++){
			if(st[i]==0){
				flag=1;
			}
		
		}
		if(flag==0) break;
	}
	return 0;	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1360980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无心剑七绝《未晚斋》

七绝未晚斋 倏忽半世莫伤怀 醉爱夕阳未晚斋 汉韵唐风情不尽 东华曼舞咏云台 2024年1月6日 新韵四开平韵 《未晚斋》这首诗&#xff0c;作者无心剑以其独特的笔触&#xff0c;描绘出了一幅宁静、淡雅的画面。诗中表达了对生活的热爱和对美好时光的珍惜。 首句“倏忽半世莫伤…

解决Gitlab Prometheus导致的磁盘空间不足问题

解决Gitlab Prometheus导致的磁盘空间不足问题 用docker搭建了一个gitlab服务&#xff0c;已经建立了多个项目上传&#xff0c;但是突然有一天就503了。 df -TH查看系统盘&#xff0c;发现已经Used 100%爆满了。。。 &#x1f4a1;Tips&#xff1a;/dev/vda1目录是系统盘目录。…

开源网络安全工具

开源工具代表了技术领域的一股动态力量&#xff0c;体现了创新、协作和可访问性。这些工具以透明度和社区驱动的原则开发&#xff0c;允许用户根据自己的独特需求仔细检查、修改和调整解决方案。 在网络安全领域&#xff0c;开源工具是无价的资产&#xff0c;使组织能够增强防…

input 关闭输入的自动提示 autocomplate

input 关闭输入的自动提示 autocomplate 一、问题 有些时候需要将 Input 的自动提示去掉&#xff0c;因为不去掉的话会很烦人&#xff0c;比如我有一个输入温度的输入框&#xff1a;每次点的时候都会出来这个提示框&#xff0c;很烦 二、解决方法 这个是可以解决的&#xff…

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图&#xff08;use case diagram&#xff09;是用户与系统交互的最简表示…

LeetCode-Z 字形变换(6)

题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R 之后&#xff0c;你的输出需要从左往…

Qt/C++摄像头采集/二维码解析/同时采集多路/图片传输/分辨率帧率可调/自动重连

一、前言 本地摄像头的采集可以有多种方式&#xff0c;一般本地摄像头会通过USB的方式连接&#xff0c;在嵌入式上可能大部分是CMOS之类的软带的接口&#xff0c;这些都统称本地摄像头&#xff0c;和网络摄像头最大区别就是一个是通过网络来通信&#xff0c;一个是直接本地通信…

小H靶场笔记:DC-5

DC-5 January 5, 2024 10:44 AM Tags&#xff1a;screen提权 Owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff0c;大概率为192.168.199.135&#xff0c;且开放端口为80和111 扫描端口80&#xff0c;111相关服务、版本、操作系统、漏洞信息 sudo nmap -sS -O -sV 19…

如何让CHAT使用python绘制概率密度图像?

问CHAT&#xff1a;用python绘制概率密度图像 CHAT回复&#xff1a;你可以使用Python的matplotlib库和numpy库进行概率密度的绘制。 以下是一个简单的例子&#xff1a; python import numpy as np import matplotlib.pyplot as plt #随机生成1000个正态分布的数 data np.rand…

高性价比LDR6028Type-C转3.5mm音频和PD快充转接器

随着市面上的大部分手机逐渐取消了3.5mm音频耳机接口&#xff0c;仅保留一个Type-C接口&#xff0c;追求音质和零延迟的用户面临着一大痛点。对于这些用户&#xff0c;Type-C转3.5mm接口线的出现无疑是一大福音。这款线材在刚推出时就受到了手机配件市场的热烈欢迎&#xff0c;…

Linux 修改主机名称并通过主机名称访问服务器

一、命令提示符简介 当我们打开终端的时候&#xff0c;我们要输入命令的左边就是命令提示符&#xff0c;如下图&#xff0c;接下来介绍下他们分别代表什么含义 1、root 和 xhf 表示的是当前登录的用户名称。 2、node2 表示的当前的主机名称。 3、~ 表示的是当前的目录 4、# 表示…

贪心半平面求交 - 洛谷 - P2600 [ZJOI2008] 瞭望塔

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 往期相关背景半平面求交 点击前往 凸包点击前往 题目大意 题目链接 https://www.luogu.com.cn/problem/P2600 有一座山&#xff0c;可以用一条山的上方轮廓折线(x1,…

数据采集有哪些方法?HTTP代理起到什么作用?

在这个数字化的时代&#xff0c;数据就如同生活中不可或缺的元素&#xff0c;我们的行为、喜好、甚至是想法都被转化成了数字化的信息。那么&#xff0c;现代社会是如何进行数据的采集的呢&#xff1f;让我们一同来看看&#xff01; 1. 网络浏览行为的追踪 在我们浏览互联网的…

nacos 2.* 部署在linux服务器无法注册问题

通过sdk注册代码 报错 Exception in thread "main" ErrCode:-401, ErrMsg:Client not connected, current status:STARTING at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:639) at com.alibaba.nacos.common.remote.client…

Python基础篇: 环境安装

Python基础环境使用 一&#xff1a;运行环境Anaconda介绍1、Anaconda搭建1.1、下载方式1.2、安装1.3、验证是否安装成功 2、管理python环境2.1、列出所有环境2.2、创建环境2.3、进入指定虚拟环境2.4、离开虚拟环境2.5、删除虚拟环境 3、依赖管理3.1、安装依赖3.2、卸载依赖3.3、…

关于电气火灾监控产品在石化行业的应用探讨-安科瑞 蒋静

摘 要&#xff1a;通过对石油化工企业电气火灾成因的分析,针对目前剩余电流检测与故障电弧检测手段在石油化工企业应用中存在的问题&#xff0c;提出一种智慧防火解决方案。通过对各类电气火灾隐患进行集中监测&#xff0c;提高了电气火灾隐患检测的精度&#xff0c;从而达到避…

Springboot+vue的工作流程管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的工作流程管理系统(有报告)&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的工作流程管理系统&#xff0c;采用M&#xff08;model&#xff09;V&am…

HarmonyOS 应用开发学习笔记 状态管理概述

移动端开发&#xff0c;最重要的一点就是数据的处理&#xff0c;并且正确的显示渲染UI。 变量在页面和组件、组件和组件之间有时候并不能实时共享&#xff0c;而有时候&#xff0c;又不需要太多的作用域&#xff08;节省资源&#xff09;&#xff0c;作用就需要根据不同场景&am…

bootstrap5实现宠物商店网站 Cat-Master

一、需求分析 宠物商店网站是指专门为宠物商店或宠物用品商家而建立的在线平台。这种网站的功能通常旨在提供以下服务&#xff1a; 产品展示&#xff1a;宠物商店网站通常会展示宠物食品、玩具、床上用品、健康护理产品等各种宠物用品的图片和详细信息。这样&#xff0c;潜在的…

欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒

出品&#xff5c;欧科云链研究院 2024年&#xff0c;Web3与AI两个数字科技的巅峰碰撞&#xff0c;欧科云链研究院探索AI与Web3的技术融合&#xff0c;与澎湃科技联合发布2024年展望&#xff0c;原标题为《2024年展望&#xff1a;Web3与AI共振引爆可信数字社会》&#xff0c;共…