Сообщение Re: Посоветуйте структуру данных от 03.01.2017 4:32
Изменено 03.01.2017 14:05 VladD2
Re: Посоветуйте структуру данных
Здравствуйте, SergASh, Вы писали:
SAS>Например, словарь такой:
SAS>
SAS>Подаем на вход [10, 30], получаем
SAS>
у нас в Nitra
При этом поиск тупым обходом такого дерева получается очень эффективным. Мы просто проверяем пересекается ли позиция с диапазоном и входим в эту ветку, если пересекается. Далее проделываем тоже самое рекурсивно пока не находим самую листовую ветку.
Не знаю особенностей ваших данных, но думаю, что их так же можно как-то упорядочить и сделать из них дерево в котором простой обход в глубину даст эффективное решение.
Если диапазоны не строго вложены (как с позициями у нас) можно ввести фиктивные узлы хранящие пересекающиеся подузлы. Твой вариант можно представить так:
Здесь отступ описывает вложенность узлов.
Теперь поиск выливается в банальный перебор корневых веток с заходом в те подветки которые пересекаются с искомым диапазоном.
За счет сортировки вложенных веток можно получить с логарифмической сложностью.
Кода будет не мало, но за часа 3 он пишется без проблем.
SAS>Например, словарь такой:
SAS>
SAS>[ 5, 15] -> Царь
SAS>[35, 50] -> Медведь
SAS>[25, 40] -> Чурка
SAS>SAS>Подаем на вход [10, 30], получаем
SAS>
SAS>[ 5, 15] -> Царь
SAS>[25, 40] -> Чурка
SAS>у нас в Nitra
Автор: VladD2
Дата: 18.12.15
похожим образом хранятся позиции в тексте. Для каждого элемента дерева разбора (или АСТ) хранится позиция его начала и позиция его конца. Так как дерево разбора и АСТ получаются по исходникам, то выдерживается правило, что диапазоны не пересекаются, а более мелкие диапазоны вложены в более крупные. Дата: 18.12.15
При этом поиск тупым обходом такого дерева получается очень эффективным. Мы просто проверяем пересекается ли позиция с диапазоном и входим в эту ветку, если пересекается. Далее проделываем тоже самое рекурсивно пока не находим самую листовую ветку.
Не знаю особенностей ваших данных, но думаю, что их так же можно как-то упорядочить и сделать из них дерево в котором простой обход в глубину даст эффективное решение.
Если диапазоны не строго вложены (как с позициями у нас) можно ввести фиктивные узлы хранящие пересекающиеся подузлы. Твой вариант можно представить так:
[ 5, 15] -> Царь
[25, 50]
[25, 40] -> Чурка
[35, 50] -> МедведьЗдесь отступ описывает вложенность узлов.
Теперь поиск выливается в банальный перебор корневых веток с заходом в те подветки которые пересекаются с искомым диапазоном.
За счет сортировки вложенных веток можно получить с логарифмической сложностью.
Кода будет не мало, но за часа 3 он пишется без проблем.
Re: Посоветуйте структуру данных
Здравствуйте, SergASh, Вы писали:
SAS>Например, словарь такой:
SAS>
SAS>Подаем на вход [10, 30], получаем
SAS>
у нас в Nitra
При этом поиск тупым обходом такого дерева получается очень эффективным. Мы просто проверяем пересекается ли позиция с диапазоном и входим в эту ветку, если пересекается. Далее проделываем тоже самое рекурсивно пока не находим самую листовую ветку.
Не знаю особенностей ваших данных, но думаю, что их так же можно как-то упорядочить и сделать из них дерево в котором простой обход в глубину даст эффективное решение.
Если диапазоны не строго вложены (как с позициями у нас) можно ввести фиктивные узлы хранящие пересекающиеся подузлы. Твой вариант можно представить так:
Здесь отступ описывает вложенность узлов.
Теперь поиск выливается в банальный перебор корневых веток с заходом в те подветки которые пересекаются с искомым диапазоном.
За счет сортировки вложенных веток можно получить логарифмическую сложность.
Кода будет не мало, но часа за 3 он пишется без проблем.
SAS>Например, словарь такой:
SAS>
SAS>[ 5, 15] -> Царь
SAS>[35, 50] -> Медведь
SAS>[25, 40] -> Чурка
SAS>SAS>Подаем на вход [10, 30], получаем
SAS>
SAS>[ 5, 15] -> Царь
SAS>[25, 40] -> Чурка
SAS>у нас в Nitra
Автор: VladD2
Дата: 18.12.15
похожим образом хранятся позиции в тексте. Для каждого элемента дерева разбора (или АСТ) хранится позиция его начала и позиция его конца. Так как дерево разбора и АСТ получаются по исходникам, то выдерживается правило, что диапазоны не пересекаются, а более мелкие диапазоны вложены в более крупные. Дата: 18.12.15
При этом поиск тупым обходом такого дерева получается очень эффективным. Мы просто проверяем пересекается ли позиция с диапазоном и входим в эту ветку, если пересекается. Далее проделываем тоже самое рекурсивно пока не находим самую листовую ветку.
Не знаю особенностей ваших данных, но думаю, что их так же можно как-то упорядочить и сделать из них дерево в котором простой обход в глубину даст эффективное решение.
Если диапазоны не строго вложены (как с позициями у нас) можно ввести фиктивные узлы хранящие пересекающиеся подузлы. Твой вариант можно представить так:
[ 5, 15] -> Царь
[25, 50]
[25, 40] -> Чурка
[35, 50] -> МедведьЗдесь отступ описывает вложенность узлов.
Теперь поиск выливается в банальный перебор корневых веток с заходом в те подветки которые пересекаются с искомым диапазоном.
За счет сортировки вложенных веток можно получить логарифмическую сложность.
Кода будет не мало, но часа за 3 он пишется без проблем.