0
0

More than 3 years have passed since last update.

アルゴリズム体操3

Last updated at Posted at 2019-12-18

Search Rotated Array

任意の数だけ右へ回転されたソート済み配列と、指定された数(key)が渡されて検索します。

説明

任意の数だけ回転されたソート済み配列で、指定された数(key)を検索します。 Keyが存在しない場合は-1を返します。 配列に重複が含まれていないと仮定します。
以下は、回転前の元の配列です。
Screen Shot 2019-12-17 at 15.15.54.png
この配列で6回、回転を実行すると、次のように変わります。
Screen Shot 2019-12-17 at 15.18.04.png

条件

  1. 線形検索O(n)は受け入れられない解決策です。
  2. 修正したBinary Searchを考える。

Solution

Runtime Complexity O(logn)

Binary Search を利用している。

Memory Complexity O(logn).

一回のループごとに、渡されたArrayを半分に切って、片方のみに検索をかけている。

解説

解決策は、基本的にBinary Search ですが、いくつかの修正が加えられています。 例の配列をよく見ると、配列の少なくとも半分が常にソートされていることがわかります。 この特徴を利用します。 探している数値nが配列のソートされた半分の中にある場合は、Binary Search で見つけることができます。 それ以外の場合は、ソートされた半分を破棄し、ソートされていない半分を調べ続けます。 各ステップで配列を半分に分割しているため、これによりRuntime Complexity はO(logn)となります。
コードにおいて、少し読みにくい条件分けの部分があります。四つの条件で
1. 半分に切ったstart ~ mid の範囲のSubArrayがソートされている、かつ、探しているKeyがその範囲に存在するとき。
2. 半分に切ったmid ~ end の範囲のSubArrayがソートされている、かつ、探しているKeyがその範囲に存在するとき。
3. 半分に切ったstart ~ mid の範囲のSubArrayがソートされてなく、かつ、探しているKeyがその範囲に存在するとき。
4. 半分に切ったmid ~ end の範囲のSubArrayがソートされてなく、かつ、探しているKeyがその範囲に存在するとき。
と言う様に条件分けしています。

実装

Screen Shot 2019-12-17 at 16.05.32.png

テスト

Screen Shot 2019-12-17 at 16.07.05.png

アウトプット

Screen Shot 2019-12-17 at 16.09.54.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0