簡體   English   中英

使用位實現集

[英]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);

取決於編譯器和計算機體系結構,這樣做可以將插入操作的性能提高一個常數。

問題

  1. 我在構造函數中的問題是為什么作者將wordBits添加到“ n”並減去1,相反,我們可以直接將其用作n / wordbit?

  2. 作者問的第二個問題是:“既然w = wordBits是2的冪,可以用移位和掩碼替換除法和取模運算/和%,如下所示:

向量[item >> shift] | = 1 <<(item&mask);

在上述情況下,要求舉一個例子,移位和掩膜的值是多少。

  1. 為什么作者提到取決於體系結構和編譯器的性能有提高?

我將其重新標記為C ++,因為它顯然不是C。

  1. 四舍五入。 考慮一下如果調用n等於小於wordBits東西會發生什么。 通用公式恰好是所使用的公式,即b = (a + Q - 1) / Q確保b * Q至少為a
  2. 基本的二進制算術,除以2等於向右移位,依此類推。
  3. 在某些機器上,移位和掩碼之類的按位運算比除法和模運算要快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM