| // Copyright ©2019 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package combin_test |
| |
| import ( |
| "fmt" |
| |
| "gonum.org/v1/gonum/stat/combin" |
| ) |
| |
| func ExampleCartesian() { |
| fmt.Println("Generate Cartesian products for given lengths:") |
| lens := []int{1, 2, 3} |
| list := combin.Cartesian(lens) |
| for i, v := range list { |
| fmt.Println(i, v) |
| } |
| // This is easy, but the number of combinations can be very large, |
| // and generating all at once can use a lot of memory. |
| // For big data sets, consider using CartesianGenerator instead. |
| |
| // Output: |
| // Generate Cartesian products for given lengths: |
| // 0 [0 0 0] |
| // 1 [0 0 1] |
| // 2 [0 0 2] |
| // 3 [0 1 0] |
| // 4 [0 1 1] |
| // 5 [0 1 2] |
| } |
| |
| func ExampleCartesianGenerator() { |
| fmt.Println("Generate products for given lengths:") |
| lens := []int{1, 2, 3} |
| gen := combin.NewCartesianGenerator(lens) |
| |
| // Now loop over all products. |
| var i int |
| for gen.Next() { |
| fmt.Println(i, gen.Product(nil)) |
| i++ |
| } |
| |
| // Output: |
| // Generate products for given lengths: |
| // 0 [0 0 0] |
| // 1 [0 0 1] |
| // 2 [0 0 2] |
| // 3 [0 1 0] |
| // 4 [0 1 1] |
| // 5 [0 1 2] |
| } |
| |
| func ExampleCombinations() { |
| // combin provides several ways to work with the combinations of |
| // different objects. Combinations generates them directly. |
| fmt.Println("Generate list:") |
| n := 5 |
| k := 3 |
| list := combin.Combinations(n, k) |
| for i, v := range list { |
| fmt.Println(i, v) |
| } |
| // This is easy, but the number of combinations can be very large, |
| // and generating all at once can use a lot of memory. |
| |
| // Output: |
| // Generate list: |
| // 0 [0 1 2] |
| // 1 [0 1 3] |
| // 2 [0 1 4] |
| // 3 [0 2 3] |
| // 4 [0 2 4] |
| // 5 [0 3 4] |
| // 6 [1 2 3] |
| // 7 [1 2 4] |
| // 8 [1 3 4] |
| // 9 [2 3 4] |
| } |
| |
| func ExampleCombinations_index() { |
| // The integer slices returned from Combinations can be used to index |
| // into a data structure. |
| data := []string{"a", "b", "c", "d", "e"} |
| cs := combin.Combinations(len(data), 2) |
| for _, c := range cs { |
| fmt.Printf("%s%s\n", data[c[0]], data[c[1]]) |
| } |
| |
| // Output: |
| // ab |
| // ac |
| // ad |
| // ae |
| // bc |
| // bd |
| // be |
| // cd |
| // ce |
| // de |
| } |
| |
| func ExampleCombinationGenerator() { |
| // combin provides several ways to work with the combinations of |
| // different objects. CombinationGenerator constructs an iterator |
| // for the combinations. |
| n := 5 |
| k := 3 |
| gen := combin.NewCombinationGenerator(n, k) |
| idx := 0 |
| for gen.Next() { |
| fmt.Println(idx, gen.Combination(nil)) // can also store in-place. |
| idx++ |
| } |
| // Output: |
| // 0 [0 1 2] |
| // 1 [0 1 3] |
| // 2 [0 1 4] |
| // 3 [0 2 3] |
| // 4 [0 2 4] |
| // 5 [0 3 4] |
| // 6 [1 2 3] |
| // 7 [1 2 4] |
| // 8 [1 3 4] |
| // 9 [2 3 4] |
| } |
| |
| func ExampleIndexToCombination() { |
| // combin provides several ways to work with the combinations of |
| // different objects. IndexToCombination allows random access into |
| // the combination order. Combined with CombinationIndex this |
| // provides a correspondence between integers and combinations. |
| n := 5 |
| k := 3 |
| comb := make([]int, k) |
| for i := 0; i < combin.Binomial(n, k); i++ { |
| combin.IndexToCombination(comb, i, n, k) // can also use nil. |
| idx := combin.CombinationIndex(comb, n, k) |
| fmt.Println(i, comb, idx) |
| } |
| |
| // Output: |
| // 0 [0 1 2] 0 |
| // 1 [0 1 3] 1 |
| // 2 [0 1 4] 2 |
| // 3 [0 2 3] 3 |
| // 4 [0 2 4] 4 |
| // 5 [0 3 4] 5 |
| // 6 [1 2 3] 6 |
| // 7 [1 2 4] 7 |
| // 8 [1 3 4] 8 |
| // 9 [2 3 4] 9 |
| } |
| |
| func ExamplePermutations() { |
| // combin provides several ways to work with the permutations of |
| // different objects. Permutations generates them directly. |
| fmt.Println("Generate list:") |
| n := 4 |
| k := 3 |
| list := combin.Permutations(n, k) |
| for i, v := range list { |
| fmt.Println(i, v) |
| } |
| // This is easy, but the number of permutations can be very large, |
| // and generating all at once can use a lot of memory. |
| |
| // Output: |
| // Generate list: |
| // 0 [0 1 2] |
| // 1 [0 2 1] |
| // 2 [1 0 2] |
| // 3 [1 2 0] |
| // 4 [2 0 1] |
| // 5 [2 1 0] |
| // 6 [0 1 3] |
| // 7 [0 3 1] |
| // 8 [1 0 3] |
| // 9 [1 3 0] |
| // 10 [3 0 1] |
| // 11 [3 1 0] |
| // 12 [0 2 3] |
| // 13 [0 3 2] |
| // 14 [2 0 3] |
| // 15 [2 3 0] |
| // 16 [3 0 2] |
| // 17 [3 2 0] |
| // 18 [1 2 3] |
| // 19 [1 3 2] |
| // 20 [2 1 3] |
| // 21 [2 3 1] |
| // 22 [3 1 2] |
| // 23 [3 2 1] |
| } |
| |
| func ExamplePermutations_index() { |
| // The integer slices returned from Permutations can be used to index |
| // into a data structure. |
| data := []string{"a", "b", "c", "d"} |
| cs := combin.Permutations(len(data), 2) |
| for _, c := range cs { |
| fmt.Printf("%s%s\n", data[c[0]], data[c[1]]) |
| } |
| |
| // Output: |
| // ab |
| // ba |
| // ac |
| // ca |
| // ad |
| // da |
| // bc |
| // cb |
| // bd |
| // db |
| // cd |
| // dc |
| } |
| |
| func ExamplePermutationGenerator() { |
| // combin provides several ways to work with the permutations of |
| // different objects. PermutationGenerator constructs an iterator |
| // for the permutations. |
| n := 4 |
| k := 3 |
| gen := combin.NewPermutationGenerator(n, k) |
| idx := 0 |
| for gen.Next() { |
| fmt.Println(idx, gen.Permutation(nil)) // can also store in-place. |
| idx++ |
| } |
| |
| // Output: |
| // 0 [0 1 2] |
| // 1 [0 2 1] |
| // 2 [1 0 2] |
| // 3 [1 2 0] |
| // 4 [2 0 1] |
| // 5 [2 1 0] |
| // 6 [0 1 3] |
| // 7 [0 3 1] |
| // 8 [1 0 3] |
| // 9 [1 3 0] |
| // 10 [3 0 1] |
| // 11 [3 1 0] |
| // 12 [0 2 3] |
| // 13 [0 3 2] |
| // 14 [2 0 3] |
| // 15 [2 3 0] |
| // 16 [3 0 2] |
| // 17 [3 2 0] |
| // 18 [1 2 3] |
| // 19 [1 3 2] |
| // 20 [2 1 3] |
| // 21 [2 3 1] |
| // 22 [3 1 2] |
| // 23 [3 2 1] |
| } |
| |
| func ExampleIndexToPermutation() { |
| // combin provides several ways to work with the permutations of |
| // different objects. IndexToPermutation allows random access into |
| // the permutation order. Combined with PermutationIndex this |
| // provides a correspondence between integers and permutations. |
| n := 4 |
| k := 3 |
| comb := make([]int, k) |
| for i := 0; i < combin.NumPermutations(n, k); i++ { |
| combin.IndexToPermutation(comb, i, n, k) // can also use nil. |
| idx := combin.PermutationIndex(comb, n, k) |
| fmt.Println(i, comb, idx) |
| } |
| |
| // Output: |
| // 0 [0 1 2] 0 |
| // 1 [0 2 1] 1 |
| // 2 [1 0 2] 2 |
| // 3 [1 2 0] 3 |
| // 4 [2 0 1] 4 |
| // 5 [2 1 0] 5 |
| // 6 [0 1 3] 6 |
| // 7 [0 3 1] 7 |
| // 8 [1 0 3] 8 |
| // 9 [1 3 0] 9 |
| // 10 [3 0 1] 10 |
| // 11 [3 1 0] 11 |
| // 12 [0 2 3] 12 |
| // 13 [0 3 2] 13 |
| // 14 [2 0 3] 14 |
| // 15 [2 3 0] 15 |
| // 16 [3 0 2] 16 |
| // 17 [3 2 0] 17 |
| // 18 [1 2 3] 18 |
| // 19 [1 3 2] 19 |
| // 20 [2 1 3] 20 |
| // 21 [2 3 1] 21 |
| // 22 [3 1 2] 22 |
| // 23 [3 2 1] 23 |
| } |