powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная труба с рейтингом
25 сообщений из 29, страница 1 из 2
Тяпничная труба с рейтингом
    #40071955
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет котаны-бротаны.

Очередная пятничная.

Дан поток данных имеющих целочисленные ключи. Поток бесконечный. У него есть точка начала
но нет конца.

Пример ключей.

Код: sql
1.
101, 20, 7, 3, 16, 0, 8, 1023, 81, 96 ...... e.t.c.



В любой момент времени пользователь может запросить из него top 1000 элементов ранжированных по ключу.
Пример output:
Код: sql
1.
Top 1000 elements ranked by key (desc) : 100500, 100499, 1023,..... 101



Язык разработки: C++/Delphi/C# вобщем любой.

Алгоритмы и структуры данных: счетчики, биткарты, хештаблички, деревья... вобщем что угодно.
Единственное пожелание - чтоб были сорцы на для уточнения алгоритма.

Что мы не будем использовать
Базы данных и готовые коробочные продукты.

Физический смысл
Физический смысл этого потока может быть любой. Например top 1000 сделок на бирже за нарастающий
период, ранжироанных по цене.

Какой-то более глубокий и точный смысл у это задачи отсуствует. Считайте что это просто разминка мозга.

Сами данные которые пристёгнуты к ключам мы пока игнорируем. Поэтому нам достаточно целых чисел.

Бесконечный поток - суть сетевой интерфейс на который что-то приходит.


P.S. Топик похож на топик Ивана но мы не будем обсуждаеть его тему.

Go-go кодить!!
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО надо какой-то здравый смысл добавить. Из того что мне известно тут просятся биржевые котировки (бесконечный поток) и их технический анализ. Насколько помню Иван именно этим увлекался. Тут элементарно строятся всякие скользящие средние и т.п.

Только это не работает! Я тоже поигрываю немного на бирже, читаю форумы трейдеров, там есть такой термин "кукл", типа пришел кто-то с кучей денег и сломал всю математику игры и дальше хоть запредсказывайся.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072089
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю. Я - не азартный.

Пробовал приспособить бинарную кучу (или пирамиду). Но у нее нет строгого доказательства что top 1000 элементов
ляжет в лимитированную пирамиду в правильном порядке. Из гарантий - только максимум. Остальные
(листовые узлы) могут вытеснятся в случайном порядке.

На картинке показан кейс.



Наименьшим элементом является ключ "1" но он не индексируется для быстрого удаления. А если мы добавляем
новый элемент (допустим 101) то он спустит вниз поддерево узлов и вытеснен будет элемент с ключом "3" при
условии что мы сохраняем фиксированный размер кучи равно 9 элементов как показано на картинке.

Если снять ограничение на 9 элементов - тогда открыт вопрос - а сколько вообще надо хранить чтобы поднять top 1000.



По другим структурам.

Можно приспособить красно-черное дерево, но оно избыточно в стационарной фазе когда есть уже 1000 элементов
и нужно будет постоянно добавлять +1 элемент и выбрасывать еще -1. Ненужное число ре-балансов.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072091
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я задачу не так понял, но в чем сложность-то? Держи в памяти 1000 топовых элементов и проверяй по ним каждый новый поступивший.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
const int N = 1000;
SortedList<int, int> topN = new(N);

foreach(var x in source)
{
    topN[x] = x;

    if(topN.Count > N)
    {
         topN.RemoveAt(0);
    }
}
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072093
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka, а как устроен внутри SortedList?
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072095
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072101
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сортированный список? Неплохо для удаления хвостика. Но не очень быстро для вставки нового элемента.

У меня под рукой нет .Net компиллятора. Ты можешь сделать бенчмарк? Добавь например 1 млрд целых
чисел и скажи сколько времени это займет.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072106
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну это просто классическая задача на кучу. Только не на max как на картинке, а на min-heap, где в корне минимальное значение. Сложность n*log(k).
Есть еще алгоритм похожий на быструю сортировку, который в среднем может найти k первый элементов со сложностью 2n, но он тут не подойдет, если данные в потоке.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072131
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда-ли куча будет хороша?

Возможен-ли кейс, когда красно-черное дерево лучше?
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072150
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Всегда-ли куча будет хороша?

Возможен-ли кейс, когда красно-черное дерево лучше?

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

