1. 程式人生 > >測試開發人員需瞭解的基礎算法系列(一)

測試開發人員需瞭解的基礎算法系列(一)

背景介紹

演算法 這個近兩年由於大資料人工智慧的興起而被提及最多的關鍵詞之一,從而在IT這個猿類圈中有了基因變異-演算法工程師,被其他老猿類羨慕嫉妒恨,其實我覺得也沒必要去羨慕,做好我們自己在本職的崗位做到優秀也不會比別人差的,有的測試猿說測試不需要了解或者研究演算法,根本沒毛線用,原來我也是這麼認為,不過隨著時間的推移猿類世界的基因突變,越來越發現不瞭解不懂演算法會越來越沒有競爭力,不為別的為了升職加薪你也得學啊,當然在測試過程中也更有助於我們瞭解需求,比如我們的專案就用到了一致性雜湊演算法,以及廣度優先圖的概念,二分查詢等所以是有很大必要的。測試猿們,我們可以不需要每個演算法都精通熟悉,但是基礎的我們還是要必須知道地,以下就對這些常見的基礎的一些演算法做一些個人的總結與理解,有不對的地方還請各位大神指正!

二分查詢

假設在電話本雖然我們都不用電話本了中查詢以我部落格名allen的首字母A開頭的人很容易第一次就能查到所有以A開頭的人,那麼假如是K呢你可能想到直接從中間找啊,還有假如要登陸CSDN,csdn必須要檢查你是否擁有其網站的賬戶,假如你的名字也是K開頭網站要從A開始查詢,其實更科學的方式是從中間開始,所以基於以上情況都可以使用同一演算法解決此問題,這種演算法就是二分查詢

舉個栗子

假如要從1-100中隨便猜一個數字,你每次猜後我都會說大或者小了,假設你從1開始猜,過程大概就是假如你要猜的是100那麼很不幸你要猜99次,當然單反有點腦子的肯定都是隨機猜,當然還有更佳的方式,那就是從50開始。過程如下。

1,2,3,4,5,6,7,8,9。。。。。。。。。100
- 50 小了 但是排除了一半的數字
- 75 大了 餘下的數字又減少了一半
- 。。。。。
- 每次都從剩下的數字排除了一半

每次猜排除數字的個數如下
100個元素–>50–>25–>13–7–4–2–1(對了)
所以不論猜的是什麼,在7次之內都能猜到,每次都能排除一半的假答案
所以
對於二分查詢,對於包含n個元素的列表用二分查詢最多可以需要log^n步(對坐Log 以2為低n 的對數)
下面讓我們來實現二分查詢,下面是一個猜數字的遊戲,每一次我們都從中間猜起,以一個List為例子,如果猜中就返回其位置,設定兩個邊界值
- low = 0
- high = len(list)-1
每次都從中間猜起是:mid = (low+high) / 2 如果mid不是整數,python會自動向下取整guess = list[mid]
完整程式碼如下

#list為傳入的猜的列表,onj_num 為目標數
def guess_num(list,obj_num):
    low = 0
    high = len(list) -1
    while low <= high: #只要範圍沒有縮小的只包含一個元素就檢查中間的元素
        mid = (low + high)/2
        guess = list[mid]
        if guess == obj_num: #找到了元素
            return mid
        if guess > obj_num: # 猜的數字大了
            high = mid -1
        else: #猜的數字小了
            low = mid +1
    return None #猜的數字不在列表中
my_list = [1,3,5,8,111]
print guess_num(my_list,3) --->1 第一個位置
print guess_num(my_list,2222)---->None 沒有找到元素2222

快速排序

我們隊一個數組進行快速排序,對排序來說最簡單的陣列是什麼樣的嘛,那就是根本不需要排序的陣列
- [ ] 空陣列
- [20] 只有一個元素的陣列
因此只要我們找到它的基線條件:空陣列或者只有一個數組,這種情況就直接返回陣列本身不需要排序,如下所示:

    def quicksort(array):
    if len(array) ==0 or len(array) == 1:
        return array 

那麼假如3個元素,甚至更多元素的陣列排序怎麼辦呢,其實一樣的那就是想辦法找到它的基線條件,下面介紹一下快速排序的原理,首先從陣列中選擇一個元素,作為基準值,接下來找出比基準值小的和大的如下假如以第一個元素15作為基準值
- 例子list=[15.10.33.85,8]
- 比15小的放到一個數組裡[10,8]
- 比15大的放到一個數組裡[33,85]
- 同理在[10,8]中以10作為基準值把比10小的放到[8],比10大的為[ ]空陣列
- 同理在[33,85]中以33作為基準值把比33小的放到[ ]空陣列,比33大的為[85 ]空陣列
以上後續發現都用了遞迴的方式排序方式都是一樣的,所以轉化成程式碼就是如下:

def quicksort(array):
    if len(array) < 2:
        return array
    else:
        jizhun_num = array[0]#極限條件
        less = [i for i in array[1:] if i <= jizhun_num]#小於基準值的
        big =  [i for i in array[1:] if i > jizhun_num]#大於基準值的
        return quicksort[less] + [jizhun_num] + quicksort[big]
print quicksort([10,3,5,11,8])

總結

以上兩個是比較常見和基礎的排序演算法之一,做一個拋磚引玉,希望可以提高一下測試人員對演算法的興趣,在這裡推薦一本演算法入門書籍《演算法圖解》如下,通俗易懂有趣
這裡寫圖片描述