Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 均匀修剪有序集_Algorithm - Fatal编程技术网

Algorithm 均匀修剪有序集

Algorithm 均匀修剪有序集,algorithm,Algorithm,给定一个由n个元素a1、a2、…、an组成的有序集合,我可以使用什么算法从这些元素M

给定一个由n个元素a1、a2、…、an组成的有序集合,我可以使用什么算法从这些元素M 例如,如果起始集是从1到9的数字,即n=9,我想对其进行均匀采样,因此我只得到其中的5个数字,即M=9,我会选择1、3、5、7、9。要得到原9中的3个,我会选择1、5、9等等。但是,对于任何n和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,还是尽可能地接近它?