国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java實(shí)現(xiàn)排列組合算法

這篇具有很好參考價(jià)值的文章主要介紹了java實(shí)現(xiàn)排列組合算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

我這里只寫(xiě)了組合的算法。

????????假設(shè)現(xiàn)有 M=4?個(gè)數(shù)據(jù) a,b,c,d。從中隨機(jī)抽取n個(gè)數(shù),n為1—4個(gè)數(shù)據(jù)進(jìn)行組合。那么數(shù)學(xué)中的計(jì)算組合方式為C(4,1) + C(4,2) + C(4,3) +?C(4,4)? = 4 + 6 + 4 + 1 = 15。那么共有15種組合方式。

方案一:此方法容易理解但是效率慢

????????我的做法是,按順序循環(huán)組合,數(shù)據(jù)分為已組合的數(shù)據(jù)和未組合(未組合數(shù)據(jù)指的是已組合數(shù)據(jù)往后剩余的數(shù)據(jù)),然后把未參與組合的進(jìn)行循環(huán)與已組合再次組合,循環(huán)進(jìn)行,直到最后。
? ? ? ? 如下示例,規(guī)律

? ? ? 已組合數(shù)據(jù)? ? 剩余未參與組合的數(shù)據(jù)

1? ? ? ?a? ? ? ? ? ? ? ? ? ? ? ? ? ? b,c,d? ? ? ? ? ? ? ?//a 后面還有b,c,d未參與
2? ? ? ?b? ? ? ? ? ? ? ? ? ? ? ? ? ? ?c,d? ? ? ? ? ? ? ?? //b 后面還有c,d未參與
3? ? ? ?c? ? ? ? ? ? ? ? ? ? ? ? ? ? ?d? ? ? ? ? ? ? ? ? ?//c 后面還有d未參與
4? ? ? ?d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//d后面沒(méi)有了其他數(shù)據(jù)
//開(kāi)始把上述第1行a —? b,c,d 進(jìn)行二次循環(huán)組合
5? ? ? ?a,b? ? ? ? ? ? ? ? ? ? ? ? ? c,d? ? ? ? ? ? ? ?//a,b 后面還有c,d未參與 ? ? ? ??
6? ? ? ?a,c? ? ? ? ? ? ? ? ? ? ? ? ? ?d? ? ? ? ? ? ? ? ?//a,c 后面還有d未參與 ? ? ? ? ?
7? ? ? ?a,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
//開(kāi)始把上面第5行a,b?—? c,d 行進(jìn)行循環(huán)組合 ? ? ?
8? ? ? ?a,b,c? ? ? ? ? ? ? ? ? ? ? ? d? ? ? ? ? ? ? ??//a,b,c 后面還有d未參與
9? ? ? ?a,b,c,d
//開(kāi)始把上面第2行b? —? c,d 行進(jìn)行循環(huán)組合
10? ? ?b,c? ? ? ? ? ? ? ? ? ? ? ? ? d? ? ? ? ? ? ? ??//b,c 后面還有c,d未參與
11? ? ?b,d? ? ? ? ? ? ? ? ? ? ? ? ??
//開(kāi)始把上面第3行c? —? d 行進(jìn)行循環(huán)組合
12? ? ? c,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//開(kāi)始把上面第6行a,c? —? d 行進(jìn)行循環(huán)組合
13? ? ? a,c,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
//開(kāi)始把上面第8行a,b,c? —? d 行進(jìn)行循環(huán)組合
14? ? ? a,b,c,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
//開(kāi)始把上面第10行b,c? —? d 行進(jìn)行循環(huán)組合
15? ? ? b,c,d? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
..............................依據(jù)上述規(guī)則,循環(huán)把每一行未組合的與當(dāng)前已組合的再次進(jìn)行組合,然后計(jì)算剩余未組合數(shù)據(jù)。至到未參與組合的數(shù)據(jù)個(gè)數(shù)為0

上述思路基本明了,按順序依次組合,只是根據(jù)每行上的未參與組合數(shù)據(jù),進(jìn)行再次組合直到全部組合完成。代碼實(shí)現(xiàn)如下:

