婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫(kù) > Go語言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))

Go語言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))

熱門標(biāo)簽:汕頭小型外呼系統(tǒng) 釘釘有地圖標(biāo)注功能嗎 惠州電銷防封電話卡 黃岡人工智能電銷機(jī)器人哪個(gè)好 建造者2地圖標(biāo)注 濱州自動(dòng)電銷機(jī)器人排名 浙江高頻外呼系統(tǒng)多少錢一個(gè)月 阿里云ai電話機(jī)器人 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng)

本文實(shí)例講述了Go語言實(shí)現(xiàn)的排列組合問題。分享給大家供大家參考,具體如下:

(一)組合問題

組合是一個(gè)基本的數(shù)學(xué)問題,本程序的目標(biāo)是輸出從n個(gè)元素中取m個(gè)的所有組合。

例如從[1,2,3]中取出2個(gè)數(shù),一共有3中組合:[1,2],[1,3],[2,3]。(組合不考慮順序,即[1,2]和[2,1]屬同一個(gè)組合)

本程序的思路(來自網(wǎng)上其他大神):

(1)創(chuàng)建有n個(gè)元素?cái)?shù)組,數(shù)組元素的值為1表示選中,為0則沒選中。
(2)初始化,將數(shù)組前m個(gè)元素置1,表示第一個(gè)組合為前m個(gè)數(shù)。
(3)從左到右掃描數(shù)組元素值的“10”組合,找到第一個(gè)“10”組合后將其變?yōu)椤?1”組合,同時(shí)將其左邊的所有“1”全部移動(dòng)到數(shù)組的最左端。
(4)當(dāng)某次循環(huán)沒有找到“10“組合時(shí),說明得到了最后一個(gè)組合,循環(huán)結(jié)束。

例如求5中選3的組合:

1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5

效率情況:20個(gè)元素中取5個(gè),共15504個(gè)結(jié)果,耗時(shí)約10ms.

代碼實(shí)現(xiàn):

復(fù)制代碼 代碼如下:
package huawei
import (
    "fmt"
    "time"
)
/*
【排列組合問題:n個(gè)數(shù)中取m個(gè)】
*/
func Test10Base() {
    nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    m := 5
    timeStart := time.Now()
    n := len(nums)
    indexs := zuheResult(n, m)
    result := findNumsByIndexs(nums, indexs)
    timeEnd := time.Now()
    fmt.Println("count:", len(result))
    fmt.Println("result:", result)
    fmt.Println("time consume:", timeEnd.Sub(timeStart))
    //結(jié)果是否正確
    rightCount := mathZuhe(n, m)
    if rightCount == len(result) {
        fmt.Println("結(jié)果正確")
    } else {
        fmt.Println("結(jié)果錯(cuò)誤,正確結(jié)果是:", rightCount)
    }
}
//組合算法(從nums中取出m個(gè)數(shù))
func zuheResult(n int, m int) [][]int {
    if m 1 || m > n {
        fmt.Println("Illegal argument. Param m must between 1 and len(nums).")
        return [][]int{}
    }
    //保存最終結(jié)果的數(shù)組,總數(shù)直接通過數(shù)學(xué)公式計(jì)算
    result := make([][]int, 0, mathZuhe(n, m))
    //保存每一個(gè)組合的索引的數(shù)組,1表示選中,0表示未選中
    indexs := make([]int, n)
    for i := 0; i n; i++ {
        if i m {
            indexs[i] = 1
        } else {
            indexs[i] = 0
        }
    }
    //第一個(gè)結(jié)果
    result = addTo(result, indexs)
    for {
        find := false
        //每次循環(huán)將第一次出現(xiàn)的 1 0 改為 0 1,同時(shí)將左側(cè)的1移動(dòng)到最左側(cè)
        for i := 0; i n-1; i++ {
            if indexs[i] == 1 indexs[i+1] == 0 {
                find = true
                indexs[i], indexs[i+1] = 0, 1
                if i > 1 {
                    moveOneToLeft(indexs[:i])
                }
                result = addTo(result, indexs)
                break
            }
        }
        //本次循環(huán)沒有找到 1 0 ,說明已經(jīng)取到了最后一種情況
        if !find {
            break
        }
    }
    return result
}
//將ele復(fù)制后添加到arr中,返回新的數(shù)組
func addTo(arr [][]int, ele []int) [][]int {
    newEle := make([]int, len(ele))
    copy(newEle, ele)
    arr = append(arr, newEle)
    return arr
}
func moveOneToLeft(leftNums []int) {
    //計(jì)算有幾個(gè)1
    sum := 0
    for i := 0; i len(leftNums); i++ {
        if leftNums[i] == 1 {
            sum++
        }
    }
    //將前sum個(gè)改為1,之后的改為0
    for i := 0; i len(leftNums); i++ {
        if i sum {
            leftNums[i] = 1
        } else {
            leftNums[i] = 0
        }
    }
}
//根據(jù)索引號(hào)數(shù)組得到元素?cái)?shù)組
func findNumsByIndexs(nums []int, indexs [][]int) [][]int {
    if len(indexs) == 0 {
        return [][]int{}
    }
    result := make([][]int, len(indexs))
    for i, v := range indexs {
        line := make([]int, 0)
        for j, v2 := range v {
            if v2 == 1 {
                line = append(line, nums[j])
            }
        }
        result[i] = line
    }
    return result
}

