のための任意のハッシュライブラリを示唆しないでください - インデックスとして番号を使用数字が使用されていることを示す1を格納し、使用されていないことを示す0を格納します。これをさらに減らすには、ストレージ用にビットマップとして配列を使用する(約625バイトに5000ビットを格納する必要があります)と、見るべき右のビット位置を計算する少しのコードを使用します。
または、インデックスを50個の整数の配列に配置する必要がある場合は、5 KBのスペースを使用して、50個の整数の配列にインデックスを格納します。 。インデックスは、それが発見された場所を示すために(存在しない)-1であるか非負かどうかを確認するaux_array
で
int main_array[50];
signed char aux_array[5000];
// initialize aux_array to all -1
for (int i = 0; i < sizeof(aux_array); i++)
aux_array[i] = -1;
// for each value `v` in main_array, store its index `i` in `aux_array[v]`
for (int i = 0; i < num_values; i++)
{
int v = main_array[i];
if (aux_array[v] != -1)
...non-unique data in main_array...
aux_array[v] = i;
}
逆ルックアップをチェックします。これは逆インデックスです。 127以上の値が必要になった場合は、signed char
ではなくunsigned char
またはshort
に切り替えることができます(マーカー値を適切に調整して、私の例では-1
)。
ハッシングはおそらく費用対効果に優れません。
番号を自分のハッシュとして使用できないのはなぜですか? – Blender
@Blender:可能ですが、その場合はサイズ5000のハッシュテーブルを作成する必要があります。そのため、ここでより良い方法を見つけるためにここに来ました。私に何も得られなければ、私はそれだけのために行くでしょう。 –
数字の範囲が「1 ... 5000」である場合、可能なハッシュは「5000」です(検索にはユニークなハッシュが必要であると仮定します)。いずれにせよ、あなたは '5000 'ハッシュを作成するでしょうから、簡単な解決策にはいかがですか? – Blender