【问题标题】:Recursive unsorted array search algorithm in C?C中的递归未排序数组搜索算法?
【发布时间】: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


【解决方案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】:

    我认为您的问题的答案是否定的,如果数据未排序,则使用二进制拆分方法无法获得任何好处。

    【讨论】:

    • 具体来说,如果数据未排序,则存在 no 算法可以让您在少于 O(n) 的时间内找到给定元素的位置。
    • @interjay:问题是“有什么办法可以使这项工作吗?”,答案是“否”
    • 实际上,如果您的搜索是多线程的,您可以通过二进制范围拆分来获得好处。与增加的复杂性相比,您在简单的“int”相等搜索中获得多少是另一回事。使用比 OP 更复杂的搜索条件(例如在其中找到一个素数),它可以为您带来真正的好处。
    【解决方案3】:

    如果数据没有排序,则不能使用二分查找。 但是分治法可以与以下递归逻辑(线性搜索)一起使用:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多