研修の課題で以下のような課題がだされています。
-------
データ数5000,000の数値データ(順序はランダム)の中で、n番目に大きい数を求めなさい。
nは、0~100とする。
但し、ソートは一切使ってはいけない。
-------
ソートを使ってはいけないという縛りが…大変、厳しく・・・
クイックセレクト等、どれも必ずソートを要するものしか思いつかないのです。。。
下位n個の数値を保持する方法→(ソート要)
クイックセレクト→(ソート要)
他に何か、ソートを使わない解法はあるのでしょうか。
アイディアをください。
よろしくお願いします。
A 回答 (14件中11~14件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
No.3 の方もおっしゃっていますが、
まず、n=0については出題者に確認した方が良いでしょう。
それから「入力に同じ値が複数存在する可能性があるか」や、
同じ値が複数存在した場合の「n番目に大きい数」の定義も
確認した方がいいでしょう。
例えば 100, 100, 90, 90, 80, 50 というデータが許容されるか、
許容された場合に「3番目に大きい数」は 90 なのか 80 なのか。
これによって少し実装が変わるはずです。
回答ですが、No.1 の方もおっしゃっているように、
「上位n個の数値を保持する方法」をベースにできます。
「下位n個」とありますが、「上位n個」ですよね?
それを前提に話を進めます。
上位n個の配列を維持するのに、
ソートは絶対に必要ではありません。
n個全てを並び替えてしまうとソートになりますが、
実際に必要なのは配列内のn個の要素の中で、
最小の要素がどれであるかを知ることだけです。
配列内のn個のそれぞれの要素について、
他の全要素と比較し、
それが最小の要素であるかをチェックしてマークします。
最小がどれであるかを知るだけで、並び替えはしません。
入力に対しての処理はこうなります。
入力が配列内の最小の要素よりも大きい場合には、
最小の要素と入れ替えます。
そしてまた最小の要素を見つけなおします。
こうして最後のデータまで処理を終えれば、
配列内の最小の要素=「n番目に大きい数」になります。
つまり、配列には出現した順にデータを詰めていき、
どの要素が最小値であるかをマークするだけにすることで、
ソートを回避するわけです。
配列内の最小値よりも小さいデータは捨て、
最小値よりも大きいデータが来たら入れ替えるのです。
結果、配列内の順序はぐちゃぐちゃなままで、
「n番目に大きい数」が求められることになります。
No.3
- 回答日時:
「ソートは一切使ってはいけない」という制約がどこまで厳しいのかによりそうだけど, 例えばヒープを作るとか.
ところで, n に 0 を与えた場合は何を答えればいいんだろう.
この回答への補足
問題の制約で、n >= 1 という条件が付いています。
また、ソートは一切使ってはいけない…という通り、本当に一切使ってはいけないのです。
ヒープもアウトなんだそうです。
何かありませんでしょうか。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Excelの50音順ソートを全ての行列に適用するには? 4 2022/12/05 11:28
- Java Java配列の問題を教えてください。 乱数で20個出力し、最大、最小、合計、平均を求め、更に昇順にソ 3 2023/07/10 18:32
- Excel(エクセル) Excel 効率的な名簿と得点の管理の仕方 8 2022/08/07 08:15
- Excel(エクセル) excel マクロでグループ内でソートしたい。見出しが上手くいきません。 7 2022/05/22 08:31
- Excel(エクセル) 重複しているか否かをソートせずに判断する方法ありますか? 2 2022/07/06 21:16
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) Excel VBAで並べ替えをしたい 3 2023/02/25 09:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataTableの行をソートしてD...
-
10個の整数を入力して小さい順...
-
C言語・要素除去
-
C# DataGridView のヘッダーセ...
-
数字文字列のソート方法
-
vbでDataTableの抽出コピー
-
あるディレクトリ内のファイル...
-
2次元配列を複数項目でソートし...
-
VB6でデータを昇順に並べ替える
-
C# ArrayListを二次元配列のよ...
-
文字列をソートする方法
-
VB.NETでファイル名順にファイ...
-
excel VBA の条件をつけての列...
-
サイトで価格順で表示するなど...
-
シフトJISのソート
-
VBA基本構文の作り方 2列の...
-
SQLで検索結果の出力件数指定?
-
Excel VBA テキストボックス内...
-
昇順と降順
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
ファイル名「1.jpg ~10.jpg~...
-
リスト構造のソートで悩んでま...
-
excel VBA の条件をつけての列...
-
C# DataGridView のヘッダーセ...
-
DataGridViewの複数列を連動し...
-
文字列をソートする方法
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
Excelですべての組合せ(重複組...
-
VBA基本構文の作り方 2列の...
-
列のどこをクリックしてもソー...
-
excel VBA リストビューの行...
-
あるディレクトリ内のファイル...
-
コレクションの数値をSortで並...
-
数字文字列のソート方法
-
VBScriptで重複レコードを削除...
-
2次元配列を複数項目でソートし...
-
10個の整数を入力して小さい順...
おすすめ情報