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日

悬赏问题

  • ¥20 数学建模来解决我这个问题
  • ¥15 计算机网络ip分片偏移量计算头部是-20还是-40呀
  • ¥15 stc15f2k60s2单片机关于流水灯,时钟,定时器,矩阵键盘等方面的综合问题
  • ¥15 YOLOv8已有一个初步的检测模型,想利用这个模型对新的图片进行自动标注,生成labellmg可以识别的数据,再手动修改。如何操作?
  • ¥30 NIRfast软件使用指导
  • ¥20 matlab仿真问题,求功率谱密度
  • ¥15 求micropython modbus-RTU 从机的代码或库?
  • ¥15 django5安装失败
  • ¥15 Java与Hbase相关问题
  • ¥15 后缀 crn 游戏文件提取资源