This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-maat/scanner/ip_matcher/IntervalIndex/ACEI.h

135 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************/
/*
AdvanceCEI 0621.2007 v1.1
Yao Qiu-lin (yaoqiulin@software.ict.ac.cn)
修改:
1. 转为OO形式
2. 文件接口改为内存接口
注意: PreProcessing后原则上不该添加查询区间因为这样会破坏当前数据结构的最优性
当然实际使用时支持通过insertIntvl继续插入少量的QueryInterval如果
要大量添加查询区间,那么应该根据新的区间集合重新构造索引。
*/
/************************************************************************/
#ifndef _ADVANCECEI_YAOQIULIN_20080509_
#define _ADVANCECEI_YAOQIULIN_20080509_
#include "IntervalIndex.h"
#include <stdlib.h>
#include <stdio.h>
#include <vector>
//#define u_int unsigned int
typedef unsigned int u_int;
typedef struct _QueryInterval_
{
u_int l;
u_int r;
u_int index;
} _QueryInterval;
typedef struct _HQueryI_
{
_QueryInterval ** ppQImatrix;
u_int MAXROWS;
u_int ROWLEN;
u_int rowID;//next available
u_int colID;//next available
u_int cnt;
}_HQueryI;
typedef struct _IID_ //可以缩减数据结构来减少空间,如果效果不好的话
{
_QueryInterval * iid;
struct _IID_ * next;
}_IID;
typedef struct _IIDSet_
{
_IID *head;
_IID *tail;
} _IIDSet;
typedef _IIDSet _CEI;
//pack type
typedef struct _SrlIID_
{
_QueryInterval * iid;
}_SrlIID;
typedef struct _SrlIIDSet_
{
_SrlIID *head;
}_SrlIIDSet;
typedef _SrlIIDSet _SrlCEI;
class ACEI : public CIntervalIndex
{
public:
//区间的值域是[0, 2^r)
ACEI(u_int eRange = 32);
virtual ~ACEI();
//一组区间,[ a[i], b[i] ]组成一个闭区间
virtual long long PreProcessing(const std::vector<unsigned int>& a, const std::vector<unsigned int>& b);
//返回所有包含key的区间的index
virtual int Find(unsigned int key, unsigned int * result, unsigned int size);
private:
//init & ruin
void initQIMatrix();
void ruinQIMatirc();
int init();
void ruin();
void releaseCEIs(_CEI **ppIIDSet, u_int lCEIsNum);
//search
int searchX(unsigned int x, unsigned int * result, unsigned int size);//可以是double但当前仅需u_int
//insert
//void insertIntvl(u_int l, u_int r)
void addIntvl(u_int ll, u_int lr, _QueryInterval* pQI);//因为是左闭右开,所以输入的两区间端点若相等,那么认为是空区间
void addFrgmnt(u_int ll, u_int lr, u_int sID, _QueryInterval* pQI);
void addBtmCEIs(u_int ll, u_int lr, u_int sID, _QueryInterval *pQI);
void addID(_CEI* pCEI, _QueryInterval* pQI);
//ultlity
double getAvrgRng();
//serialization
void serializeCEI(_CEI *pCEI, _SrlCEI* pSrlCEI);//suppose pCEI not NULL
void serialBtmCEIs();
void serialTopCEIs();
void serial();
private:
//input data
_HQueryI HQI; //插入的区间所在
//model data
u_int n; //插入的区间数量
u_int r; //值域
u_int L;//L=2^H, Segment Len
u_int H;//最大VC树高度
u_int h;//实际VC树高度
double w; //平均区间长度
u_int SNum;//Segment Num
u_int SCEINum;
unsigned long *pExp2;
const u_int Exp2Size;
_CEI *pTopCEIs;
_CEI **ppBotCEIs;//每个CEIs序列长度为L或H
//for serial
_SrlCEI *pTopSrlCEIs;
_SrlCEI **ppBotSrlCEIs;//每个CEIs序列长度为L或H
};
#endif