LINUX.ORG.RU

Есть ли такая структура данных?

 ,


1

1

Мне нужна такая структура данных, которая бы позволяла делать эффективно следующие две вещи. Эффективно в смысле, как минимум, со сложностью O(log n) относительно количества данных.

Первое. Это должна быть очередь с приоритетами, так чтобы я мог эффективно извлечь элемент с минимальным ключом. Для ключей есть отношение упорядоченности.

Второе. Эта структура должна позволять эффективно удалять заданный элемент по значению. Для определенности допустим, что существует отношение упорядоченности и для значений элементов, т.е. можно строить двоичные деревья со сравнением.

Сейчас есть хип (императивный или чистый функциональный - без разницы). На основе его легко строится эффективная очередь с приоритетами. Но вот, если вводить удаление полным перебором, то там сразу возникает сложность O(n), что совсем не комильфо.

Может быть, есть более эффективный способ? Что-то ничего умного в голову не лезет.

★★★★★

Ответ на: комментарий от zamazan4ik

что ТС имел в виду удаление ВСЕХ элементов с заданным значением за logN, что невозможно

Хм, я что-то не понимаю, ведь элементы с одинаковыми значениями будут складываться в одном узле дерева в вектор/массив. Тогда поиск узла log N, удаление за 1. Не?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

ну а как удалить все разные ключи, указывающие на 1 и тот же элемент за logN ?

zamazan4ik ★★
()
Ответ на: комментарий от zamazan4ik

А, понял, опять рассуждения про сферического коня. :)

CyberK
()
Ответ на: комментарий от zamazan4ik

Ок, я не так понял что по персистентностью имелось ввиду. Хранение индексов позволяет делать дешевые копии.

AIv ★★★★★
()
Ответ на: комментарий от qnikst

я не дорос до матеметика, я это.. экс-физик наверное.

Хорошо что я пока не экс - я все же считаю себя физииком, хотя окружающие наверное думают что я прикладной математик;-)

Ок, если под перси... вообщем этой хней понимать то, что ты говоришь, тогда нужно просто хранить структуру + историю изменений? Насчет асимптотических оценок (которые как правило к реальной производительности имеют отношение с большим числом оговорок) - зависит от использования истории, это уже к ТС-у зачем она ему нужна.

AIv ★★★★★
()
Ответ на: комментарий от zamazan4ik

офигеть, у этой штуки есть название :)

qnikst ★★★★★
()
Ответ на: комментарий от CyberK

Например, ключ — три 32-битных целых, значения — UTF-8 строка. Средняя длина строки — около 10 байт, возможны и длинные, около 200. Число элементов — порядка десятка тысяч. Процессор — Sandy Bridge, кеши L1/L2/L3 на ядро — 64/256/1024 КБ.

Предложения?

i-rinat ★★★★★
()

Первое. Это должна быть очередь с приоритетами, так чтобы я мог >эффективно извлечь элемент с минимальным ключом. Для ключей есть >отношение упорядоченности.

Что такое минимальный ключ?

Второе. Эта структура должна позволять эффективно удалять >заданный элемент по значению. Для определенности допустим, что >существует отношение упорядоченности и для значений элементов, >т.е. можно строить двоичные деревья со сравнением.

Если можешь по значению вычислить хэш, то вот тебе и ответ.

Jewlix
()
Ответ на: комментарий от zamazan4ik

из того, что я смог придумать. Если подойдет, то оптимальнее >всего заюзать дерево Ван Эмде Боаса : быстро пашет, а удалять мы >будем за N*w. Но это из разряда теории :)

У Вн Эмде Боаса время всех операций это O(log(log(U))), не совсем то. что хочет ТС.

Jewlix
()
Ответ на: комментарий от AIv

ТСу вроде как история изменений не нужна - ему просто нужно уметь удалять из структуры. Я понимаю, что можно типо удалять, как «не удаляем, а обращаемся к версии структуры без данного значения». Но он просил именно удаление. Честное. И вроде как из ТЗ, даже уточненного qnikst видно, что персистентности ТСу не надо (если меня libastral и здравая логика не подводит).

zamazan4ik ★★
()
Ответ на: комментарий от Jewlix

у Ван Эмде Боася (ВЭБ) операции за logW, где W - это максимальная степень 2^W,а 2^W ограничивает, насколько большое мы можем хранить число в структуре. Я понимаю, что это не совсем то, но если у него данные чиселки просто, а не сложные(хотя qnikst уточнял, что там сложные данные - события), то ВЭБ справится.

zamazan4ik ★★
()
Ответ на: комментарий от AIv

из нового, что я узнал по вине ТСа, пока искал то, что ему надо - Tango-дерево - взяли и положили идею Heavy-light Decomposition на Splay деревья.по крайней мере очень похоже по этим жирным рёбрам, которые там используются. Почитайте. Жаль, что ТСу не подходит, так как инзертить и удалять элементы нельзя в танго-дереве. Но всё равно структура крайне интересная. http://neerc.ifmo.ru/wiki/index.php?title=Tango-дерево

https://en.wikipedia.org/wiki/Tango_tree

zamazan4ik ★★
()
Ответ на: комментарий от AIv

ТС - барин, а мы ему и так вариантов накидали немало. А вообще, когда не можем какой-то структуры придумать, то локальные оптимайзы : скорее всего, операций удаления мало будет, поэтому то, что мы предлагаем ТСу, скорее всего будет заходить. А логарфимических структур очень много:-)

zamazan4ik ★★
()

любое дерево поиска же(std::map, treap, что душе угодно)

