好的算法通常需要满足以下几个基本要求:
正确性:算法应该能够正确解决问题,即对于所有合法的输入,算法都能产生正确的输出。
效率:算法应该在合理的时间内完成计算。这通常涉及到算法的时间复杂度,即算法执行步骤的数量与输入大小的关系。
可读性:算法的代码应该易于理解,这样其他程序员可以轻松阅读和维护。
健壮性:算法应该能够优雅地处理错误输入、异常情况和边缘情况。
基本的函数运行时间计算方式
//
// 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!):阶乘时间复杂度,表示算法的执行时间与输入规模的阶乘成正比,效率非常低。