哈希入門

查找練習 hash——出現過的數字

Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裏^_^

題目描述

有一個數據字典,裏面存有n個數字(n<=100000),小明現在接到一個任務,這項任務看起來非常簡單——給定m個數字,分別查詢這m個數字是否出現在字典之中;但是考慮到數據量的問題,小明找到了善於編程的你,希望你可以幫他解決這個問題。
 

輸入

 輸入數據只有一組!
第一行包含兩個整數n m,分別代表字典中數字的個數和要查詢的數字的個數。
接着n行代表字典中的n個數字。
最後m表示要查詢的數字。

輸出

 如果某個數字存在,則輸出YES,否則輸出NO
 

示例輸入

5 3
1
2
3
4
5

5
4
10

示例輸出

YES

YES

NO

一開始的二分法超時時間1010ms,二分代碼:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
    return x<y;
}
int bsearch(int* b,int x,int y,int v)
{
    int m;
    while(x<=y)
    {
         m=x+(y-x)/2;
    if(b[m]==v) return m;
    else if(b[m]>v) y=m;
    else x=m+1;
    }
   return -1;
}
int main()
{
    int n,a[100001],m,count,b[100001] ;
    scanf("%d%d",&n,&m);
       count =0;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
            for(int i=0;i<m;i++)
            scanf("%d",&b[i]);
        //sort(a,a+n,cmp);
        //scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            count =bsearch(a,0,n-1,b[i]);
        if(count!=-1) printf("YES\n");
        else printf("NO\n");
        }


    return 0;
}
 




下面是通過的哈希算法 時間30ms:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,a[100001],m,count,k ;
    scanf("%d%d",&n,&m);
       count =0;
        for(int i=0;i<n;i++)
            a[i]=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&k);
            a[k]=1;
        }
        for(int j=0;j<m;j++)
        {
            scanf("%d",&count);
            if(a[count]==1) printf("YES\n");
            else printf("NO\n");
        }
        return 0;
}



發佈了44 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章