powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO
72 сообщений из 72, показаны все 3 страниц
Поиск Min-Max в стеке FIFO
    #38228440
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке.

Как это эффективно реализовать? Есть ли нативная сишная ф-ция вычисления мин-макс массива?

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

Быстродействие крайне критично. Из-за этого и обратился к C++

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

** C++ почти не знаю. Допиливаю чужую заготовку.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228469
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underC,

Для начала давайте уточним -термины стек и FIFO - взаимоисключающие.
Стек это всегда LIFO, а FIFO - это очередь.
И данная задача решается для них по разному.

У вас очередь или стек?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228474
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две переменные max и min, определяются перед помещением значений в FIFO.
При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min).
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228484
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри. Я не настоящий сварщик :)

В предлагаемой нотации - очередь. FIFO. Или LILO. Как удобнее. Пулеметная лента. Не магазин. Стек, прдн, очередь, выдавливается. Т.е. всегда заполнен(а) полностью.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228506
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla,
m_SlaДве переменные max и min, определяются перед помещением значений в FIFO.
При выталкивании значений проверяем на max(min). Если вытолкнули max(min), то перебором находим новое max(min). Схоже с тем, что я предложил выше. Только хранятся сами значения, а не указатели. А т.к. в стеке м.б. несколько величин, равных граничным, то в моем варианте можно оптимизироваться под хранение указателя на наиболее актуальную максимальную величину, перебирая стек с последнего вошедшего. Тогда не придется перебирать при выходе каждой величины, равной граничным. На длинных стеках может возникнуть существенная экономия.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228525
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как много операций вставки - удаления - запроса минимакса будет? Какова длина очереди. Может там и оптимизировать нечего. Рискну предположить, что этот участок не станет узким местом системы.

Структура данных с затиранием иногда называется кольцом.

забавная книжка про узкие места
http://yandex.ru/yandsearch?text=голдратт+цель+-+процесс+непрерывного+совершенствования&lr=213
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228529
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
struct item
{
	T value;  // T это тип значений элементов очереди, вероятно числовой
	item* next; // указатель на следующий (в порядке добавления и соответственно извлечения) элемент очереди
	
	// оператор сравнения для реализации сортировки multiset
	friend bool operator<(const item& a, const item& b) {
		return a.value < b.value;
	}
};

std::multi_set<item> queue;
item* first_item = 0;

queue.begin()->value  // мин значение
queue.rbegin()->value  // макс значение
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле в моем примере в multiset скорее надо хранить не item, а указатель item* - так проще реализовать.
Если будете реализовывать в этом направлении, то напишу подробнее.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228597
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)

Так что, все упирается в минмакс...

На книжку обязательно взгляну. Снкс.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228601
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,
Спасиюо. Чуть позже отвечу. Надо отлучиться.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228646
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
std::map<T, size_t> unique_values;

void add(T value)
{
    // добавляем в очередь 
    ...
    // добавляем в счетчик
    ++unique_values[value];
}
T remove()
{
    // извлекаем из очереди
    T value = ...
    // удаляем из счетчика
    if (--unique_values[value] == 0)
    	unique_values.erase(value);
    return value;    	
}

T get_min()
{
    std::map<T, size_t>::iterator i = unique_values.begin();
    if (i == unique_values.end())
       return 0; // очередь пуста
    return i->first;
}

T get_max()
{
    std::map<T, size_t>::iterator i = unique_values.rbegin();
    if (i == unique_values.rend())
       return 0; // очередь пуста
    return i->first;
}



Теперь у нас add и remove выполняются за O(log(n)) - где n, не размер очереди, а кол-во уникальных значений, что худшем случае то же самое, а в лучшем - существенно меньше.
get_min и get_max выполняются за O(1)
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228656
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T get_max()
{
    std::map<T, size_t>::reverse_iterator i = unique_values.rbegin();
    if (i == unique_values.rend())
       return 0; // очередь пуста
    return i->first;
}
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228735
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underC,
1) Бъем очередь на сегменты. например, на 100.
2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее.
3) при добавлении/удалении значения пересчитываем только значения в блоке.
4) Когда блок покидает или добавляется пересчитываются общие значения

Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25%
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228784
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите, люди 500 вставок в секунду в mySql делают.
http://www.sql.ru/forum/actualthread.aspx?tid=973281
И он держит вроде.
Неужели самописная очередь, даже неоптимальная, не работает в 5-6 раз быстрее?
Какая структура данных - что кроме замеренного числа записывается?

Может сделать конвеер. Приемник данных заполняет блоки в памяти, второй паралельно работающий процесс скидывает полностью заполненные блоки в файлы, а уже третий, фоновый - все обрабатывает?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228851
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public class num_test {
   public static void main (String[] argv) {
	   double a[]=new double[11000];
	   int i,j;
	   for (i=0; i<10000; i++) {
		   a[i]=i*i/1234;
	   }
	   for (j=1;j<1000000;j++){
		   double min,max;
		   min=0; max=0;
		   for (i=0; i<10000; i++) {
				  if (a[i] < min) {min=a[i];}
				  if (a[i] > max) {max=a[i];}
		   }
		   
	   }
	   
   }
}


на джаве - милион тупых минимаксов - секунд 30 на глаз....
а на С++? 500 в сек - с запасом, правда?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228938
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38228957
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так и я про что. Узкое место - не тут))))) но пооптимизировать - если есть время - это мы любим. и поговорить о оптимизации.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38229383
Фотография vromanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Мы давали тестовое задание при приеме работу с похожей задачей.
Предположим, наше приложение получает по разным каналам данные. Данные поступают пачками переменного размера.
Т.е. в некоторый момент времени дергается функция on_get_data(size_t size);
периодически дергается метод double get_average_speed() который должен возвращать приблизительную (+-10%) среднюю скорость за последние n секунд.
Интервал n задается при старте приложения.
Интнервал может быть от 60 секунд до суток или даже месяца.
частота событий получения данных также может быть от тысяч за секунду до раза в сутки.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38233687
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
underCAnatoly Moskovsky,
Спасиюо. Чуть позже отвечу. Надо отлучиться.Отлучился, млин, сходил за хлебушком :) Полсоюза за это время проехал.
Прошу прощения за пропажу топикстартера.

