好的算法通常需要满足以下几个基本要求:

  1. 正确性:算法应该能够正确解决问题,即对于所有合法的输入,算法都能产生正确的输出。

  2. 效率:算法应该在合理的时间内完成计算。这通常涉及到算法的时间复杂度,即算法执行步骤的数量与输入大小的关系。

  3. 可读性:算法的代码应该易于理解,这样其他程序员可以轻松阅读和维护。

  4. 健壮性:算法应该能够优雅地处理错误输入、异常情况和边缘情况。

基本的函数运行时间计算方式

//
// Created by lammy on 24-9-6.
//
#include <valarray>
#include <cstdio>
#include <ctime>
clock_t start, stop;
double duration;
double f1(int n, const double a[], double x){
    int i;
    double p = a[0];
    for(i = 1; i <= n; i++){
        p += (a[i] * pow(x, i));
    }
    return p;
}
int main(){
    start = clock();
    f1(1000, new double[1000], 1.1);
    stop = clock();
    duration = ((double)(stop - start)) / CLK_TCK;
    printf("ticks1 = %f\n", (double)(stop - start));
    return 0;
}

常见的时间复杂度及其特点

  • O(1):常数时间复杂度,表示算法的执行时间不随输入规模的变化而变化

  • O(log n):对数时间复杂度,通常与二分搜索等算法相关。

  • O(n):线性时间复杂度,表示算法的执行时间与输入规模成正比

  • O(n log n):线性对数时间复杂度,常见于快速排序、归并排序等算法。

  • O(n^2):平方时间复杂度,常见于简单排序算法如冒泡排序、插入排序等。

  • O(n^k)多项式时间复杂度,其中k是常数,表示算法的执行时间与输入规模的k次方成正比

  • O(2^n):指数时间复杂度,通常与暴力搜索算法相关,效率较低。

  • O(n!):阶乘时间复杂度,表示算法的执行时间与输入规模的阶乘成正比,效率非常低。