数据结构 - 20行的Java代码多分支语句优化
PHPz
PHPz 2017-04-18 09:53:02
0
3
380
    public void delete(int pos) {
        Heap[pos] = Heap[size];
        size--;
        int current = pos;
        while (hasLeaf(current)) {
            if (hasDoubleLeaf(current)
                    && Heap[current] > Math.min(Heap[leftChild(current)],
                            Heap[rightChild(current)])) {

                if (Heap[leftChild(current)] < Heap[rightChild(current)]) {
                    swap(leftChild(current), current);
                    current = leftChild(current);
                } else {
                    swap(rightChild(current), current);
                    current = rightChild(current);
                }
            } else if (Heap[current] > Heap[leftChild(current)]) {
                swap(current, leftChild(current));
                current = leftChild(current);
            } else{
                break;
            }
        }
    }

写了一个最小heap,这是其中删除节点函数,丑的要死,可读性太差。希望可以把代码多分支语句优化。
分支结构有两种情况,该节点有左子树或左右子树都有。
需求是和值较小的子树进行交换。

PHPz
PHPz

学习是最好的投资!

모든 응답(3)
Ty80

재귀적 형식으로 작성하는 것이 좋습니다. Python과 유사한 코드를 사용하여 설명하겠습니다.

으아아아

get_min의 논리는 그다지 복잡하지 않습니다.

刘奇

PriorityQueue의 소스 코드를 읽어보는 것이 좋습니다. siftUp()과 siftDown() 함수가 있는데, 하나는 요소를 띄우는 것이고, 다른 하나는 요소를 삭제하는 것입니다. 노드가 있으면 마지막 노드를 삭제해야 합니다. 노드는 삭제된 요소의 위치에 추가된 다음 가라앉았다가 다시 떠오릅니다.

이것은 며칠 전 데이터 구조를 검토할 때 우연히 작성된 것입니다. 테스트되지는 않았지만 주요 논리는 꽤 정확합니다

으아악
阿神

으아악

비즈니스 로직 자체가 있기 때문에 if 브랜치를 줄이는 것이 실제로 어렵습니다. 게다가 각 브랜치의 로직은 그다지 복잡하지 않으며, 인터페이스로 추상화할 필요도 없습니다. 교환하다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