面接のコーディングテスト対策: 計算量オーダーと探索法

経緯:

面接でコーディングテストあると、だいたい聞かれる。ので、勉強しておいたほうがいい。

参考サイト:

計算量オーダーの求め方を総整理! 〜 どこから log が出て来るか 〜 - Qiita

線形探索法

一つずつ辿る方法。

例えば、1から10までのデータがあった場合に、そこから数をあてる処理を考えます。

線形探索法では1から10まで 1つずつ試していく 処理を行います。

オーダー: O(n)

二分探索法

半分に分けて不要な処理を省いていく方法。

例えば、1から10までのデータがあった場合に、そこから数をあてる処理を考えます。

二分探索では1から10までの値を 5より大きい値か?2より大きい値か? のように絞り込みながら処理を行います。

オーダー: O(log(n))

練習

その1

for i in range(n):
    for j in range(n):
        pass

オーダー: O(n^2)

その3

exist = False # 存在しなかったら false のままになるように初期化
for i in range(n):
    if a[i] == v:
        exist = True
        break

計算量は最悪のケースを考えるべき

オーダー: O(n)

その4

for i in range(0, n, 2):
    print(i, ",", end='')

ループの回数は n/2 (切り下げ)であるが係数 1/2 は無視する。

オーダー: O(n)

その5

for i in range(1, 10):
    for j in range(1, 10):
        print('{} x {} = {}'.format(i, j, i*j))

オーダー: O(n^2)

その6

2次元平面上の座標(x,y)がn個が与えられたとき、2点間の距離が最短となる点の組み合わせと距離を求める。

import math

min_dist = 1000000
for i in range(0, n):
    for j in range(i+1, n):
        if sqrt(x**2 + y**2) < min_dist:
            min_dist = sqrt(x**2 + y**2)

(n-1) + (n-2) + … + 1 + 0

であるから、初項 n-1, 公差 -1の等差数列と考えて

比較

計算ステップの関係

log(n) < n < n^2 < n^3 < 2^n < n!