1

それぞれが 2D 配列で表される 2 つの 3x3 行列があります。最初のマトリックスは要素を保持します[私はPIDを保存するので、要素の範囲は数百万からなる可能性があります。実際のアプリケーションではAとして単純化しています。整数の範囲です。Aは200、Bは200000です]たとえば、マトリックス要素

{ A B C
  B D C
  C F B }

2 番目は、各位置の重みを保持します (例: 行列の重み)

{ 9 7 5
  8 6 1
  7 5 4 }

上記の例では、B の重量が 7+8+4 であり、その後に C が続くため、B が最も重い要素です。

上位 3 つの最も高い要素を見つけるにはどうすればよいですか?

1つの解決策は次のとおりです。要素を別の配列A [9] [2](要素、値、一意)に格納し、要素マトリックスをループしてから、別のループで値配列を通過し、要素に対応する値を埋めることです. [反復して9x2キー値マトリックスを作成し、反復してソートし、反復して重複を削除します(重みを統合する必要があるため)、-より良い方法はありますか? ]

他の効率的な方法はありますか?[ヒント: 3 つしか必要ないので、9x2 は使用しないでください]

4

2 に答える 2

2

A-Z使用できるのは文字のみであり、それらは大文字であることがわかっていると仮定しましょう。

char elems[3][3] = {
    { 'A', 'B', 'C' },
    { 'B', 'D', 'C' },
    { 'C', 'F', 'B' }
};

そして、同様に重みを設定しました...

次のようにカウントを追跡できます。

int counts[26] = {0};

for( int i = 0; i < 3; i++ ) {
    for( int j = 0; j < 3; j++ ) {
        counts[elems[i][j] - 'A'] += weights[i][j];
    }
}

次に、最大 3 つのカウントのインデックスを見つけるだけです。これは簡単に実行できると思います。

于 2013-01-21T22:27:41.150 に答える
2

それらが 2D 配列であることを忘れて、2 つのデータ ソースを (ペアの) 1 つの配列にマージします。あなたの例では、{{'A', 9}, {'B', 7}, {'C', 5}, {'B', 8}, ...}. これらを (たとえば、 でqsort) 並べ替えてから、リストをスキャンし、合計して、見つけた上位 3 つのスコア付きキーを維持します。

[この解決策は常に機能しますが、配列が大きい場合にのみ意味があり、質問を読み直すとそうではありません]。

于 2013-01-21T22:46:51.703 に答える