Спасиюо за высказанные соображения и примеры. С позволения присутствующих - возьму еще таймаут. В понедельник-вторник вернемся к обсуждению, ОК?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38235801
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот. У меня есть первые результаты и замеры. Я реализовал вот такой алгоритм в модели на 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.
' l_Arr      - массив (очередь) поступающих значений
' l_ArrSiz   - наибольший (верхний) индекс элементов массива l_Arr
' l_Pnt_OLD  - пойнтер выталкиваемого значения
' l_Pnt()    - пойнтеры на miN и maX элементы массива l_Arr
' l_Val()    - сохраненные значения  miN и maX элеменов массива l_Arr
' l_LB, l_UB - нижняя и верхняя границы цикла 'for'

Const cQ As Byte = 0    ' eQu (здесь не задействована)
Const cX As Byte = 1    ' maX
Const cN As Byte = 2    ' miN

Sub sb_NX_Simple() ' miN-maX simple compare
' сравниваем пойнтер удаляемого значения с пойнтерами на мин и макс
    Select Case ((l_Pnt_OLD = l_Pnt(cN)) Or (l_Pnt_OLD = l_Pnt(cX))) 
        Case True ' удаляется или мин, или макс
            l_Val(cN) = l_Arr(0): l_Val(cX) = l_Val(cN) ' назначаем произвольное значение _
                                                        ' из массива и на мин, и на макс
            l_LB = 0: l_UB = l_StkSiz     ' надо проверять весь массив заново
        Case False
            l_LB = l_Pnt_OLD: l_UB = l_LB ' проверяем только последнее вошедшее значение, _
                                          ' вставшее на пойнтер l_Pnt_OLD взамен вытолкнутого   
    End Select
    
' назначаем новые мин или(и) макс и сохранем его(их) поинтер(ы)
    For i = l_LB To l_UB
        Select Case l_Stk(i)
            Case Is < l_Val(cN): l_Val(cN) = l_Arr(i): l_Pnt(cN) = i
            Case Is > l_Val(cX): l_Val(cX) = l_Arr(i): l_Pnt(cX) = i
        End Select
    Next
End Sub


У меня этот цикл выполняется для очередей длиной:
Код: plaintext
1.
2.
3.
4.
    50 -    15 мксек == 0.000'015 сек == 15 * 10^(-6) сек
   500 -   120 мксек
 1'000 -   230 мксек
 5'000 - 1'150 мксек
10'000 - 2'350 мксек 
(все округлено-усреднено на глаз, но замеры ведутся с точностью до 1 мксек)

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-модели. Поэтому синхронная обработа навязана. Можно было бы говорить о буфере, но по ТЗ указано мириться с потерянными тиками в пользу самых свежих. Т.е. выбор сделан в пользу актуальности, за счет целостности, полноты данных
.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38236032
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСпасибо за цифры. На джаве - это, конечно, ни в какие ворота :)
Почему? В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду?
и у меня на джаве 10 К записей, а не 1 К.

И ВБА - уж тормозит так тормозит.

Да и еще такой аспект - все сейчас обрабатывается в Access
Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38236292
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Baskakov ,

* и у меня на джаве 10 К записей, а не 1 К.
Вот, что было написано выше: "милион тупых минимаксов - секунд 30 на глаз" . Пусть 20. Итого, на 1'000 циклов:
Код: plaintext
1.
2.
JS:  2 * 10^(-2) сек 
C++: 2 * 10^(-6) сек
VBA: 2 * 10^(-4) сек

Что уж так за яву расстраиваться :) Странно было бы от нее большего ожидать.

* В Ваши ворота пролазит с запасом. у Вас же 1000 замеров в секунду?
Пролазит. Ну и что? Пролазит-то лишь среднебольничная температура...

И я называл лишь ориентировочную цифру общего числа отсчетов за секунду. 500. В качестве ориентира. Об интервале между самими тиками я не обмолвился. За секунду может пройти всего два отсчета, но с минимальным зазором между ними. Минимальный зазор, который я наблюдаю - 11 мксек.

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

* И ВБА - уж тормозит так тормозит.
Ну, надо уметь его готовить :) А цифры выше я привел.

* Ну посмотрите шутки ради - сколько времени оно туда льется. Через COM.
Да не надо шуток. Смотрю постоянно :)
БД - десятка полтора целочисленных полей и три дабла, строковых нет. В онлайне пишется меньше чем за 1 мск (0.001 сек) запись (это включая сопутствующие статистические вычисления) и еще полно мест для оптимизации. Последовательное чтение (имитация онлайна, тоже с вычислениями) - до 80'000 записей в сек. Access на удивление шустер.

Пишется до 1.5 млн записей в сутки (обычно 700-800 тыс). Это в среднем чуть больше 10 записей в сек. В среднем!
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38236480
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCВ стек FIFO, реализованный в массиве с плавающим пойнтером*, поступают данные. Среди прочих вычислений необходимо иметь доступ к мин-макс значениям, находящимся в данный момент в стеке.
Можно сделать стек указателей на дерево. А в дереве max/min ищется довольно быстро.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38236578
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton ,
это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения и Vladimir Baskakov про конвейер. Конечно, вместо того, чтобы из API выплевывать в VBA, оттуда в сишную длл, а потом обратно, лучше на си написать шлюз (бридж) к API со всей математикой, а аксу оставить исключтельно БД-шный функционал.

В плане портирования предложенного алгоритма на C++ возникает следующий вопрос - как передать из VBA в сишную длл массив значений ?

