1.1 線形検索の定義
線形検索(sequential searchとも言う)は、リストや配列内の要素を探すアルゴリズムで、全ての要素を順番にチェックしていって、一致するものを見つけるか、全ての要素を確認するまで続ける方法だよ。これは最も簡単な検索アルゴリズムで、データの事前ソートを必要としないんだ。
主な原則:
- 順次確認: アルゴリズムは、配列やリストの各要素を順番に探し求める値と比較するよ。
- 検索の終了: 一致する要素が見つかるか、全ての要素が確認されたら、検索を終了するんだ。
- ソート不要: 線形検索は未ソートのデータにも適用できるよ。
- 適用先: 線形検索は、リストや配列を含む、イテレーションをサポートするあらゆるデータ構造に適用できるんだ。
線形検索の時間計算量はO(n)
で、ここでn
は配列またはリスト内の要素数だよ。最悪の場合、アルゴリズムは検索したい値を見つけるか、存在しないことを確認するために全てのn要素をチェックする必要がある。
時間計算量の分析:
- 最良ケース (Best case): 要素が最初に見つかる場合、
O(1)
。 - 平均ケース (Average case): 要素が途中で見つかる場合、
O(n/2)
で、O(n)
と同じことだね。 - 最悪ケース (Worst case): 要素が最後に見つかるか存在しない場合、
O(n)
。
1.2 線形検索のステップバイステップ実装
線形検索のステップ:
- 初期化: 検索の開始インデックスを設定(通常はゼロインデックス)。
- 順次確認: リストや配列の各要素を求める値と比較する。
- 終了条件: 要素が見つかったら、そのインデックスを返す。全ての要素が確認され、求める値が見つからない場合、特別な値(通常は-1やNone)を返す。
Pythonでの線形検索の実装:
def linear_search(arr, target):
# 配列の各要素を通過する
for index, element in enumerate(arr):
# 現在の要素が求める値に等しい場合、そのインデックスを返す
if element == target:
return index
# 要素が見つからない場合、-1を返す
return -1
実装のステップバイステップの説明:
- ループの初期化:
enumerate
関数を使ったfor
ループで、各イテレーションに配列のインデックスと要素を返すよ。 - 比較: 各イテレーションで、現在の要素は求める値(target)と比較される。
- インデックスの返却: 現在の要素が求める値に等しい場合、その要素のインデックスを返す。
- -1の返却: ループが終了し、求める要素が見つからない場合、-1を返す。
# 使用例:
arr = [4, 2, 7, 1, 9, 3]
target = 7
result = linear_search(arr, target)
print(f"エレメント {target} はインデックス {result} で見つかりました") # 出力: エレメント 7 はインデックス 2 で見つかりました
# 配列内にない要素の使用例:
target = 5
result = linear_search(arr, target)
print(f"エレメント {target} はインデックス {result} で見つかりました") # 出力: エレメント 5 はインデックス -1 で見つかりました
1.3 線形検索で解決できる問題の例
線形検索はデータコレクション内で要素を探す多くの問題を解決するのに使われるよ。以下はそのような問題のいくつかの例だよ:
問題1: 配列内の要素を探す
指定された数値を配列内で見つける必要がある。
例:
def linear_search(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
arr = [10, 23, 45, 70, 11, 15]
target = 70
index = linear_search(arr, target)
print(f"エレメント {target} はインデックス {index} で見つかりました") # 出力: エレメント 70 はインデックス 3 で見つかりました
問題2: リスト内の要素の存在確認
指定された文字列がリスト内に存在するか確認。
例:
def linear_search(arr, target):
for element in arr:
if element == target:
return True
return False
words = ["apple", "banana", "cherry", "date"]
target = "cherry"
found = linear_search(words, target)
print(f"エレメント {target} は{'見つかりました' if found else '見つかりませんでした'}") # 出力: エレメント cherry は見つかりました
問題3: 最小または最大要素の探索
リスト内の最小または最大値を見つける必要がある。
例:
def find_min(arr):
if not arr:
return None
min_val = arr[0]
for element in arr:
if element < min_val:
min_val = element
return min_val
arr = [34, 17, 23, 2, 45, 13]
min_value = find_min(arr)
print(f"最小値: {min_value}") # 出力: 最小値: 2
問題4: 最初の出現を探す
リスト内の指定された要素の最初の出現を探す。
例:
def find_first_occurrence(arr, target):
for index, element in enumerate(arr):
if element == target:
return index
return -1
arr = [4, 2, 7, 1, 9, 3, 2]
target = 2
index = find_first_occurrence(arr, target)
print(f"最初の {target} の出現はインデックス {index} です") # 出力: 最初の 2 の出現はインデックス 1 です
問題5: 出現回数のカウント
リスト内の指定された要素の出現回数をカウントする。
例:
def count_occurrences(arr, target):
count = 0
for element in arr:
if element == target:
count += 1
return count
arr = [4, 2, 7, 2, 9, 3, 2]
target = 2
count = count_occurrences(arr, target)
print(f"エレメント {target} は {count} 回出現します") # 出力: エレメント 2 は 3 回出現します
GO TO FULL VERSION