假设我们想在C中编写一个函数,它在未排序的int数组中找到指定的目标值。通常,这很简单,并且在O(n)时间内运行:
int search(int *data, int len, int target)
{
int i;
for(i = 0; i < len; i++)
if(data[i]==target) return i;
return -1;
}
让我们说我们是受虐狂,并希望用分而治之的算法来解决这个问题。我们在递归部分会遇到麻烦,因为我们不能每次排除一半数组,就像我们可以使用二进制搜索一样:
int search(int *data, int start, int stop, int target)
{
// Base case: we've divided the array into two size subarray
if(stop==start+1)
{
if(data[start]==target) return start;
if(data[stop]==target) return stop;
return -1;
}
/* The recursion part is tricky.
We *need* to parse both halves of the array, because we can't safely
exclude any part of the array; it's not sorted, so we can't predict
which half it's going to be in.*/
else
{
/** This obviously doesn't work. */
int mid = (stop-start)/2;
return search(data, start, mid, target);
return search(data, mid+1, stop, target);
}
}
有没有办法让这项工作?
注意:这是不要求人们为我做作业,因为有些人在阅读这个问题时可能会想到。然而,在我试图解决本周早些时候提交的作业中的一个问题后,我遇到了这个问题,这是好奇心的启发。
答案 0 :(得分:1)
我认为你的问题的答案是否定的,如果数据未排序,你可以使用二进制拆分方法获得任何好处。
答案 1 :(得分:1)
如何将递归调用更改为:
else
{
int mid = (stop-start)/2;
int x = search(data, start, mid, target);
if (x == -1)
return search(data, mid+1, stop, target);
else
return x;
}
答案 2 :(得分:1)
如果数据未排序,则无法使用二进制搜索。 但是,分而治之可以与以下递归逻辑(线性搜索)一起使用:
int search(int *data, int len, int target)
{
if (len == 0)
return -1;
else if (data[0] == target);
return 0;
else
return 1 + search(++data, len-1, target);
}