線形探索VSバブルソート・2分探索

続き。
線形探索とバブルソート+二分探索で勝負してみた。

要素の数をを100, 1000, 10000の時、そして、探索場所をリストの前・真ん中・後ろの3箇所で調べてみた。

# Compare two ways of Search

import time
import random

def Search(target, numList):
    for x in numList:
        if x == target:
            return True
    return False

def Search2(target, numList):
    bubble(numList)
    min_pos = 0
    max_pos = len(numList) - 1

    while min_pos <= max_pos:
        mid_pos = (min_pos + max_pos) / 2

        if target == numList[mid_pos]:
            return True
        elif target > numList[mid_pos]:
            min_pos = mid_pos + 1
        else: # target < numList[mind_pos]
            max_pos = mid_pos - 1
    return False

def bubble(numList):
    for i in range(len(numList)):
        for j in range(i+1, len(numList)):
            if numList[i] > numList[j]:
                tmp = numList[i]
                numList[i] = numList[j]
                numList[j] = tmp

def main():
    N = 10000
    
    numList = [random.randint(1,1000) for i in range(N)]
    numList2 = [x for x in numList]
    
    target1 = 5
    target2 = N/2
    target3 = N-5

    print N
    print

    print "Linear Search"
    start = time.clock()
    Search(target1, numList)
    finish = time.clock()
    print finish - start

    start = time.clock()
    Search(target2, numList)
    finish = time.clock()
    print finish - start

    start = time.clock()
    Search(target3, numList)
    finish = time.clock()
    print finish - start

    print 
    print "Search2"
    start = time.clock()
    Search2(target1, numList2)
    finish = time.clock()
    print finish - start

    start = time.clock()
    Search2(target2, numList2)
    finish = time.clock()
    print finish - start

    start = time.clock()
    Search2(target3, numList2)
    finish = time.clock()
    print finish - start

if __name__ == "__main__":
    main()

結果は以下のとおり

D:\workspace\Python>python comparison.py
100

Linear Search
1.03306717192e-005
9.74722184629e-006
9.44647448911e-006

Search2
0.00136934482188
0.000914317077939
0.000914957669809

D:\workspace\Python>python comparison.py
1000

Linear Search
8.22303424009e-005
8.16739597901e-005
2.31936361859e-005

Search2
0.119159937445
0.0779367949354
0.0622293980542

D:\workspace\Python>python comparison.py
10000

Linear Search
0.000190661794559
0.000826772529736
0.000796321859822

Search2
7.00275457512
6.45483894077
6.58490988105

線形探索の圧勝。
まあそりゃそうか。

かたや計算量がx/2O(x)に対して、
かたや計算量がax^2 + log_2 xO(x^2)
だもんな。
xが要素の数、aは適当な係数。


単純作業に勝るものはなし??
んなことはなくて、高速なソートのアルゴリズムがいっぱいありますからね。
クイックソートなんかを使えば2分探索が勝てるのかな??
またやってみよう。