二项队列 C++实现
来源:互联网 发布:2015年十大网络流行语 编辑:程序博客网 时间:2024/05/22 10:29
二项队列是比左式堆与斜堆更好的选择。
二项队列不是一棵树,是由堆序的集合组成的,成为森林。堆序中每一颗树都有约束,都为二项树,每一个高度只有一个二项树,每层的高度由两个下一层高度的树组成。B1= B0 + B0。
二项队列的合并是相同高度的二项树合并,并且insert与deleteMin都是依靠合并这个操作实现的。
template<typename T>class BinomialQueue{public: BinomialQueue(); BinomialQueue(const T &t); BinomialQueue(const BinomialQueue &rhs); ~BinomialQueue(); bool isEmpty() const; const T & findMin() const; void insert(const T &t); void deleteMin(); void deleteMin(T & t); void makeEmpty(); void merge(BinomialQueue & rhs); const BinomialQueue & operator= (const BinomialQueue &rhs);private: struct BinomialNode { T element; BinomialNode * leftChild; BinomialNode * nextSibling; BinomialNode(const T & t, BinomialNode * lc, BinomialNode *ns) : element(t), leftChild(lc), nextSibling(ns) {} }; enum { DEFAULT_TREES = 1}; int currentSize; vector<BinomialNode *> theTrees; int findMinIndex() const; int capacity() const; BinomialNode * combineTrees(BinomialNode * t1, BinomialNode * t2); void makeEmpty(BinomialNode * & t); BinomialNode * clone(BinomialNode * t) const;};template<typename T>BinomialNode * BinomialQueue<T>::combineTrees(BinomialNode * t1, BinomialNode * t2){ if (t2->element < t1->element) return combineTrees(t2, t1); t2->nextSibling = t1->leftChild; t1->leftChild = t2; return t1;}template<typename T>void BinomialQueue<T>::merge(BinomialQueue & rhs){ if (this == &rhs) return; currentSize == rhs.currentSize > theTrees.size() ? rhs.currentSize + 1 : theTrees.size() + 1; //上一层树合并生成的下一层树,没有则为空 BinomialNode * carry = nullptr; //书上写的这个j是什么意思啊? 求解 for (int i = 0, j = 1; i < currentSize; ++i, j *= 2) { BinomialNode * t1 = theTrees[i]; BinomialNode * t2 = i < rhs.theTrees.size() ? rhs.theTrees[i] : nullptr; int whichCase = t1 == nullptr ? 0 : 1; whichCase += t2 == nullptr ? 0 : 2; whichCase += carry == nullptr ? 0 : 4; switch (whichCase) { case 0://没有树 case 1://就有本身这棵树 break; case 2://只有rhs有 theTrees[2] = t2; rhs.theTrees[2] = nullptr; break; case 4://只有carry theTrees[i] = carry; carry = nullptr; break; case 3://有本身和rhs carry = combineTrees(t1, t2); theTrees[i] = rhs.theTrees[i] = nullptr; break; case 5://本身和carry carry = combineTrees(t1, carry); theTrees[i] = nullptr; break; case 6://rhs与carry carry = combineTrees(t2, carry); rhs.theTrees[i] = nullptr; break; case 7://本身、rhs、carry都有 theTrees[i] = carry; carry = combineTrees(t1, t2); rhs.theTrees[i] = nullptr; break; } } for (int k = 0; k < rhs.theTrees.size(); ++k) rhs.theTrees[k] = nullptr; rhs.currentSize = 0;}
0 0
- 二项队列实现文件C语言
- 二项队列--C语言实现
- 循环队列及C语言实现<二>
- 【c++】模拟实现顺序队列方法二
- 二项队列 C语言
- 二项队列 C++实现
- JAVA实现二项队列
- 二项队列头文件C语言
- c语言实现通用数据结构(二):通用队列
- 优先队列之二项队列(JAVA实现)
- 二项队列分析及实现
- 二项队列的简单实现
- (二)用双栈实现队列
- C 宏实现队列
- 队列C实现
- Objective-C 队列实现
- C实现链式队列
- 循环队列实现(C++)
- 第11周阅读程序写出执行结果1(5)
- CQUoj 威尼斯平底渔船 (强连通)
- 专题三 Problem1013
- POJ3041 Asteroids(二分图)
- 机器学习中使用的神经网络第四讲笔记
- 二项队列 C++实现
- javascript平稳退化
- poj 1961 Period(KMP求周期)
- java 私有是封装的一种形式
- 不惑JAVA之JAVA基础 - volatile
- 第1课:通过案例对SparkStreaming 透彻理解三板斧之一
- GCC 4.6.3段错误(核心已转储)
- 线性表---顺序表
- 常用HTML颜色表-HTML颜色代码色彩表