Algorithm 将数字集拆分为尽可能少的已定义“的子集”;间隔长度“;算法
假设我有一些数字。例如{1,2,3,7,8,9,11,15,16}。我需要的是将此集合拆分为尽可能少的子集,并且最低和最高数字之间的差值小于9。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}
我需要它来优化通过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尺寸因此,该算法产生的集合赋值不会比任何其他赋值更差。因此,它是最优的。贪婪方法如何,即从左侧将元素插入到集合中,当您查看所需的差异时,创建一个新集合 因此,对于
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尺寸因此,该算法产生的集合赋值不会比任何其他赋值更差。因此,它是最优的。贪婪方法如何,即从左侧将元素插入到集合中,当您查看所需的差异时,创建一个新集合 因此,对于
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}
注意:
如果元素不一定是有序的