数据结构 - 20行的Java代码多分支语句优化
PHPz
PHPz 2017-04-18 09:53:02
0
3
388
    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 のロジックはそれほど複雑ではありません。

いいねを押す +0
刘奇

PriorityQueue のソース コードを読むことをお勧めします。 siftUp() と siftDown() の 2 つの関数があります。1 つは要素をフローティングする関数で、もう 1 つは要素をシンクする関数です。ノードを削除した場合は、最後のノードを削除する必要があります。要素が削除された位置にノードが追加され、再び沈んで浮き上がります。

これは、数日前にデータ構造をレビューしていたときに何気なく書いたもので、テストされていませんが、メインのロジックは非常に正しいです

。 リーリー

いいねを押す +0
阿神

リーリー

ビジネス ロジック自体が存在するため、if ブランチを減らすことは実際には困難です。また、各ブランチのロジックはそれほど複雑ではなく、インターフェイスに抽象化する必要もありません。

を交換する
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート