我正在寻找一种最佳算法来找出剩余的所有可能的排列 给二进制数。
例如:
二进制数是:........ 1。算法应返回剩余的2 ^ 7个剩余二进制数,如00000001,00000011等
谢谢, Sathish所在
答案 0 :(得分:4)
给出的例子是不一个排列!
排列是对输入的重新排序。
因此,如果输入为00000001,则00100000和00000010是排列,但00000011不是。
答案 1 :(得分:4)
如果这只适用于小数字(可能最多16位),那么只需迭代所有数字并忽略不匹配:
int fixed = 0x01; // this is the fixed part
int mask = 0x01; // these are the bits of the fixed part which matter
for (int i=0; i<256; i++) {
if (i & mask == fixed) {
print i;
}
}
答案 2 :(得分:2)
找到所有你不会比循环所有数字更好的事情,例如如果你想循环所有8位数
for (int i =0; i < (1<<8) ; ++i)
{
//do stuff with i
}
如果您需要以二进制输出,请查看您使用的语言中的字符串格式选项。
e.g。
的printf( “%B”,i)的; //不是C / C ++中的标准
对于计算,在大多数语言中,基数应该是无关紧要的。
答案 3 :(得分:1)
为什么让它变得复杂! 它简单如下:
// permutation of i on a length K
// Example : decimal i=10 is permuted over length k= 7
// [10]0001010-> [5] 0000101-> [66] 1000010 and 33, 80, 40, 20 etc.
main(){
int i=10,j,k=7; j=i;
do printf("%d \n", i= ( (i&1)<< k + i >>1); while (i!=j);
}
答案 4 :(得分:0)
您可以使用许多排列生成算法,例如:
#include <stdio.h>
void print(const int *v, const int size)
{
if (v != 0) {
for (int i = 0; i < size; i++) {
printf("%4d", v[i] );
}
printf("\n");
}
} // print
void visit(int *Value, int N, int k)
{
static level = -1;
level = level+1; Value[k] = level;
if (level == N)
print(Value, N);
else
for (int i = 0; i < N; i++)
if (Value[i] == 0)
visit(Value, N, i);
level = level-1; Value[k] = 0;
}
main()
{
const int N = 4;
int Value[N];
for (int i = 0; i < N; i++) {
Value[i] = 0;
}
visit(Value, N, 0);
}
来源: http://www.bearcave.com/random_hacks/permute.html
确保根据需要调整相关常数(二进制数,7位等)
答案 5 :(得分:0)
我将您的问题读作:“给定一些二进制数字,并始终设置一些位,创建剩余的可能二进制数”。
例如,给定1xx1:你想要:1001,1011,1101,1111。
O(N)算法如下。
假设位在掩码m中定义。你也有一个哈希值。
生成数字&lt; n-1,伪码:
counter = 0 for x in 0..n-1: x' = x | ~m if h[x'] is not set: h[x'] = counter counter += 1
代码中的想法是遍历从0到n-1的所有数字,并将预定义的位设置为1.然后通过将结果数字映射到值来记忆结果数字(如果尚未记忆)一个正在运行的柜台。
h的关键是排列。作为奖励,h [p]将包含排列p的唯一索引号,尽管您在原始问题中不需要它,但它可能很有用。
答案 6 :(得分:0)
如果你真的在寻找排列,那么下面的代码应该这样做。
例如,查找给定二进制字符串(模式)的所有可能排列。
1000的排列是1000,0100,0010,0001:
void permutation(int no_ones, int no_zeroes, string accum){
if(no_ones == 0){
for(int i=0;i<no_zeroes;i++){
accum += "0";
}
cout << accum << endl;
return;
}
else if(no_zeroes == 0){
for(int j=0;j<no_ones;j++){
accum += "1";
}
cout << accum << endl;
return;
}
permutation (no_ones - 1, no_zeroes, accum + "1");
permutation (no_ones , no_zeroes - 1, accum + "0");
}
int main(){
string append = "";
//finding permutation of 11000
permutation(2, 6, append); //the permutations are
//11000
//10100
//10010
//10001
//01100
//01010
cin.get();
}
答案 7 :(得分:0)
如果您打算为n位生成所有字符串组合,那么可以使用回溯来解决问题。
你走了:
//Generating all string of n bits assuming A[0..n-1] is array of size n
public class Backtracking {
int[] A;
void Binary(int n){
if(n<1){
for(int i : A)
System.out.print(i);
System.out.println();
}else{
A[n-1] = 0;
Binary(n-1);
A[n-1] = 1;
Binary(n-1);
}
}
public static void main(String[] args) {
// n is number of bits
int n = 8;
Backtracking backtracking = new Backtracking();
backtracking.A = new int[n];
backtracking.Binary(n);
}
}