-3

一意の数値 [5, 123, 49176, 30982, 542] のセットがあるとします。数値を変換して、0 から 25 の範囲の一意の数値 (整数) の別のセットを取得したいとします。

この問題を解決するのに役立つアルゴリズムを提案できますか?

4

3 に答える 3

3

あなたはそれらを正規化するつもりですか?

raw =  [5, 123, 49176, 30982, 542] 

normalization = [(i-min(raw))/(max(raw)-min(raw))*25 for i in raw]
print(normalization)

それはあなたに与えます:(すべての要素は一意であることが保証されています)

[0.0, 0.059994712330438675, 25.0, 15.749628846271177, 0.2730267840800472]     

結果の要素が整数に制限されている場合:

import random
raw =  [5, 1, 23, 49176, 30982, 542] 

if len(raw) > 26: #there's no way to get more than 26 unique elements from 0~25 integers 
    print("mission impossible")
else:
    print(random.sample(range(26), len(raw)))

それはあなたに与えるでしょう(例えば):

[23, 4, 13, 10, 18, 24]   

これらはあなたにとって2つの妥協的な方法です. しかし、あなたのコメントによると、実際にはドメインがすべて整数でコドメインが [0,25] の整数である単射関数が必要です。残念ながらミッションインポッシブルです。

于 2012-12-20T13:21:02.470 に答える
2

(整数を仮定)

要素を並べ替えて、各要素に(並べ替えられたリストで)インデックスを付けることができます。数値が 26 未満 (または正確に) であると仮定すると、目的の範囲が得られます。セットの現在の順序 (反復順序など) として数値を設定するだけで、同じセットの決定論的結果を許容できない場合は、並べ替えを回避することもできます。

一般的なケースのハッシュが必要な場合は、それを実行できないことに注意してください-範囲が26を超える場合-重複が発生します。これは、範囲がハトであり、範囲 [0,25] がピジョンホールであるピジョンホールの原則から直接来ています。

于 2012-12-20T13:16:18.917 に答える
0

各数値をランダム関数のシードとして使用してから、重複がないことを確認してください。
アミットが言ったように、25を超えるセットがある場合、これも崩壊します.

于 2012-12-20T13:19:08.590 に答える