V>Здравствуйте, BAC, Вы писали:
BAC>>Здравствуйте, vadimcher, спасибо за участие. течение моих мыслей совпадает с Вашими. Это радует, ибо вероятность ошибки минимируется.
BAC>>Первый метод — динамический список он же впринципе wfq алгоритм. оптимален по использованию памяти, но памяти море. Но я бы предпочел второй метод, потому что считать очередь нужно только один раз. Параметр тика тоже. Конфликтные ситуации возникают только один раз, при создании списка. Если некоторые элементы становятся инактивными, то придётся список создавать заново — в динамическом списке это лучше решено.
V>В динамическом списке даже более того, автоматически решен такой случай, например, когда само считанное значение параметра может влиять на периодичность считывания. Вот представь, что у тебя есть унимодальная функция ("колокол"). Ты считываешь значение параметра по x и вычисляешь по этой функции значение параметра по y. На концах (при малых и больших x) значение функции от x зависит слабо. Т.е. если тебе нужен y с заданной точностью, то при получении очередного x на концах, если x меняется непрерывно по времени и с ограниченной скоростью, можно увеличить время до следующего считывания, однако если x лежит близко к пику функции, то малейшие изменения x могут приводить к большим изменениям y, т.е. x надо считывать чаще. Это такой частный случай, который, возможно, не имеет отношения к твоей задаче, но это просто как пример. У тебя в примере другой случай -- когда список параметров меняется.
BAC>>планирую решить так:
BAC>>задаю параметры по приоритетам группами (стэтик эррэй). для удобства я буду называть параметры каждой группы другой буквой. для упрощения беру три группы по три параметра. BAC>>Г2 ( А1, А2, А3 ). BAC>>Г1 ( Б1, Б2, Б3 ). BAC>>Г0 ( В1, В2, В3 ). BAC>>частота считывания зависит от индекса группы: 2^индекс. Г2 считывается в два раза чаще чем Г1, например. BAC>>формирую из каждого списка список на максимальный период. тоесть максимальный период Г0 потому список без изменений. BAC>>Г0" ( В1, В2, В3 ). BAC>>Г1" ( Б1, Б2, Б3, Б1, Б2, Б3 ). BAC>>Г2" ( А1, А2, А3, А1, А2, А3, А1, А2, А3, А1, А2, А3 ). BAC>>Теперь расчитываю для каждого параметра фазовый сдвиг для каждой группы : BAC>>( 1/(колличество элементов) ) * индекс элемента. Запишу для примера сдвиг в скобках с точностью два знака после запятой. BAC>>Г0" ( В1(.33), В2(.66), В3(.99) ). BAC>>Г1" ( Б1(.16), Б2(.32), Б3(.48), Б1(.64), Б2(.80), Б3(.96) ). BAC>>Г2" ( А1(.08), А2(.16), А3(.24), А1(.32), А2(.40), А3(.48), А1(.56), А2(.64), А3(.72), А1(.80), А2(.88), А3(.96) ). BAC>>теперь я обьединяю все три множества используя подобие бинарного поиска. внедряю поэлементно одно множество в другое. Конфликтные ситуации есть уже в примере. ну чтож, решаем.
V>Ну тут у тебя существенное облегчение задачи. Сделай так. Пусть нулевая группа обновляется каждые s тиков, т.е. если в ней n0 параметров, то расстояние между ними равно s/n0. Тогда параметры первой группы должны обновляться каждые s/2 тиков. Если их там n1, то расстояние между ними s/2n1. В твоем примере n0=n1. В этом случае смещение для первой группы выбирается так, что первый элемент стоит на 1:3 между соседними элементами нулевой группы (второй будет стоять на 3:1 и т.д.). Если ты можешь поделить группы на равное число элементов, то так их и надо расставлять. Если же не можешь, то надо искать НОК(n0,n1,...) и расставлять так, что твои арифметические прогрессии в этом кольце вычетов не пересекаются.