【问题标题】:Finding the distance between the two closest numbers in an array of n numbers. (Presorted Arrays)在 n 个数字的数组中查找两个最接近的数字之间的距离。 (预排序数组)
【发布时间】:2016-03-23 17:19:35
【问题描述】:

与蛮力 θ(n2) 相比,数组经过预排序,使算法 θ(nlogn) [排序+查找最小距离]。两个代码都执行相同的工作,但第一个代码显示超出时间限制。我想知道错误是什么。代码有bug吗?

带有 while 循环的代码(超出时间限制)


#include <stdio.h>

void mindistance(int a[],int n)
{
    int i=1,arraymin=999,currentmin,current=a[0];

    while(i<n)
    {
        if(a[i]==current)
            i++;
        else
        {
            currentmin=a[i]-a[i-1];
            if(currentmin<arraymin)
            {
                arraymin=currentmin;
                current=a[i];
                i++;
            }

        }
    }
    printf("%d",arraymin);
}


int main(void)
{

    int a[]={4,34,56,77,99,424,754}; 
    mindistance(a,7);

    return 0;
}

使用 for 循环的代码(效果很好)


#include <stdio.h>

void mindistance(int a[],int n)
{
    int i,arraymin=999,currentmin,current=a[0],x,y;

    for(i=1;i<n;i++)
    {
        if(a[i]==current)
            continue;
        else
        {
            currentmin=a[i]-a[i-1];
            if(currentmin<arraymin)
            {
                arraymin=currentmin;
                current=a[i];

            }

        }
    }
    printf("%d",arraymin);
}


int main(void)
{

    int a[]={4,34,56,77,99,424,754};
    mindistance(a,7);

    return 0;
}

【问题讨论】:

  • i++ 应该总是发生。因此,在 while 循环中,要么将其作为循环中的第一件事,要么作为循环中的最后一件事。不要在 if 语句中这样做。无论如何,如果您坚持在测试中这样做,就会缺少 if(currentmin&lt;arraymin) 的 else。?
  • 这确实有效。 if-else 子句后的一般 i++ 语句。但是为什么它不早点使用单独的 i++ 增量工作呢?

标签: loops array-algorithms


【解决方案1】:

循环不相同。在 for 循环中 i 在每次迭代中都会增加,而在 while 循环中 i 仅在某些情况下增加。一个相同的 while 循环是:

while(i<n)
{
    if(a[i]==current)
        i++;
    else
    {
        currentmin=a[i]-a[i-1];
        if(currentmin<arraymin)
        {
            arraymin=currentmin;
            current=a[i];
        }
        i++;
    }
}

【讨论】:

  • 但我不明白为什么我们不能在 if 子句中增加 i ?它就像任何其他变量一样,对吗?还是应该只使用匹配的 if-else 子句来增加它?
  • 你可以。但是在您编写的 while 代码中,您不会在输入 else 子句但 currentmin>=arraymin 的迭代中增加 i (因此您没有输入第二个 if 子句并且 i 没有增加)。在您编写的 for 循环中,i 在每次迭代中都会增加(即使 currentmin>=arraymin)。
  • 是的,确实注意到了..谢谢。
【解决方案2】:

我相信您会陷入无限循环,因为您没有在每次迭代时都设置电流值。

【讨论】:

  • 在 if-else 子句之后使用一般 i++ 语句。但是为什么它不早点使用单独的 i++ 增量工作呢?
猜你喜欢
  • 2019-12-10
  • 1970-01-01
  • 2020-06-18
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多