【问题标题】:all possible combinations of bits given n max length and a known count of 1 bits给定 n 个最大长度和已知的 1 位计数的所有可能的位组合
【发布时间】:2018-02-19 17:44:49
【问题描述】:

我正在尝试推出自己的压缩算法作为实验。对于我的解决方案的一部分,我需要计算输入字节中 1 的位数。当前要求输入字节为 8 字节或 64 位长。这意味着我可以从 0 到 64 计算 1 位。

我正在努力理解和计算的是我使用这种方法可能遇到的最大组合数?

示例 1:

1 位计数 = 1 这意味着有 63 个零位 这意味着在这种情况下总共有 64 种组合

我不明白的地方

当有 32 个 1 位时会发生什么?到目前为止,我的方法是简单的乘法:所以对于 32 个 1 位和 32 个 0 位(请记住,我们的最大值为 64 位)所以 64 x 32 = 2048。

这个数学正确吗?

老实说,这似乎太低了,但我不确定。更令人困惑的是,我知道 1 和 0 的数量但不知道它们的确切位置,这如何减少最大可能的组合。很明显,如果这是一个简单的 64 位总共有多少组合,那将是 2^64,这是一个巨大的数字。让我怀疑我之前的数学是否准确。

【问题讨论】:

    标签: math combinations bit


    【解决方案1】:

    这是combinations 中的一个问题。您有 64 个位置,并且想要选择其中的 32 个来放置 1 位。选择不能有任何重复,选择的顺序无关紧要。这使它成为一个组合问题。

    答案是64对32的binomial coefficient,可以通过公式计算出来

    64! / (32! * (64-32)!)
    

    感叹号是factorial function

    计算结果是

    1832624140942590534
    

    这比您尝试的答案要大得多。

    只需一点,结果就是 1 的二项式 64,这确实是 64,所以你猜对了。许多计算机语言中有许多包可以计算二项式系数。

    请注意,这与其说是一道编程题,不如说是一道数学题。由于这确实直接来自编程问题,因此我不仅将您定向到Mathematics Stack Exchange,而且将来您应该在那里提出此类问题。

    【讨论】:

    • 在考虑到我需要实际重新创建原始输入时,这个答案是否仍然正确,所以我不在乎它们实际上的顺序,因为我们只有零或一,但我确实需要通过我的其他计算复制零和一的原始输入。其中一个计算涉及迭代和猜测,直到我们找到正确的答案(我有一种方法可以在解压过程中验证给定输入的答案是否正确)。这有意义吗?
    • 重新阅读您的帖子几次,我认为您已经完全涵盖了这一点。再次感谢您的帮助,我很抱歉没有意识到数学堆栈交换的存在。
    • @Vance:恐怕你的第一条评论对我来说没有意义,所以我无法回答这个问题。
    • 不用担心,它确实读到了一点乱码。再次感谢!
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 2022-01-07
    • 2015-02-03
    • 1970-01-01
    • 2022-01-03
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多