Java 逆引き集 | アルゴリズム基礎(ソート/検索の考え方) — パフォーマンス判断

Java Java
スポンサーリンク

アルゴリズム基礎(ソート/検索の考え方) — パフォーマンス判断

プログラムでよく使う処理が ソート(並べ替え)検索(探す)
初心者がまず理解すべきは「どういう方法があるか」「どのくらい速いか(計算量)」です。ここでは Java のコード例とともに、かみ砕いて解説します。


ソート(Sorting)

代表的なアルゴリズムと計算量

アルゴリズム計算量(平均)特徴
バブルソートO(n²)シンプルだが遅い。学習用。
選択ソートO(n²)実装簡単。やはり遅い。
挿入ソートO(n²)小規模データに有効。
クイックソートO(n log n)高速。標準ライブラリで採用。
マージソートO(n log n)安定ソート。大規模データに強い。

👉 実務では Arrays.sortCollections.sort を使えば十分。内部で高速アルゴリズムが選ばれる。


Java のコード例

import java.util.*;

public class SortDemo {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(5, 2, 9, 1, 3);

        // 昇順ソート
        Collections.sort(list);
        System.out.println(list); // [1, 2, 3, 5, 9]

        // 降順ソート
        list.sort(Comparator.reverseOrder());
        System.out.println(list); // [9, 5, 3, 2, 1]
    }
}
Java

検索(Searching)

代表的な方法と計算量

方法計算量特徴
線形探索(リニアサーチ)O(n)先頭から順に探す。小規模データ向け。
二分探索(バイナリサーチ)O(log n)ソート済み配列に有効。高速。
ハッシュ探索O(1)(平均)HashMap/HashSet を使う。超高速。

Java のコード例

線形探索

int[] arr = {5, 2, 9, 1, 3};
int target = 9;
boolean found = false;
for (int x : arr) {
    if (x == target) {
        found = true;
        break;
    }
}
System.out.println(found); // true
Java

二分探索(Arrays.binarySearch)

int[] arr = {1, 2, 3, 5, 9};
int idx = Arrays.binarySearch(arr, 5);
System.out.println(idx); // 3(インデックス)
Java

ハッシュ探索(HashSet)

Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");

System.out.println(set.contains("apple"));  // true
System.out.println(set.contains("orange")); // false
Java

パフォーマンス判断の考え方

  • データ量が少ない: 単純な線形探索や挿入ソートでも十分。
  • データ量が多い: O(n log n) のソート、O(log n) の検索を選ぶ。
  • 頻繁に検索する: HashMap/HashSet を使うと効率的。
  • 安定ソートが必要: 同じ値の順序を保ちたいならマージソート系(Java の Collections.sort は安定)。

👉 計算量の目安:

  • O(n²) → 数千件程度まで。
  • O(n log n) → 数百万件でも現実的。
  • O(1) → 即時応答。

例題で練習

例題1: 名前リストをソートして検索

List<String> names = Arrays.asList("Tanaka", "Sato", "Suzuki", "Kato");
Collections.sort(names); // 昇順ソート
System.out.println(names); // [Kato, Sato, Suzuki, Tanaka]

int idx = Collections.binarySearch(names, "Suzuki");
System.out.println("Suzukiの位置=" + idx);
Java

例題2: 商品コード検索(HashMap)

Map<String, String> products = new HashMap<>();
products.put("A001", "Apple");
products.put("B002", "Banana");

System.out.println(products.get("A001")); // Apple
System.out.println(products.containsKey("C003")); // false
Java

テンプレート集

ソート

Collections.sort(list); // 昇順
list.sort(Comparator.reverseOrder()); // 降順
Java

線形探索

for (T item : list) {
    if (item.equals(target)) { ... }
}
Java

二分探索

int idx = Arrays.binarySearch(array, target);
Java

ハッシュ探索

Set<T> set = new HashSet<>();
set.contains(target);
Java

まとめ

  • ソート: データを並べ替える。Collections.sort が基本。
  • 検索: 線形探索(O(n))、二分探索(O(log n))、ハッシュ探索(O(1))。
  • パフォーマンス判断: データ量と用途に応じてアルゴリズムを選ぶ。

👉 練習課題として「10万件のデータをソートして検索する」コードを書いてみると、線形探索と二分探索の速度差が体感できます。

タイトルとURLをコピーしました