Algorithm 带修正的子集和算法
给定一个正整数数组和一个上限MAX,我必须找到sum的子序列,你可以找到数组()中所有可能的子序列,其和小于或等于MAX,然后你可以对所有得到的和进行排序,然后相应地你可以找到小于或等于MAX的和。 如果您想要序列,那么再次使用这个新的和,并检查子序列的总和达到该和 您也可以使用一些优化 1.无论何时,只要找到某个sum=MAX,就直接返回答案。 2.您不需要对获得的总和列表进行排序(对此不确定,但我认为结果将按排序顺序排列,您可以自己查看)Algorithm 带修正的子集和算法,algorithm,performance,approximation,subset-sum,Algorithm,Performance,Approximation,Subset Sum,给定一个正整数数组和一个上限MAX,我必须找到sum的子序列,你可以找到数组()中所有可能的子序列,其和小于或等于MAX,然后你可以对所有得到的和进行排序,然后相应地你可以找到小于或等于MAX的和。 如果您想要序列,那么再次使用这个新的和,并检查子序列的总和达到该和 您也可以使用一些优化 1.无论何时,只要找到某个sum=MAX,就直接返回答案。 2.您不需要对获得的总和列表进行排序(对此不确定,但我认为结果将按排序顺序排列,您可以自己查看) 总体复杂性为O(nlogn)。我在这里解释我的方法,
总体复杂性为O(nlogn)。我在这里解释我的方法,以便其他人可以改进以下算法。
所需概念-A.V.L.树(AVL树是高度平衡的BST)
算法:-
For all elements in A
{
if(A[i]=MAX) add to the subsets.
if(A[i]>MAX) skip the element, Its not part of any subset.
if(A[i]<MAX) insert in AVL Tree
}
REMAINING <-- MAX
CURRENT_SET <-- NULL
while(TREE IS NOT EMPTY)
{
TEMP <-- Maximum element in tree which is less than REMAINING (Using Search in AVL Tree)
if(TEMP IS NULL)
{
CURRENT_SET is added to the set of subsets
}
else
{
REMAINING <-- REMAINING - TEMP
CURRENT_SET <-- CURRENT_SET + TEMP
Delete TEMP from the AVL TREE
}
}
用于一个文件中的所有元素
{
如果(A[i]=MAX)添加到子集。
如果(A[i]>MAX)跳过该元素,则该元素不属于任何子集。
如果(A[i]条目是否允许为负数?子数组是否必须是连续的?不,没有负数,也不必是连续的。对不起,这是一个子序列而不是子数组。这是一个不清楚的问题。如果您没有客观的方法来评估解决方案,则不可能提供有用的答案。因此,它只是一个子序列那么?什么是可接受的精度?95%,99%,等等?我不认为复杂性是O(n logn)。你说的是“在数组中找到所有可能的子序列(动态规划解),其和小于或等于最大值”。你参考哪种方法,其复杂性是什么?我糟糕的动态规划需要O(n^2)虽然我找到了一个O(nlogn)解,你可以看到这个。只要看看这个解,我想这是一个完全不同的问题。它是LIS-最长递增子序列。你如何将两者联系起来?你可以使用逻辑来找到不同的子序列和,这就是我建议它的原因。