算法必须具备有限性、确定性、可行性、输入、输出五个特性。确定性是指算法没有歧义。算法可以根据正确性、可读性、健壮性、高效性四个方面来评估优劣。前三个方面都是可以实现的,高效性一般是拉开算法差距的方面。算法的效率又分为时间效率和空间效率,两个方面也存在一定程度的互斥。
算法的执行时间无法精确计算,但是能够进行估算。如STM32f103的时钟周期为0.0138us,指令周期为0.011us。每条语句需要花费不定个数的指令周期。
不同的编译软件,对 for 语句的编译也不尽相同,以keil 为例,对 for(i=0;i<1;i++) n++;(i,n 均为 char 型或 unsigned char 型)进行编译,得:
①一条赋值语句(i=0) 2个指令周期,
②一条判断语句(i<1) 4个指令周期,
③一条自增语句(n++) 1个指令周期,
④一条自增语句(i++) 1个指令周期,
⑤一条判断语句(i<1) 4个指令周期。
以以下程序为例子,进行大致估算 16 + 14 * n条指令,运行时间大概为0.154 * n+0.176 us。10个节点为1.716us,100个节点为15.576us。
linklist *init(int n)
{
linklist *head, *node, *tail; //定义字头节头,中间字节,尾节点 6个周期
head = (linklist*)malloc(sizeof(linklist)); //分配内存空间 2个周期
tail = head; //与head指针分配一样的内存空间 2个周期
int value = 0; // 2个周期
for (int i = 0; i < n; i++) // 14 * n个周期
{
node = (linklist*)malloc(sizeof(linklist)); //分配内存空间
node->height = value; //更新node节点数据,将其赋值给node
tail->next = node; // tail的next指针指向node
tail = node;//tail等于node
value++;
}
tail->next = NULL;//创建尾部 // 2个周期
return head; //返回头部字节指针 //2个周期
}
但在计算算法的时间效率时,往往以算法的最大次方作为时间的评价指标,如以上算法的时间为一次方。