Java需要帮助实现一个算法

Java需要帮助实现一个算法,java,algorithm,recursion,dynamic-programming,Java,Algorithm,Recursion,Dynamic Programming,对于我的基本编程技能来说是如此先进,以至于我不知道如何实现它。我在一个新问题中发布了这一点,因为我不能在上一个问题的评论部分继续打扰那个单独给我算法的人 MaxSet(node) = 1 if "node" is a leaf MaxSet(node) = Max(1 + Sum{ i=0..3: MaxSet(node.Grandchildren[i]) }, Sum{ i=0..1: MaxSet(node.Children[i])

对于我的基本编程技能来说是如此先进,以至于我不知道如何实现它。我在一个新问题中发布了这一点,因为我不能在上一个问题的评论部分继续打扰那个单独给我算法的人

MaxSet(node) = 1 if "node" is a leaf
MaxSet(node) = Max(1 + Sum{ i=0..3: MaxSet(node.Grandchildren[i]) },  
                       Sum{ i=0..1: MaxSet(node.Children[i])      })
谢谢你的算法

这里的问题是如何实现两条求和线的部分,我该怎么做?我需要标记这个算法选择的每个节点。它只是节点类中设置为true的“标记”变量。我不明白它是否也做出了选择节点的决定

编辑以包含迄今为止的代码:

public int maxSet(Posisjon<E> bt){
        if (isExternal(bt)){
            return 1; 
        }
        return Math.max(1 + helper1(bt), helper2(bt));
    }

private int helper1(Posisjon<E> node){
    int tmp = 0; 
    if (hasLeft(node)){
        if(hasLeft((Position<E>)node.leftChild())){
            tmp += maxSet(node.leftChild().leftChild());
        }
        if(hasRight((Position<E>)node.leftChild())){
            tmp += maxSet(node.leftChild().rightChild());
        }
    }
    if(hasRight(node)){
        if(hasLeft((Position<E>)node.rightChild())){
            tmp += maxSet(node.leftChild().leftChild());
        }
        if(hasRight((Position<E>)node.rightChild())){
            tmp += maxSet(node.leftChild().rightChild());
        }
    }
    return tmp; 
}
private int helper2(Posisjon<E> node){
    int tmp = 0; 
    if(hasLeft(node)){
        tmp +=maxSet(node.leftChild());
    }
    if(hasRight(node)){
        tmp +=maxSet(node.rightChild());
    }
    return tmp; 
}
public int-maxSet(Posisjon-bt){
如果(isExternal(bt)){
返回1;
}
返回Math.max(1+helper1(bt),helper2(bt));
}
私有int helper1(Posisjon节点){
int-tmp=0;
if(hasleet(节点)){
if(hasleet((Position)node.leftChild()){
tmp+=maxSet(node.leftChild().leftChild());
}
if(hasRight((Position)node.leftChild()){
tmp+=maxSet(node.leftChild().righchild());
}
}
if(hasRight(node)){
if(hasleet((Position)node.rightChild()){
tmp+=maxSet(node.leftChild().leftChild());
}
if(hasRight((Position)node.rightChild()){
tmp+=maxSet(node.leftChild().righchild());
}
}
返回tmp;
}
私有int helper2(Posisjon节点){
int-tmp=0;
if(hasleet(节点)){
tmp+=maxSet(node.leftChild());
}
if(hasRight(node)){
tmp+=maxSet(node.rightChild());
}
返回tmp;
}
这似乎在起作用,现在剩下的是什么。是否实际将节点标记为已选择?我会那样做吗


更新代码:

public ArrayList<Posisjon<E>> getSelectionSet(Posisjon<E> bt, ArrayList<Posisjon<E>> s){
        if(bt.marked){
            s.add(bt);
        }
        if(hasLeft(bt)){
            if(hasLeft(bt.leftChild())){
                getSelectionSet(bt.leftChild().leftChild(),s);
            }
            if(hasRight(bt.leftChild())){
                getSelectionSet(bt.leftChild().rightChild(),s);
            }
        }
        if(hasRight(bt)){
            if(hasLeft(bt.rightChild())){
                getSelectionSet(bt.rightChild().leftChild(),s);
            }
            if(hasRight(bt.rightChild())){
                getSelectionSet(bt.rightChild().rightChild(),s);
            }
        }
        return s; 
    }

public int maxSet(Posisjon<E> bt){
        if (bt.visited){
            return bt.computedMax; 
        }
        bt.visited = true; 
        int maxIfCurrentNodeIsSelected = 1 + helper1(bt);
        int maxIfCurrentNodeIsNotSelected = helper2(bt);
        if (maxIfCurrentNodeIsSelected > maxIfCurrentNodeIsNotSelected){
            bt.marked = true; 
            bt.computedMax = maxIfCurrentNodeIsSelected; 
        }else{
            bt.marked = false; 
            bt.computedMax = maxIfCurrentNodeIsNotSelected; 
        }
        return maxSet(bt);
    }
public ArrayList getSelectionSet(Posisjon bt,ArrayList s){
如果(bt标记){
s、 添加(bt);
}
如果(已离开(bt)){
if(hasleet(bt.leftChild())){
getSelectionSet(bt.leftChild().leftChild(),s);
}
if(hasRight(bt.leftChild()){
getSelectionSet(bt.leftChild().rightChild(),s);
}
}
如果(拥有权利(bt)){
if(hasleet(bt.rightChild()){
getSelectionSet(bt.rightChild().leftChild(),s);
}
if(hasRight(bt.rightChild()){
getSelectionSet(bt.rightChild().rightChild(),s);
}
}
返回s;
}
公共整数最大集(Posisjon bt){
如果(英国电信访问){
返回bt.computedMax;
}
bt.visted=true;
int maxIfCurrentNodeIsSelected=1+helper1(bt);
int maxIfCurrentNodeIsNotSelected=helper2(bt);
如果(MaxIfCurrentNodesSelected>MaxIfCurrentNodesNotSelected){
bt.marked=true;
bt.computedMax=maxIfCurrentNodeIsSelected;
}否则{
bt.marked=false;
bt.computedMax=MaxIfCurrentNodesNotSelected;
}
返回最大值集(bt);
}

提交后,我将张贴这个完整的代码

您当前拥有的功能不会每次都记录函数的返回值。每次调用
maxSet
,都应该检查是否已经计算了结果。如果你有,就把它还给我。如果你还没有计算它并把它存储在某个地方。否则,您的算法将效率低下。(这种方法称为“动态规划”。了解它。)

//伪代码:
公共整数最大集(Posisjon bt){
如果(访问[bt])
返回计算最大值[bt];
访问[bt]=真;
//您不需要手动检查是否为叶子
//对于叶,“maxIfCurrentNodeIsSelected”始终较大。
int maxIfCurrentNodeIsSelected=1+helper1(bt);
int maxIfCurrentNodeIsNotSelected=helper2(bt);
如果(MaxIfCurrentNodesSelected>MaxIfCurrentNodesNotSelected){
应选择[bt]=true;
computedMax[bt]=MaxIfCurrentNodesSelected;
}否则{
应选择[bt]=false;
computedMax[bt]=MaxIfCurrentNodesNotSelected;
}
}
公共集合getSelectionSet(Posisjon bt,集合s){
如果(应选择[bt]){
s、 添加(bt);
//当然,您应该检查空值
getSelectionSet(bt.leftChild.leftChild,s);
getSelectionSet(bt.leftChild.rightChild,s);
getSelectionSet(bt.rightChild.leftChild,s);
getSelectionSet(bt.rightChild.rightChild,s);
}否则{
getSelectionSet(bt.leftChild,s);
getSelectionSet(bt.rightChild,s);
}
返回s;
}

调用
getSelectionSet
,在调用
maxSet

之后,以根节点和空的
Set
作为参数调用
。我认为如果你发布你自己尝试过的代码,并提出一个具体的问题,你会得到更好的回复。如果这对我没有帮助,我会清理我的代码,稍后再发布。我只使用了两个辅助函数作为求和函数。它们很大,因为我还必须检查节点是否为空。关于如何存储集合的部分,我会将节点标记为choosen吗?你可以在伪算法中指出它。到目前为止用我的代码更新了。它似乎可以计算最大值并返回整数。仅在包含三个元素的树上进行测试。我会把节点标记为选中的吗?好的,我现在已经开始工作了。但是当根元素应该被添加到集合中时,却没有添加根元素。问题一定在maxSet中,因为我发现根元素没有被选中。正在参观。这是怎么来的?maxSet返回正确的金额。data\u jepp:你确定吗?请注意,结果不是唯一的。对于树2(1(4)(5)(3)),maxSet返回3,元素4和5。如果maxSet返回3,那么根2也将是其中的一部分?这是现在的代码数据_-jepp:我不知道
// pseudocode:
public int maxSet(Posisjon<E> bt){
    if (visited[bt])
        return computedMax[bt];

    visited[bt] = true;        

    // You don't need to manually check for being a leaf
    // For leaves 'maxIfCurrentNodeIsSelected' is always larger.
    int maxIfCurrentNodeIsSelected = 1 + helper1(bt);
    int maxIfCurrentNodeIsNotSelected = helper2(bt);

    if (maxIfCurrentNodeIsSelected > maxIfCurrentNodeIsNotSelected) {
         shouldSelect[bt] = true;
         computedMax[bt] = maxIfCurrentNodeIsSelected;
    } else {
         shouldSelect[bt] = false;
         computedMax[bt] = maxIfCurrentNodeIsNotSelected;
    }
}

public Set getSelectionSet(Posisjon<E> bt, Set s) {
    if (shouldSelect[bt]) {
        s.Add(bt);

        // You should check for nulls, of course
        getSelectionSet(bt.leftChild.leftChild, s);
        getSelectionSet(bt.leftChild.rightChild, s);
        getSelectionSet(bt.rightChild.leftChild, s);
        getSelectionSet(bt.rightChild.rightChild, s);
    } else {
        getSelectionSet(bt.leftChild, s);
        getSelectionSet(bt.rightChild, s);
    }
    return s;
}