Как перебрать все способы выбора n b-битных массивов из всех возможных b-битных массивов? - PullRequest
2 голосов
/ 29 января 2020

Есть 2^b b-битные массивы. Существует "2^b выбирать n" различными способами выбора n b-битных массивов. Я хотел бы перебрать все "2^b выбирать n" различные способы выбора n b-битных массивов. Очевидно, что это возможно только в реалистичном периоде времени c, если b и n оба малы.

Как я могу сделать это в Джулии?

1 Ответ

5 голосов
/ 30 января 2020

Вы можете использовать combinations из Combinatorics.jl для генерации различных комбинаций. И, в зависимости от того, что вы ищете, вы можете использовать string или bitstring для преобразования целых чисел в их двоичное представление:

julia> string(123, base=2)
"1111011"

julia> bitstring(123)
"0000000000000000000000000000000000000000000000000000000001111011"

Для краткости я буду придерживаться string. Вот пример полного расчета для случая b = 3 и n = 2:

julia> using Combinatorics

julia> r = 0:2^3-1
0:7

julia> b = string.(r, base=2)
8-element Array{String,1}:
 "0"  
 "1"  
 "10" 
 "11" 
 "100"
 "101"
 "110"
 "111"

julia> combs = combinations(b, 2);

julia> foreach(println, combs)
["0", "1"]
["0", "10"]
["0", "11"]
["0", "100"]
["0", "101"]
["0", "110"]
["0", "111"]
["1", "10"]
["1", "11"]
["1", "100"]
["1", "101"]
["1", "110"]
["1", "111"]
["10", "11"]
["10", "100"]
["10", "101"]
["10", "110"]
["10", "111"]
["11", "100"]
["11", "101"]
["11", "110"]
["11", "111"]
["100", "101"]
["100", "110"]
["100", "111"]
["101", "110"]
["101", "111"]
["110", "111"]
...