在列表中对选定数字进行分组的算法

问题描述

给出一个连续的和唯一的号码列表,其中一些被选中,而另一些则没有,我需要创建包含所有选定号码的组。组的数量应保持最小,并且组中非必需值的数量也应保持最小。组的最大大小也是一个变量。

示例列表,其中*表示所选编号,并且组大小限制为5: 1 *,2,3,4,5 *,6 *,7,8 *,9

最优化的组将是[(1)和(5,6,7,8)]。 [(1,2,5)和(6,8)]是另一个可能的答案,但是它包含更多未选择的值,因此不希望使用。

这种算法有名称吗?我不需要别人为我编写代码,只要已经知道此问题就可以寻找指针。

对于那些好奇的目的,我正在尝试优化Modbus TCP寄存器请求。用户可以定义他们需要的寄存器列表,并且一次只能请求连续的寄存器组。由于TCP延迟,我们希望发出尽可能少的请求,而只请求最少数量的不需要的寄存器。

解决方法

尝试一下:

numbers = [1,2,3,4,5,6,4]
groups,current_group = [],[]
max_group_size = 4 # here you put your max size
for n in numbers:
    is_valid = is_selected(n)
    if is_valid:
        current_group.append(n)
    elif (not is_valid and current_group) or len(current_group) == max_group_size:
        groups.append(current_group)
        current_group = []

假设is_selected是一个告诉您是否选择了数字的功能