Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归以获得数组中的最大差异_Algorithm_Recursion - Fatal编程技术网

Algorithm 递归以获得数组中的最大差异

Algorithm 递归以获得数组中的最大差异,algorithm,recursion,Algorithm,Recursion,返回数组中的一对数字p和q。p必须出现在数组中的q之前,并且q-p必须是可能的最高值 A=[1,4,12,5,9,1,3,8] 返回值为p=1&q=12 有人提出了以下解决方案。 但是,我不确定在“第三种情况”中它应该返回什么,如下所示: 建议: 将A均匀地分成两个较小的数组A1、A2,然后(递归地)解决A1和A2上的问题。这能帮你找到一个最佳的选择吗?别忘了你可以使用额外的处理,成本高达O(n)。假设p,q是A的最佳对。p,q∈A1,或p,q∈A2,或者这两种情况都不正确。在第三种情况下,关于

返回数组中的一对数字p和q。p必须出现在数组中的q之前,并且q-p必须是可能的最高值

A=[1,4,12,5,9,1,3,8]

返回值为p=1&q=12

有人提出了以下解决方案。 但是,我不确定在“第三种情况”中它应该返回什么,如下所示:

建议:

将A均匀地分成两个较小的数组A1、A2,然后(递归地)解决A1和A2上的问题。这能帮你找到一个最佳的选择吗?别忘了你可以使用额外的处理,成本高达O(n)。假设p,q是A的最佳对。p,q∈A1,或p,q∈A2,或者这两种情况都不正确。在第三种情况下,关于p和q你能说些什么

下面是我的代码,它基本上划分数组,从上半部分得到最小值,从下半部分得到最大值。这个问题有0(n)个解决方案,但我对递归感兴趣,因为我正在学习递归。因此,请不要建议任何其他解决方案

    #define min_f(a, b) (a)>(b)?(b):(a)
    #define max_f(a, b) (a)>(b)?(a):(b)
    #define MAX 1 << 30
    #define MIN -1

    int get_min(int *a, int start, int end)
    {
            int t_min = MAX;
            while(start <= end) {
                    t_min = min_f(t_min, a[start]);
                    start++;
            }
            return t_min;
    }

    int get_max(int *a, int start, int end)
    {
            int t_max = MIN;
            while(start <= end) {
                    t_max = max_f(t_max, a[start]);
                    start++;
            }
            return t_max;
    }

    int foo(int *a, int start, int end)
    {
            int g_max = MIN;
            int min, max, i;

            for(i=0;i<=end;i++) {
                    min = get_min(a, start, i);
                    max = get_max(a, i+1, end);
                    if (max > min) {
                            g_max = max_f(g_max, max-min);
                    }
            }
            return g_max;
    }

    int main()
    {
            int a[] = {1,4,12,5,9,1,3,8};
            int size = sizeof(a)/sizeof(a[0]);
            printf("%d\n", foo(a, 0, size-1));
            return 0;
    }
定义最小值(a,b)(a)>(b)?(b):(a) #定义最大值f(a,b)(a)>(b)?(a):(b)
#定义MAX 1您的递归解决方案只不过是一个例子,您还可以通过查找了解分治的基本概念

现在,让我们以你为例

                 [1,4,12,5,9,1,3,8]
                       /\
                      /  \
                     /    \
            [1,4,12,5]    [9,1,3,8]
如果您确实阅读了上面的链接,或者您知道分治算法,您将理解我们递归地对左子数组和右子数组执行操作。下一步是,我们再次将每个部分分开。在这里,让我们只做上半部分,它将足以进入第三种情况,这是你一无所知

拿前一半,再把它分开

                  [1,4,12,5]
                     /\
                    /  \
                   /    \
              [1,4]      [12,5]
在分割数组的这一步中,您应该已经了解了第三种情况。答案p=1(左半部分)和q=12(右半部分)位于除法后的不同半部分


这是第三起案件。现在,我让您自行编写递归代码,并在代码中适当地处理第三种情况

可以先在递归函数中找到最大值,然后以相同的方式找到最小值。在你找到不同之处之后。我认为你不可能只靠一个功能就成功

 public static int diff(int[] arr)
    {
        int max=findMax(arr, 0, arr.Length - 1);
        int min=findMin(arr, 0, arr.Length - 1);

        return max-min;
    }

 private static int findMax(int[] arr, int index_begin, int index_end)
    {
        if (index_begin == index_end) return arr[index_begin];

        int m = (index_begin + index_end) / 2;

        return Math.Max(findMax(arr, index_begin, m), findMax(arr, m + 1, 
        index_end));
    }
 private static int findMin(int[] arr, int index_begin, int index_end)
    {
        if (index_begin == index_end) return arr[index_begin];

        int m = (index_begin + index_end) / 2;

        return Math.Min( findMin(arr, index_begin, m), findMin(arr, m + 1, 
        index_end));
    }

闻起来像家庭作业。@mikeb:你为什么这么认为?我真的不喜欢那些不提问、不假设的人。不,我不会删除它,因为即使它不是“家庭作业”,你也应该试着自己解决它,当你陷入困境时,来这里。你来这里是想找人帮你做,而不是至少努力。尝试一下解决方案,我不仅会删除-1,还会帮助您解决这个问题。如果这是一个太难的问题,也许您应该解决一些更简单的问题,比如一个取数字n并返回斐波那契(n)的函数。这是一个典型的递归问题,应该让你开始学习。我已经读了你写的东西。你们给我们苹果,让我们用它来做橘子。你甚至都没试过。我没有复制粘贴,哈哈。如果你至少不尝试做你想做的事情,没有人会为你写作业。到目前为止你试过什么?您的示例代码应该做您想要做的事情,但没有给您预期的结果,它在哪里?不要只是粘贴一些工作代码,而是让别人转换它。发布一些损坏的代码,并询问如何修复它的一些提示,然后您可能会得到一些帮助。@mikeb:这是我最后的评论,让您明白我不是在寻找代码,而是在寻找想法。我只想知道当p和q在细分数组中都不好时,第三种情况是什么。