検索

ホームページ  >  に質問  >  本文

数据结构 - 20行的Java代码多分支语句优化

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

PHPzPHPz2900日前397

全員に返信(3)返信します

  • PHP中文网

    PHP中文网2017-04-18 09:55:02

    再帰形式で記述することをお勧めします。Python のようなコードを使用して説明します。

    リーリー

    get_min のロジックはそれほど複雑ではありません。

    返事
    0
  • 怪我咯

    怪我咯2017-04-18 09:55:02

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

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

    。 リーリー

    返事
    0
  • 阿神

    阿神2017-04-18 09:55:02

    リーリー

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

    を交換する

    返事
    0
  • キャンセル返事