この問題の作業は簡単です:最初のハッシュテーブルに明確な正の整数のシーケンスを挿入します。その後、別のテーブルから整数キーの配列と出力平均検索時間(キーがテーブルにあるかどうかを見つけるために行われる比較の数)を見つけることを試みます。ハッシュ関数は、と定義される (ここで、 T S I Z ハッシュテーブルのEIS最大サイズ。二次プローブ(のみ)の衝突を解決するために使用される正の増分を有します。
テーブルサイズが素数であることを優れていることに注意してください。ユーザーが指定した最大サイズが素数でない場合は、テーブルのサイズは、ユーザによって与えられたサイズよりも大きい最小の素数であることを再定義する必要があります。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。MSIZE、N、およびM、ユーザー定義テーブルのサイズ、入力番号の数、及び発見されるキーの数は、それぞれ各場合について、最初の行は、3つの正の数字を含んでいます。すべての3つの数字はせいぜいされ そして1 Nの異なる正の整数は、次の行でMは正の整数キーに続いて、次の行に与えられていません。行のすべての数字は、スペースで区切らず、せいぜいされている 1。
出力仕様:
各テストケースのために、ケースには、いくつかの番号を挿入行で印刷することは不可能である 入力番号です。最後に小数第1位まで正確に、ライン内のすべてのMキーの平均検索時間を印刷します。X cannot be inserted.
X
サンプル入力:
4 5 4
10 6 4 15 11
11 4 15 2
サンプル出力:
15 cannot be inserted. 2.8
効果の件名:
乗解決ハッシュ衝突検出方法の手順を考えると、m個の番号が与えられ、
この数が出力に挿入することができない場合、「Xは挿入できません。」、そしてM桁の平均の出力は、シーク時間
分析:
まずTSIZEより大きい最小の素数が真TSIZEで見つけ、その後、配列TSIZE長を作成します。最初のデジタルを使用して、正方形の検出方法を挿入
各POS =(+ J * J)%のTSIZE、jは、現在の位置がV [POS]に割り当てられている場合に挿入され、〜TSIZE-1 0の数であります
あなたは成功出力を挿入することができない場合は、「Xは挿入できません。」。次に、平均シーク時間を計算し、各計算POS =(+ jのの* jの)%TSIZE
ここで、j <= TSIZE、Vであれば[POS]それを見つけ、その後、V [POS]はデジタル表示で存在しない場合、ループを終了する場所が見つからなかったことは、その後、ループを終了する必要があります。
たびにルックアップは、ループ長jを終了する前にこの番号を見つけることです。最後に〜mで、ANS、その後、平均シーク時間を出力し
1つの#include <ビット/ STDC ++ H> 2 3 使用して 名前空間STDを、 4 INT MSIZE、N、M、X。 5 INT VIS [ 100005 ]。 6 BOOL isprime(INT X){ 7 場合(X == 1)を返す 偽。 8 のために(int型 I = 2 ; iは= xを<*; iは++ ){ 9 であれば(X%のI == 0 ) 10 リターン 偽。 11 } 12 リターン 真; 13 } 14 INT メイン(){ 15 CIN >> MSIZE >> N >> M。 16 しばらく(!isprime(MSIZE)) 17 MSIZE ++ ; 18 のために(int型 I = 0 ; iがN <; ++ I){ 19 CIN >> X; 20 ブールフラグ= 真。 21 のための(int型 J = 0 ; J <MSIZE J ++ ){ 22 INT ANS =(X + j個* jの)%MSIZE。 23 もし(VIS [ANS] == 0 ){ 24 フラグ= 偽。 25 VIS [ANS] =のX。 26 ブレーク; 27 } 28 } 29 であれば(フラグ) 30 のprintf(" %dは挿入できない\ N。" 、X)。 31 } 32 int型の CNT = 0 。 33 のために(int型 I = 0 ; iが<M; iが++ ){ 34 CIN >> X; 35 用(int型 J = 0 ; J <= MSIZEあり、j ++ ){ 36 INT ANS =(X + j個* jの)%MSIZE。 37 CNT ++ ; 38 であれば(VIS [ANS] == X || VIS [ANS] == 0 ){ 39 ブレーク。 40 } 41 } 42 } 43 のprintf(" %0.1lfする\ n "、CNT * 1.0 / M)。 44 リターン 0 ; 45 }