В построении куча будет немного дешевле, нужен будет +1 элемент в массиве, т.е. - 1001.
И да, в ранговых задачах - min-heap. За одно сравнение с первым элементом ты решаешь, добавлять ли элемент в кучу.
И всегда добавляешь, пока куча не выросла до своего максимально допустимого размера в 1000 хранимых элементов.

-------------------
И это простейший вариант - кучи с единственным источником данных.
А так как снаружи куча - всегда интерфейс, ничто не мешает внутри реализации часть кучи держать в базе данных, например, смерживая при отдаче сортированного набора источник памяти с его продолжением на диске.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072165
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
ИМХО надо какой-то здравый смысл добавить. Из того что мне известно тут просятся биржевые котировки (бесконечный поток) и их технический анализ. Насколько помню Иван именно этим увлекался. Тут элементарно строятся всякие скользящие средние и т.п.

Давай я придумаю здравый смысл. Возможно он пригодится не для этого а для моих будущих топиков.
Потом просто кину ссылку сюда.

Есть приложение которое анализирует события мира ценных бумаг в разрезе одной биржи. Приложение
используют заинтерсованные лица (ЗЛ). Кто эти лица - мы не знаем. События - месседжи. Хотя не всякий
месседж нам интересен.

Здесь я могу немного ошибаться. Но нам может быть интересен например filled ордера. И нам может быть интересно
цена (= произведение цены ценной бумаги (price) на ее количество (quantity)). Заполнение ордера означает что
пакет ценных бумаг куплен.

Пример месседжа (я взял с Вики образец) https://ru.wikipedia.org/wiki/Financial_Information_eXchange.

Код: sql
1.
2.
8=FIX.4.2 | 9=178 | 35=D | 34=123123 | 49=BROKER11 | 56=PHLX | 52=20071123-05:30:00.000 | 
11=ATOMNOCCC9990900 | 55=MSFT | 167=FUT | 54=1 | 38=15 | 40=2 | 44=15 | 59=0 | 10=128 | 


В данном примере нас в сортировке бы интересовало произведение 15 штук акций * цену акции 15 $ = 225 $.
Только тип события не 35=D (новый ордер) а другой код связанный с заполнением количества штук
(я не помню его точно).

Какие поиски или какие views ЗЛ может заказывать - мы не знаем. Но пока мы собираем топы сделок в разрезе
всего торгового дня или в разреде какого-то конкретного тикера (например Microsoft/Apple/IBM).

Скорость реакции интерфейса - важна и наши заинтересованные не хотят долго ждать выборок из БД.

Наше приложение слушает события в этом формате (TCP/UDP/JMS/...e.t.c) по сетевым и прикладным протоколам
и публикует на экране топчик.

Возможно смысл что я придумал - не совершенен, и кто знающий - можете добавить больше смыслов.
Только так чтобы главная постановка задачи кардинально не изменилась.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072167
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
mayton
Всегда-ли куча будет хороша?

Возможен-ли кейс, когда красно-черное дерево лучше?

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

В построении куча будет немного дешевле, нужен будет +1 элемент в массиве, т.е. - 1001.
И да, в ранговых задачах - min-heap. За одно сравнение с первым элементом ты решаешь, добавлять ли элемент в кучу.
И всегда добавляешь, пока куча не выросла до своего максимально допустимого размера в 1000 хранимых элементов.

Я еще немного поборюсь за кучу (двоичную кучу или пирамиду).

Далее я с вашего позволения буду называть "кучу" пирамидой . Мне так удобнее чтоб не было терминологической
тавтологии с кучей как механизмом аллокации памяти.

Мне нравится пирамида своей компактностью в противоположность дереву.

Моя первая идея была как предложил Зяма выше - использовать мин-пирамиду. Только
я хотел трекать две пирамиды сразу. Мин-пирамиду - для решения собственно задачи. И макс-пирамиду
для показа первых 10-15 значений (типа pagination). Но я уже сомневаюсь что можно доверять макс-пирамиде.
Есть вероятность что она просто станет хуже обычной пирамидальной сортировки (мин-пирамида -> сортировка
по месту -> реверс массива наоборот).

Сами тела месседжей - хранить отдельно от пирамид. В идеале элемент пирамиды должен быть ключом + указателем
на месседж в пуле месседжей.

Это также удобно тем что мы можем сделать несколько views. По цене сделки за день. По заданному типу сделок за день.
И т.п. вариации.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
mayton
Всегда-ли куча будет хороша?

