【问题标题】:Time limit exceeded in binary search二分查找超出时间限制
【发布时间】:2015-04-18 15:50:12
【问题描述】:

我一直在开发一个使用二进制搜索来搜索元素的程序,但是每次运行该程序时,我都会收到超出时间限制的错误。虽然我搜索了这个错误但我无法找到这个程序中的错误是什么请帮助这里是代码

#include<stdio.h>
int BinarySearch(int low,int high,int *a,int item);
int main(){
  int a[50] , i , low , high , n , item , position;

  printf("Enter the number of Elements");
  scanf("%i",&n);
  for(i=0;i<n;i++){
    scanf("%i",&a[i]);
  }

  printf("Enter the Element to be searched");
  scanf("%i",&item);
  low=0;
  high=n-1;
  position=BinarySearch(low,high,a,item);

  if(position==-1)
    printf("Item not found");
  else
    printf("item was found on the %i position",position);

  return 0;
}
int BinarySearch(int low,int high,int *a,int item){
  int mid,loc,flag=0;
  while (item!= a[mid] && low <= high)
  {
    mid = (low + high) / 2;

    if(a[mid]==item){
      loc=mid;
      flag=flag+1;
    }
    else if (item < a[mid])
      high = mid - 1;
    else
      low = mid + 1;
  }
  if (flag>=1)
    return loc;
  else
    return -1;
}

【问题讨论】:

  • 你正在使用midBinarySearch()中未初始化

标签: c gcc


【解决方案1】:

您的方法似乎存在多个问题。

首先,删除while旁边的分号,就像现在一样,每次搜索的项目不在位置0时,你的while都是一个无限循环

这个:

while (item!= a[mid] && low <= high);

应该变成这样:

while (item!= a[mid] && low <= high)

完成后,请考虑以下事项:

二分搜索只能应用于排序集合。

阅读完所有数字后,您应该先对它们进行排序,然后再申请 你的算法。

编辑

另外,正如评论中提到的,您正试图在函数的开头将一些变量初始化为 0(零),但这并不完全正确:

这个:

int mid,loc,flag=0;

只会将flag初始化为零,midloc会未初始化,可能是垃圾。

相反,这样做:

int mid= (low + high) /2, loc=-1, flag=0;

通过将 loc 设置为 -1,您甚至可以通过去掉标志来改进您的代码:

int BinarySearch(int low,int high,int *a,int item)
{
  int mid= (low + high) /2, loc=-1;
  while (item!= a[mid] && low <= high)
  {
    if(a[mid]==item){
      loc=mid;
    }
    else if (item < a[mid])
      high = mid - 1; 
    else
      low = mid + 1;
  }
  return loc;
}

如您所见,flag已被完全消除,您无需再次设置mid

【讨论】:

  • 建议int mid = (low + high) / 2; 而不是int mid=0
  • 哦,对不起,我的错 :) 没注意
  • 我进行了编辑,包括对手头代码进行更广泛的重构。
【解决方案2】:
while (item!= a[mid] && low <= high);

去掉最后的分号:)

并且您的数组必须经过排序才能使二进制搜索起作用

【讨论】:

    猜你喜欢
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多