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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

5回答

7024閲覧

二分探索について質問です。

nyan_lia

総合スコア50

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2016/03/30 03:12

見て頂きありがとうございます。質問です。

例えば配列の中に0から始まり+1ずつ昇順で数値が入っているとします。
arry[10] = {0,1,2,3,4,....};(今は10の配列ですが実際は10万とか膨大な数だと思ってください。)

これで7を探索するとかは解るんです。

ここで疑問に思ったんですが、例えば
array[10] = {3,1,5,6,2,4...};

こういう風にランダムで数値が入っていた時に、
目的の値を取り出すときは皆さんはどう探索しているのでしょうか?

私の考えではクイックソートとかで昇順にしてから二分探索でもするのかな?と思っているのですが。

時間あれば返答よろしくお願いします。

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

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

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

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

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

guest

回答5

0

クイックソート(O(n log n))は線形探索(O(n))よりも遅いので、

  • 探索するのが一度か数回だけなら線形探索
  • 何度も探索するならクイックソートして二分探索

と使い分けますかね。

投稿2016/03/30 03:33

yuba

総合スコア5568

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

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

nyan_lia

2016/03/30 03:49

なるほど、そういう風に使い分けしていくのですね。 回答ありがとうございました。
guest

0

ソートをするってことは、各要素を1回はアクセスするんですよね。
それなら、なにも考えずに頭から最後まで順番にアクセスして、目的の数字の存在をチェックすればよいのでは?
ソートしてから二分探索するよりは速いはず...

投稿2016/03/30 14:07

katoy

総合スコア22324

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

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

0

二分探査はソートしてあることが前提の探査法なので、ばらばらの配列に対して二分探査しても意味はありません。
ソートしてから二分探査することになります。ソート方法はクイックソートでもマージソートでも好きなものを使えばいいのではないでしょうか。

投稿2016/03/30 03:40

swordone

総合スコア20651

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

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

nyan_lia

2016/03/30 03:51

そうですねそもそも二分探索ってソートしてあることが前提なんですね。 ソートは下に書かれてあるOdacchiさんの複合ソートでいこうかなぁって思ってます。 回答ありがとうございます。
guest

0

ベストアンサー

2分探索は、ソート済み配列に対する探索アルゴリズムですので、
その考えは正しいです。

(一応ソートについて補足ですが、多くの言語で提供されている標準的なソートアルゴリズムは、クイックソートではあるのですが、実際は、クイックソートはソート処理の前のオーバーヘッドが大きいので、要素数が一定数以下になると挿入ソートに切り替える、クイックソート+挿入ソートの複合ソートだったりします。)

投稿2016/03/30 03:22

Odacchi

総合スコア907

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

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

nyan_lia

2016/03/30 03:48

考えが正しくてよかったです。 回答ありがとうございました。
guest

0

こんにちは。

私は、要素を登録する際に2分探索で昇順に並べておいて、2分探索でサーチすることが多いです。
C++でプログラムすることがほとんどなのですが、最近std::mapの使い方を悟ったので、寿命が短いものならstd::mapで赤黒木にしてます。

投稿2016/03/30 03:19

編集2016/03/30 03:21
Chironian

総合スコア23272

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

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

nyan_lia

2016/03/30 03:45

やっぱりあらかじめ昇順で並べておいた方が楽なんですね。 赤黒木は二分探索木のようなものなんですかね? ちょっとアルゴリズム調べてみます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問