Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
В стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке. Как это эффективно реализовать? Есть ли нативная сишная ф-ция вычисления мин-макс массива? В голову пришло лишь: - хранить еще два пойнтера на индексы последних значений, признанных мин-макс, и проверять их на присутствие в стеке при поступлении каждого нового значения. Если они вышли из стека - перебором выявить новые мин и/или макс. Быстродействие крайне критично. Из-за этого и обратился к C++ * не знаю, как обозвать - постоянно хранится указатель на индекс, в который произошла последняя запись. Т.е. новым значением перезаписывается самое старое - FO. Без смещения всего стека по массиву. ** C++ почти не знаю. Допиливаю чужую заготовку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 07:31 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Для начала давайте уточним -термины стек и FIFO - взаимоисключающие. Стек это всегда LIFO, а FIFO - это очередь. И данная задача решается для них по разному. У вас очередь или стек? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 08:50 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Две переменные max и min, определяются перед помещением значений в FIFO. При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 08:57 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Сорри. Я не настоящий сварщик :) В предлагаемой нотации - очередь. FIFO. Или LILO. Как удобнее. Пулеметная лента. Не магазин. Стек, прдн, очередь, выдавливается. Т.е. всегда заполнен(а) полностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:04 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
m_Sla, m_SlaДве переменные max и min, определяются перед помещением значений в FIFO. При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). Схоже с тем, что я предложил выше. Только хранятся сами значения, а не указатели. А т.к. в стеке м.б. несколько величин, равных граничным, то в моем варианте можно оптимизироваться под хранение указателя на наиболее актуальную максимальную величину, перебирая стек с последнего вошедшего. Тогда не придется перебирать при выходе каждой величины, равной граничным. На длинных стеках может возникнуть существенная экономия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:20 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
А как много операций вставки - удаления - запроса минимакса будет? Какова длина очереди. Может там и оптимизировать нечего. Рискну предположить, что этот участок не станет узким местом системы. Структура данных с затиранием иногда называется кольцом. забавная книжка про узкие места http://yandex.ru/yandsearch?text=голдратт+цель+-+процесс+непрерывного+совершенствования&lr=213 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:37 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Если макс. размер очереди небольшой (десятки байтов), то быстрее всего будет перебор при удалении (как вы изначально предложили). Если же очередь существенно больше (например миллионы байтов), то данный алгоритм имеющий сложность O(n) будет не самой эффективной реализацией. Если заменить массив на список, и вести два списка - один в порядке очереди, а другой (параллельный для тех же элементов списка) в порядке сортировки, то можно добиться сложности O(log(n)). Сортированный список можно эффективно реализовать с помощью std::multiset, а список для очереди - введя указатель на предыдущий элемент в каждом элементе multiset. Набросок структуры данных: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:41 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
На самом деле в моем примере в multiset скорее надо хранить не item, а указатель item* - так проще реализовать. Если будете реализовывать в этом направлении, то напишу подробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 09:52 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov , * как много операций вставки - удаления - запроса минимакса будет? - непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково. * Какова длина очереди - три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs) * Рискну предположить, что этот участок не станет узким местом системы. - Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально): - приращение очереди: (Chg = New - Old); - сумма значений очереди: (Sum = Sum + Chg); - скользящее среднее: (Avg = Sum / Siz); - диапазон минмакс: (Dnx = Max - Min) Так что, все упирается в минмакс... На книжку обязательно взгляну. Снкс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:20 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, Спасиюо. Чуть позже отвечу. Надо отлучиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:21 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, Я тут подумал, что может эффективнее и проще сделать по другому. Очередь оставить такой какая у вас уже есть (в массиве). А отдельно вести счетчик уникальных значений. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Теперь у нас add и remove выполняются за O(log(n)) - где n, не размер очереди, а кол-во уникальных значений, что худшем случае то же самое, а в лучшем - существенно меньше. get_min и get_max выполняются за O(1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:43 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Поправка: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 10:47 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC, 1) Бъем очередь на сегменты. например, на 100. 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее. 3) при добавлении/удалении значения пересчитываем только значения в блоке. 4) Когда блок покидает или добавляется пересчитываются общие значения Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:18 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Смотрите, люди 500 вставок в секунду в mySql делают. http://www.sql.ru/forum/actualthread.aspx?tid=973281 И он держит вроде. Неужели самописная очередь, даже неоптимальная, не работает в 5-6 раз быстрее? Какая структура данных - что кроме замеренного числа записывается? Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:36 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. на джаве - милион тупых минимаксов - секунд 30 на глаз.... а на С++? 500 в сек - с запасом, правда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 11:58 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC Vladimir Baskakov , * как много операций вставки - удаления - запроса минимакса будет? - непрерывно поступают данные с неких датчиков со скоростью до 500 отсчетов секунду в пределе, стандартно - 5-10 в сек. Каждое входящее надо проверять на минмакс и фиксировать, если оно таково. * Какова длина очереди - три-четыре самостоятельных очереди с максимальной длиной до 10 тыс. Из расчета, чтобы охватить хотя бы 3-4 минуты в экстремуме (0.2 мсек Х 10'000 pcs) * Рискну предположить, что этот участок не станет узким местом системы. - Ну, за всю систему, конечно, не самое-самое. А на этапе обработки сырых данных - самое узкое. Из сложной статистики, вычисляемой на каждом тике еще считаются (но все тривиально): - приращение очереди: (Chg = New - Old); - сумма значений очереди: (Sum = Sum + Chg); - скользящее среднее: (Avg = Sum / Siz); - диапазон минмакс: (Dnx = Max - Min) Так что, все упирается в минмакс... На книжку обязательно взгляну. Снкс.Поиск max и min перебором из массива double data[10000] на моем компьютере выполняется за 0,00002сек. А искать надо только при выталкивании max или min. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 12:28 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
так и я про что. Узкое место - не тут))))) но пооптимизировать - если есть время - это мы любим. и поговорить о оптимизации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 12:37 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov, Мы давали тестовое задание при приеме работу с похожей задачей. Предположим, наше приложение получает по разным каналам данные. Данные поступают пачками переменного размера. Т.е. в некоторый момент времени дергается функция on_get_data(size_t size); периодически дергается метод double get_average_speed() который должен возвращать приблизительную (+-10%) среднюю скорость за последние n секунд. Интервал n задается при старте приложения. Интнервал может быть от 60 секунд до суток или даже месяца. частота событий получения данных также может быть от тысяч за секунду до раза в сутки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2013, 15:29 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCAnatoly Moskovsky, Спасиюо. Чуть позже отвечу. Надо отлучиться.Отлучился, млин, сходил за хлебушком :) Полсоюза за это время проехал. Прошу прощения за пропажу топикстартера. Спасиюо за высказанные соображения и примеры. С позволения присутствующих - возьму еще таймаут. В понедельник-вторник вернемся к обсуждению, ОК? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2013, 09:04 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Ну вот. У меня есть первые результаты и замеры. Я реализовал вот такой алгоритм в модели на VBA, которую предполагаю переносить в сишную длл: VBA code Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. У меня этот цикл выполняется для очередей длиной: Код: plaintext 1. 2. 3. 4. Vladimir Baskakov * на джаве - милион тупых минимаксов - секунд 30 на глаз m_Sla * double data[10000] на моем компьютере выполняется за 0,00002 сек Спасибо за цифры. На джаве - это, конечно, ни в какие ворота :) А вот 2 мксек на 1000 записей - меня это более чем устраивает. Под VBA производительность получается на два порядка ниже. И то, с учетом, что m_Sla ворочал запятую, а уменя все целочисленное. Но это только модель. Потом все портируется на С и будет летать :) Важно алгоритм оценить. Теоретически, можно еще ускориться за счет линейной записи кода - уйти от второго for (это я чисто для экономии строчек кода и понимания так записал). Можно еще попытаться ускориться за счет уточнения - кто, мин или макс все-таки вышел, и проверять дальше только на него. vromanov , об этом шла речь в 14191192 ?vromanovЕще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25% И там же 14191192 : Бъем очередь на сегменты. например, на 100 * 2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее. Непонятно, зачем хранить время (хоть оно у меня хранится). * 3) при добавлении/удалении значения пересчитываем только значения в блоке. Недостаточно. После удаления текущего минимакса, ближайший может оказаться в другом блоке. Anatoly Moskovsky Спасибо за примеры кода. Но я, к сожалению, совершенно поверхностно знаю язык - лишь в рамках той длл, которую мне придется модифицировать. Поэтому я просто не могу по достоинству оценить предложенное. И хотелось бы остаться в рамках того, что я смогу потянуть самостоятельно без погружения в маны. Интересны приведенные оценки сложности алгоритма O(log(n)). Что можно почитать на эту тему? Если не очень заумное :) Vladimir Baskakov 14191364 * Какая структура данных - что кроме замеренного числа записывается? Фактически очередь - это двумерный массив, т.к. значений (полей), одновременно в нее передающихся - несколько, плюс таймстемп на каждую запись, который я проставляю самостоятельно. Очередей таких - несколько разных длин. Т.е. элементы самой короткой очереди дублируются в более длинной. Кстати, в этом направлении тоже, думаю, есть место для оптимизации. Но мне пока надо в самом простом, но эффективном варианте. * Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает? Это было бы шикарно. Но я не потяну самостоятельно. Да и еще такой аспект - все сейчас обрабатыывается в Access через подключенный API в COM-модели. Поэтому синхронная обработа навязана. Можно было бы говорить о буфере, но по ТЗ указано мириться с потерянными тиками в пользу самых свежих. Т.е. выбор сделан в пользу актуальности, за счет целостности, полноты данных . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2013, 23:31 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
авторСпасибо за цифры. На джаве - это, конечно, ни в какие ворота :) Почему? В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду? и у меня на джаве 10 К записей, а не 1 К. И ВБА - уж тормозит так тормозит. Да и еще такой аспект - все сейчас обрабатывается в Access Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 09:46 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
Vladimir Baskakov , * и у меня на джаве 10 К записей, а не 1 К. Вот, что было написано выше: "милион тупых минимаксов - секунд 30 на глаз" . Пусть 20. Итого, на 1'000 циклов: Код: plaintext 1. 2. Что уж так за яву расстраиваться :) Странно было бы от нее большего ожидать. * В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду? Пролазит. Ну и что? Пролазит-то лишь среднебольничная температура... И я называл лишь ориентировочную цифру общего числа отсчетов за секунду. 500. В качестве ориентира. Об интервале между самими тиками я не обмолвился. За секунду может пройти всего два отсчета, но с минимальным зазором между ними. Минимальный зазор, который я наблюдаю - 11 мксек. Борьба за быстродействие это не самоцель. С учетом COM-модели мне всегда будет мало скорости, т.к. хочется как можно меньше потерять отсчетов, а для этого надо как можно раньше освободить систему для следующего тика. * И ВБА - уж тормозит так тормозит. Ну, надо уметь его готовить :) А цифры выше я привел. * Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM. Да не надо шуток. Смотрю постоянно :) БД - десятка полтора целочисленных полей и три дабла, строковых нет. В онлайне пишется меньше чем за 1 мск (0.001 сек) запись (это включая сопутствующие статистические вычисления) и еще полно мест для оптимизации. Последовательное чтение (имитация онлайна, тоже с вычислениями) - до 80'000 записей в сек. Access на удивление шустер. Пишется до 1.5 млн записей в сутки (обычно 700-800 тыс). Это в среднем чуть больше 10 записей в сек. В среднем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 11:48 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underCВ стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке. Можно сделать стек указателей на дерево. А в дереве max/min ищется довольно быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:16 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
mayton , это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения и Vladimir Baskakov про конвейер. Конечно, вместо того, чтобы из API выплевывать в VBA, оттуда в сишную длл, а потом обратно, лучше на си написать шлюз (бридж) к API со всей математикой, а аксу оставить исключтельно БД-шный функционал. В плане портирования предложенного алгоритма на C++ возникает следующий вопрос - как передать из VBA в сишную длл массив значений ? Сейчас я передаю в нее несколько параметров. Вот у меня вызов инициализации очереди: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Вот передача новых значений к пересчету: Код: plaintext 1. 2. 3. 4. 5. 6. Я, конечно, могу увеличить число передаваемых параметров, но может лучше массивом. А еще более важно массивом же из нее получить результаты вычислений . Сейчас для получения одного из результатов вычислений я вызываю ее функцию с определенным параметром. И так несколько раз. Слава богу, они не все нужны одновременно. Но гораздо интереснее получить все махом за один вызов и уже в VBA разбираться с результатами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 13:59 |
|
||
|
Поиск Min-Max в стеке FIFO
|
|||
|---|---|---|---|
|
#18+
underC mayton , это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения А нужно потянуть. Единственные структуры данных которые быстро выбирают max/min - это деревья и пирамида (Heap). Пирамида описана у Вирта в книге. Она более компактна но я не уверен что поможет в поиске min и нужно проверить насколько она быстра при inserts/deletes. Дерево в этом плане конечно-же лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2013, 17:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38235801&tid=2019267]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 136ms |

| 0 / 0 |