public static void main(String[] args) {
        //結(jié)果集
        List<String> resList = new ArrayList<>();
        //初始化需要組合的數(shù)據(jù)
        String[] arr = new String[]{"a","b","c","d"};
        List<String> initList = new LinkedList(Arrays.asList(arr));
        //map中 key:組合數(shù)據(jù)的前綴,value:未參與組合的數(shù)據(jù)
        Map<String,List<String>> map = new HashMap<>();
        for (int i = 0; i < initList.size(); i++) {
            String pj = initList.get(i);
            resList.add(pj);
            System.out.println(pj);
            //當(dāng)剩余未組合的數(shù)據(jù)個(gè)數(shù)為0時(shí) 不再繼續(xù)添加
            if(i+1 < initList.size()){
                //按順序排列 下標(biāo)為i后面未參與組合的數(shù)據(jù)
                List<String> syList = initList.subList(i+1,initList.size());
                map.put(pj,syList);
            }
        }
        combinLoop(map,resList);
        System.out.println(resList.size());
    }

    public static void combinLoop(Map<String,List<String>> map,List<String> resList){
        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
            String prefix = entry.getKey();
            List<String> list = entry.getValue();
            Map<String,List<String>> map2 = new HashMap<>();
            //循環(huán)未參與組合的數(shù)據(jù),與之前的prefix進(jìn)行組合
            for (int i = 0; i < list.size(); i++) {
                String newPre = prefix+list.get(i);
                System.out.println(newPre);
                resList.add(newPre);
                if(i+1 < list.size()){
                    //按順序排列,下標(biāo)為i后面未參與組合的數(shù)據(jù)集合
                    List<String> syList = list.subList(i+1,list.size());
                    map2.put(newPre,syList);
                }
            }
            combinLoop(map2,resList);
        }
    }

方案2:效率更快

此方法,對(duì)初始化數(shù)據(jù)initList進(jìn)行循環(huán),把前一次的結(jié)果resultList與當(dāng)前參與循環(huán)的數(shù)據(jù)進(jìn)行一一組合,得到新的結(jié)果加入到已有的組合結(jié)果resultList中,initList依次循環(huán),resultList不斷加入新的數(shù)據(jù),重復(fù)進(jìn)行直到最后。如下示例:

對(duì)initList =?{"a","b","c","d"} 進(jìn)行循環(huán),初始化resultList為空。

? ? ? ? ? ? ? 當(dāng)前參與循環(huán)數(shù)據(jù)? ?前一次resultList集? ? 結(jié)束resultList集

第一次循環(huán)? ? ? a? ? ? ? ? ? ? ? ? ? ? ??null? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a
第二次循環(huán)? ? ? b? ? ? ? ? ? ? ? ? ? ? ? ?a? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a,b,ab
第三次循環(huán)? ? ? c? ? ? ? ? ? ? ? ? ? ? a,b,ab? ? ? ? ? ? ? ? ? ? ? ? ? ? ?a,b,ab,c,ac,bc,abc
第四次循環(huán)? ? ? d? ? ? ? ? ? ? ??a,b,ab,c,ac,bc,abc? ? a,b,ab,c,ac,bc,abc,d,ad,bd,abd,cd,acd,bcd,abcd? ?

通過(guò)上述規(guī)律可看出,當(dāng)前參與循環(huán)的數(shù)據(jù)與已有的resultList集進(jìn)行新的組合,可得到黃色部分組合后的結(jié)果,再加上resultList中原來(lái)已有的數(shù)據(jù),組成新的resultList與下一次參與循環(huán)的數(shù)據(jù)組合,依次進(jìn)行直到所有數(shù)據(jù)循環(huán)完成。

代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-548910.html

    public static void combine2(){
        String[] arr = new String[]{"a","b","c","d"};
        //初始化數(shù)據(jù)
        List<String> initList = Arrays.asList(arr);
        //結(jié)果集
        List<String> resultList = new ArrayList<>();
        for (String init : initList) {
            //重新賦值上次循環(huán)組合后得到的resultList結(jié)果集
            List<String> list = new ArrayList<>(resultList);
            //resultList添加初始數(shù)據(jù)
            resultList.add(init);
            for (String pr : list) {
                //把前一次得到的resultList 與當(dāng)前數(shù)據(jù)重新進(jìn)行組合
                resultList.add(pr + init);
            }
        }
    }

