資料結構之紅黑樹 位集合

2021-09-24 05:37:16 字數 2293 閱讀 8871

用位向量實現集合,採用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節點,空節點 是黑色的。性質...