Сейчас я передаю в нее несколько параметров.
Вот у меня вызов инициализации очереди:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//	+-----------------------------------------------------------------
//	| Stack ini
//	+-----------------------------------------------------------------
_DLLAPI char __stdcall fn_MA_Ini(int &pBBB, int &pAAA, 
                                 short &pPer_S, short &pPer_L, short &pPer_D, 
                                 short &pPer_E, short &pPer_T, 
                                 short &pMpl_D, short &pSns_D, short &pSns_T)
{
...


Вот передача новых значений к пересчету:
Код: plaintext
1.
2.
3.
4.
5.
6.
//	+-----------------------------------------------------------------
//	| Stack recalc
//	+-----------------------------------------------------------------
_DLLAPI char __stdcall fn_MA_New(long &pBBB, long &pAAA) //, double *pDv)
{
...


Я, конечно, могу увеличить число передаваемых параметров, но может лучше массивом.

А еще более важно массивом же из нее получить результаты вычислений . Сейчас для получения одного из результатов вычислений я вызываю ее функцию с определенным параметром. И так несколько раз. Слава богу, они не все нужны одновременно. Но гораздо интереснее получить все махом за один вызов и уже в VBA разбираться с результатами.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237041
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underC mayton ,
это мне сейчас не потянуть. Надо учиться. На заметку возьму, как и предложения Anatoly Moskovsky про уникальные значения
А нужно потянуть. Единственные структуры данных которые быстро выбирают max/min - это деревья и пирамида (Heap).
Пирамида описана у Вирта в книге. Она более компактна но я не уверен что поможет в поиске min и нужно
проверить насколько она быстра при inserts/deletes. Дерево в этом плане конечно-же лучше.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237154
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да я не расстраиваюсь за джаву. Просто интересно.
1000 циклов минимакса на массиве в 1000 элементов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import java.util.*;
public class num_test {
   public static void main (String[] argv) {
	   double a[]=new double[11000];
	   int i,j;
	   for (i=0; i<10000; i++) {
		   a[i]=i*i/1234;
	   }
	   long t_strt=System.currentTimeMillis();
	   for (j=1;j<1000;j++){
		   double min,max;
		   min=0; max=0;
		   for (i=0; i<1000; i++) {
				  if (a[i] < min) {min=a[i];}
				  if (a[i] > max) {max=a[i];}
		   }
		   
	   }
	   System.out.print((System.currentTimeMillis()-t_strt));
   }
}


1000 циклов поиска минимакса по 1000 элементов = 3 милисикунды.
один проход по массиву (2..4)*10 в -6 ой.

те 100 000 измерений в секунду смогут пролезть с некоторым запасом. Если каждое измерение сопровождается поиском минимакса. А у Вас - 500 ~ 1 000. Мне думается, что запас пока еще весьма существенный....

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

И может получится так, что работа со связанной структурой на таких незначительных объемах не даст справедливо ожидаемого логарифмического выигрыша. С учетом того, что даже на "медленной джаве" от которой никто ничего хорошего не ждет (шутка) запас по времени 100 кратный.... Стоит ли искать еще большего выигрыша? На С++ должно быть в полтора-2 раза быстрее минимум.

Там скорее чтоб работало надо играть с приоритетностью процесса у ОС - что б ему квантов времени давали полным половником. Вот где ресурс. Возможно...
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237166
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?..
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237185
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЧем иногда невыгодны усложненные структуры данных - линейный массив почти наверняка будет жить в кэше процессора.
Ну например хип, про который выше говорилось, в большинстве случаев может храниться тоже как массив.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237188
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЯ смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?..
Тут бы еще узнать зачем оно вообще надо :)
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237212
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
#include <time.h>
#include <stdio.h>
#include <windows.h>

main(){
//  Sleep(1000);
  double a[11000];
  double *da;

   int i,j;
  for (i=0; i<10000; i++) {
		   a[i]=i*i/1234;
   }

 long   t_strt=clock();
	   for (j=1;j<1000000;j++){
		   double min,max, tt;
                  	   min=0; max=0;
                    
		   for (i=0; i<10000; i++,da++) {
                     if (a[i] < min) {min=a[i];}
		     if (a[i] > max) {max=a[i];}
		   }
		   
	   }


  printf("hello %d",clock()-t_strt);
}


что-то со мной не так? почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)?
почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды?
не расстроен - удивлен....
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237218
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня почему-то в голове крутиться аналогия с расчётом
"скользящего среднего" если считать FIFO - статистической
выборкой.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237231
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovЯ смотрю автора ещё никто не спросил какого типа данные у него в очереди... И почему бы не считать этот min/max при необходимости, а не на лету?..
Я оговаривался - целочисленные.авторm_Sla ворочал запятую, а уменя все целочисленное. Необходимость такая есть. Надо просто принять это :)

Anatoly MoskovskyТут бы еще узнать зачем оно вообще надо :)Да все очень просто. Нужно продемонстрировать, что существующая методика и инструментарий для сбора, оценки м анализа параметров процесса устарели и нужно вложиться в нормальную разработку. И уж если я на коленке смог собрать более эффективную и, главное, работающую модель, то наверное следует нанять профессионалов и сделать все красиво :)

maytonУ меня почему-то в голове крутиться аналогия с расчётом
"скользящего среднего" если считать FIFO - статистической
выборкой.Не удивительно, что крутится :)авторна каждом тике еще считаются (но все тривиально):
- приращение очереди: (Chg = New - Old);
- сумма значений очереди: (Sum = Sum + Chg);
- скользящее среднее: (Avg = Sum / Siz);
- диапазон минмакс: (Dnx = Max - Min)
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237240
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)?
почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды?
не расстроен - удивлен....
А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1.
Сделайте - тогда будете расстроены
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237255
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCЯ оговаривался - целочисленные.
"Я" бывают разные. (с) Кролик.

Целочисленные значения имеют разрядность от 1 до 64 бит минимум. Какие у тебя? До
разрядности в 8 бит будет эффективным уже предложенный способ счётчиков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237260
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyVladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)?
почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды?
не расстроен - удивлен....
А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1.
Сделайте - тогда будете расстроены
Вот откуда растут двойные стандарты
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237294
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov"Я" бывают разные. (с) Кролик.

Целочисленные значения имеют разрядность от 1 до 64 бит минимум. Какие у тебя? До
разрядности в 8 бит будет эффективным уже предложенный способ счётчиков.
Мои целочисленные - VBA-шный тип long:
F1Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237302
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCМои целочисленные - VBA-шный тип long:
Ну, раз ты так считаешь...

Тогда следующий вопрос: кто и с какой частотой использует эти min/max значения?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237325
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

