Algorithm 将数字集拆分为尽可能少的已定义“的子集”;间隔长度“;算法

Algorithm 将数字集拆分为尽可能少的已定义“的子集”;间隔长度“;算法,algorithm,math,modbus,Algorithm,Math,Modbus,假设我有一些数字。例如{1,2,3,7,8,9,11,15,16}。我需要的是将此集合拆分为尽可能少的子集,并且最低和最高数字之间的差值小于9。 根据我的示例集,它将是例如: {1,2,3,7,8},{9,11,15,16} 我需要它来优化通过Modbus的“读取多个寄存器”请求的数量。 我已经尝试将集合拆分为具有连续数字的子集,然后合并它们,但这并不理想,因为它会返回以下结果: {1,2,3},{7,8,9,11},{15,16}或{1,2,3},{7,8,9},{11,15,16} 正如您所

假设我有一些数字。例如{1,2,3,7,8,9,11,15,16}。我需要的是将此集合拆分为尽可能少的子集,并且最低和最高数字之间的差值小于9。
根据我的示例集,它将是例如:
{1,2,3,7,8},{9,11,15,16}
我需要它来优化通过Modbus的“读取多个寄存器”请求的数量。
我已经尝试将集合拆分为具有连续数字的子集,然后合并它们,但这并不理想,因为它会返回以下结果:
{1,2,3},{7,8,9,11},{15,16}或{1,2,3},{7,8,9},{11,15,16}
正如您所见,这种方法为我提供了三个子集,而不是两个子集。
有什么可用的算法吗?

谢谢

贪婪方法如何,即从左侧将元素插入到集合中,当您查看所需的差异时,创建一个新集合

因此,对于
1,2,3,7,8,9,11,15,16

你可以从1开始。
2-1=1<9,因此添加2。
3-1=2<9,因此添加3。
7-1=6<9,因此添加7。
8-1=7<9,所以加上8。
9-1=8<9,因此添加9。
11-1=10>9,因此创建一个新集合。
15-11=4<9,所以加上15。
16-11=5<9,所以加上16

输出:
{1,2,3,7,8,9},{11,15,16}

注意:

如果元素不一定是有序的,我们可以简单地先对它们进行排序

如果这些子集不一定是连续的,那也没什么区别,因为从有序输入中选择连续集总是比选择非连续集好

如果元素不一定是有序的,并且子集必须是连续的,这将稍微改变问题

最优性证明:

设S为该算法对任意输入产生的集合赋值

取任意一组赋值T

设Si为S的第i组。
设Ti为T的第i组

设Si size为第i组S的大小。
设Ti size为第i组T的大小

假设S和T不同,那么对于某些Si和Ti,Si尺寸!=钛尺寸。具体选择第一组
i
,其中两组不同

因此,要么Si尺寸>Ti尺寸,要么Si尺寸 j>i是不可能的,因为该算法从一开始就尽可能多地使用元素

如果j 现在,由于上述原因,Si+2的第一个元素将类似地大于Ti+2的第一个元素,因此Si+2将至少包括Ti+2的所有元素,而Ti+2的所有元素尚未包括在之前的S组中。对于其余的S组和T组,情况类似。因此,T组中的集合至少与S组中的集合一样多


因此,该算法产生的集合赋值不会比任何其他赋值更差。因此,它是最优的。

贪婪方法如何,即从左侧将元素插入到集合中,当您查看所需的差异时,创建一个新集合

因此,对于
1,2,3,7,8,9,11,15,16

你可以从1开始。
2-1=1<9,因此添加2。
3-1=2<9,因此添加3。
7-1=6<9,因此添加7。
8-1=7<9,所以加上8。
9-1=8<9,因此添加9。
11-1=10>9,因此创建一个新集合。
15-11=4<9,所以加上15。
16-11=5<9,所以加上16

输出:
{1,2,3,7,8,9},{11,15,16}

注意:

如果元素不一定是有序的,我们可以简单地先对它们进行排序

如果这些子集不一定是连续的,那也没什么区别,因为从有序输入中选择连续集总是比选择非连续集好

如果元素不一定是有序的,并且子集必须是连续的,这将稍微改变问题

最优性证明:

设S为该算法对任意输入产生的集合赋值

取任意一组赋值T

设Si为S的第i组。
设Ti为T的第i组

设Si size为第i组S的大小。
设Ti size为第i组T的大小

假设S和T不同,那么对于某些Si和Ti,Si尺寸!=钛尺寸。具体选择第一组
i
,其中两组不同

因此,要么Si尺寸>Ti尺寸,要么Si尺寸 j>i是不可能的,因为该算法从一开始就尽可能多地使用元素

如果j 现在,由于上述原因,Si+2的第一个元素将类似地大于Ti+2的第一个元素,因此Si+2将至少包括Ti+2的所有元素,而Ti+2的所有元素尚未包括在之前的S组中。对于其余的S组和T组,情况类似。因此,T组中的集合至少与S组中的集合一样多


因此,该算法产生的集合赋值不会比任何其他赋值更差。因此,它是最优的。

贪婪方法如何,即从左侧将元素插入到集合中,当您查看所需的差异时,创建一个新集合

因此,对于
1,2,3,7,8,9,11,15,16

你可以从1开始。
2-1=1<9,因此添加2。
3-1=2<9,因此添加3。
7-1=6<9,因此添加7。
8-1=7<9,所以加上8。
9-1=8<9,因此添加9。
11-1=10>9,因此创建一个新集合。
15-11=4<9,所以加上15。
16-11=5<9,所以加上16

输出:
{1,2,3,7,8,9},{11,15,16}

注意:

如果元素不一定是有序的