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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1230閲覧

二分探索の計算量の求め方について

takuyaKK

総合スコア37

アルゴリズム

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/31 01:27

下記の二分探索の計算量は、while文がlogN回実行されるからO(logN)ということになっていると思います。ですが、各while文の中でリストにアクセスする必要があって、リストへのアクセスはO(N)の計算量がいるので、二分探索の実際の計算量はO(NlogN)になる気がするのですがどうなのでしょうか?
リストへのアクセスは実際にはCPU内部でキャッシュが使われるので、無視できる計算量になるみたいな話なのでしょうか?

python

1int binary_search(int v) { 2 /* 目的の index は [left, right) のどこかにある */ 3 int left = -1; 4 int right = (int)a.size(); 5 6 while (right - left > 1) { 7 int mid = left + (right - left) / 2; 8 9 /* a[mid] と v との大小関係に応じて候補区間を左右半分に分ける */ 10 if (a[mid] >= v) right = mid; // 候補区間を [left, mid)11 else left = mid; // 候補区間を [mid, right)12 } 13 14 /* left は条件を満たさない最大の値、right は条件を満たす最小の値になっている */ 15 return right; 16}

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

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

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

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

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

quickquip

2021/03/31 01:29

言語タグを間違えていると思います。 コード中にaの定義がありません。
guest

回答2

0

おそらく用語の混乱かと思います。
アルゴリズムの世界で単に「リスト」というと線形リストを指す場合が多いと思います。これは要素をポインタでつないでいくもので、アクセスには平均O(N)の時間がかかります。
一方、Pythonでいうリストはアルゴリズムの世界では配列と呼ばれるもので、各要素へのアクセスはO(1)で可能です。なので、二分探索の平均の計算量は O(log N)になります。二分探索の実装に線形リストを使うことには意味がないので通常やらないと思います。

投稿2021/03/31 01:43

ockeghem

総合スコア11701

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

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

maisumakun

2021/03/31 01:44

よくよく読むと、提示されたコードがPythonではないんですよね…
takuyaKK

2021/03/31 01:46

そうなんですね!理解できました!ありがとうございます!
ockeghem

2021/03/31 01:51 編集

本当ですね。失礼しました。が、まぁ「用語の混乱」という意味ではあっていますかw
guest

0

ベストアンサー

リストへのアクセスはO(N)の計算量がいるので

aの型は何でしょうか?アクセスに必要な計算量はそれに依存します。

投稿2021/03/31 01:30

編集2021/03/31 01:43
maisumakun

総合スコア145184

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

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

maisumakun

2021/03/31 01:32

二分探索の計算量がO(logN)、というのは、配列など各要素へのアクセスがO(1)、というのが前提です。
takuyaKK

2021/03/31 01:45

pythonのlistは連結リストじゃなくて配列なんですね!理解しました!ありがとうございます!
maisumakun

2021/03/31 01:46

えっと、ソースコードがPythonではないのですが、結局したかったのはPythonでの話なのですか?
takuyaKK

2021/03/31 01:53

pythonの話であってます!混乱させてしまい申し訳ありません!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問