亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++中的組合和排列

C ++中的組合和排列

C++
UYOU 2019-08-08 10:59:31
C ++中的組合和排列什么是C ++中使用最廣泛的現有庫來提供n個元素中k個元素的所有組合和排列?我不是問算法而是現有的庫或方法。謝謝。
查看完整描述

3 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

此答案提供了最小的實施工作解決方案。如果要檢索大輸入范圍的組合,則可能沒有可接受的性能。

標準庫有std::next_permutation,你可以從中輕松地構建一個next_k_permutation和它next_combination。

template<class RandIt, class Compare>bool next_k_permutation(RandIt first, RandIt mid, RandIt last, Compare comp){
    std::sort(mid, last, std::tr1::bind(comp, std::tr1::placeholders::_2                                            , std::tr1::placeholders::_1));
    return std::next_permutation(first, last, comp);}

如果您沒有tr1::bind或者boost::bind您需要構建一個將參數交換為給定比較的函數對象。當然,如果您只對某種std::less變體感興趣,next_combination可以std::greater直接使用:

template<class RandIt>bool next_k_permutation(RandIt first, RandIt mid, RandIt last){
    typedef typename std::iterator_traits<RandIt>::value_type value_type;

    std::sort(mid, last, std::greater< value_type >());
    return std::next_permutation(first, last);}

這是一個相對安全的版本next_combination。如果您可以保證范圍[mid, last)與調用之后的順序一致,next_combination那么您可以使用更簡單的:

template<class BiDiIt, class Compare>bool next_k_permutation(BiDiIt first, BiDiIt mid, BiDiIt last, Compare comp){
    std::reverse(mid, last);
    return std::next_permutation(first, last, comp);}

這也適用于雙向迭代器以及隨機訪問迭代器。

要輸出組合而不是k-排列,我們必須確保只輸出每個組合一次,所以只有當它是按順序的k排列時,我們才會返回它的組合。

template<class BiDiIt, class Compare>bool next_combination(BiDiIt first, BiDiIt mid, BiDiIt last, Compare comp){
    bool result;
    do
    {
        result = next_k_permutation(first, mid, last, comp);
    } while (std::adjacent_find( first, mid,
                             std::tr1::bind(comp, std::tr1::placeholders::_2                                                , std::tr1::placeholders::_1) )
                                                                        != mid );
    return result;}

替代方案是使用反向迭代器而不是參數交換bind調用,或者std::greater如果使用的std::less是比較則顯式使用。


查看完整回答
反對 回復 2019-08-08
  • 3 回答
  • 0 關注
  • 514 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號