【发布时间】:2017-09-21 11:01:47
【问题描述】:
算法:
给定一个数 n,所有大小为 n 的二进制数的 list(L(n)) 可以通过以下方式从 L(n-1) 计算出来:
- 假设数组 L(n-1) 包含所有长度为 n-1 的二进制数。
- 反转 L(n-1) 并调用 RL(n-1)。
- 将“0”附加到 L(n-1) 中的所有二进制数。将“1”附加到 RL(n-1) 中的所有二进制数。
- 合并新的附加数组 L(n-1) 和 RL(n-1) 以获得所有大小为 n 的二进制数。
- 基础案例, 如果 n=1,则输出 = [0,1]。
例如,如果 n=2,我们可以通过以下方式获取所有大小为 2 的二进制数的列表:
- 设 a = [0,1] 为大小为 (2-1) = 1 的二进制数列表。
- 令 b = a = [1,0] 的倒数。
- 将 0 附加到 a 中的所有元素。新的 a = [00,11]。
- 将 1 附加到 b 中的所有元素。新 b = [11,10]。
- 合并新的 a 和 b。 [00,11,11,10]。
问题陈述:给定一个数 n,找出 n 个二进制数的列表。
解决方案:如果 n 小于 20,则可以使用简单的递归或非递归解决方案。
问题:如果传递了一个更大的数字(比如说 40 并超出内存限制),我的代码将失败。
为什么? - '因为对于一个数字来说 40,二进制数的总数将是幂(2,40),这是巨大的(1048576 * 1048576)。
那么,有没有更好的算法或方法来解决上述问题呢?
【问题讨论】:
-
为什么需要一个特定大小的所有个数字的列表?
-
您的结果有重复的
11,但缺少01。 -
问题与算法无关。如果没有足够的内存来容纳所有二进制数,那么您创建一个包含所有大小为 N 的二进制数列表的目标就无法实现。
-
对,应该是[00,01],新的a。
-
好吧,假设我不想要所有的数字。但只想要最后 n 个数字。那么问题仍然存在。