31337Ghost
Новичок
Nested Sets, формирование дерева в массиве
Вопрос такой, голову уже сломал. Лезут какие-то лохматые алгоритмы в голову, в принципе теоретически, которые должны работать, но вот на счет их рациональности и возможных дальнейших глюков - хз.
Это была преамбула - теперь к делу:
Есть массив, в котором сформировано дерево, такого вида -
14(0)
[]17(1)
[][]20(2)
[][][]21(3)
[][][][]16(4)
[][]18(2)
[][][]9(3)
[][][][]13(4)
[][][][]10(4)
[][][][][]12(5)
[][][][][][]11(6)
[][][][][][][]15(7)
[][]22(2)
в массиве хранится id объекта и его уровень, основываясь на этих данных хочется завернуть данный массив в бд по Nested Sets.
Немного запутано объяснил, но все же - надо банально каждому элементу массива приписать left и right положение, т.е. пройтись по всему массиву и каждому элементу приписать недостающие (для таблицы Nested Sets) поля.
В голове крутится такое решение:
Идем по массиву с верху в низ и на каждом элементе увеличиваем счетчик, приписывая каждому пройденному элементу left. Проверяем попутно, если следующий элемент массива имеет level меньше levela текущего элемента, то начинаем шагать обратно (и запоминаем номер элемента на котором остановились - пусть будет X) опять же плюсуя счетчик и прописывая right элементу, мимо которого сейчас идем. Если дошли до элемента, level которого равен levelу элемента X+1 (X - запомненный ранее номер элемента с которого мы пошли "на верх", по структуре, прописывать right) - то вписываем текущему right и перескакиваем на X+1. И так далее пока не дойдем до самого низа.
При таком алгоритме, единственное, первые два элемента массива останутся без right'ов. На этот счет можно изначально считать скольким элементам прописали right, затем взять общее количество элементов массива, получить разницу - это у будет 2, т.е. первые два элемента и пройтись от этой разницы (2) до начала массива и так же вбить им right.
В общем вопрос - есть ли более рациональный способ, нежели тот, который я описал? И нет ли бага в данном алгоритме?
З.Ы. Перечитал эту ахинею, что написал, простите за полную кашу, но мозг уже не хочет придумывать другое описание моей проблемы.
Вопрос такой, голову уже сломал. Лезут какие-то лохматые алгоритмы в голову, в принципе теоретически, которые должны работать, но вот на счет их рациональности и возможных дальнейших глюков - хз.
Это была преамбула - теперь к делу:
Есть массив, в котором сформировано дерево, такого вида -
14(0)
[]17(1)
[][]20(2)
[][][]21(3)
[][][][]16(4)
[][]18(2)
[][][]9(3)
[][][][]13(4)
[][][][]10(4)
[][][][][]12(5)
[][][][][][]11(6)
[][][][][][][]15(7)
[][]22(2)
в массиве хранится id объекта и его уровень, основываясь на этих данных хочется завернуть данный массив в бд по Nested Sets.
Немного запутано объяснил, но все же - надо банально каждому элементу массива приписать left и right положение, т.е. пройтись по всему массиву и каждому элементу приписать недостающие (для таблицы Nested Sets) поля.
В голове крутится такое решение:
Идем по массиву с верху в низ и на каждом элементе увеличиваем счетчик, приписывая каждому пройденному элементу left. Проверяем попутно, если следующий элемент массива имеет level меньше levela текущего элемента, то начинаем шагать обратно (и запоминаем номер элемента на котором остановились - пусть будет X) опять же плюсуя счетчик и прописывая right элементу, мимо которого сейчас идем. Если дошли до элемента, level которого равен levelу элемента X+1 (X - запомненный ранее номер элемента с которого мы пошли "на верх", по структуре, прописывать right) - то вписываем текущему right и перескакиваем на X+1. И так далее пока не дойдем до самого низа.
При таком алгоритме, единственное, первые два элемента массива останутся без right'ов. На этот счет можно изначально считать скольким элементам прописали right, затем взять общее количество элементов массива, получить разницу - это у будет 2, т.е. первые два элемента и пройтись от этой разницы (2) до начала массива и так же вбить им right.
В общем вопрос - есть ли более рациональный способ, нежели тот, который я описал? И нет ли бага в данном алгоритме?
З.Ы. Перечитал эту ахинею, что написал, простите за полную кашу, но мозг уже не хочет придумывать другое описание моей проблемы.