Возможен-ли кейс, когда красно-черное дерево лучше?

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

В деревьях - хотелось-бы избежать insert/delete ключей и произвести сразу update минимального на текущий новый
с ребалансировкой как обычно. Это моя наивная попытка избежать операций с new/delete памяти.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072169
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

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

На самом деле, я просто к тому, что в этой задаче ничего особо любопытного нет. Другое дело, вот, если нужно, например, искать медиану потенциально неограниченной последовательности - вот там действительно нужны не совсем тривиальные подходы, хотя и тут уже все изучено и алгоритмы готовые есть (они либо приближенные, либо вероятностные).
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072221
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkfka, почему o(n)?

Для пирамиды:

Добавление в хвост O(1) + Перебалансировка O(Log n)
Чтение max (peek) - O(1). Изьятие max (poll) - O(Log n)
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072226
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
fkfka, почему o(n)?

Имеется в виду обработка N айтемов входящих данных. У тебя-то "куча" или что-либо еще никогда не вырастет больше 1000 элементов, т.ч. вставка/удаление и т.п. одного отдельного элемента не будут зависеть хоть у тебя их поступило миллион, хоть миллиард. Вполне возможно, что на конкретно 1000 элементах какая-нибудь самая тупая структура сможет оказаться быстрее, чем какое-нибудь навороченное дерево. Надо будет, например, любопытства ради сравнить SortedSet и HashSet.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072272
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо сравнивать с HashSet. Это просто бесполезно т.к. цели не те.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072278
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Не надо сравнивать с HashSet. Это просто бесполезно т.к. цели не те.

Ну почему бесполезно. По сути задача, это хранить коллекцию с возможностью быстрой вставки и поиска/удаления минимального элемента. Можно даже на совсем простом массиве реализовать - вопрос только в скорости.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну сделай на массиве. Посмотрим.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072297
fkfka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Ну сделай на массиве. Посмотрим.

Лень. Да и других дел полно.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072314
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Дан поток данных имеющих целочисленные ключи. Поток бесконечный. У него есть точка начала
но нет конца.

...

В любой момент времени пользователь может запросить из него top 1000 элементов ранжированных по ключу.
Пример output:
Код: sql
1.
Top 1000 elements ranked by key (desc) : 100500, 100499, 1023,..... 101


Я думаю что при бесконечном потоке top 1000 выродится в набор значений около абсолютного максимума, типа такого
Код: sql
1.
Top 1000 elements ranked by key (desc) : 100500, 100500, 100500, 100500, 100499, 100499, 100499, ..... 100498
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас бесконечность - это опер-день. С утреца - будет снова по нулям.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072465
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начал строить дом с крыши. До 1000 элементов кучу можно наполнять. Или пакетно впихнуть.
А после 1000 делать замены вершинного элемента (там будет минимальный) на новый.

Вот этот метод replaceTopItem() я сделал в целях оптимизации insert/poll. Хотя чорт его знает будет ли дешевле.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
public interface Heap<T extends Comparable> {

    boolean insert(@Nonnull T item);

    int size();

    @Nonnull T peekTopItem();

    @Nullable T pollTopItem();

    void replaceTopItem(@Nonnull T item);

    @Nonnull Iterator<T> items();

    default void merge(@Nonnull Heap<T> argHeap) {
        merge(argHeap.items());
    }

    default void merge(@Nonnull Iterator<T> comparables) {
        comparables.forEachRemaining(item -> insert(item));
    }

}



Из готовых имплементаций есть в std готовый метод делания пирамиды https://en.cppreference.com/w/cpp/algorithm/make_heap
и кажется он был там уже очень давно.

Я его называю "пирамидизация". Но мне также еще понадобиться метод для проталкивания "бульбы" вверх и вниз
методом пузыря.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072468
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
...
А после 1000 делать замены вершинного элемента (там будет минимальный) на новый.
...
Из готовых имплементаций есть в std готовый метод делания пирамиды https://en.cppreference.com/w/cpp/algorithm/make_heap
и кажется он был там уже очень давно.
....

ты точно понимаешь, что делаешь?
если верить твоей ссылке, то make_heap в вершину максимальный поместит, а не минимальный.
...
Рейтинг: 0 / 0
Тяпничная труба с рейтингом
    #40072478
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В java уже есть PriorityQueue. Чет я не понимаю, какую в ней часть ты хочешь оптимизировать?
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничная труба с рейтингом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]