【问题标题】:Binary Search Recursion Algorithm Issue In CC中的二进制搜索递归算法问题
【发布时间】:2013-12-15 02:00:14
【问题描述】:

好的,所以我得到了这个功能

int bin(int value, int size, int array[])

我应该在“array[]”中找到“value”,但这里的问题是,在大多数情况下,我们有一些类似于

int bin(int value, int max, int min, int array[])

从逻辑上讲,这部分的递归要容易得多,因为我仍然可以传递我所在的数字,并记住数组的大小。

int bin(int array[], int value, int min, int max)
{
    if(max < min)
        return -1;
    else
    {
        int mid = min + (max - min)/2;

        if(array[mid] > value)
            return bin(array, value, min, mid-1);
        else if(array[mid] < value)
            return bin(array, value, mid+1, max);
        else
            return mid;
    }

但由于我只能传递 1 个整数,我该如何调整这个算法呢? 从本质上讲,我只能做这样的事情,但我知道这在逻辑上是行不通的。不过,有没有办法让我看到数组的大小?我试过了,但数字不正确。

   int bin(int array[], int value, int size)
    {
            int mid = size/2;

            if(array[mid] > value)
                return bin(array, value, size-(size/2));
            else if(array[mid] < value)
                return bin(array, value, size+(size/2));
            else
                return mid;
    }

【问题讨论】:

  • 请调整您的“家庭作业”等标签;你的限制听起来确实像那样。提示:在 C 中,数组实际上是指向底层数据类型的指针。因此,您可以将计算出的参数“数组”传递给函数。
  • @Adriaan:数组不是指针。数组就是数组。但是,您不能将数组作为函数参数传递,并且在这种情况下,数组会衰减为指向第一个元素的指针。不过,这不会改变数组的性质。

标签: c recursion binary-search


【解决方案1】:

您还需要显式传递基数:

int
bin(int array[], int value, int size)
{
        int mid = size/2;

        if(array[mid] > value)
            return bin(array, value, size/2);
        else if(array[mid] < value)
            return bin(&array[mid], value, size/2);
        else
            return mid;
}

注意“if(array[mid]

每次,您都需要搜索正确的一半数组,使用 base + offset 副最小/最大索引

【讨论】:

  • @erturne 不错;我的代码仍然没有解决所有问题(例如数组中的奇数/偶数元素),但基本思想就在那里
  • 是的。有效。谢谢!是的,在我教授的一些项目中,有时会有这些奇怪的限制。
  • @Ezrb3zr 这种对具有不同签名的方法的要求在递归中很常见。通常有一个公共方法,然后是一个私有辅助方法。我的回答中有更多关于它的信息。
  • @Ezrb3zr 嘿,你能接受/投票吗?说我解决了你的问题有点粗鲁,但就这样吧。
  • 不应接受错误的错误答案。在第一种情况下,新尺寸应该是 mid,在第二种情况下应该是 size - mid。
【解决方案2】:

使用具有不同参数集的方法的目的是使该方法易于为用户调用。这在递归中很常见。

具有
int bin(int value, int size, int array[]) 签名的用户可以使用公共方法。

然后应该有带有
int bin(int value, int max, int min, int array[]) 签名的私有内部辅助方法。

关键是,调用这个方法的人会想要传入数组的大小,而不是开始和结束索引(因为对他们来说,开始索引应该总是 0,结束应该总是 size-1)使用带有这样预设参数的方法是不好的做法。

具有开始值和结束值(最小值和最大值)的辅助方法用于递归调用以提高计算效率,它对用户隐藏了不必要的参数。

您的方法应该如下所示:

int bin(int value, int size, int array[]) {
    return bin(value, size - 1, 0, array);
}

【讨论】:

    【解决方案3】:
    int * binSearch (int *arr,int size, int num2Search)
    
    {
    
        if(size==1)
    
            return ((*arr==num2Search)?(arr):(NULL));
    
        if(*(arr+(size/2))<num2Search)
    
            return binSearch(arr+(size/2)+1,(size/2),num2Search);
    
        if(*(arr+(size/2))==num2Search)
    
            return (arr+(size/2));
    
        return binSearch(arr,(size/2),num2Search);
    
    }
    

    在我的函数中,你得到相同的参数并返回值的地址。

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 1970-01-01
      • 2021-04-28
      • 2022-08-02
      • 2021-12-15
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多