* Ну, раз ты так считаешь...
это VBA так считает. Чем-то мои лонги не понравились...

* кто и с какой частотой использует эти min/max значения?
С частотой поступления тиков все это предварительно считаемое добро участвует в последующей математике системы принятия решения. Также, параллельно с сырыми данными, пишется статистика. Для истории и для оффлайн анализа как наблюдаемых процессов, так и поведения самой системы наблюдения за ними
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237358
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCэто VBA так считает. Чем-то мои лонги не понравились...
То, что считает какой-то VBA никому неинтересно. Гораздо интереснее мнение того, кто эти
данные присылает. Конкретнее - диапазон генерируемых значений.

underCС частотой поступления тиков все это предварительно считаемое добро участвует в
последующей математике системы принятия решения.
То есть принятие решения осуществляется на каждое поступление новых данных, 500 раз в секунду?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237427
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня был один простой вопрос - уважаемые спецы по Си, как вам видится мой алгоритм и получу ли я ожидаемую (в пределах +- трамвайная остановка) скорострельность.

Спасибо всем явно или косвено подтвердивших работоспособность алгоритма и особенно тем, кто не поленился и смоделировал. Vladimir Baskakov , m_Sla - снкс. Спасибо остальным за высказанные идеи и ориентиры на будущее.

Осталось два простых вопроса. Их, к сожалению, залистали:

- как передать в длл массив значений разом вместо нескольких параметров , и

- как получить из нее так же массив значений, вместо нескольких вызовов .

Dimitry Sibiryakov,
* Гораздо интереснее мнение того, кто эти данные присылает
Уточни, плз, что имеется ввиду?

Если только это:
* Конкретнее - диапазон генерируемых значений.
то датчиками генрируется абстракщина, понятия не имею. А на выходе из API - лонги любого знака. Порядок величин - 10^5, не более. За исключением моего собственного сквозного таймштемпа, который я проставляю с точностью 100 мксек. Так что у него порядок до 10^9.

авторТо есть принятие решения осуществляется на каждое поступление новых данных, 500 раз в секунду?Я оценил сарказм. Позволь и мне?

Не поверишь - именно так. 500 раз в секунду и даже с большей частотой оператор сидит ровно на заднице и не подпрыгивает к пультам, а принимает, и принимает и снова принимает решение сидеть так же ровно и дальше . И лишь несколько раз в день он отрывает тохес от стула потому что загорается большая красная лампочка. Сказать почему она загорается? В частности потому, что 500 раз в секунду считается (среди прочего) минмакс.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237468
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCНе поверишь - именно так. 500 раз в секунду и даже с большей частотой оператор сидит ровно на заднице и не подпрыгивает к пультам, а принимает, и принимает и снова принимает решение сидеть так же ровно и дальше . И лишь несколько раз в день он отрывает тохес от стула потому что загорается большая красная лампочка. Сказать почему она загорается? В частности потому, что 500 раз в секунду считается (среди прочего) минмакс.
Я сильно сомневаюсь что ваша SCADA или АСУТП может требовать
от человека-оператора требовать реакции с частотой 500 Гц. Субъективно
люди зрением видят изменяюшуюся картинку с частотой 10 Гц а принимают
решение с лагом еще большим.

Поэтому в твоём случае буферизировать данные можно сколь угодно быстро.
Но аналитику по ней гонять 10 раз в секунду. Оно и будет ладненько. Я готов спорить
на ящик коньяку что разница между 500 Гц-ным замером и 10 Гц-ным на практике
не будет заметна. Тем более что скользящие значения не будут изменяться
быстро.

Они в ПРИНЦИПЕ быстро не могут скакнуть. Окно не позволит.

Прыгать щас через ж...пу и включать хардварные расчёты на Cuda-х
и прочих железяках только по тому что чел. который ставил задание
слабо себе понимал разницу между частотой выборки и частотой
ПРИНЯТИЯ РЕШЕНИЯ явно не стоит.

Ну вот ... в таком вот аспекте. n'est-ce pas?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237491
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCдатчиками генрируется абстракщина, понятия не имею.
А ты поинтересуйся. Потому что если диапазон значений невелик и разброс - тоже, то
быстрейшим способом получить экстремумы будет массив счётчиков значений. Как тебе уже сказали.

underCЯ оценил сарказм. Позволь и мне?
Не позволю. Потому что это не был сарказм. Я знаю что такое ИИ и системы принятия решений.
Если их алгоритмы должны работать в реальном времени, на каждую порцию данных, тогда - да,
min/max надо считать при занесении данных в буфер. Если они работают реже чтобы не дёргать
зазря исполнительные цепи из-за кратковременных выбросов - нет смысла мучить сборщика данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237527
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
//------------------------------------------------------------
struct channel
{
    uint32_t *data;
    uint32_t data_size;
    uint32_t max;
    uint32_t min;
};
//------------------------------------------------------------
void find_max_min(channel *c)
{
    c->max=0;
    c->min=0xffffffff;

    for(uint32_t i=0;i<c->data_size;i++)
    {
        if(c->data[i] > c->max) c->max = c->data[i];
        if(c->data[i] < c->min) c->min = c->data[i];
    }
}
//------------------------------------------------------------
int main()
{
    channel channel1;
    channel1.data_size=10000;
    channel1.data=new uint32_t[10000];
    
    find_max_min(&channel1);
    std::cout<<"max="<<channel1.max<<std::endl;
    std::cout<<"min="<<channel1.min<<std::endl;

    return 0;
}

...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237739
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоэтому в твоём случае буферизировать данные можно сколь угодно быстро.
Но аналитику по ней гонять 10 раз в секунду.


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

Но это пока не нужна кумулятивная статистика по нескольким потокам на разных процах.
Вот ее уже можно собирать из счетчиков разных нитей раз в 10 сек, или даже реже
вобщем с дисткретностью, с которой оператор может поднять свой тухес.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237768
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЯ сильно сомневаюсь [...] Ну вот ... в таком вот аспекте. n'est-ce pas?
mayton , c'est tout. В смысле - pourquoi cure l'accordeon? ;)

