【问题标题】:BitSet bug in cracking the coding interview?破解编码面试中的BitSet bug?
【发布时间】:2013-09-05 01:13:38
【问题描述】:

以下是破解编码面试书10-4题解法中BitSet的实现。为什么它分配一个 size/32 而不是 (size/32 + 1) 的数组。我在这里遗漏了什么还是这是一个错误?

如果我将 33 传递给 BitSet 的构造函数,那么我将只分配一个 int,如果我尝试设置或获取位 32,我将获得一个 AV!

package Question10_4;

class BitSet {
    int[] bitset;

    public BitSet(int size) {
            bitset = new int[size >> 5]; // divide by 32
    }

    boolean get(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            return (bitset[wordNumber] & (1 << bitNumber)) != 0;
    }

    void set(int pos) {
            int wordNumber = (pos >> 5); // divide by 32
            int bitNumber = (pos & 0x1F); // mod 32
            bitset[wordNumber] |= 1 << bitNumber;
    }

}

【问题讨论】:

  • 另外,我们可以分配一个 ceil(size / 32.0) 元素数组,以避免在 size 可被 32 整除时分配额外的元素。
  • 我只能假设这被忽略了,因为它只应该涵盖 32,000 个元素的情况,即 32 的倍数。对于任何不是 32 的倍数的数字 N,此代码将- 正如你所说 - 失败。您应该给作者留个便条,让他们知道,以便他们解决这个问题。
  • 我查了那本书的Errata,没有列出错误。考虑到他们最近在 5 天前有更正,我肯定会给他们写一封电子邮件;最坏的情况,你我都错了,他们会告诉你原因。
  • @GBach 对于任何小于 32,001 的 N,代码都不会失败。书中解决方案中bitset的构造不依赖于N。答案中bitset的大小设置为32,000正好涵盖了问题中的场景,其中N
  • @groovy 如果它旨在处理一种特定情况,那么更简洁的设计将是不编写一个构造函数,该构造函数接受一个参数并且对于不是 32 的倍数的 size 值失败而是将大小 32000 硬编码到构造函数中。 BitSet 的构造函数的编写方式表明它适用于任何size,但它不是。

标签: algorithm bitset bitarray


【解决方案1】:

是的,书中的答案是错误的。 正确答案:

bitset = new int[(size + 31) >> 5]; // divide by 32

【讨论】:

    【解决方案2】:

    从阅读您提到的解决方案(第 205 页)中收集到的信息,以及我对计算机编程的了解很少,在我看来,这是 bitset 的特殊实现,旨在采用 32,000 的论点在其构造中(请参阅checkDuplicates 函数。问题是关于检查数字从 1 到 N 的数组,其中 N 最多为 32,000,只有 4KB 的内存)。

    这样,创建了一个包含 1000 个元素的数组,每个元素用于位集中的 32 位。你可以在bitset类中看到,为了得到一个bit的位置,我们(floor)除以32得到数组索引,然后mod 32得到具体的bit位置。

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 2015-12-06
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多