【问题标题】:All binary permutations of a fixed length in CC中所有固定长度的二进制排列
【发布时间】:2014-08-20 00:18:35
【问题描述】:

我已经搜索过这个主题,但找不到。问题是:给定一个整数n,生成一个包含01的所有2^n组合的数组。

例如,当n = 2,我们应该得到{{0, 0}, {0, 1}, {1, 0}, {1, 1 }}。我发现itertools.productPython 中使用参数repeat 执行此操作(但我的雇主希望它严格在C 中)。

我需要代码适合n = 24, 25 案例(并且足够快 - 这是我雇主的要求)。

此外,我还有一个问题。 CPython 中是否有类似于Generator 的内容?

编辑

我在这里看到很多 -ve 反馈。对于这种混乱,我真的很抱歉。在这里,我尝试重新构建我的问题:

我有一个160 元素数组,其中只有24(或25)被标记(这些标记元素的索引存储在单独的数组中)。我需要获取所有160 元素2^24 次 - 每次一个或多个标记元素将被其 dual 替换,并执行一些操作(此操作需要 160 元素并产生每次都有一个二进制响应,我需要所有响应的 XOR)。我怎样才能有效地做到这一点?

我工作的农场经理除了C 不知道。所以,他希望在C 中完成。

*每个元素都是一个二维数组。

编辑#2

可能是,我仍然无法澄清我遇到的问题。我在伪代码的基础上工作:

all_elements = { <collection of elements> };
all_marked_elements = { <collection of 24 marked elements> };
all_combinations = { <all 0, 1 combinations of length 2^24> };

int operation (<160 elements>) {
    ...
    return 0 or 1;
}

x = 0;

foreach (c in all_combinations) {
    e = {};
    for (i >= 0; i <= 23; i=i+1) {
        if (c[i] == 1) {
            append all_marked_elements[i] to e;
        }
    }
    d = get dual of all elements in e; 
    x xor= operation ( <all_elements with e replaced by d>);
}
show x; 

【问题讨论】:

  • 这个问题是两个问题。这不好。
  • 你在问如何用二进制计数。
  • 我想知道这个“雇主”到底是谁......?
  • @alk: 一个……未来的,也许吧?听起来像是一个入门级的面试问题(如果不是家庭作业)

标签: c arrays binary


【解决方案1】:

答案是这样的。

  1. 在 C 中,处理 [0,1] 数组的自然方法是将它们视为位。
  2. 24 位的 2^24 排列正是 unsigned int 从 0 到 2^24-1 的值。
  3. 所以问题本质上是如何根据该数据结构编写代码。

类似的东西。

int all_elements[160] = { ??? };
int all_marked_elements[24] = { ??? };
unsigned combo;
for (combo = 0; combo < 0x1000000; ++combo) {
  /* you probably want to take a copy of all_elements here */
  for (i = 0; i < 23; ++i) {
    unsigned bit = 1 << i;
    if (combo & bit) {
      int marked_element = all_marked_elements[i];
      /* do something I didn't understand, replacing element by its dual */
    }
    /* now call the operation and do something with the result */
  }
}

【讨论】:

  • Dual 在这里无关紧要。而且,感谢您理解我的需求(呵呵!)。
  • 我的荣幸。你得到了很多我认为不值得的反对票,因为大多数人不理解这个问题。如果您努力使您的问题更易于理解,您将获得更好的答案。
【解决方案2】:

实际上,您只需要查找整数中的位。如果您有 25 位,则您的排列对应于所有数字的位序列0&lt;= i &lt; 2^25,它适合简单的unsigned int。您无需“生成”和存储这些数字,只需在需要排列的任何地方使用它们即可。

【讨论】:

    【解决方案3】:
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    main()
    {
        int i,n=2;
        char arr[500];
        for(i=0;i<pow(2,n);i++)
            printf("%s\n",itoa(i,arr,2));
    }
    

    【讨论】:

    • 为什么要转换成字符表示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多