草庐IT

algorithm - 生成特定长度的组合/排列

coder 2024-07-07 原文

项目比较复杂,但阻塞的问题是:如何从列表中生成特定长度的单词序列?

我已经找到了如何生成所有可能的组合(见下文),但问题是我只需要特定长度的组合。

Wolfram 工作示例(尽管它使用排列,我只需要组合(顺序无关紧要)):

Permutations[{a, b, c, d}, {3}]

例子(伪go):

  list := []string{"alice", "moon", "walks", "mars", "sings", "guitar", "bravo"}
  var premutationOf3
  premutationOf3 = premuate(list, 3)
  // this should return a list of all premutations such 
  // [][]string{[]string{"alice", "walks", "moon"}, []string{"alice", "signs", "guitar"} ....}

预突变所有可能序列的当前代码(无长度限制)

    for _, perm := range permutations(list) {
        fmt.Printf("%q\n", perm)
    }

func permutations(arr []string) [][]string {
    var helper func([]string, int)
    res := [][]string{}

    helper = func(arr []string, n int) {
        if n == 1 {
            tmp := make([]string, len(arr))
            copy(tmp, arr)
            res = append(res, tmp)
        } else {
            for i := 0; i < n; i++ {
                helper(arr, n-1)
                if n%2 == 1 {
                    tmp := arr[i]
                    arr[i] = arr[n-1]
                    arr[n-1] = tmp
                } else {
                    tmp := arr[0]
                    arr[0] = arr[n-1]
                    arr[n-1] = tmp
                }
            }
        }
    }
    helper(arr, len(arr))
    return res
}

最佳答案

我在 Go 中实现了生成组合的 twiddle 算法。这是我的实现:

package twiddle

// Twiddle type contains all information twiddle algorithm
// need between each iteration.
type Twiddle struct {
    p   []int
    b   []bool
    end bool
}

// New creates new twiddle algorithm instance
func New(m int, n int) *Twiddle {
    p := make([]int, n+2)
    b := make([]bool, n)

    // initiate p
    p[0] = n + 1

    var i int

    for i = 1; i != n-m+1; i++ {
        p[i] = 0
    }
    for i != n+1 {
        p[i] = i + m - n
        i++
    }

    p[n+1] = -2

    if m == 0 {
        p[1] = 1
    }

    // initiate b
    for i = 0; i != n-m; i++ {
        b[i] = false
    }
    for i != n {
        b[i] = true
        i++
    }

    return &Twiddle{
        p: p,
        b: b,
    }
}

// Next creates next combination and return it.
// it returns nil on end of combinations
func (t *Twiddle) Next() []bool {
    if t.end {
        return nil
    }

    r := make([]bool, len(t.b))
    for i := 0; i < len(t.b); i++ {
        r[i] = t.b[i]
    }

    x, y, end := t.twiddle()
    t.b[x] = true
    t.b[y] = false
    t.end = end

    return r
}

func (t *Twiddle) twiddle() (int, int, bool) {
    var i, j, k int
    var x, y int

    j = 1
    for t.p[j] <= 0 {
        j++
    }

    if t.p[j-1] == 0 {
        for i = j - 1; i != 1; i-- {
            t.p[i] = -1
        }
        t.p[j] = 0
        x = 0
        t.p[1] = 1
        y = j - 1
    } else {
        if j > 1 {
            t.p[j-1] = 0
        }
        j++
        for t.p[j] > 0 {
            j++
        }
        k = j - 1
        i = j
        for t.p[i] == 0 {
            t.p[i] = -1
            i++
        }
        if t.p[i] == -1 {
            t.p[i] = t.p[k]
            x = i - 1
            y = k - 1
            t.p[k] = -1
        } else {
            if i == t.p[0] {
                return x, y, true
            }

            t.p[j] = t.p[i]
            t.p[i] = 0
            x = j - 1
            y = i - 1
        }
    }
    return x, y, false

}

您可以按如下方式使用我的 tweedle 包:

tw := tweedle.New(1, 2)

for b := tw.Next(); b != nil; b = tw.Next() {
    fmt.Println(b)
}

关于algorithm - 生成特定长度的组合/排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47778453/

有关algorithm - 生成特定长度的组合/排列的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  3. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  7. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  8. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  9. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