Algorithm 均匀修剪有序集
给定一个由n个元素a1、a2、…、an组成的有序集合,我可以使用什么算法从这些元素MAlgorithm 均匀修剪有序集,algorithm,Algorithm,给定一个由n个元素a1、a2、…、an组成的有序集合,我可以使用什么算法从这些元素M
这个问题的数学公式如下:给定M
def prune(a, M):
n = len(a)
# The [i][j] entry is the max min gap
# for a[0], ..., a[i] choose j + 1 (a[0] is always chosen).
table = [[float('inf')] * M for i in range(n)]
for i in range(1, n):
for j in range(M):
table[i][j] = max(min(table[k][j], a[i] - a[k])
for k in range(i))
# Trace back the sequence of argmaxes to recover the chosen indexes.
使用完全单调性,这可以改进到M时间。这个想法是,随着i的增加,k的适当值也只能增加,当我们增加k时,目标值一旦减少,我们就可以继续下一个i
上述两种算法都处理相当一般的目标。如果max是确定的,那么有一个日志n时间算法,它使用二进制搜索来猜测最小间隔,然后检查它是否可行。我将等待您更新问题。如果您选择q1=a1和qM=an,则您的总和是最大值。两者之间的数字并不重要,因为它们各自的术语相互抵消。您是否希望最大化最小差异?是否希望均匀地隔开索引,即您选择了1、3、5、7、9,因为所有索引的差异正好为2?或者均匀地隔开这些值,即您选择1、3、5、7、9是因为a9-a7=a7-a5=a5-a3=a3-a1,还是尽可能地接近它?