用位向量實現集合,採用16位無符號短整數陣列bit_vector作為集合元素的儲存,1和0分別表示在或不在集合之中。如何將集合元素i的值存入位向量之中,採用put_member()函式實現,取出採用get_member()實現。下文會給出程式。
用位向量來儲存集合元素,這些集合元素只具有整數型別,集合元素的範圍在0~set_size-1之間,陣列採用16位無符號短整數實現對映。
集合操作主要有交,並,差。
並:利用位運算或 | 實現
交:裡用位運算與 &實現
差:舉個例子:如 主體陣列: 10011001
引數陣列: 00111000
差: 10000001
可見是用 主題陣列 & ~引數陣列即得到結果
程式實現有兩需要注意:
1.在初始化時,我們使用的是集合元素數目作為初始化引數,來解析出陣列應有的空間大小。解析方式為 (set_size + 15) >> 4,注意:不能是 set_size/16+1 或者 set_size/17+1
它們分別在set_size值為16和33時候失效
2.put member時,我們首先得到該集合元素所在的unsigned short型別,並確定在該型別中是第幾位。
auto pos = get_elem_and_pos(x);
unsigned short elem = bit_vector_[pos.first];
unsigned short tmp = elem >> (15 - pos.second);
elem <<= (pos.second + 1); // !!! +1
if(((tmp & 1) == 0) && v)
tmp += 1;
else if(((tmp & 1) == 1) && !v)
tmp -= 1;
bit_vector_[pos.first] = (elem >> (pos.second+1)) | (tmp << (15-pos.second));
我們先用tmp取出該位,然後把原有元素向左移到頭!為什麼呢?因為這樣做了之後,我們由於在後面 | 運算要和改動的資料進行合併,這是我們把原有元素再右移回來,無符號數右移,最高位全為0,這樣和改動的元素 | 運算就不會有影響了。
**如下:
#ifndef _bit_set_h
#define _bit_set_h
#include
#include
#include
#include
const int default_size = 100;
template //template t for char, short, int, long ...
class bit_set ;
template
bit_set::bit_set(int sz)
: set_size_(sz)
template
bit_set::bit_set(const bit_set& other)
template
bit_set::~bit_set()
template
inline int bit_set::get_set_size() const
template
inline std::pairbit_set::get_elem_and_pos(const t& x) const
template
inline void bit_set::assert_is_valid(const t& x) const
template
void bit_set::put_member(const t& x, bool v)
template
bool bit_set::get_member(const t& x) const
template
bool add_member(const t& x)
return false;
}template
bool del_member(const t& x)
return false;
}template
bit_setbit_set::operator+(const bit_set& other)
template
bool bit_set::contains(const t& x)
template
bool bit_set::sub_set(bit_set& other) //is this sub_set of other ?
資料結構之紅黑樹
定義 紅黑樹是一顆二叉查詢樹,樹中結點顏色或為紅色或為黑色,且滿足如下條件 根結點和所有外結點的顏色為黑色 根結點到任意乙個外結點的路徑上沒有連續的兩個紅色結點,若乙個結點是紅色,則其兩個兒子結點都是黑色 根結點到任意外結點的路徑上都有相同數目的黑色結點。1 插入操作 插入操作可以概括為以下幾個步驟...
資料結構 紅黑樹
紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...
資料結構 紅黑樹
一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...