天天看點

A1078 Hashing (25 分)(給定序列哈希存儲并處理沖突)(素數+沖突處理)

The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be H(key)=key%TSize where TSize is the maximum size of the hash table. Quadratic probing (with positive increments only) is used to solve the collisions.

Note that the table size is better to be prime. If the maximum size given by the user is not prime, you must re-define the table size to be the smallest prime number which is larger than the size given by the user.

Input Specification:

Each input file contains one test case. For each case, the first line contains two positive numbers: MSize (≤10​4​​) and N (≤MSize) which are the user-defined table size and the number of input numbers, respectively. Then N distinct positive integers are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the corresponding positions (index starts from 0) of the input numbers in one line. All the numbers in a line are separated by a space, and there must be no extra space at the end of the line. In case it is impossible to insert the number, print "-" instead.

Sample Input:

4 4
10 6 4 15
           

Sample Output:

0 1 4 -
           

題意:

給出散清單長TSize和欲插入的元素,将這些元素按讀入的順序插入散清單中,其中散列函數為H(key)=key%TSize,解決沖突采用隻往正向增加的二次探查法。另外,如果題目給出的TSize不是素數,那麼需要将TSize重新指派為第一個比TSize大的素數,再進行元素插入。

樣例解釋:

TSize = 4,取第一個比4大的素數 TSize = 5,接着插入4個元素:

key = 10,10 % 5 = 0,插入0号位

key = 6, 6 % 5 = 1,插入1号位

key = 4,4 % 5 = 4, 插入4号位

key = 15,15 % 5 = 0,沖突;15 + 1 = 16, 16 % 5 = 1, 沖突;15 + 4 = 19, 19 % 5 = 4,沖突;15 + 9 = 24,24 % 5 = 4,沖突;15 + 16 = 31, 31 % 5 = 1,.... 可以證明找不到一個沖突的點。

思路:

本題的難點在于,對于二次探測的處理。

首先确定TSize,開bool型數組 HashTable,記錄是否存儲元素。本題中二次平方探測法要注意,沖突處理公式為 M = (a + step * step) % TSize; (此處要注意模 TSize)

注意:

  1. 注意輸出時,第一個元素與其他元素分開處理,最後一個輸出之後不能有空格
  2. 已證明,如果從 0 ~ TSize - 1進行枚舉找不到位置,那麼對于大于等于TSize的位置,也不可能存在,輸出 "-"即可
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
const int N = 11111;
bool isPrime(int n){
  if(n <= 1)
    return false;
  int sqr = (int)sqrt(1.0 * n);
  for(int i = 2; i <= sqr; i++){
    if(n % i == 0)
      return false;
  }
  return true;
}
bool hashTable[N] = {0};

int main(){
  int n, TSize, a;
  scanf("%d%d", &TSize, &n);
  while(isPrime(TSize) == false){
    TSize++;
  }
  for(int i = 0; i < n; i++){
    scanf("%d", &a);
    int M = a % TSize;
    if(hashTable[M] == false){
      hashTable[M] = true;
      if(i == 0)
        printf("%d", M);
      else
        printf(" %d", M);
    }
    else{
      int step;
      for(step = 1; step < TSize; step++){
        M = (a + step * step) % TSize;
        if(hashTable[M] == false){
          hashTable[M] = true;
          if(i == 0)
            printf("%d", M);
          else
            printf(" %d", M);
          break;
        }
      }
      if(step >= TSize){
        if(i > 0)
          printf(" ");
        printf("-");
      }
    }
  }
  return 0;
}
           

繼續閱讀