生成全排列算法(Scala和C++實(shí)現(xiàn))

全排列問(wèn)題描述為:給定一串?dāng)?shù)字,生成所有可能的排列。
本文給出兩類,一種使用C++通過(guò)回溯算法,一種使用Scala通過(guò)遞歸來(lái)求解。

首先介紹使用Scala通過(guò)遞歸求解的方法,定義遞歸關(guān)系:對(duì)S中的每個(gè)x,遞歸的生成S-x的所有排列的序列,而后將x加到每個(gè)序列的前面。這樣就能對(duì)S里的每個(gè)x,產(chǎn)生出了S的所有以x開(kāi)頭的排列。合起來(lái)就是所有的排列了。
實(shí)現(xiàn)的代碼如下:

def permutation(xs: List[Int]): Set[List[Int]] =
  if (xs == Nil) Set(Nil)
  else {
    for {
      i <- xs.indices
      ys <- func(xs filter (_ != xs(i)))
    }   yield xs(i) :: ys
  }.toSet

func(List(1, 2, 3))

使用回溯法的代碼如下:

void permutation(vector<int> vec, int s) {
    if (s == vec.size()) {
        for_each(vec.begin(), vec.end(), [](int v) { cout << v << " "; });
        cout << endl;
    }

    for (int i = s; i < vec.size(); i++) {
        swap(vec[s], vec[i]);
        func(vec, s+1);
        swap(vec[s], vec[i]);
    }
}

其中,函數(shù)參數(shù)s表示的是當(dāng)前序列已經(jīng)有多少位完成了排列,即前s位完成了排列,當(dāng)前正在對(duì)第s位進(jìn)行排列。取所有ssize - 1位置的元素作為第s位的數(shù)字?;厮莸囊饬x是在執(zhí)行完遞歸func(vec, s+1);后,需要將之前交換過(guò)的元素交換回來(lái),即需要將數(shù)組回復(fù)原狀。

綜上,覺(jué)得使用Scala的遞歸思想考慮還是比較簡(jiǎn)單的,但效率不敢恭維。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 回溯算法 回溯法:也稱為試探法,它并不考慮問(wèn)題規(guī)模的大小,而是從問(wèn)題的最明顯的最小規(guī)模開(kāi)始逐步求解出可能的答案,并...
    fredal閱讀 14,028評(píng)論 0 89
  • 歸去來(lái)兮。 1.1 說(shuō)明 本篇為《挑戰(zhàn)程序設(shè)計(jì)競(jìng)賽(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy閱讀 14,922評(píng)論 0 160
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,431評(píng)論 2 36
  • 文/蘇門(mén)映雪 -1- 周末我?guī)畠喝シb店,碰見(jiàn)一個(gè)媽媽帶著自己的孩子正在試穿衣服。那是個(gè)十歲左右的小姑娘,她們母...
    蘇門(mén)映雪閱讀 1,296評(píng)論 9 18

友情鏈接更多精彩內(nèi)容