给定一个连续且唯一的数字列表,其中一些数字被选中,而另一些数字没有被选中,我需要创建包含所有选定数字的组。组的数量应保持在最小值,组中非必需值的数量也应保持在最低值。组的最大大小也是一个变量。
示例列表,其中*表示所选数字,组大小限制为5:1*,2,3,4,5*,6*,7,8*,9
最优化的组是[(1(和(5,6,7,8(]。[(1,2,3,4,5(和(6,7,8(]是另一个可能的答案,但它包含更多未选择的值,因此不可取。
这种类型的算法有名字吗?我不需要有人为我编写代码,只需要在这个问题已经众所周知的情况下寻找指针。
对于那些好奇这是为了什么的人,我正在尝试优化Modbus TCP寄存器请求。用户可以定义他们需要的寄存器列表,并且一次只能请求连续的寄存器组。由于TCP延迟,我们希望发出尽可能少的请求,并且只请求最少数量的非必需寄存器。
试试这个:
numbers = [1,2,3,4,5,4,5,6,2,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
是一个函数,它告诉您是否选择了一个数字