[英]implemenation of sets using bits
我正在閱讀有關在以下位置表示為位的集合的信息
http://www.brpreiss.com/books/opus4/html/page395.html
class SetAsBitVector : public Set
{
typedef unsigned int Word;
enum { wordBits = bitsizeof (Word) };
Array<Word> vector;
public:
SetAsBitVector (unsigned int);
// ...
};
SetAsBitVector::SetAsBitVector (unsigned int n) :
Set (n),
vector ((n + wordBits - 1U) / wordBits)
{
// Question here?
for (unsigned int i = 0; i < vector.Length (); ++i)
vector [i] = 0;
}
void SetAsBitVector::Insert (Object& object)
{
unsigned int const item = dynamic_cast<Element&> (object);
vector [item / wordBits] |= 1 << item % wordBits;
// Question here
}
要將項目插入集合,我們需要將位數組中的相應位更改為1。 位陣列的第i位是字ceiling(i / w)的位i mod w。 因此,插入函數是通過按位執行或將第i位更改為1的操作來實現的,如上面的Program所示。 盡管它比SetAsArray類的相應操作稍微復雜一些,但此操作的運行時間仍為O(1)。 由於w = wordBits是2的冪,因此可以用移位和掩碼替換除法和模運算/和%,如下所示:
向量[item >> shift] | = 1 <<(item&mask);
取決於編譯器和計算機體系結構,這樣做可以將插入操作的性能提高一個常數。
問題
我在構造函數中的問題是為什么作者將wordBits添加到“ n”並減去1,相反,我們可以直接將其用作n / wordbit?
作者問的第二個問題是:“既然w = wordBits是2的冪,可以用移位和掩碼替換除法和取模運算/和%,如下所示:
向量[item >> shift] | = 1 <<(item&mask);
在上述情況下,要求舉一個例子,移位和掩膜的值是多少。
我將其重新標記為C ++,因為它顯然不是C。
n
等於小於wordBits
東西會發生什么。 通用公式恰好是所使用的公式,即b = (a + Q - 1) / Q
確保b * Q
至少為a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.