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

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

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

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

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

(一)組合問題

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

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

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

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

例如求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個元素中取5個,共15504個結果,耗時約10ms.

代碼實現(xiàn):

復制代碼 代碼如下:
package huawei
import (
    "fmt"
    "time"
)
/*
【排列組合問題:n個數(shù)中取m個】
*/
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))
    //結果是否正確
    rightCount := mathZuhe(n, m)
    if rightCount == len(result) {
        fmt.Println("結果正確")
    } else {
        fmt.Println("結果錯誤,正確結果是:", rightCount)
    }
}
//組合算法(從nums中取出m個數(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{}
    }
    //保存最終結果的數(shù)組,總數(shù)直接通過數(shù)學公式計算
    result := make([][]int, 0, mathZuhe(n, m))
    //保存每一個組合的索引的數(shù)組,1表示選中,0表示未選中
    indexs := make([]int, n)
    for i := 0; i n; i++ {
        if i m {
            indexs[i] = 1
        } else {
            indexs[i] = 0
        }
    }
    //第一個結果
    result = addTo(result, indexs)
    for {
        find := false
        //每次循環(huán)將第一次出現(xiàn)的 1 0 改為 0 1,同時將左側(cè)的1移動到最左側(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復制后添加到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) {
    //計算有幾個1
    sum := 0
    for i := 0; i len(leftNums); i++ {
        if leftNums[i] == 1 {
            sum++
        }
    }
    //將前sum個改為1,之后的改為0
    for i := 0; i len(leftNums); i++ {
        if i sum {
            leftNums[i] = 1
        } else {
            leftNums[i] = 0
        }
    }
}
//根據(jù)索引號數(shù)組得到元素數(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個元素中取m個一共有多少種取法可直接通過數(shù)學公式計算得出,即:

復制代碼 代碼如下:
//數(shù)學方法計算排列數(shù)(從n中取m個數(shù))
func mathPailie(n int, m int) int {
    return jieCheng(n) / jieCheng(n-m)
}
//數(shù)學方法計算組合數(shù)(從n中取m個數(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
}

通過此公式可以簡單的驗證一下上述程序的結果是否正確。

(二)排列問題

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

代碼實現(xiàn):

