首先,我有一组K值S = {v_1,...,v_K}。我想选择最小的值,用另一个值替换它,然后再选择最小值 - 这样做K次。所以,最初,我最好的B组是空的,我想表演:
步骤1.找到最小值S.说它有索引n。 B = [B,v_n](即,将v_n附加到B)
步骤2.通过将v_n替换为另一个值来更新S(不重要的是如何计算其他值)。
重复步骤1和2,直到B有K值。
我认为合理的方法是首先从初始S(KlogK复杂度)构造一个min-heap,然后我可以(取出root + insert new元素)(K-1)次。假设取出root和insert都是logK复杂度,总复杂度将是KlogK + 2(K-1)log(K)=(3K-2)logK。
下一步,一旦我有了集合B,我想为B中的每个b计算一些函数f(b),并用集合{f(b)}而不是集合S重复上述过程。换句话说,现在将集合{f(b)}作为S,我想执行上述过程。蛮力方式 - 我可以先用(3K-2)logK单位时间找到B,然后计算集合{f(b)},然后在{f上使用另一个(3K-2)logK单位时间(b)}。但是,很明显我可以通过流水线做得更好。基本上,只要我开始获取B的条目,我就可以为可用条目计算f(。),并进行一些排序操作。
你能为整体问题提出一个好的/最佳的方法吗?