Почему Патриция пытается использовать обратные ссылки в некоторых узлах, и какова логика этого? - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь реализовать свою собственную библиотеку Patricia Trie для целей обучения, поэтому я застрял при добавлении некоторых узлов, потому что каждый полученный мной пример имеет эти странные обратные ссылки, которые не имеют смысла для меня. Какой смысл в этих ссылках? Какая логика стоит за этим?

Я видел десятки видео, газет (включая оригинальную статью Эдварда Фредкина), книги (Дроздек, Чепмен, Кормен и другие) и презентации, и я не могу понять.

Вот процедуры вставки, которые я сделал, не обращая внимания на последние комментарии, я пытался научить себя и потерпел неудачу.

    public void insert(int value) {
        int numOfBits = (int) (Math.log(value) / Math.log(2)) + 1;
        if (numOfBits > MaxBits) {
            System.out.println("Error : Number too large");
            return;
        }

        root = insert(this.root, value);
    }



    private PatriciaNode insert(PatriciaNode node, int value) {

        int differingBitNumber;
        String binaryValue, binaryLastNodeValue;
        PatriciaNode newNodeGrandma, newNodeParent, lastNode, newNode;

        // Tree is empty create the first item
        if (node == null) {
            node = new PatriciaNode();

            node.bitNumber = 0;
            node.data = value;
            node.leftChild = node;
            node.rightChild = null;

            return node;
        }

        // Checks if there is already a node with this value
        lastNode = search(node, value);
        if (value == lastNode.data) {
            System.out.println("Error : key is already present\n");
            return node;
        }

        // There is no value like this stored!!!
        // translate values in to the binary
        // representations for comparisons
        binaryValue = toBinary(value);
        binaryLastNodeValue = toBinary(lastNode.data);

        // find the first differing bit beetween the binary representations
        differingBitNumber = 1;
        while (isBit1At(binaryValue, differingBitNumber) == isBit1At(binaryLastNodeValue, differingBitNumber)) {
            differingBitNumber++;
        }

        // going down in the tree in order to find a spot to insert the new node
        newNodeParent = node;
        newNodeGrandma = node.leftChild; // I known it makes no sense, but after the loop will
        while (newNodeGrandma.bitNumber > newNodeParent.bitNumber && newNodeGrandma.bitNumber < differingBitNumber) {
            newNodeParent = newNodeGrandma;

            // deciding if we should go to the left or to ther right
            // bit 1 to right, bit 0 to left
            newNodeGrandma = isBit1At(binaryValue, newNodeGrandma.bitNumber) ? newNodeGrandma.rightChild : newNodeGrandma.leftChild;
        }

        // spot has been found!!
        // creating the node
        newNode = new PatriciaNode();
        newNode.bitNumber = differingBitNumber;
        newNode.data = value;

        // Doing some circular references, it will be used when we search at tree
        // when bitNumberCurrent < bitnumberParent we known we reach the bottom of
        // the tree

        // my grandma is less than me? Put it on the left otherwise put it on the right
        newNode.leftChild = isBit1At(binaryValue, differingBitNumber) ? newNodeGrandma : newNode;

        // my grandma is bigger than me? Put it on right otherwise put it on the left
        newNode.rightChild = isBit1At(binaryValue, differingBitNumber) ? newNode : newNodeGrandma;

        // when using patricia trees the children points
        // backwards to grandmas informing if its grandmas
        // has bigger or lowers values, when a node has
        // a child it must "forget" about your own grandmas
        // and points to your new children
        if (newNodeGrandma == newNodeParent.leftChild) {
            newNodeParent.leftChild = newNode;
        } else {
            newNodeParent.rightChild = newNode;
        }

        return node;
    }

Итак, код работает, но я не могу понять, почему и как.

...