到了這里,關(guān)于java實(shí)現(xiàn)排列組合算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    【數(shù)據(jù)結(jié)構(gòu)】用Java實(shí)現(xiàn)七大排序算法

    目錄 ??1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指標(biāo) 1.2 十個(gè)排序算法 ?1.3 十個(gè)排序性能對(duì)比 ??2. 冒泡排序 2.1 算法描述 2.2 動(dòng)圖 ??代碼優(yōu)化 ??3. 選擇排序 3.1 算法描述 3.2 動(dòng)圖 ?3.3 代碼 ??4. 插入排序 4.1 算法描述 4.2 動(dòng)圖 ?4.3 代碼 ??5 希爾排序 5.1 描述 5.2 動(dòng)圖 ?

    2023年04月23日
    瀏覽(31)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    【算法與數(shù)據(jù)結(jié)構(gòu)】Java實(shí)現(xiàn)查找與排序

    也叫做折半查找,屬于有序查找算法。 前提條件 :數(shù)組數(shù)據(jù)必須有序,從小到大,或者從大到小都是可以的。 如果是無(wú)序的,也可以先進(jìn)行排序。 但是排序之后,會(huì)改變?cè)袛?shù)據(jù)的順序,查找出來(lái)元素位置跟原來(lái)的元素可能是不一樣的,所以排序之后再查找只能判斷當(dāng)前數(shù)

    2024年01月19日
    瀏覽(31)
  • 【算法教程】排列與組合的實(shí)現(xiàn)

    在講排列與組合之前,我們先定義數(shù)據(jù)元素類(lèi)型Fruit 對(duì)N個(gè)不同元素進(jìn)行排序,總共有多少不同的排列方式? 例子:某水果店有以下水果,請(qǐng)對(duì)所有水果進(jìn)行全排列,請(qǐng)輸出所有排列 排列算法的javascript實(shí)現(xiàn)模板(DSF,最優(yōu)解in-place) 測(cè)試結(jié)果 對(duì)N個(gè)不同元素進(jìn)行排序,總共有多少不

    2024年02月07日
    瀏覽(20)
  • 【一起學(xué)數(shù)據(jù)結(jié)構(gòu)與算法】Java實(shí)現(xiàn)雙鏈表

    【一起學(xué)數(shù)據(jù)結(jié)構(gòu)與算法】Java實(shí)現(xiàn)雙鏈表

    雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。一般我們都構(gòu)造雙向循環(huán)鏈表。 打印雙鏈表非常簡(jiǎn)單,只需要單獨(dú)創(chuàng)一個(gè)結(jié)點(diǎn)

    2024年02月22日
    瀏覽(33)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】1、學(xué)習(xí)動(dòng)態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)(基本模擬實(shí)現(xiàn) Java 的 ArrayList 實(shí)現(xiàn)增刪改查)

    【數(shù)據(jù)結(jié)構(gòu)與算法】1、學(xué)習(xí)動(dòng)態(tài)數(shù)組數(shù)據(jù)結(jié)構(gòu)(基本模擬實(shí)現(xiàn) Java 的 ArrayList 實(shí)現(xiàn)增刪改查)

    ?? 數(shù)據(jù)結(jié)構(gòu)是 計(jì)算機(jī) 存儲(chǔ) 、 組織 數(shù)據(jù)的方式 ?? 線性 結(jié)構(gòu) 線性表(數(shù)組、鏈表、棧、隊(duì)列、哈希表) ?? 樹(shù)形 結(jié)構(gòu) 二叉樹(shù) AVL 樹(shù) 紅黑樹(shù) B 樹(shù) 堆 Trie 哈夫曼樹(shù) 并查集 ?? 圖形 結(jié)構(gòu) 鄰接矩陣 鄰接表 ?? 線性表是具有 n 個(gè) 相同類(lèi)型元素 的有限 序列 (n = 0) a1 是首節(jié)點(diǎn)

    2024年02月10日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)與算法中的七大排序(Java實(shí)現(xiàn))

    數(shù)據(jù)結(jié)構(gòu)與算法中的七大排序(Java實(shí)現(xiàn))

    目錄 一、直接插入排序 二、希爾排序 三、直接選擇排序 四、堆排序 五、冒泡排序 六、快速排序 七、歸并排序 ? ? ? ? ? ? ? 定義i下標(biāo)之前的元素全部已經(jīng)有序 ,遍歷一遍要排序的數(shù)組,把i下標(biāo)前的元素全部進(jìn)行排序,當(dāng)遍歷玩這個(gè)數(shù)組后,就已經(jīng)排好序了。 ? ? ? ?

    2024年02月06日
    瀏覽(31)
  • 深入理解Java線程池ThreadPoolExcutor實(shí)現(xiàn)原理、數(shù)據(jù)結(jié)構(gòu)和算法(源碼解析)

    深入理解Java線程池ThreadPoolExcutor實(shí)現(xiàn)原理、數(shù)據(jù)結(jié)構(gòu)和算法(源碼解析)

    什么是線程池? ????????線程池主要是為了解決執(zhí)行新任務(wù)執(zhí)行時(shí),應(yīng)用程序?yàn)闇p少為任務(wù)創(chuàng)建一個(gè)新線程和任務(wù)執(zhí)行完畢時(shí)銷(xiāo)毀線程所帶來(lái)的開(kāi)銷(xiāo)。通過(guò)線程池,可以在項(xiàng)目初始化時(shí)就創(chuàng)建一個(gè)線程集合,然后在需要執(zhí)行新任務(wù)時(shí)重用這些線程而不是每次都新建一個(gè)線

    2024年02月07日
    瀏覽(41)
  • 數(shù)據(jù)結(jié)構(gòu)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    數(shù)據(jù)結(jié)構(gòu)與算法細(xì)節(jié)篇之最短路徑問(wèn)題:Dijkstra和Floyd算法詳細(xì)描述,java語(yǔ)言實(shí)現(xiàn)。

    最短路徑的算法有兩個(gè), Dijkstra算法 和 Floyd算法 。 Dijkstra算法 解決的是 單源 最短路徑問(wèn)題 。 Floyd算法解決的是 多源 最短路徑問(wèn)題,并且可以處理負(fù)權(quán)圖 。 今天要講的就是Dijkstra算法。 加: feng--Insist (大寫(xiě)的i),進(jìn)java交流群討論互聯(lián)網(wǎng)+技術(shù)。可索要PPT等資料。 其他資料

    2024年02月11日
    瀏覽(95)
  • 數(shù)據(jù)結(jié)構(gòu):樹(shù)和二叉樹(shù)之-堆排列 (萬(wàn)字詳解)

    數(shù)據(jù)結(jié)構(gòu):樹(shù)和二叉樹(shù)之-堆排列 (萬(wàn)字詳解)

    目錄 樹(shù)概念及結(jié)構(gòu) 1.1樹(shù)的概念 1.2樹(shù)的表示 ?編輯2.二叉樹(shù)概念及結(jié)構(gòu) 2.1概念 2.2數(shù)據(jù)結(jié)構(gòu)中的二叉樹(shù):?編輯 2.3特殊的二叉樹(shù): ?編輯 2.4 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu) 2.4.1 順序存儲(chǔ): 2.4.2 鏈?zhǔn)酱鎯?chǔ): 二叉樹(shù)的實(shí)現(xiàn)及大小堆排列 1功能展示 2 定義基本結(jié)構(gòu) 3 初始化 4打印 5銷(xiāo)毀 6插入

    2024年02月07日
    瀏覽(17)
  • java數(shù)據(jù)結(jié)構(gòu)與算法:棧

    代碼: 測(cè)試: 鏈表頭為堆棧頂 代碼: 測(cè)試:

    2024年01月21日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包