无限运行时间

Infinite run time

本文关键字:运行时间 无限      更新时间:2023-10-16

对于 Ubuntu 16.04 中的以下代码

对于自定义测试用例

4 3

1 2 3 7

我的运行时是无限的,没有输出。(无输出意味着"a"也不会打印在控制台上(。但是当我评论函数调用 foo

// int temp = foo(ab, 0, n-1);

我得到输出

A##

无限运行时间和没有输出的原因是什么?

#include<bits/stdc++.h>
using namespace std;
int a[1000000];
int foo(int x, int f, int l)
{
int m = (f+l)/2;
while(f<=l)
{
if(a[m]==x)
return 1;
else if(a[m]<x)
f = m+1;
else if(a[m]>x)
l = m-1;
}
return 0;
}
int main()
{
int n, x;
cin >> n;
cin >> x;
int i=0;
for (i = 0; i < n; i++)
{
cin >> a[i];
}
cout<<'a';
sort(a,a+n);
for(i=0; i<n-1; i++)
{
if(a[i]==a[i+1])
{
cout << 0;
return 0;
}
}
cout<<'#';
int ab = a[i];
int temp = foo(ab, 0, n-1);
cout<<'#';
return 0;
}

你没有得到任何输出(甚至没有'a'(的原因是stdout被缓冲了。通常它是行缓冲的,这意味着只有在写入新行时才会打印它。

您可以通过执行std::cout << std::flush;来强制缓冲区中的任何内容立即打印出来,或者例如在您的情况下,std::cout << 'a' << std::flush;会起作用。

无限循环的原因是您的f值和l值最多更新一次。 最初m指向数组的中间(即(n-1)/2(,从那一刻起,
如果元素a[m]小于x,则无限分配m+1(n-1)/2 + 1f
-如果元素a[m]大于x,则无限(n-1)/2 - 1分配给l

在任何一种情况下,f永远不会大于l并且l永远不会小于f(除非数组具有单个元素或具有两个元素并且x<a[0](

尝试按以下方式更新函数:

int foo(int x, int f, int l)
{
int m = (f+l)/2;
while(f<=l)
{
if(a[m]==x)
return 1;
else if(a[m]<x)
{ 
f = m+1; m = f; 
}
else if(a[m]>x)  
{
l = m-1; m = l;
}
}
return 0;
}