问题描述
给出一个连续的和唯一的号码列表,其中一些被选中,而另一些则没有,我需要创建包含所有选定号码的组。组的数量应保持最小,并且组中非必需值的数量也应保持最小。组的最大大小也是一个变量。
示例列表,其中*表示所选编号,并且组大小限制为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
是一个告诉您是否选择了数字的功能