質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

763閲覧

配列の中から最大値を速く求めたい。

hanamur

総合スコア45

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/01/24 06:37

配列の中から最大値を求めるのが速い方法を教えてください。
C++を使っていまして、
例えば
int aaa[10]={3,5,2,1,6,7,4,5,9,3}
という配列があったとすると、9を最も速く出せる方法は何でしょうか。(実際には1万個くらいある)
ぱっと思いつくのは先頭から一つずつ比べる方法、つまり最大値を更新したらそれ用の変数(例えばaaamax)を入れ替えていく方法。
次に思いつくのはソートして先頭を取得する方法。
私にはこれくらいしか思いつきません。どちらのほうが速いのでしょうか。
あるいはこれより速い方法をご存じでしたらどうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hanamur

2022/01/26 18:03

皆さん、回答ありがとうございました。 いくつか方法を出していただいたので私の場合に速いのはどれかを試してみます。 BAは回答が速かったfanaさんに。 皆さんありがとうございます。
guest

回答3

0

ベストアンサー

「配列」の中身が何かしらの「最大値を効率良く求めるのに都合の良い形」になっていないのであれば,
全ての要素をチェックしない限り最大値はわからないのだから,全部見るしかない.

単発の探索を考えるなら,単純に全部見るのは O(n) だろうからソートより早い.
ソートが有用なのは,ある時点でソートしたという結果を以降に活かせるような話があるのかどうか次第かと.

投稿2022/01/24 06:46

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/01/24 06:52

最大値なる値が欲しいタイミングで速度が重視されるのであれば, それ以外のときに最大値を求めて保持しておけばよいのではあるまいか. その配列の内容を変更する処理において「現在の最大値」を都度更新するとか.
guest

0

あらかじめ昇順/降順に並んでいるのでもなければ、
最大値を見つけるのは総当たりすなわち要素数に比例した時間:O(N)を要します。

ソートしておけば速いのは事実ですが、ソート自体がO(NlogN)の時間計算量(最短で)ですから。

「ソートされてはいないけど最大値はどれか」が求めるものであるならヒープを作るのがオススメ。
要素の追加に要する時間計算量はO(logN)です。
※ vectorとpush_heap()/pop_heap() を使います。

投稿2022/01/24 11:25

編集2022/01/24 11:32
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実験したところ, hanamurさんが挙げてくださったもの以外に速い方法がありました。

C++

1#include<iostream> 2#include<algorithm> 3using namespace std; 4 5int main() { 6 int aaa[10]={3,5,2,1,6,7,4,5,9,3}; 7 cout<<*max_element(aaa,aaa+10)<<endl; 8}

algorithm関数を用いてポインタの形で表す方法です。
計算時間を調べると最大値を順に更新する方法では0.72秒, 上のコードでは0.07秒, ソートして先頭の数を出力する方法では1.10秒でした。よって, 定義を使わずmax_elementを使用するのが速いと思います。

投稿2022/01/25 07:40

wagashi_157

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/01/25 08:37

それぞれがどんな実装の話なのか,可能であればそのコードも示されると良いのではないかな,と. > 最大値を順に更新する方法では0.72秒 たかだか10要素から最大値を見つけるのに 0.7 秒もかかるとは思えないのですが,何か誤記でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問