У меня есть QMap<int, MyData>
, где ключ - это адрес регистра Modbus, а MyData
- моя собственная структура, содержащая некоторую информацию, не важную для этого вопроса.
Набор ключей может быть довольно большим(скажем 2000 значений) с некоторыми из них закрывают друг друга.Например:
1, 2, 3, 4, 7, 23, 24, 25, 40, 41, 43, ...
Моя цель - получить QList<QPair<int,int>>
, где элементы класса QPair
представляют собой нижнюю и верхнюю границы каждого запроса Modbus, который я отправлю.Этот список должен быть оптимизирован для объединения последовательных значений или значений, «очень близких» друг другу.Это должно уменьшить количество запросов Modbus с компромиссом с количеством запрошенных данных.
В приведенном выше примере я хотел бы:
[1, 7], [23, 25], [40, 43]
Я собираюсь установитьпара ограничений, чтобы дать вес для каждого запроса.Запрос данных с адреса с 1 по 7 стоит от 1 до 4, а затем только 7, но это не так, если 7 было 16 ... Еще одним ограничением является максимальная длина одного запроса: даже если есть много последовательныхадреса, которые они должны быть разбиты на сегменты длиной N.
Я спрашиваю некоторые рекомендации, как подходить к такой проблеме.
Что я думал до сих пор.Создайте второй массив с разницей между элементом x и x-1:
1, 2, 3, 4, 7, 23, 24, 25, 40, 41, 43, ...
1, 1, 1, 3, 16, 1, 1, 15, 1, 2, ...
Затем отсканируйте этот массив и найдите любое число ниже «порога веса» (скажем, 4) и создайте первый QPair
список, включающий эти адреса:
[1, 7], [23, 25], [40, 43]
Наконец, проверьте длину каждой пары и, если она превышает максимально допустимое значение, разделите ее.
Считаете ли вы разумным подход?Есть какой-нибудь известный алгоритм, который мог бы здесь соответствовать?QMap
- хороший выбор?Я использовал это, потому что я собираюсь испустить сигнал, когда я получу каждое значение от Modbus следующим образом:
void dataReceived(int address, quint16 value);
, следовательно, было бы очень легко получить связанный MyData
.