powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO
22 сообщений из 72, страница 3 из 3
Поиск 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
22 сообщений из 72, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Поиск Min-Max в стеке FIFO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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