EeBlog(テクニカルブログ)

探索アルゴリズム (1)

そろそろソートアルゴリズムもネタが尽きてきましたので、探索アルゴリズムを紹介します。
まずはリスト探索アルゴリズムの線形探索を紹介します。

リストからオブジェクトを見つけるときにまず思いつくのは、リストの最初の要素から順番に調べていく、というものはないでしょうか。線形探索とはこのアルゴリズムのことです。

探索には n をリストの長さとして O(n) の計算時間量になります。

例を示すまでもないでしょうけれども、念のためにコードを載せておきます。

search/list/LinearSearch.java

package search.list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class LinearSearch {

    public static  int search(List list, T target,
            Comparator comparator) {
        for (int i = 0; i < list.size(); i++) {
            if (comparator.compare(list.get(i), target) == 0) {
                return i;
            }
        }
        return -1;
    }

    public static > int search(List list,
            T target) {
        return search(list, target, new DefaultComparator());
    }

    private static  void showResult(List list, int result) {
        if (result < 0) {
            System.out.println("object not found");
        } else {
            System.out.println("object found");
            System.out.println("index: " + result + ", value: "
                    + list.get(result));
        }
    }

    public static void main(String... args) {
        List list = new ArrayList();
        for (int i = 0; i < 1000; i++) {
            list.add(i);
        }
        Collections.shuffle(list);

        System.out.println("リストの中から値が0のオブジェクトを探索");
        showResult(list, search(list, 0));

        System.out.println();
        System.out.println("リストの中から値が1000のオブジェクトを探索");
        showResult(list, search(list, 1000));

        Comparator gec = new Comparator() {
            @Override
            public int compare(Integer a, Integer b) {
                return a >= b ? 0 : 1;
            }
        };

        System.out.println();
        System.out.println("リストの中から値が990以上のオブジェクトを探索");
        showResult(list, search(list, 990, gec));

        System.out.println();
        System.out.println("リストの中から値が1000以上のオブジェクトを探索");
        showResult(list, search(list, 1000, gec));
    }

    private static class DefaultComparator>
            implements Comparator {

        @Override
        public int compare(T a, T b) {
            return a.compareTo(b);
        }
    }
}