Необходимо найти следующий узел для вставки в двоичное дерево с меньшим использованием ресурсов и производительности. ⇐ Php
Необходимо найти следующий узел для вставки в двоичное дерево с меньшим использованием ресурсов и производительности.
Схема дерева базы данных
идентификатор узла размещение узлов nodeparentid 1 Слева NULL 2 Слева 1 3 Верно 1 4 Слева 2 5 Верно 2 6 Слева 3 7 Верно 3 8 Слева 4 9 Верно 4
Такое увеличение таблицы продолжается, когда пользователь отправляет древовидную форму.
Создали функцию для поиска следующего родительского узла по заданному значению узла с помощью метода BFS, теперь столкнулись с проблемой производительности, имея 200 тысяч строк при поиске 1, требуется больше ресурсов и производительности, потому что он проверяет каждый узел, поэтому оптимизирован код, извлекающий все строки из одного запроса и выполняющий логику на основе значения, это уменьшит взаимодействие с базой данных, но теперь все строки хранятся в памяти, когда больше пользователи находят следующий nodeparentid для каждого пользователя, все строки хранятся в памяти, поэтому возникает проблема, требующая оптимизации кода
текущее время выполнения — 80 секунд.
Я попробовал использовать приведенный ниже фрагмент кода для поиска следующего родительского узла для данного узла
публичная функция getNodeInsertPostionByParentId($parentIds) { $parent = array('status' => false); $результаты = массив(); // Извлекаем все данные из дерева $qry = "ВЫБРАТЬ nodeid, nodeposition, nodeparentid ИЗ дерева ORDER BY nodeposition"; $stmt = $this->mysqli->prepare($qry); $stmt->выполнить(); $stmt->bind_result($nodeid, $nodeposition, $nodeparentid); // Создаем карту для хранения дочерних элементов каждого родителя $ ChildrenMap = массив (); // Обработка результатов запроса while ($stmt->fetch()) { $childrenMap[$nodeparentid][] = array('id' => $nodeid, 'position' => $nodeposition); } // Используем BFS для обработки каждого родительского идентификатора $queue = $parentIds; while (!empty($queue)) { $currentParent = array_shift($queue); // Обрабатываем текущего родителя $children = isset($childrenMap[$currentParent]) ? $childrenMap[$currentParent]: массив(); $count = count($детей); если ($count == 2) { // Два дочерних элемента, рекурсивно проверяем каждого дочернего элемента foreach ($children как $child) { $queue[] = $child['id']; } } elseif ($count == 1) { // Один дочерний элемент, установите позицию «Справа» или «Слева» в зависимости от идентификатора дочернего элемента $parent['status'] = правда; $parent['parentId'] = $currentParent; $parent['node'] = 'Верно'; перерыв; } elseif ($count == 0) { // Нет дочерних элементов, установите позицию «Справа» или «Слева» на основе идентификатора текущего родителя $parent['status'] = правда; $parent['parentId'] = $currentParent; $parent['node'] = 'Слева'; перерыв; } } // Возвращаем обработанные результаты вернуть $родитель; } $ yourInstance = новое имя вашего класса (); эхо ''; print_r($yourInstance->getNodeInsertPostionByParentId(array('1'))); Как мы можем сократить время выполнения, используя меньше ресурсов.
Древовидное представление приведенных выше данных
1 / \ 2 3 / \ / \ 4 5 6 7 / \ / \ 8 9 10 [*]если найти 1, чтобы следующий узел вставил 5 прямо в качестве вывода. [*]если найти 6, чтобы следующий узел вставил 6 слева в качестве вывода. [*]если найти 3, чтобы следующий узел вставил 6, осталось в качестве вывода. [*]если найти 2, чтобы следующий узел вставил 5 прямо в качестве вывода.
любое предложение или код будут полезны
Схема дерева базы данных
идентификатор узла размещение узлов nodeparentid 1 Слева NULL 2 Слева 1 3 Верно 1 4 Слева 2 5 Верно 2 6 Слева 3 7 Верно 3 8 Слева 4 9 Верно 4
Такое увеличение таблицы продолжается, когда пользователь отправляет древовидную форму.
Создали функцию для поиска следующего родительского узла по заданному значению узла с помощью метода BFS, теперь столкнулись с проблемой производительности, имея 200 тысяч строк при поиске 1, требуется больше ресурсов и производительности, потому что он проверяет каждый узел, поэтому оптимизирован код, извлекающий все строки из одного запроса и выполняющий логику на основе значения, это уменьшит взаимодействие с базой данных, но теперь все строки хранятся в памяти, когда больше пользователи находят следующий nodeparentid для каждого пользователя, все строки хранятся в памяти, поэтому возникает проблема, требующая оптимизации кода
текущее время выполнения — 80 секунд.
Я попробовал использовать приведенный ниже фрагмент кода для поиска следующего родительского узла для данного узла
публичная функция getNodeInsertPostionByParentId($parentIds) { $parent = array('status' => false); $результаты = массив(); // Извлекаем все данные из дерева $qry = "ВЫБРАТЬ nodeid, nodeposition, nodeparentid ИЗ дерева ORDER BY nodeposition"; $stmt = $this->mysqli->prepare($qry); $stmt->выполнить(); $stmt->bind_result($nodeid, $nodeposition, $nodeparentid); // Создаем карту для хранения дочерних элементов каждого родителя $ ChildrenMap = массив (); // Обработка результатов запроса while ($stmt->fetch()) { $childrenMap[$nodeparentid][] = array('id' => $nodeid, 'position' => $nodeposition); } // Используем BFS для обработки каждого родительского идентификатора $queue = $parentIds; while (!empty($queue)) { $currentParent = array_shift($queue); // Обрабатываем текущего родителя $children = isset($childrenMap[$currentParent]) ? $childrenMap[$currentParent]: массив(); $count = count($детей); если ($count == 2) { // Два дочерних элемента, рекурсивно проверяем каждого дочернего элемента foreach ($children как $child) { $queue[] = $child['id']; } } elseif ($count == 1) { // Один дочерний элемент, установите позицию «Справа» или «Слева» в зависимости от идентификатора дочернего элемента $parent['status'] = правда; $parent['parentId'] = $currentParent; $parent['node'] = 'Верно'; перерыв; } elseif ($count == 0) { // Нет дочерних элементов, установите позицию «Справа» или «Слева» на основе идентификатора текущего родителя $parent['status'] = правда; $parent['parentId'] = $currentParent; $parent['node'] = 'Слева'; перерыв; } } // Возвращаем обработанные результаты вернуть $родитель; } $ yourInstance = новое имя вашего класса (); эхо ''; print_r($yourInstance->getNodeInsertPostionByParentId(array('1'))); Как мы можем сократить время выполнения, используя меньше ресурсов.
Древовидное представление приведенных выше данных
1 / \ 2 3 / \ / \ 4 5 6 7 / \ / \ 8 9 10 [*]если найти 1, чтобы следующий узел вставил 5 прямо в качестве вывода. [*]если найти 6, чтобы следующий узел вставил 6 слева в качестве вывода. [*]если найти 3, чтобы следующий узел вставил 6, осталось в качестве вывода. [*]если найти 2, чтобы следующий узел вставил 5 прямо в качестве вывода.
любое предложение или код будут полезны
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение