インタビューでこの質問に出会った。 1と0を含むnxn行列があります。あなたは最も効率的な方法で1の最大数を含む行を見つける必要があります。私はそれがn^2で行うことができることを知っていますが、これには最適なソリューションがありますか?最大発生数が1の行を見つけよう
答えて
最適解はO(n^2)です。行列にゼロのみが含まれているとします。あなたはこれを確かめるためにすべてのセルを調べなければなりません。これはO(n^2)です。
アルゴリズムを最適化すると、1だけしか含まれていない行が見つかった場合(最適でなければならない)、行内に非常に多くの零点があると見なして、遠いこれは場合によっては大幅なスピードアップをもたらす可能性がありますが、一般的なケースではまだO(n^2)になります。
最適化として、列を解析してから1行あたり最大1を計算します。 n/2ステップ後に、適切でない行を排除し始めます。 (The rows with MAX number of 1s - rowSum(number of ones in that row) > (the number of columns unchecked)
- 複雑度O(n^2)
最悪の場合の複雑さは、とにかくO(n )になります。
しかし、定数と一般的な複雑さを減らすことができます。
#(x < n)
行数を計算します。
残りのn-x行については、停止すると、その行からbextの回答を見つけることができなくなります。
ここでポイントはxの最適値を得ることです。
PS:類似しています - あなたが3回しか選べないという条件で、100人の中から最高の人を選んでください。
JavaScriptで最も効率的な実装です。
上記の回答と同様です。 N 1で行をヒットした場合は短絡し、現在の行が1より大きい可能性がない場合は外部(行)ループを継続します。
しかし、この回答は、関係する条件付きロジックを効率的に使用(読み込み:配置)することも示しています。最悪の場合は、したがって、問題はそれを見つけることに減らし、あなたがそれらをすべて確認する必要があり、マトリックス全体に一つだけ1があるということですので、
// return the smallest row index 0 - (N-1) containing the greatest number of 1's
function MaxRow(M, N) {
// initialize max to 0 if you want to return null for an all zero matrix
// initialize max to -1 if you want to return 0 (row 0) for an all zero matrix
var max = 0;
var result = null;
var row1s;
rowLoop:
for(var row = 0; row < N; row++) {
row1s = 0;
for(var col = 0; col < N; col++) {
if((N - col) + row1s < max) { // row's current potential 1's
continue rowLoop; // next row
}
row1s += M[row * N + col]; // + 0 or + 1
}
if(row1s > max) { // new max
max = row1s; // save new max value
if(max == N) { // largest possible
return row;
}
result = row;
}
}
return result;
}
- 1. 行内に1の最大数を見つける
- 2. 計算の最大数でグローバルな最大値を見つけよう
- 3. 最大の変数を見つける
- 4. Javascriptが最大値を見つける
- 5. ベクトル内の要素の最大の差を見つけよう
- 6. MySQLのSUMの最大値を見つけよう
- 7. SQL抽出値Xpath式最初の発生を見つけよう
- 8. 現在のプラットフォームで最大のネイティブ整数型を見つけよう
- 9. 最大の出現数を持つ文字を見つける
- 10. 最大数を見つけます。グラフ内のエッジの数
- 11. ポイントグループの最大ポリゴンを見つける
- 12. ベクトル内の複数の最大値のインデックスを見つける
- 13. 最大合計を見つける
- 14. 最大ページテーブルサイズを見つける
- 15. sql - 最大値を見つける
- 16. 整数のストリームで最大の要素を見つける
- 17. テーブル内のアイテムの最大数を見つける方法
- 18. 最大合計で最大増加サブシーケンスを見つける
- 19. 変数の最大値を見つける方法
- 20. C++配列の最大数を見つける
- 21. 関数の最大値を見つける
- 22. Pandasを使って最大欠損値を持つ列を見つけよう
- 23. 最大総和を持つサブリストを見つけるための生成再帰
- 24. マルチセットで最大発生数を持つ要素を選択
- 25. 複数の整数を比較し、Javaで最大のものを見つけよう
- 26. 字句的に最大の一意の文字列を見つけよう
- 27. 行列の最大値の行と列のインデックスを見つける
- 28. カラムがvarcharのときにmysqlを最大に見つける
- 29. 最も発生している数字の数...特定の数字の中で最も多く発生する数字を見つける
- 30. 私は関数の最大値を見つける必要がある機能
あなたは、(N^2)最悪のケースオメガを倒すことはできません。私が考えることができる最も明白な最適化は、best-so-farが 'm'で、あなたが今チェックしている行の中で見つかった1の数が' k'であり、 'mk'より少ない数です。残っている列をチェックし、現在の行がこれまでのところ最良の結果を明らかに上回っていないため、早めに脱退することができます。また、SIMD命令で行うことができ、複数のコアを利用するために並列化することもできます。 –
はn^2よりも優れているということは、あなたが行列のすべてのセルを訪れていないことを意味します。最大行を素早く決定できる状況がありますが、一般的なケースでは、少なくとも1回はすべてのセルを訪問する必要があります – adrianm