1. 程式人生 > >經典入門_Hash的應用

經典入門_Hash的應用

需要 eof ++ 固定 給定 靜態 post 如果 pre

Hash:將存儲位置與數據本身對應掐來的存儲手段就是Hash

例2.5 統計通成績學生人數(1018)

題目描述:讀入n(n<=1000)名學生的成績(0~100,整型)(當讀到n時結束),將獲得某一給定分數的學生人數輸出。

樣例輸入:
3
80 60 90
60 
2
85 66
0
5
60 75 90 55 75
75
0
樣例輸出:
1
0
2
#include<stdio.h>

int main(){
    int n,tmp,num;
    int buf[101];
    while(scanf("%d",&n)!=EOF&&n!=0){
        
for(int i=0;i<=100;i++)//也可直接定義為int Hash[101]={0}; buf[i]=0; for(int i=0;i<n;i++){ scanf("%d",&tmp); buf[tmp]++; } scanf("%d",&num); printf("%d\n",buf[num]); } return 0; }

例2.6 Sort (1431)

題目描述:給你n個整數,請按從大到小的順序輸出前m大的數。第一行有兩個數n,m(0<n,m<1000000),第二行包含n個各不相同,且處於區間[-500000,500000]的整數。

樣例輸入:
5 3
3 -35 92 213 -644
樣例輸出:
213 92 3

由於代排序數字的數量十分龐大(1000000),即使使用快排也仍有可能超時。而哈希只需要從尾到頭遍歷數組,其時間復雜度仍在百萬數量級,解法符合要求。

由於輸入數據中出現了負數,於是我們不能直接把輸入數據當做數組下標來訪問數組元素,而是將每一個輸入的數據都加上一個固定偏移值,使數據區間映射到數組下標區間。

本題還要註意在最後一個數字之後不存在空格。

#include<stdio.h>
int Hash[1000001];//在函數內部的靜態數組是在棧上分配空間所以不能開得太大,而全局的數組是在數據段分配空間所以可以弄大些。如果在函數內部開大數組可能產生棧溢出。
int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=0;i<=1000000;i++) Hash[i]=0; for(int i=1;i<=n;i++){ int tmp; scanf("%d",&tmp); Hash[tmp+500000]++; } for(int i=1000000;i>=0;i--){ if(Hash[i]!=0){ printf("%d",i-500000); m--; if(m!=0) printf(" "); else{ printf("\n"); break; } } } } return 0; }

經典入門_Hash的應用