【问题标题】:Execution algorithm recursively seeking lower number, is very slow执行算法递归寻找较低的数字,非常慢
【发布时间】:2015-06-27 21:50:46
【问题描述】:

您好,我有以下代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define min(x, y)(x < y)?(x):(y)
#define SIZE 1000

int valormenor(int a[], int n)
{
    if(n == 1)
        return a[0];
    else
        return min(a[0], valormenor(a + 1, n - 1));
}

int main(void)
{
    int arr[SIZE] = {0}, i;
    srand (time (NULL));
    for(i = 0; i < SIZE; i++)
        arr[i] = rand() % SIZE;
    arr[5] = -1;
    printf("%d\n", valormenor(arr, SIZE));

    return 0;
}

关键是不明白,因为找最小数的时间太长了,我的理论是这个递归函数实现得很糟糕,你声称吗?

【问题讨论】:

  • “非常慢”有多慢?但当然你是对的,因为所有不必要的开销,这是在数组中找到最小值的一种非常慢的方法与简单循环相比
  • @romkyns 你能解释一下为什么这个函数效率低吗
  • 你的算法是 O(n)²
  • @xsami 更像 O(2^n)
  • @Anonymous 谢谢我失败了:p

标签: c algorithm recursion


【解决方案1】:

让我们在这里展开 min 宏:

return min(a[0], valormenor(a + 1, n - 1));

变成了

return (a[0] < valormenor(a + 1, n - 1))?(a[0]):(valormenor(a + 1, n - 1));

如您所见,valormenor 被调用了两次。这两个递归调用进行了四个递归调用,然后进行了八个递归调用,依此类推。这是一个经典的双重评估错误。

不要使用这样的宏。他们只是不值得头疼。

【讨论】:

  • @Tony:不要那样做。每个问题一个问题。
  • 另外:宏没有正确括起来!它应该是#define MIN(x, y)((x) &lt; (y))?(x):(y)。为避免多重评估,请将其设为函数。为了性能,这个函数可以做成static或者更好的static inline
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多