T、DZ 2023-05-27 16:41 采纳率: 83.3%
浏览 17

哈希表链地址法查找元素是否在集合中出现

给定一个集合,查找元素是否在集合中出现。
每个测试用例由多行组成,第一行是两个整数n和m,两个数范围在1到100000之间。自第二行起一共有n+m个整数,其中前面n个整数代表集合的元素,随后的m个整数是待查询的数。所有的整数在范围[-2^31,2^31)内。
对于每个待查询的数,如果在集合中则输出yes,否则输出no.
样例输入
5 3
7 9 3 2 -5
4 9 -5
5 3
-2 1 0 -2 1
0 -2 3
样例输出
no
yes
yes
yes
yes
no
错误:时间超限
不知道还能怎么提高查找效率,我觉得这个哈希函数挺高效的啊。散列表长度刚好合适时间复杂度会不会更小啊?求解答……

#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;

typedef struct node
{
    int key;
    struct node *next;
} Node, *PNode;

typedef struct
{
    PNode *elem;
    int sz;
} HashTable;

void InitHashTable(HashTable &ht, int n)
{
    if(n<100)
        n=7;
    else if(n>=100&&n<10000)
        n=97;
    else if(n>=10000&&n<1000010)
        n=9931;
    ht.sz = n;
    ht.elem = new PNode[n]();
}
bool InsertHashTable(HashTable &ht, int k)
{
    int x = k % ht.sz;
    PNode newnode = new Node;
    newnode->key = k;
    newnode->next = ht.elem[x];
    ht.elem[x] = newnode;
    return true;
}
PNode SearchHashTable(HashTable ht, int j)
{
    int y=j%ht.sz;
    PNode p=ht.elem[y];
    while(p)
    {
        if(j==p->key)
            return p;
        p=p->next;
    }
    return NULL;
}
int main()
{
    HashTable ht;
    int m,n;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        InitHashTable(ht, n);
        int j,k;
        for(int i=0; i<n; i++)
        {
            cin>>k;
            InsertHashTable(ht, k);
        }
        for(int i=0; i<m; i++)
        {
            cin>>j;
            cout <<(SearchHashTable(ht, j) ? "yes" : "no") << endl;
        }
    }
    return 0;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-27 18:39
    关注
    评论

报告相同问题?

问题事件

  • 创建了问题 5月27日

悬赏问题

  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!