復制代碼 代碼如下:
func pailieResult(nums []int, m int) [][]int {
    //組合結果
    zuhe := zuheResult(nums, m)
    //保存最終排列結果
    result := make([][]int, 0)
    //遍歷組合結果,對每一項進行全排列
    for _, v := range zuhe {
        p := quanPailie(v)
        result = append(result, p...)
    }
    return result
}
//n個數(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.")
    }
    //如果只有一個數(shù),則直接返回
    if COUNT == 1 {
        return [][]int{nums}
    }
    //否則,將最后一個數(shù)插入到前面的排列數(shù)中的所有位置
    return insertItem(quanPailie(nums[:COUNT-1]), nums[COUNT-1])
}
func insertItem(res [][]int, insertNum int) [][]int {
    //保存結果的slice
    result := make([][]int, len(res)*(len(res[0])+1))
    index := 0
    for _, v := range res {
        for i := 0; i len(v); i++ {
            //在v的每一個元素前面插入新元素
            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
}

希望本文所述對大家Go語言程序設計有所幫助。

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

標簽:泰安 東營 瀘州 滄州 晉中 駐馬店 昭通 阿壩

巨人網(wǎng)絡通訊聲明:本文標題《Go語言實現(xiàn)的排列組合問題實例(n個數(shù)中取m個)》,本文關鍵詞  語言,實現(xiàn),的,排列組合,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go語言實現(xiàn)的排列組合問題實例(n個數(shù)中取m個)》相關的同類信息!
  • 本頁收集關于Go語言實現(xiàn)的排列組合問題實例(n個數(shù)中取m個)的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品国产污网站| 精品中文字幕一区二区小辣椒| 欧美一区二区三区人| 欧美日韩国产系列| 欧美做爰猛烈大尺度电影无法无天| 色综合久久久久综合99| 99久久精品免费看国产| 91在线porny国产在线看| www.日韩在线| 日本久久一区二区三区| 欧美日韩一级二级| 欧美一区二区三区四区久久| 久久综合视频网| 中文字幕国产一区| 亚洲色图都市小说| 天堂成人免费av电影一区| 毛片av中文字幕一区二区| 极品少妇一区二区| av成人动漫在线观看| 欧美日韩亚州综合| 久久久午夜电影| 亚洲色图第一区| 久久99精品久久久久久国产越南| 国产麻豆精品在线观看| 91网址在线看| 欧美一级生活片| 欧美国产丝袜视频| 视频在线观看91| 国产老妇另类xxxxx| 日本韩国一区二区三区| 日韩精品中午字幕| 亚洲综合视频在线| 国产精品毛片高清在线完整版 | 在线观看区一区二| 欧美福利一区二区| 中文字幕欧美区| 欧美aaaaa成人免费观看视频| 国产精品18久久久久久久久| 中文字幕在线一区| 日韩一区二区三区在线观看| 久久美女高清视频| 亚洲第一搞黄网站| 成人av电影在线| 国产精品一二一区| 免费人成在线不卡| 色狠狠色狠狠综合| 国产三级一区二区| 日本欧美在线观看| 免费高清成人在线| 国产精品99久久久久久宅男| 欧美性色aⅴ视频一区日韩精品| 久久久久久亚洲综合影院红桃| 亚洲一区二区在线免费看| 国产盗摄精品一区二区三区在线 | 青椒成人免费视频| 99精品视频一区二区| wwwwxxxxx欧美| 日韩精彩视频在线观看| 成人高清视频在线| 久久精品夜色噜噜亚洲aⅴ| 秋霞av亚洲一区二区三| 欧美欧美欧美欧美| 亚洲在线免费播放| 在线看不卡av| 一区二区三区日韩在线观看| 99久久婷婷国产| 中文字幕中文字幕一区| 成人免费毛片嘿嘿连载视频| 欧美精品一区二区三区高清aⅴ| 亚洲一区二区三区四区不卡| 91小视频免费看| 亚洲品质自拍视频网站| 99热精品一区二区| 亚洲日本va在线观看| 99re在线精品| 一区二区三区精品视频| 欧美在线综合视频| 婷婷成人综合网| 日韩美女一区二区三区| 国内欧美视频一区二区| 精品99999| 成人av在线播放网址| 亚洲欧洲精品一区二区精品久久久| www.成人网.com| 亚洲综合区在线| 日韩欧美在线不卡| 国产综合色精品一区二区三区| www成人在线观看| 粉嫩欧美一区二区三区高清影视 | 中文字幕一区二区三区视频| 99在线视频精品| 一区二区久久久| 日韩一区二区免费视频| 国产午夜亚洲精品午夜鲁丝片| 99精品久久只有精品| 欧洲精品中文字幕| 老司机精品视频导航| 中文字幕成人在线观看| 日韩黄色免费电影| 久久99最新地址| 国产精品拍天天在线| 精品粉嫩aⅴ一区二区三区四区| 一区二区三区四区视频精品免费| 欧美在线观看18| 日韩欧美亚洲另类制服综合在线| 日本精品一区二区三区四区的功能| 韩国视频一区二区| 精品中文字幕一区二区小辣椒| 视频一区二区国产| 日韩欧美在线影院| 国内精品伊人久久久久av影院| 美女一区二区三区| 日本欧美肥老太交大片| 蜜臀精品一区二区三区在线观看 | 依依成人精品视频| 亚洲品质自拍视频| 亚洲激情自拍偷拍| 亚洲gay无套男同| 日韩av一区二| 国产综合久久久久久鬼色| 亚洲精品国产一区二区精华液| 91在线观看下载| 成人国产精品免费网站| 成人免费福利片| 91女厕偷拍女厕偷拍高清| 色狠狠桃花综合| 日本vs亚洲vs韩国一区三区二区| 日韩免费视频线观看| 精品欧美乱码久久久久久| 久久久不卡网国产精品一区| 久久精品亚洲乱码伦伦中文| 国产亚洲精品7777| 亚洲色图制服丝袜| 图片区日韩欧美亚洲| 久久精品99久久久| 国产成a人无v码亚洲福利| 97精品视频在线观看自产线路二| 在线视频观看一区| 国产一本一道久久香蕉| 亚洲免费av网站| 奇米在线7777在线精品| 粗大黑人巨茎大战欧美成人| 在线观看成人免费视频| 精品久久五月天| 亚洲天天做日日做天天谢日日欢| 日一区二区三区| 成人中文字幕合集| 欧美日韩电影在线播放| 国产视频一区二区在线观看| 亚洲乱码日产精品bd| 久久在线免费观看| 亚洲激情综合网| 国产精品萝li| 日韩在线一区二区| 99国产一区二区三精品乱码| 日韩欧美色综合| 亚洲免费成人av| 国产成人午夜精品影院观看视频| 在线亚洲欧美专区二区| 久久亚洲综合av| 五月天婷婷综合| 91免费观看视频在线| 精品国产sm最大网站免费看| 亚洲黄色av一区| 亚洲欧美激情一区二区| 精品一区二区三区在线播放| 天天综合网天天综合色| 91日韩精品一区| 中文成人综合网| 国产精品自拍网站| 日韩一级片在线观看| 亚洲男同1069视频| 成人午夜伦理影院| 久久久国产精华| 精品一区二区影视| 日韩欧美www| 婷婷综合五月天| 奇米四色…亚洲| 欧美日韩精品一二三区| 欧美酷刑日本凌虐凌虐| 一区精品在线播放| 成人精品鲁一区一区二区| 久久综合九色综合97婷婷女人| 久久精品久久综合| 欧美一区二区视频观看视频 | 555www色欧美视频| 一区二区免费看| 欧美天堂亚洲电影院在线播放| 亚洲天堂精品视频| 99国产精品久久久久久久久久| www.亚洲激情.com| 中文字幕av一区二区三区免费看 | www.亚洲人| 亚洲欧美电影一区二区| 99国产精品久久久久| 一区二区在线观看免费视频播放| 色综合天天做天天爱| 亚洲你懂的在线视频| 欧美日韩一级片在线观看| 首页国产丝袜综合|