Ну зачем же так серьезно о метафоре, тем более анонсированной как сарказм в ответ на сарказм :)

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

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

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

Вот все это в комплексе и определеят мое нежелание избавиться от избыточности как самих собираемых данных, так и аналитики, проводимой над ними.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237805
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovunderCдатчиками генрируется абстракщина, понятия не имею.А ты поинтересуйся. Потому что если диапазон значений невелик и разброс - тоже, то быстрейшим способом получить экстремумы будет массив счётчиков значений. Как тебе уже сказали.Может в этом и есть сермяжная правда. Но ведь таким образом ты меня подталкиваешь к написанию собственного API, а это не есть гуд. Сырые данные с датчиков... гальванические развязки, калибровки, шумы... Ты это все серьезно?

Dimitry SibiryakovunderCЯ оценил сарказм. Позволь и мне?Не позволю. Потому что это не был сарказм. Я знаю что такое ИИ и системы принятия решений.
Если их алгоритмы должны работать в реальном времени, на каждую порцию данных, тогда - да, min/max надо считать при занесении данных в буфер. Если они работают реже чтобы не дёргать зазря исполнительные цепи из-за кратковременных выбросов - нет смысла мучить сборщика данных.
* Не позволю.
Ну, я ужЕ, сорри :)

* Я знаю что такое [...]
Ну, я про себя так не скажу. А вот очередной притчей поделюсь. Про восходящие(!) стадии становления философа:

- Я знаю, что я знаю.
- Я знаю, что мало знаю.
- Я знаю, что ничего не знаю (это уже на смертном одре).

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

Я не могу понять, почему нельзя просто принять на веру мое "надо"? Даже если это просто мой каприз. Даже, если это просто дурость. Помогите разобраться с этим гребаным Си, и не учите меня жить ;)

Я ведь говорил уже - да часть информации избыточна и мои требования к системе тоже. Но это ведь только стадия если не разработки, но все еще обкатки. Пока есть запас прочности (а замеры мужиков выше это подтверждают) - надо делать в самой простой модели, соответствующей моему низкому скиллу в Си . Вот когда заработает и станет это узким местом - вот тогда и вернемся к вопросу.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237880
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCЕсли же наблюдаемые процессы безынерционны и, более того, склонны мгновенно менять знак (вектор) на противоположный, то мувинги будут совсем даже во вред. И вот отслеживание этой точки перелома есть одна из основных задач данной, простите, задачи :) На передний план выходит фильтрация шума (естественных смен знака).

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



underCВот все это в комплексе и определеят мое нежелание избавиться от избыточности как самих собираемых данных, так и аналитики, проводимой над ними.


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

НО за все нужно платить, вам нужно найти баланс избыточности и скорости обработки.

что бы не пропустить момент
underC"... если боевое дежурство приведо к последствиям, во избежание которых оно назначено..."


А то иногда бывает, что за деревьями леса не видно.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237887
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCМожет в этом и есть сермяжная правда. Но ведь таким образом ты меня
подталкиваешь к написанию собственного API, а это не есть гуд. Сырые данные с датчиков...
гальванические развязки, калибровки, шумы... Ты это все серьезно?
Какие развязки, какие калибровки, какое, нафиг, собственное API? Я тебе предлагаю
разобраться с тем, что в твоей системе на входе. Чтобы точнее определить технические
требования. И тем самым расширить диапазон возможных решений.

Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме
как сканировать весь твой массив раз за разом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237890
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyVladimir Baskakov почему сишный код из под GCC 3-4-5 работает медленнее джавского (6)?
почему миллион циклов по 10000 сравнений выполняется 43522 условных милисекунды?
не расстроен - удивлен....
А шо ж вы в джаве не сделали миллион циклов по 10000, а всего 1.
Сделайте - тогда будете расстроены
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
 for (j=1;j<1000000;j++){
		   double min,max;
		   min=0; max=0;
		   for (i=0; i<10000; i++) {
				  if (a[i] < min) {min=a[i];}
				  if (a[i] > max) {max=a[i];}
		   }
		   
	   }