注:n個(gè)元素中取m個(gè)一共有多少種取法可直接通過數(shù)學(xué)公式計(jì)算得出,即:

復(fù)制代碼 代碼如下:
//數(shù)學(xué)方法計(jì)算排列數(shù)(從n中取m個(gè)數(shù))
func mathPailie(n int, m int) int {
    return jieCheng(n) / jieCheng(n-m)
}
//數(shù)學(xué)方法計(jì)算組合數(shù)(從n中取m個(gè)數(shù))
func mathZuhe(n int, m int) int {
    return jieCheng(n) / (jieCheng(n-m) * jieCheng(m))
}
//階乘
func jieCheng(n int) int {
    result := 1
    for i := 2; i = n; i++ {
        result *= i
    }
    return result
}

通過此公式可以簡(jiǎn)單的驗(yàn)證一下上述程序的結(jié)果是否正確。

(二)排列問題

從n個(gè)數(shù)中取出m個(gè)進(jìn)行排列,其實(shí)就是組合算法之后,對(duì)選中的m個(gè)數(shù)進(jìn)行全排列。而全排列的問題在之前的文章中已經(jīng)討論過了。

代碼實(shí)現(xiàn):

復(fù)制代碼 代碼如下:
func pailieResult(nums []int, m int) [][]int {
    //組合結(jié)果
    zuhe := zuheResult(nums, m)
    //保存最終排列結(jié)果
    result := make([][]int, 0)
    //遍歷組合結(jié)果,對(duì)每一項(xiàng)進(jìn)行全排列
    for _, v := range zuhe {
        p := quanPailie(v)
        result = append(result, p...)
    }
    return result
}
//n個(gè)數(shù)全排列
//如輸入[1 2 3],則返回[123 132 213 231 312 321]
func quanPailie(nums []int) [][]int {
    COUNT := len(nums)
    //檢查
    if COUNT == 0 || COUNT > 10 {
        panic("Illegal argument. nums size must between 1 and 9.")
    }
    //如果只有一個(gè)數(shù),則直接返回
    if COUNT == 1 {
        return [][]int{nums}
    }
    //否則,將最后一個(gè)數(shù)插入到前面的排列數(shù)中的所有位置
    return insertItem(quanPailie(nums[:COUNT-1]), nums[COUNT-1])
}
func insertItem(res [][]int, insertNum int) [][]int {
    //保存結(jié)果的slice
    result := make([][]int, len(res)*(len(res[0])+1))
    index := 0
    for _, v := range res {
        for i := 0; i len(v); i++ {
            //在v的每一個(gè)元素前面插入新元素
            result[index] = insertToSlice(v, i, insertNum)
            index++
        }
        //在v最后面插入新元素
        result[index] = append(v, insertNum)
        index++
    }
    return result
}
//將元素value插入到數(shù)組nums中索引為index的位置
func insertToSlice(nums []int, index int, value int) []int {
    result := make([]int, len(nums)+1)
    copy(result[:index], nums[:index])
    result[index] = value
    copy(result[index+1:], nums[index:])
    return result
}

