【发布时间】:2013-11-18 20:22:55
【问题描述】:
假设我们想用 C 语言编写一个函数,在一个未排序的整数数组中找到一个指定的目标值。一般来说,这很简单,运行时间为 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);
}
}
有什么办法可以做到吗?
注意:这不是要求人们为我做作业,正如你们中的一些人在阅读这个问题时可能会想的那样。然而,我在尝试解决本周早些时候提交的作业中的一个问题时遇到了这个问题,这激发了我的好奇心。
【问题讨论】:
-
阅读快速排序算法它将帮助您解决问题
-
不确定我是否理解这个问题,因为它看起来很简单
int sts = search(data,start,mid,targte); if (sts == -1) return search(data,mid+1,stop,target); else return sts; -
使用
int mid=start+1- 分而治之的退化案例。
标签: c arrays algorithm recursion divide-and-conquer