ну не миллион. ну ну один меньше. или я что-то путаю((((
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237896
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как происходит считывание данных. программа куда-то заглядывает постоянно, и если там что-то есть - запускает обработчик?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237915
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla, спасибо за код, но я в некоторых непонятках.
m_Sla
Код: 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.
//------------------------------------------------------------
struct channel
{
    uint32_t *data;
    uint32_t data_size;
    uint32_t max;
    uint32_t min;
};
//------------------------------------------------------------
void find_max_min(channel *c)
{
    c->max=0;
    c->min=0xffffffff;

    for(uint32_t i=0;i<c->data_size;i++)
    {
        if(c->data[i] > c->max) c->max = c->data[i];
        if(c->data[i] < c->min) c->min = c->data[i];
    }
}
//------------------------------------------------------------
int main()
{
    channel channel1;
    channel1.data_size=10000;
    channel1.data=new uint32_t[10000];
    
    find_max_min(&channel1);
    std::cout<<"max="<<channel1.max<<std::endl;
    std::cout<<"min="<<channel1.min<<std::endl;

    return 0;
}


1. Если я правильно понимаю, то структуры в C++, это как пользовательские типы в VBA. Но это ведь имеет смысл, если участвуют данные разных типов, а у меня ведь все лонги.

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

Повторюсь (уточню). В длл я должен передать вновь поступившие показания нескольких датчиков. Они (по твоему коду) будут сохранены в массивах data (у тебя он один, но можно добавить ему измерение). Сейчас я передаю их параметрами, а хотелось бы - массивом. Или типом, т.к. из VBA, чтобы он был проинтерпретирован внутри как структура.

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

Правильно я понимаю, что невозможно передать из VBA в сишную длл параметр по ссылке? Чтобы в VBA этот параметр отразил модифицированное внутри длл его значение.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237943
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov[
Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме
как сканировать весь твой массив раз за разом.


Решение есть , Майтон там вроде предлагал дерево.
У которого с одного конца будет макс , с другого мин.

Какой профит будет получен от дерева , зависит от отношения размера
всей записи с параметром к размеру самого параметра измерения.
Чем больше разница , тем больше будет профита от дерева.

Есть массив записей рядом есть некий мап ( дерево) ,
в котором хранится значение параметра и индекс в массиве записей.

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

На вставку в мап значения придется потратить некие ресурсы.
Зато это потом развяжет руки в алгоритмике расчета необходимости перемещения тухеса.

Приблизительно так.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237945
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Baskakovа как происходит считывание данных. программа куда-то заглядывает постоянно, и если там что-то есть - запускает обработчик?Все построено на событиях класса. API предоставляет несколько классов, один из которых дает события - датчик такой-то, значение такое-то, ну и еще некую сопроводиловку. А уж что там внутри API - хз. Наверное он как-то сам опрашивает их, или они сами что-то генерят, хз...

Датчики цепляются к черному ящику (или к репитерам, если длинный шланг), ящик через COM, LPT, USB и еще какую-то хрень (любой единственный, на выбор) - к компу или к серверу.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38237946
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovну не миллион. ну ну один меньше. или я что-то путаю((((
Вы не туда смотрите.
Посмотрите на ваш код на джаве. Там совсем другое число итераций внешнего и внутреннего цикла, чем в коде на С++.
Чтобы сравнивать код на двух языках, нужно чтобы они делали одно и то же.
И причем достаточно долго, т.к. для мелкой задачи погрешность измерения может быть сравнима со временем работы, или даже существенно превышать его.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238114
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаР , спасибо за поддержку, что концептуально я смотрю в правильном направлении.

2ALL , с минмаксами в сегодняшнем варианте мы разобрались и сделали наметки на будущее. Спасибо всем.

Щаз другая задача - как эффективно передать в длл новые значения и получить обратно расчеты?
Сейчас длл выглядит так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int i, iNew[4], iClc[6]; 

//	+-----------------------------------------------------------------
//	| New values calc
//	+-----------------------------------------------------------------
_DLLAPI int __stdcall fn_MA_New(int &pA, int &pB, int &pC)
{
    iNew[1] = pA; iNew[2] = pB; iNew[3] = pC; 
    for(i = 1; i < 4; i++) {iClc[i] = iNew[1] * i;} // здесь и ниже абстрактные вычисления
    iClc[4] = (iClc[2] +  iClc[3]) / 2;
    iClc[5] = (iClc[3] -  iClc[1]) * 2;
return(0);
}

//	+-----------------------------------------------------------------
//	| Calc return
//	+-----------------------------------------------------------------
_DLLAPI int __stdcall fn_MA_Clc(int &pPar)
{
return(iClc[pPAr]);
}


Вызов из VBA выглядит так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Declare Function fn_MA_New Lib "C:\MaNC.dll" Alias "_fn_MA_New@8" _
                    (pA&, pB&, pC&) As Long
Private Declare Function fn_MA_Clc Lib "C:\MaNC.dll" Alias "_fn_MA_Clc@8" _
                    (pPar&) As Long 
Sub sb_NewData()
Dim i&, lNew&(1 to 3), lClc&(1 to 5)
    For i = 1 to 3 ' получение новых значений
        lNew(i) = i
    Next
    Call fn_MA_New(lNew(1), lNew(2), lNew(3)) ' передача новых значений к расчету

    For i = 1 to 5 ' получение результатов расчетов
        lClc(i) fn_MA_Clc(i)
    Next
End Sub


Возможно ли вместо отдельных параметров передавать в длл массив новых значений и обратно получить не поштучно, а массивом же?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238149
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underC ДохтаР , спасибо за поддержку, что концептуально я смотрю в правильном направлении.


Всегда пожалуйств :)

underCЩаз другая задача - как эффективно передать в длл новые значения и получить обратно расчеты?
Возможно ли вместо отдельных параметров передавать в длл массив новых значений и обратно получить не поштучно, а массивом же?

Ты же сишник, :)
Передай в функцию адрес массива в куче и размер.

зы Тока мой тебе совет , не рисуй лапшекода с выделением памяти в приложении
и удалением в библиотеке и наоборот.
Выделил память в библиотеке , удаляй в билиотеке, выделил в приложении удаляй там же.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238187
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРDimitry Sibiryakov[
Но, конечно, раз уж ты решил удариться в экстремизм, то нету у тебя другого выбора кроме
как сканировать весь твой массив раз за разом.


Решение есть , Майтон там вроде предлагал дерево.
У которого с одного конца будет макс , с другого мин.

Учитывая постоянные inserts/deletes в дерево оно будет переживать
бешеные перебалансировки. Здесь нужно хорошо подумать. Вроде
как получили профит на поиске минимакса но просадили общее
время фиксации тразнакции.

Кстати в топике не зря спрашивали про разрядность. Если она не велика
то после записи возможно датчик будет показывать одинаковые значения
длительное время. На этом можно сыграть и сжимать поток измерений.
Получится что-то вроде RLE в котором искать минимаксы будет
быстрее.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238199
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДохтаРТы же сишник, :)
Передай в функцию адрес массива в куче и размер.

зы Тока мой тебе совет , не рисуй лапшекода с выделением памяти в приложении
и удалением в библиотеке и наоборот.
Выделил память в библиотеке , удаляй в билиотеке, выделил в приложении удаляй там же.Да какой я сишник... Я на него, как баран на новые ворота смотрю. Вот из первого же поста:автор** C++ почти не знаю. Допиливаю чужую заготовку.Я по VBA в основном и БД :(
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДохтаРТы же сишник, :)
Нет, он VBA-шник и писал, что С видит первый раз в жизни.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238228
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton... после записи возможно датчик будет показывать одинаковые значения
длительное время.
Практически не бывает. Дребезг, шум постоянный. Как раз настораживает - когда прямая достаточно протяженная линия, ну, типа больше 10-20 отсчетов.

Когда с API-шниками был внятный контакт, с ними вроде вели разговоры о модернизации входных фильтров и доступа к их тонким настройкам. Но воз так там и остался. А сейчас они вообще в эту сторону не смотрят. Страый продукт, разрабы давно поувольнялись-поумирали. Пишите, говорят сами, после API и скажите спасибо, что вообще еще все работает.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что дреберг ортогонален к функциям управления или принятия решений.
Ну тоесть если идут подряд значения типа: 127,128,127,128,... то можно
как-то принять решение об использовании простого ФНЧ. Ну тоесть мы
сами примем решение о том что есть собственно полезный сигнал F1
(обычно гладкий, низкочастотный) и есть какой-то шум F2 который
(дребезжит и фонит на высоких частотах) но на принятие решения
никак не влияет.

Здесь я советов давать не могу это надо как-то самому решить на основе
знаний об измеряемом объекте.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238374
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что дреберг ортогонален к функциям управления или принятия решений.
Ну тоесть если идут подряд значения типа: 127,128,127,128,... то можно
как-то принять решение об использовании простого ФНЧ. Ну тоесть мы
сами примем решение о том что есть собственно полезный сигнал F1
(обычно гладкий, низкочастотный) и есть какой-то шум F2 который
(дребезжит и фонит на высоких частотах) но на принятие решения
никак не влияет.

Здесь я советов давать не могу это надо как-то самому решить на основе
знаний об измеряемом объекте.

Не ортогонален, дребезг, его амплитуда и частота,
может влиять на средюю температуру по больнице.


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

А то получится как я раньше говорил , что за деревьями леса не видно.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238413
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какая разница, аппаратный он или программный? В данной постановке - всё равно.
Аппаратный - ну просто улучшенная оптимизация. Может он вообще на аналоговой
электронике будет собран. Но смысл то один.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238425
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
underCmayton... после записи возможно датчик будет показывать одинаковые значения
длительное время.
Практически не бывает. Дребезг, шум постоянный. Как раз настораживает - когда прямая достаточно протяженная линия, ну, типа больше 10-20 отсчетов.



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

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

автор"... если боевое дежурство приведо к последствиям, во избежание которых оно назначено..."


Показания которые вы меряете, уже есть недостоверными , нужно искать их причину .
Я бы причину сбросли на поставщиков датчиков и прочей аппаратной требухи,
повесив оператору лампочку "Обнаружены недостоверные показания КИП "
Важно математически формально точно
обосновать принятие решения о достоверности- недостоверности значений,
которые к вам поступают.
.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238433
ДохтаР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА какая разница, аппаратный он или программный? В данной постановке - всё равно.
Аппаратный - ну просто улучшенная оптимизация. Может он вообще на аналоговой
электронике будет собран. Но смысл то один.

Смысл одни , а затраты разные.
Купить в Китае чипов по доллару за килограм с поствкой за месяц,
или потратить пару человеко лет на програмирование от отладку смарт релюшки
которая зажигает лампочку "Срочно поднять тухес".
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238470
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Type input_data
    sensor(1 To 10) As Long ' десять датчиков
End Type

Type output_data
    max(1 To 10) As Long
    min(1 To 10) As Long
End Type

Declare Sub SomeFunction Lib "y:\simpledll.dll" Alias "SomeFunction@12" (i As input_data, o As output_data, l As Long)

Sub test()

Dim i As input_data
Dim o As output_data
Dim l As Long

l = 10  
For k = 1 To 10
    i.sensor(k) = k ' заполняем для теста
Next

Call SomeFunction(i, o, l)

End Sub


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//тестовая функция
void DLL_EXPORT CALLBACK SomeFunction(long *input, long *output, long *len)
{
    for(int i=0;i<*len;i++)
    {
        output[i]=10*input[i]; //max = 10 * показание датчика
        output[i + *len]=100*input[i];//min = 100 * показание датчика
    }
}

...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238504
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vromanovunderC,
1) Бъем очередь на сегменты. например, на 100.
2) на каждом сегменте храним время старта и стопа, считаем мин, макс, среднее.
3) при добавлении/удалении значения пересчитываем только значения в блоке.
4) Когда блок покидает или добавляется пересчитываются общие значения

Еще одна оптимизация. При обычном поиске мин/макс в массиве делается два сравнения на элемент. Можно делать так, берем два значения из массива. сравниваем их между собой, а потом максимальный сравниваем с макс и меньший с мин. Итого получается 1.5 сравнения на элемент. Ускорение на 25%

циклическая очередь, сделанная по этому принципу периваривает 1 млн случайных чисел за 78 мс
- Так ли сильно нужны деревья (в данном случае)?


Код: java
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
import java.util.Random;

public class numtest {
   public class CycleQueue {
	   //очередь
	   double[] a;
	   int write_point;
	   int count;
	   int block_size,block_count;
	   boolean first_cycle;
	   
	   boolean global_is_min_max;
	   double global_min;
	   double global_max;
	   double global_sum;
	   	   
	   // для каждого блока в 100 чисел - локальный минимакс 
	   double[] loc_min;
	   double[] loc_max;
	   boolean[] is_min_max;
	   double[] loc_sum;
	   
	   
	   public CycleQueue(int p_block_size, int p_block_count) {
		 write_point=0;
		 block_size= p_block_size;
		 block_count =p_block_count;
		 a=new double[block_size*block_count+10];
		 loc_min=new double[block_count+2];
		 loc_max=new double[block_count+2];
		 loc_sum=new double[block_count+2];
		 is_min_max=new boolean[block_count+2];
		 first_cycle=true;

		 global_is_min_max=false;
		 global_min=0;
		 global_max=0;
		 global_sum=0;
		 
		 write_point=0;
		 count=0;
		 for (int i=0 ; i<block_count; i++){
			   is_min_max[i]=false;
			   loc_min[i]=0;
			   loc_max[i]=0;
		 }
	   }
	   
	   public void PutNum (double n) {
		 int block_no=write_point / block_size;
		// System.out.println(block_no);
		 // проверим, не совпадает ли затираемое с минимаксом
		 boolean do_recalc_minmax=(!first_cycle) &&
			 (a[write_point]==loc_min[block_no] || 
			  a[write_point]==loc_max[block_no] );
		 
		 //если затираем старое значение - выкинем из суммы по блоку
		 if (!first_cycle) {
			  loc_sum[block_no]-=a[write_point];
			  global_sum-=a[write_point];
			  }
		 a[write_point]=n;
		 
		 loc_sum[block_no]+=n;
		 global_sum+=n;
		 
		 boolean local_extremum_changed=false;
		 
		 // минимакс по блоку не считался
		 if (!is_min_max[block_no]) {
			 is_min_max[block_no]=true; 
			 loc_min[block_no]=n;
			 loc_max[block_no]=n;
			 local_extremum_changed=true;
		 }
		
		 // локальный экстремум не затерт
		 if (!do_recalc_minmax) {
			    if (n<loc_min[block_no]) {
				      loc_min[block_no]=n;
				      local_extremum_changed=true;
				   }
			    if (n>loc_max[block_no]) {
				      loc_max[block_no]=n;
				      local_extremum_changed=true;
				   }
		 } else {
			    // минимакс блока затерт, пересчитаем
				int from=block_no*block_size;
				int to=block_no*block_size+1;
				//Блок заполнен не полностью?
				if (to>count-1) {to=count-1;};
				double mn=a[from];
				double mx=a[from];
				for (int i=from;i<=to; i++) {
					if (a[i]<mn) mn=a[i];
					if (a[i]<mx) mx=a[i];
				}
				
  		        local_extremum_changed=
  		        	loc_max[block_no]!=mx ||
				    loc_min[block_no]!=mn;
				loc_max[block_no]=mx;
				loc_min[block_no]=mn;
		 }
		 
		 // если поменялся экстремум блока, пропишем его в глобальный
		 if (local_extremum_changed) {
			// минимакса не было 
			if (!global_is_min_max) {
				global_is_min_max=true;
				global_min=loc_min[block_no];
				global_max=loc_max[block_no];
			} 
			if (loc_min[block_no]<global_min) {
				global_min=loc_min[block_no];
			}
			if (loc_max[block_no]>global_max) {
				global_max=loc_max[block_no];
			}
		 }
		 if (write_point==block_size*block_count-1) 
		   {write_point= 0; 
		    first_cycle=false;
		   } 
		 else write_point++;
		 
		 if (count<block_size*block_count) count++; 
	   }
	   
   }
   
   void Test() {	   
	   Random gen=new Random();
	   CycleQueue q=new CycleQueue(100,100);
	   
	   long t_strt=System.currentTimeMillis();
	   for (int i=0;i<1000000;i++)
	     {q.PutNum(gen.nextDouble());
		   
	     }
	   System.out.print((System.currentTimeMillis()-t_strt));
	   double s=0;
	   double mn=0;
	   double mx=0;
	   mn=q.a[0];
	   mx=q.a[0];
	   for(int i=0; i<q.count; i++) {
		   s+=q.a[i];
		   if (mn>q.a[i]) mn=q.a[i];
		   if (mx<q.a[i]) mx=q.a[i];
	   };
	   System.out.print("\n Сумма ");
	   System.out.print(q.global_sum);
	   
	   double s1=0;
	   for(int i=0; i<q.block_count; i++) {
		   s1+=q.loc_sum[i];
	   }
	   System.out.print("\n Сумма1 ");
	   System.out.print(s1);

	   System.out.print("\n Сумма пересч ");
	   System.out.print(s);

	   System.out.print("\n Макс ");
	   System.out.print(q.global_max);

	   System.out.print("\n Макс пересч");
	   System.out.print(mx);

	   System.out.print("\n Мin ");
	   System.out.print(q.global_min);

	   System.out.print("\n Мin пересч");
	   System.out.print(mn);
	   
   }
   
   static public void main(String[] argv) {
	     
	   numtest n=new numtest();
	   n.Test();
	   
   }
}

...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238550
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из ВБА вызывается с-шная DLL, и туда надо скормить массив.
А где был этот массив до скармливания. Случайно не в базе ACCESS?
может SELECT min(...) FROM ....
Спасет радикально? От си-шной DLL c деревьями. А то я подозреваю, что время крохами экономится на работе с массивами в С++ и щедро разбрасывается внутри других подсистем...
ВБА - он же чистейше интерпретируемый?
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238560
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla , большое спасибо за код 14225120 . Беру таймаут на реализацию. Позже отпишусь.
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38238635
underC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir BaskakovИз ВБА вызывается с-шная DLL, и туда надо скормить массив.
А где был этот массив до скармливания. Случайно не в базе ACCESS?
может SELECT min(...) FROM ....
Нет. Совсем наоборот. В рекордсеты попадают уже обсчитанные данные. Приходит тик. Все считается, отображается и лишь последним шагом - в рекордсет. И то - через буфер длиной 100-200 записей (короткий, чтобы не бояться за потерю если что). Слив в рекордсет только по заполнении буфера. А все статистические ф-ции DMax, DMin и пр. что в Аксовом SQL, что под чистым VBA - тормоза дичайшие. Да и не доходит до "SELECT ..." дело :)

Vladimir BaskakovСпасет радикально? От си-шной DLL c деревьями. А то я подозреваю, что время крохами экономится на работе с массивами в С++ и щедро разбрасывается внутри других подсистем... ВБА - он же чистейше интерпретируемый?
Радикально - кончено же нет. Но должен же быть выигрыш. По крайней мере, когда предыдущая математика была вынесена в длл, производительность поднялась (по памяти) с 10-20 до 70-80 тыс записей в сек (это на круг, со всей требухой).

Алгоритм мы все хором утвердили. Под VBA он работает уже известно как. m_Sla дал сишную заготовку. Вот реализую, сравню и отпишусь.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поиск Min-Max в стеке FIFO
    #38779703
staya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странные все какие-то. В условиях было сказано, что главный критерий - быстродействие. Ограничений на память нет в условиях.
Тогда проще и быстрее всего вести параллельно еще два стека - для хранения текущих максимумов и минимумов.
Pop и Push в эти стеки делаются одновременно с pop и push в основной стек. Если известен предыдущий max и min, очевидно, что при Push-е легко вычислить текущий.
Для получения текущего max и min берется верхнее значение соответствующего стека.

Нагородили деревьев и сортировок...
...
Рейтинг: 0 / 0
Поиск Min-Max в стеке FIFO
    #38779792
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С новым годом.
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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