希望本文所述對(duì)大家Go語言程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • Golang排列組合算法問題之全排列實(shí)現(xiàn)方法
  • Go語言對(duì)字符串進(jìn)行SHA1哈希運(yùn)算的方法
  • GO語言運(yùn)行環(huán)境下載、安裝、配置圖文教程
  • go語言文件正則表達(dá)式搜索功能示例
  • Go語言正則表達(dá)式用法實(shí)例小結(jié)【查找、匹配、替換等】
  • Go語言中三種不同md5計(jì)算方式的性能比較
  • Go語言中反射的正確使用
  • PHP與Go語言之間的通信詳解
  • 深入理解GO語言的面向?qū)ο?/li>
  • 利用Go語言實(shí)現(xiàn)簡(jiǎn)單Ping過程的方法
  • Go語言如何并發(fā)超時(shí)處理詳解

標(biāo)簽:泰安 東營(yíng) 瀘州 滄州 晉中 駐馬店 昭通 阿壩

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))》,本文關(guān)鍵詞  語言,實(shí)現(xiàn),的,排列組合,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go語言實(shí)現(xiàn)的排列組合問題實(shí)例(n個(gè)數(shù)中取m個(gè))的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美性色aⅴ视频一区日韩精品| 韩国精品一区二区| 欧美刺激脚交jootjob| 91国产丝袜在线播放| 91女厕偷拍女厕偷拍高清| 色综合久久综合网| 欧美三级资源在线| 欧美一区二区福利在线| 欧美变态tickle挠乳网站| 久久精品欧美一区二区三区不卡| 日本道色综合久久| 欧美电影在线免费观看| 欧美一级黄色录像| 国产精品女主播在线观看| 一级女性全黄久久生活片免费| 亚洲国产aⅴ天堂久久| 美女脱光内衣内裤视频久久网站| 久久97超碰色| 成人午夜电影小说| 欧美久久一二区| 日韩欧美国产一区在线观看| 日韩一级二级三级精品视频| 国产日产欧美精品一区二区三区| 亚洲精品视频在线看| 日韩高清不卡在线| 成人av网站在线| 欧美电视剧免费观看| 亚洲欧美韩国综合色| 日本中文字幕不卡| av在线综合网| 91精品国产综合久久福利软件 | 欧美精品一区二区久久久| 欧美不卡激情三级在线观看| 国产欧美日本一区视频| 亚洲资源在线观看| 91农村精品一区二区在线| 欧美一级欧美三级| 亚洲天堂网中文字| 高清成人免费视频| 日韩欧美亚洲国产精品字幕久久久| 欧美韩国一区二区| 精品无人区卡一卡二卡三乱码免费卡| 一本色道久久综合狠狠躁的推荐 | 久久亚洲一区二区三区明星换脸 | 在线观看日韩电影| 国产网红主播福利一区二区| 一片黄亚洲嫩模| 色综合久久综合网欧美综合网| 国产精品国产三级国产普通话三级| 久久激情综合网| 久久久午夜电影| 国产suv精品一区二区883| 国产精品久久久久久久久久久免费看 | 日韩一本二本av| 亚洲电影在线播放| 欧美一区三区四区| 天使萌一区二区三区免费观看| 91精品欧美久久久久久动漫| 亚洲男人的天堂在线aⅴ视频| 91看片淫黄大片一级在线观看| 精品少妇一区二区三区在线播放 | 欧美专区在线观看一区| 97se亚洲国产综合自在线不卡| 欧美色图第一页| 中文字幕在线一区| 色综合久久88色综合天天| 亚洲高清视频在线| 久久夜色精品国产噜噜av| 欧美乱妇20p| 国产一区中文字幕| 亚洲欧美中日韩| 欧美日韩国产综合一区二区 | 亚洲国产日日夜夜| 午夜电影网亚洲视频| 欧美一个色资源| 国产一区二区91| 天堂资源在线中文精品| 精品动漫一区二区三区在线观看| 成人免费高清视频| 日本成人超碰在线观看| 男人的天堂亚洲一区| 国产91精品欧美| 日韩国产高清在线| 国产精品女同一区二区三区| 欧美群妇大交群中文字幕| 国产·精品毛片| 日韩 欧美一区二区三区| 亚洲激情男女视频| 国产欧美中文在线| 欧美日本在线播放| 色狠狠av一区二区三区| 国产精选一区二区三区| 精一区二区三区| 免费久久99精品国产| 免费在线观看不卡| 一区二区三区色| 中文字幕一区二区三区在线不卡 | 成人开心网精品视频| 国产乱码精品一区二区三 | 欧美在线不卡视频| 色婷婷国产精品综合在线观看| 成人免费视频一区二区| 国产成人精品免费网站| 91免费视频观看| 欧美综合一区二区三区| 欧美日韩国产经典色站一区二区三区| 欧美午夜寂寞影院| 欧美日韩精品一区二区三区 | 国产精品一二三在| av在线不卡免费看| 欧美日韩黄色一区二区| 日韩欧美成人一区| 国产精品初高中害羞小美女文| 一区二区三区免费看视频| 夜夜嗨av一区二区三区| 国产专区欧美精品| 欧美伊人久久久久久午夜久久久久| 欧美久久高跟鞋激| 国产亚洲人成网站| 日韩激情一二三区| 99re亚洲国产精品| 久久综合色之久久综合| 一区二区三区免费网站| 成人激情午夜影院| 精品日韩99亚洲| 日韩二区在线观看| 在线视频你懂得一区| 中文字幕精品一区| 激情国产一区二区| 日韩欧美一区在线| 亚洲一区二区偷拍精品| 99re视频精品| 国产精品嫩草影院com| 麻豆国产精品777777在线| 欧美精品黑人性xxxx| 日韩成人免费看| 日韩欧美在线网站| 日韩在线一二三区| 欧美一二区视频| 天堂久久久久va久久久久| 欧美电影在线免费观看| 免费成人av资源网| 欧美xxxx在线观看| 国产一区二区三区免费观看| 欧美精品一区二| 国内成人精品2018免费看| 国产亚洲午夜高清国产拍精品| 国产综合久久久久影院| 久久综合九色欧美综合狠狠| 国产一区二区三区国产| 国产精品久久久久一区二区三区共| av亚洲精华国产精华精华 | 亚洲一二三四区不卡| 在线成人午夜影院| 国产一二精品视频| 中文字幕第一区第二区| 91在线观看免费视频| 亚洲黄色小说网站| 久久久久久久免费视频了| 91香蕉视频黄| 日韩av电影免费观看高清完整版 | 黄色资源网久久资源365| 国产欧美日韩激情| 欧美日韩高清在线播放| 久久国产人妖系列| 一区二区三区精品视频在线| 欧美第一区第二区| 97久久精品人人爽人人爽蜜臀| 中文字幕人成不卡一区| 在线日韩一区二区| 国产一区二区日韩精品| 天天综合网天天综合色| 久久网站最新地址| 欧美综合亚洲图片综合区| 国产乱理伦片在线观看夜一区| 偷拍日韩校园综合在线| 依依成人综合视频| 亚洲国产成人私人影院tom| 日韩一级片在线观看| 92精品国产成人观看免费| 国产精品短视频| 国产欧美一区二区精品久导航 | 中文字幕免费不卡在线| 欧美色成人综合| 欧美色视频一区| 91影院在线观看| 色婷婷久久久综合中文字幕| 国产成人精品影院| 国产成人在线色| 亚洲成人av资源| 亚洲图片欧美综合| 一区二区在线电影| 午夜精品久久久久久久久久久 | 在线亚洲+欧美+日本专区| 亚洲黄色片在线观看| 亚洲欧美在线观看| 亚洲福中文字幕伊人影院| 亚洲视频精选在线| 亚洲国产中文字幕| 奇米一区二区三区av|