c – 如何更新某些子集的排名?

我的输入由一些比赛中的排名组成(比如马拉松比赛),其值在[0,N]范围内.有几个子竞赛(例如,基于年龄,性别等),这些竞赛仅对子集团队感兴趣,而另一个子集not_eligible不符合资格.

我正在寻找一种有效的算法(最好用标准库编写),它将更新排名.例:

auto team = std::vector<int>{ 1, 2, 9, 13 };
auto not_eligible = std::vector<int>{ 8, 10, 12 };
std::vector<int> result;

// some algorithm

assert(result == std::vector<int>{ 1, 2, 8, 10 });

因为只有1个#9(即#8)以下的同志不符合条件,所以#9的等级减少1,因为在#13之前有3个不合格的终结者(即#8,#10和#12) ,对于该特定的子竞赛,该等级从#13更新为#10到#10.

注8和10是结果的一部分,但不是因为它们是从不合格的合并,而是因为他们的排名是由团队的9和13.

如何使用标准算法的组合实现上述目标?我希望能够以O(N M)复杂度对长度为N和M的输入范围(例如通过5腿std ::变换)进行此操作.

更新:我也对逆算法感兴趣:给定子竞赛的排名,如何在添加以前不合格的参与者时更新子测试中竞争者的等级?

最佳答案 利用现有算法并没有明显的方法;你最好采用示例代码进行合并并进行调整:

template<class InputIt1, class InputIt2, class OutputIt>
OutputIt update_ranks(InputIt1 first1, InputIt1 last1,
               InputIt2 first2, InputIt2 last2,
               OutputIt d_first)
{
    typename std::iterator_traits<InputIt1>::value_type adjust = {};
    while (first1 != last1) {
        if (first2 != last2 && *first2 < *first1) {
            ++adjust;
            ++first2;
        } else {
            *d_first = *first1 - adjust;
            ++first1;
            ++d_first;
        }
    }
    return d_first;
}

对于反向,再次适应合并应该起作用.

点赞