硬件递归分治算法

Posted

技术标签:

【中文标题】硬件递归分治算法【英文标题】:HW Recursive Divide and Conquer Algorithm 【发布时间】:2011-12-06 12:07:06 【问题描述】:

我在寻找解决问题的方法时遇到了一个非常大的问题。我必须创建一个递归的分治算法,该算法计算整数数组中元素的最长非递减子序列的长度。我有以下代码,但它并没有真正工作,任何帮助将不胜感激!!!

public class LongestSubSequence 

    public static int getPartition(int[] a, int p, int r)
    
        int mid = ((p+r)/2)-1;
        int q=0;
        int i = 1;
        int j= mid+i;
        int k = mid -i;

            while (a[mid]<=a[j] && j < r)
                
                    q = j;
                    i++;

                

                    while (a[mid] >=a [k] && k > p)
                
                    q = k;
                    i++;
                

        return q;
    

    public static int getCount (int[]a, int p, int r)
    
        int i = p;
        int j = p+1;
        int count = 0;
        while (i<r && j<r)
        
            if(a[i]<=a[j])
                count++;
            i++;
            j++;
        
        return count;
    

    public static int getLongestSubsequence (int[] a, int p, int r) 

        int count = 0;

        if (p<r)
        
            int q = getPartition (a, p, r);
            count = getCount(a,p,r);
            if (count < getLongestSubsequence(a,p,q))
                count = getLongestSubsequence(a, p, q);
            else if (count < getLongestSubsequence(a, q+1, p))
            
                count = getLongestSubsequence(a, q+1, p);
            

        


        return count;
        

     public static int LongestSubsequence (int[] a) 
            return getLongestSubsequence(a, 0, a.length);
            




    public static void main(String[] args) 
        int[] a = 1,3,5,9,2, 1, 3;
        System.out.println(LongestSubsequence(a));

    


【问题讨论】:

这对于您的需要来说有点广泛。我看到的第一个问题是 a 的初始长度是 7,所以 ((p+r)/2) 将是 3.5 你能定义“子序列”是什么意思吗?子序列的元素在父序列中必须是连续的吗? 他们给出的定义子序列的例子是:如果给定一个序列 1 2 3 4 3 2 1 最长的非递减子序列是 1 2 3 4 并且该方法应该返回 4。它的原因如此冗长(代码)是我不知道如何使它成为一个分而治之的递归问题。作为一个简单的循环,它非常容易。我知道 p+r/2 =3.5 但它会将其截断为 3 并且也可以。我认为... 如果我理解正确,函数计数有问题 - 它第一次调用 p==0 和 r==a.length,将返回比任何其他调用它更高的值其他参数 分区函数还有一个问题,你不能在循环中改变 j 和 k 的值,你给 i 赋值的事实并不意味着它无论如何都会影响 j 或k 【参考方案1】:

这是一个相当大的代码体,很难理解所有的 a、r、q 等。

一般来说,我会创建一个数组(称为longestSeq),其中longestSeq[i] 是迄今为止发现的从原始序列的索引i 开始的最长非递减序列的长度。例如,如果我有

  int[] sequence = new int[]  3, 5, 1, 2 

那么算法就会产生

  longestSeq[0] = 2;
  longestSeq[1] = 1;
  longestSeq[2] = 2;
  longestSeq[3] = 1;

因此,您可以将最长序列初始化为全 0,然后遍历您的列表并填写这些值。最后取longestSeq的最大值。

也许从尝试使其迭代工作(不使用递归)开始,然后在需要时添加递归。

【讨论】:

我知道这是一个没有递归和分而治之的邪恶简单问题。但是我们需要在其中实现这两种算法技术,这就是它如此令人沮丧的原因。 但是,通常从递归到动态编程,而不是相反。

以上是关于硬件递归分治算法的主要内容,如果未能解决你的问题,请参考以下文章

五大常见算法策略——递归与分治策略

算法分析之递归与分治策略

分治算法其实很有趣

递归分治策略

分治策略

算法:找到分治算法的递归方程