線形探索と番兵
番兵を使った線形探索の実装。
線形探索は床に並べたトランプと端から確認していき、目的の数を探すような
直感的なアルゴリズム。
当然、計算量はデータ量Nに対してO(N)となる。
しかし、番兵を使うと定数倍の計算量の違いがでる。
番兵を使わないと
for (int i =0; i < n;i++){ if (A[i] == key) return i+1; }
のように、forとifで2回処理が発生する。
一方、番兵を使うと
//番兵をセット A[n] = key; while ( A[i] != key ) i++;
のように、処理が1回になる。
したがって、番兵を使わないと2N回の処理が番兵を使うとN回になった。
(現在の計算機ではよほどデータ量が多くないと効果が出にくそうですが・・・。)
ちなみに、何かにつけてif文を使ってしまうため、ループが番兵まで行った時にfalseとするとき、if文を使わずに
return i != n;
とするのは見事だと思う。
■ソース
algorithm/5-2_linearsearch.c at master · JunKojima/algorithm · GitHub
algorithm/5-2-2_linearsearch.c at master · JunKojima/algorithm · GitHub
■参考資料
プログラミングコンテスト攻略のためのアルゴリズムとデータ構造
- 作者: 渡部有隆,Ozy(協力),秋葉拓哉(協力)
- 出版社/メーカー: マイナビ
- 発売日: 2015/01/30
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る