-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStreamStatic.h
executable file
·138 lines (115 loc) · 3.29 KB
/
StreamStatic.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
* @file StreamStatic.h
* @author alex <yeshiwei.math@gmail.com>
* @date Thu Jun 20 00:49:51 2013
*
* @brief 利用红黑树实现的求动态数据流最新N个数中的第k小个数的快速算法。每次k都可以取不同的值。
*
*
*/
#ifndef __STREAMSTATIC_H__
#define __STREAMSTATIC_H__
#include <vector>
using namespace std;
enum Color{
BLACK,
RED
};
class StaticNode{
public:
double key; /**< 数据值 */
int index; /**< 数据下标,第index个数据 */
int size; /**< 红黑树中这个节点作为根的子树的大小 */
Color color; /**< 红黑树中这个节点的颜色 */
StaticNode *left, *right, *parent; /**< 红黑树中这个节点的左儿子,右儿子,父亲 */
};
class StaticTree{
public:
StaticTree(int length_k); /**< 只有这一个构造函数 表示只考虑最近 length_k个数*/
~StaticTree();
/**
* 求节点z的后继节点,就是key比 z大的节点中的最小key的节点
*
* @param z
*
* @return
*/
StaticNode* Successor(StaticNode *z);
/**
* 插入一个节点,用于新增一个数据
*
* @param z
*/
void InsertNode(StaticNode *z);
/**
* 删除一个节点,用于删除倒数第k个数据, 未实现,下面这个就够了。
*
* @param index 被删除节点的下标。
*/
void DeleteNode(int index);
/**
* 删除一个节点。用于删除倒数第k个数据
*
* @param z 被删除节点的指针。
*
* @return 返回树中从内存意义上被删除的那个节点。可能删除了别的节点,把被删除节点的信息copy到z上了。
*/
StaticNode* DeleteNode(StaticNode *z);
/**
* 求以 z为根的子树中的包含最大key的节点。
*
* @param z 所求子树的根。
*
* @return 最大key的节点的指针。
*/
StaticNode* Maximum(StaticNode *z);
/**
* 求以 z为根的子树中的包含最小key的节点。
*
* @param z 所求子树的根。
*
* @return 最小key的节点的指针。
*/
StaticNode* Minimum(StaticNode *z);
/**
* 取出第以 x为根的子树中第i小的数
*
* @param x 子树的根
* @param i 求第i小的数
*
* @return 子树中key第i小的节点的指针。
*/
StaticNode* Select(StaticNode*x, int i);
/**
* 取出第i小的数
*
* @param i 求第i小的数
*
* @return 子树中key第i小的key值。
*/
double Select(int i);
/**
* 取出第i大的数
*
* @param i 求第i大的数
*
* @return 子树中key第i大的key值。
*/
double SelectLarge(int i);
StaticNode* pool_pop(); /**< 从事先分配的内存池中取一个空节点 */
void pool_push(StaticNode *z); /**< 把从红黑树中删除掉的节点放回内存池中 */
StaticNode* poolroot; int poolsize; /**< 内存池的相关信息 */
int length_k; /**< 所考虑的长度 */
vector <StaticNode*> nodes; /**< 用于保存最后k个数据在树中的位置以便将来删除。 */
StaticNode* root; /**< 红黑树的根。 */
private:
//@{ 红黑树实现的内部子程序。
StaticNode* nil;
void LeftRotate(StaticNode* x);
void RightRotate(StaticNode* x);
void InsertFixup(StaticNode* z);
void DeleteFixup(StaticNode* x);
StaticNode* pool;
//@}
};
#endif