f1u77y ★★★★
()
Последнее исправление: f1u77y (всего исправлений: 1)
Ответ на: комментарий от CyberK

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

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

нет смысла в трипе, так как красно-чёрное лучше показывает себя, чем трип. Трип просто намного проще накодить и быстро

zamazan4ik ★★
()

Спасибо всем отписавшимся!

i-rinat, Waterlaz: Очень может быть, что направление правильное. Годится и для императивной структуры и для персистентной (мне нужны обе).

zamazan4ik: Можем считать, что значения уникальны, а ключи - нет.

AIv: Меня тоже прикалывает термин «персистентность», но это когда операция добавления нового элемента в двоичное дерево, состоящее из миллиона элементов, сводится к созданию нового дерева, которое будет отличаться от старого не более, чем на 20 или около того элементов! (порядок чисел примерно такой)

qnikst Отмену событий я делаю в лоб - через замыкания и ссылку. Сейчас же я задумался об оптимизации такой вещи, как «вытеснение ресурса» (англ. resource preemption). Да, ты прав. Мне нужны оба случая: чистая структура и императивная.

dave ★★★★★
() автор топика
Ответ на: комментарий от dave

... не более, чем на 20 узлов, конечно

dave ★★★★★
() автор топика
Ответ на: комментарий от dave

Про персистентность. Я Вашей задачи не знаю, но у меня вот сейчас такая (вдруг поможет чем):

Есть адаптивная треугольная сетка, задающая волновой фронт. Сетка задается графом с двумя типами узлов - лучи и лучевые трубки (треугольные ячейки), каждая ячейка ссылается на образующие ее лучи и соседние ячейки.

В первом проходе сетка просто строится (т.е. фронт расходится из точечного источника в сложной среде, фронт там как то извивается и сетка подстраивается обеспечивая хорошую аппроксимацию, при этом некоторые ячейки разбиваются на несколько штук), некоторые трубки выходят за область и уничтожаются.

Во втором проходе надо прогнать все лучевые трубки по новой, включая самые мелкие, воспроизвести все разбиения и произвести всякие нетривиальные действия, которые по ряду причин в первом проходе сделать не получается. Т.е. та самая персистентность налицо - у меня сложная эволюционирующая система данных, и мне надо ее эволюцию вопроизвести и на каждом шаге работать с актуальным для текущего времени состоянием.

Решается довольно просто - на первом шаге накапливается история, затем создаются сразу все трубки и лучи, и для каждой трубки есть интервал времени когда она актуальна. Дальше бегаем по всем возможным трубкам, если попали в интервал - трубка обрабатывается, если вышли за интервал - трубка уничтожается.

AIv ★★★★★
()

Может рядом держать хешмапу на элементы и помечать их удалёнными. Если надо - иногда чистить

vertexua ★★★★★
()

если есть 2 раза памяти сколько нужно приоритетной очереди то всё просто

1. заводишь пирамиду с минимомом в вершине.

2. для удаления заводишь дополнительную пирамиду.

когда извлекаешь из (1) проверяешь на совпадение с топ(2) если таки да то удалешь поп(2) и поп(1) и повторяешь

qulinxao ★★☆
()
Ответ на: комментарий от vertexua

Идея с иногда чистить во время простоя системы - разумно, да. Но просто в рантайме очищать, если вдруг у нас что-то делается... то на запрос какой-то задержка будет

zamazan4ik ★★
()
Ответ на: комментарий от zamazan4ik

посмотрел обсуждение - это уже предлагали.

2оя пирамида(из пирамидальной сортировки хипсорт всмысле) -это пирамида удаляемых - тут естественно ещё нужно следить на слияние повторов.

т.е вообщем можно одну пирамиду но запросы на удаление обрабатывать как помеченые (электронно позитроные пары Ж)) при процессинге пирамиды всяко будет случай когда при просеивании элемента произойдёт встреча пары антиподов - тут как в обычной пирамиде пихаем на их место два последних элемента и опускаем их.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

и да зависит воозможно ли повторы ключей ну и удаление отсутсвтующих.

ззы тсу - вообще оказалось нужно было «совсем» другое

qulinxao ★★☆
()
Ответ на: комментарий от Waterlaz

Дерево Ван Боаса — это только теория, показывающая, что поиск из N целочисленных элементов, значения которых не превосходят U, можно делать за O(log log U), занимая память O(N). Но эти «O» слишком велики, чтобы говорить про какое-то практическое применение. Есть очень близкие к дереву Ван Боаса решения — X-fast и Y-fast деревья. У них используется perfect hashing, так что получается слишком непрактично.

iVS ★★★★★
()
Последнее исправление: iVS (всего исправлений: 2)
Ответ на: комментарий от zamazan4ik

Это если надо чистить. Можно просто не чистить никогда и просто пропускать их во время прохождения верхушки heap, если на ваших задачах раздаваться сильно не будет

vertexua ★★★★★
()
Ответ на: комментарий от zamazan4ik

z-fast дерево — экзотика, хотя можешь попробовать поломать мозги и разобраться. Статья Belazzougui et al. «Monotone minimal perfect hashing: Searching a sorted table with O(1) accesses» (2009).

iVS ★★★★★
()
Ответ на: комментарий от vertexua

Там есть проблемы при повторной вставке, т.е. в PQ нужно держать не значения, а контейнеры с флагом удалённости, но это только для мутаьелтных структур.

qnikst ★★★★★
()
Ответ на: комментарий от vertexua

Ну может в последующих сообщениях, я их не видел в момент ответа.

qnikst ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.