如何估计算法的执行时间?

算法必须具备有限性、确定性、可行性、输入、输出五个特性。确定性是指算法没有歧义。算法可以根据正确性、可读性、健壮性、高效性四个方面来评估优劣。前三个方面都是可以实现的,高效性一般是拉开算法差距的方面。算法的效率又分为时间效率和空间效率,两个方面也存在一定程度的互斥。

算法的执行时间无法精确计算,但是能够进行估算。如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个周期
}

但在计算算法的时间效率时,往往以算法的最大次方作为时间的评价指标,如以上算法的时间为一次方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值