首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

一步一步寫演算法(開篇):測試驅動、漸進優化、從簡單開始

     編輯:關於C語言

系列宣言

  • 演算法是軟體的生命:無演算法則無軟體,電腦只是冰冷鐵疙瘩。
  • 演算法 ≠ 純數學:必須能用程式語言落地,工程落地能力同等重要。
  • 名字含義:
    ① 保證「人人可學、人人可懂」;
    ② 保證「健壯、可測試」——開發過程伴隨測試用例增長,無測試保護的程式碼只是無序字元。

核心認知

  1. 演算法皆有適用場景,無萬能演算法。
  2. 複雜演算法由普通演算法組成 → 分治、遞迴、化大為小。

實戰範例:陣列查找函式的演進

第 1 步:最小骨架 + 參數檢查

int find(int array[], int length, int value) {
    if (NULL == array || 0 == length)
        return FALSE;   // 參數非法

    int index = 0;
    return index;       // 佔位
}

測試用例同步編寫:

static void test1() {
    int array[10] = {0};
    assert(FALSE == find(NULL, 10, 10));
    assert(FALSE == find(array, 0, 10));
}

第 2 步:線性查找實作

int find(int array[], int length, int value) {
    if (NULL == array || 0 == length)
        return FALSE;

    for (int index = 0; index < length; ++index) {
        if (value == array[index])
            return index;   // 找到,回傳索引
    }
    return FALSE;           // 未找到
}

測試用例擴充:

static void test2() {
    int array[10] = {1, 2};
    assert(0 == find(array, 10, 1));   // 找到首項
    assert(FALSE == find(array, 10, 10)); // 未找到
}

第 3 步:指標優化(消除索引運算)

int find(int array[], int length, int value) {
    if (NULL == array || 0 == length)
        return FALSE;

    int* start = array;
    int* end   = array + length;
    while (start < end) {
        if (value == *start)
            return (start - array) / sizeof(int);
        ++start;
    }
    return FALSE;
}

第 4 步:泛型化(C++ template)

template <typename T>
int find(T array[], int length, T value) {
    if (NULL == array || 0 == length)
        return FALSE;

    T* start = array;
    T* end   = array + length;
    while (start < end) {
        if (value == *start)
            return (start - array) / sizeof(T);
        ++start;
    }
    return FALSE;
}

測試用例同步泛型化:assert(0 == find<int>(array, 10, 1));

四大鐵律總結

  1. 演算法必須經測試用例驗證。
  2. 任何優化建立在測試通過基礎上(重構前先有測試)。
  3. 測試與程式碼同步編寫(TDD 思想)。
  4. 成功是一步步累積的:每一步的成功建立在前一步成功之上。

寄語

不斷辨認錯誤、發現錯誤,才能不斷提升編程能力與業務水平。讓我們一起一步步寫出健壯的演算法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved