【发布时间】: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
标签: java algorithm recursion divide-and-conquer