【问题标题】:Dealing with big size binary numbers in php在php中处理大尺寸二进制数
【发布时间】: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 个数字。那么问题仍然存在。

标签: php algorithm memory


【解决方案1】:

您可以做的是只存储第一个n 号码。似乎在每种情况下,您只需要第一个 n-1 数字来反转并附加 '1' 以获得正确的输出。

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2023-03-29
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多