可能なペアの数から、元の配列のサイズを取得します

user3134006

私はこの機能を持っています

public int numberOfPossiblePairs(int n)
{
        int k=2;
        if (k>n-k) { k=n-k;}  
        int b=1;
        for (int i=1, m=n; i<=k; i++, m--)
            b=b*m/i;
        return b;
} 

これは、指定された数のアイテムから作成できるペアの数を取得します。たとえば、1000個のアイテムの配列がある場合、499,500ペアを作成できます。しかし、私が実際に必要としているのはその逆です。言い換えると、パラメーターとして499500を受け取り、その数のペアを生成できる一意のアイテムの元の数として1000を返す関数です。(499501のように、その数だけ一意のペアを作成する一意のアイテムの数がない不完全な番号も処理できる場合はボーナスになりますが、499500ペアを生成するため、最も近いものとして1000が返されます。)

探している番号が表示されるまで、numberOfPossiblePairs()を段階的にループできることに気付きましたが、そのようにブルートフォースするのではなく、アルゴリズムでこれを行う方法があるはずです。

ジョセフウッド

あなたの問題は小さな代数に要約され、O(1)時間内に解決することができます最初に、関数はペアの順列の数ではなく、ペアの組み合わせの数を与えることに注意してください。いずれにせよ、以下のロジックは順列に対応するために簡単に変更できます。

組み合わせの数の式を書くことから始めますkを選択します

ここに画像の説明を入力してください

n = 1000およびr = 2に設定すると、次のようになります。

1000! / (2!(998)!) = 1000 * 999 / 2 = 499500

と同じようにnumberOfPossiblePairs(1000)

演習に進むと、この例ではr = 2であるため、次のようになります。

total = n! / ((n - 2)! * 2!)

ここで単純化します。

total = (n * (n - 1)) / 2

total * 2 = n^2 - n

n^2 - n - 2 * total = 0

これで、2次方程式を適用してnを解くことができます

ここに画像の説明を入力してください

ここで、x = na = 1b = -1、およびc = -2 *合計があり、次のようになります。

n = (-(-1) +/- sqrt(1^2 - 4 * 1 * (-2 * total))) / 2

正の数のみに関心があるため、負の解は除外します。コードには次のようなものがあります(注:OPはJavaを使用しているようで、私はここでは専門家ではありません...以下はC++):

int originalNumber(int total) {
    int result;
    result = (1 + std::sqrt(1 - 4 * 1 * (-2 * total))) / 2;
    return result;
}

結果が整数でない場合に最も近い値を返すというボーナスの質問については、整数に強制変換する前に、結果を単純に丸めることができます。

int originalNumber(int total) {
    int result;
    double temp;
    temp = (1 + std::sqrt(1 - 4 * 1 * (-2 * total))) / 2;
    result = (int) std::round(temp);
    return result;
}

ここで、のような値500050が渡されると、実際の結果は1000.55であり、上記はを返し1001ますが、最初のソリューションはを返し1000ます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

配列からn個の重複しないmサイズのサンプルを取得します

GoogleSpreadSheetの複数サイズの配列から配列要素を取得する

numpy配列から別の配列のサイズの範囲/スライスを取得します

観測可能な配列の数を取得してから返します

関数から静的な固定サイズの配列を返す

argv [1]から配列のサイズを取得し、乱数で埋めます

関数の引数から配列のサイズを取得する

1つの関数から異なる次元の配列を返します。F#で可能ですか?

配列のサブアイテムの数を取得します

利用可能な用紙サイズのリストから最も近い用紙サイズを取得します

グループの配列から可能なすべての組み合わせを順番に再帰的に取得します。配列サイズとグループサイズは1-Xで、Xは多数ではありません

異なるサイズの元の配列から配列を構築する高速な方法

配列サイズのみを引数として関数から2D配列を返します

サイズnのブール配列のすべての可能な方法を作成しますか?

異なるサイズの小さな配列から単一のnumpy配列を構築します

不明なサイズの配列を作成しますか?

長さnc#のリストから可能なすべての文字列のペアを取得します

Javascript:配列から特定のアイテムを削除し、それらのアイテムを含まない元の配列を返します

c ++配列サイズを関数の戻り値に設定する可能な方法はありますか

大きな2DNumPy配列からさまざまなサイズのサブ行を抽出します

配列を均等なサイズの配列に分割します

サイズも異なる2つの異なる配列からペアを作成する方法はありますか?

PHPの配列から特別なアイテムを取得します

配列からランダムなアイテムのセット数を取得します

ランダム化された配列からランダムな数のアイテムを取得します

さまざまなサイズのNumPy配列のリストから平均を計算します

多次元の$ _POST配列から値を取得します

Javaで現在の要素を維持しながら配列のサイズを変更しますか?

np.uniqueを使用して、2つのnumpy配列からペアワイズ重複を削除します

TOP 一覧

  1. 1

    モーダルダイアログを自動的に閉じる-サーバーコードが完了したら、Googleスプレッドシートのダイアログを閉じます

  2. 2

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  3. 3

    CSSのみを使用して三角形のアニメーションを作成する方法

  4. 4

    ドロップダウンリストで選択したアイテムのQComboBoxスタイル

  5. 5

    ZScalerと証明書の問題により、Dockerを使用できません

  6. 6

    PyCharmリモートインタープリターはプロジェクトタブにサイトパッケージのコンテンツを表示しません

  7. 7

    Windows 10でのUSB入力デバイスの挿入/取り外しの検出

  8. 8

    Excel - count multiple words per cell in a range of cells

  9. 9

    PictureBoxで画像のブレンドを無効にする

  10. 10

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  11. 11

    スタート画面にシャットダウンタイルを追加するにはどうすればよいですか?

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Luaの文字列から特定の特殊文字を削除するにはどうすればよいですか?

  14. 14

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  15. 15

    LinuxでPySide2(Qt for Python)をインストールするQt Designerはどこにありますか?

  16. 16

    goormIDEは、ターミナルがロードするデフォルトプロジェクトを変更します

  17. 17

    QGISとPostGIS(マップポイント(米国の地図上にraduisを使用した緯度と経度)

  18. 18

    MLでのデータ前処理の背後にある直感

  19. 19

    ターミナルから「入力ソースの変更」ショートカットを設定する

  20. 20

    パンダは異なる名前の列に追加します

  21. 21

    同じクラスの異なるバージョンを使用したクラスローディング:java.lang.LinkageError:名前の重複クラス定義を試行しました

ホットタグ

アーカイブ