0

1つの大きな範囲を表す線形範囲のリストがあります。

                                          X'
 100    200 300    400 500    600 700     |       900    (X)
|----------|----------|----------|--------+----------|
 0                                        |       100    (Y)
                                          Y'

Xは、次の範囲で構成されます(偶数と丸数は、理解を容易にするための単なる例であり、何でもかまいません。ここでは比率はまったくありません)。

  • 100から200まで
  • 300から400まで
  • 500から600まで
  • 700から900まで

反対に、Yの範囲は1つだけです。

  • 0〜100

XとYはどちらも同じ長さで、単位が異なります。1つがドルで、もう1つがパーセント(または他の同様に無関係な単位)であるとしましょう。したがって、Y'0==X'100およびY'100==X'900です。

Yの任意の点が与えられた場合、Xの等量点は何であり、その逆も同様です。Xの点が与えられた場合、Yのそれは何ですか?

これは典型的な数学の問題ですか?名前はありますか?

4

5 に答える 5

2

範囲はいくつありますか?アルゴリズムがO(範囲の数)であっても問題ありませんか?

その場合、以下はアルゴリズムの説明です。あなたの(元の)例でそれを説明させてください。

 100    200 300    400 500    600 700    800
|----------|----------|----------|----------|
 0%                                     100%

1)実行しているのは、範囲A(100-800)の値Xを連続範囲B(0-399)の値Yにマップすることです(範囲内の要素の総数は400であるため)。次に、Bの位置をパーセントに変更するのは簡単です。この部分は省略します。

2)レコードのリストを作成します。各レコードは1つの範囲マッピングを表します。

struct RangeRecord {
  int start_in_a;
  int start_in_b;
};

あなたの場合、あなたは次のリストを得るでしょう:

{100, 0}, {300, 100}, {500, 200}, {700, 300}

3)数値XをAからBにマップする必要がある場合は、リストを繰り返して、start_in_a<=Xの最初のレコードを見つけます。値Yは次のようになります。

Y = X + start_in_b - start_in_a;

4)アルゴリズムは対称的であり、リストを繰り返してstart_in_b <= Yの最初のレコードを見つけてから、

X = Y + start_in_a - start_in_b.

注1.エラーチェックの目的で、範囲サイズをRangeRecordに保持することもできます。

注2.O(範囲数)が十分でない場合は、レコードをリストではなくツリーとして保持してください。次に、O(log(範囲の数))操作が必要になります。

于 2009-06-01T23:37:35.633 に答える
0

X'からY'に、またはその逆に変換する際に調整する必要がある3つのことがあります。

  1. 範囲はさまざまな場所から始まります。
  2. それらの1つは不連続です。
  3. 各ステップのサイズは、2つの範囲で異なります。

(少なくともソリューションの開発中は)同様の範囲Zを検討すると役立つ場合があります。これは、0から503の範囲であり、Xの504の可能な値と1対1のマッピングがあります。つまり、不連続性ごとに、 X値が不連続性の上限よりも大きい場合は、99(不連続性のサイズ)を引きます。次に、X'100 = Z'0、X'200 = Z'100、X'300 = Z'101、X'400 = Z'201、X'500=Z'202など。Z範囲の導入により解決されます。上記のリストの問題1と2。

ZからYに変換するには、101/504を掛けるだけで、ZがYにスケーリングされます。

于 2009-06-01T23:55:24.180 に答える
0

1つの範囲(a、b)と別の範囲(c、d)があるとします。これで、a<i<bの数iができました。aを減算し、bで除算することで「正規化」できます--a-これにより、0〜1の値が得られます。次に、この値を使用して、この計算を他の境界で逆にすることにより、他の範囲に転送できます。話すには(d --c)を掛けて、cを足します。

他の範囲の対応するポイントがi'であると言います。それで、

i' = (i - a) / (b - a) * (d - c) + c

あなたが探している用語はスケーリングと翻訳です。

于 2009-06-01T23:01:14.757 に答える
0

問題が特定されていないため、これは実際には解決できません。同じ範囲であっても、次のような異なるスライダーが存在する可能性があります。

1  100 101       1000
|-----|-----------|

1        100 101 1000
|-----------|-----|

のような各範囲について[1..100]、スライダーのどのパーセントポイントがそれに対応するかを知る必要があります。上記の例では、これはまたはのようなものになり[0%..33%]ます[0%..66%]。この情報を取得すると、特定のデータポイントがどの範囲にあり、その範囲のどの位置にあり、どの値に対応しているかを簡単に判断できます。

于 2009-06-01T23:16:33.117 に答える
0

あなたが暗示する区分的線形配置を仮定すると、Xは次のように見つけることができます。

X = 4*Y + 100*int(1 + Y/25.)

Yの場合はその逆です。

X2 = int(X/100.)
X3 = X2-int(X2/2.)
Y = (X-100*X3)/4.

編集:このソリューションは、指定した元の範囲で機能します。

 100    200 300    400 500    600 700    800
|----------|----------|----------|----------|
 0%                                     100%

そしてもちろん、逆の式はXの有効な値に対してのみ成り立ちます。

これが2つの曲線の図です。緑は元の仕様で、青は逆の曲線です(ここでも、有効なx値に対してのみ有効です)。 代替テキストhttp://img523.imageshack.us/img523/8858/66945008.png

于 2009-06-01T23:34:58.650 に答える