Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance_Approximation_Subset Sum - Fatal编程技术网

Algorithm 带修正的子集和算法

Algorithm 带修正的子集和算法,algorithm,performance,approximation,subset-sum,Algorithm,Performance,Approximation,Subset Sum,给定一个正整数数组和一个上限MAX,我必须找到sum的子序列,你可以找到数组()中所有可能的子序列,其和小于或等于MAX,然后你可以对所有得到的和进行排序,然后相应地你可以找到小于或等于MAX的和。 如果您想要序列,那么再次使用这个新的和,并检查子序列的总和达到该和 您也可以使用一些优化 1.无论何时,只要找到某个sum=MAX,就直接返回答案。 2.您不需要对获得的总和列表进行排序(对此不确定,但我认为结果将按排序顺序排列,您可以自己查看) 总体复杂性为O(nlogn)。我在这里解释我的方法,

给定一个正整数数组和一个上限MAX,我必须找到sum的子序列,你可以找到数组()中所有可能的子序列,其和小于或等于MAX,然后你可以对所有得到的和进行排序,然后相应地你可以找到小于或等于MAX的和。 如果您想要序列,那么再次使用这个新的和,并检查子序列的总和达到该和

您也可以使用一些优化 1.无论何时,只要找到某个sum=MAX,就直接返回答案。 2.您不需要对获得的总和列表进行排序(对此不确定,但我认为结果将按排序顺序排列,您可以自己查看)


总体复杂性为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-最长递增子序列。你如何将两者联系起来?你可以使用逻辑来找到不同的子序列和,这就是我建议它的原因。