演算法導論 區間樹上的重疊區間查詢演算法

2021-07-27 03:42:47 字數 3293 閱讀 3040

一、   演算法設計與分析:

(1)   資料結構設計:

//區間

struct interval;

//節點

struct node

int key;

int color;

int max;

interval int;

node* parent;

node* left;

node* right;

};

//樹

struct tree

node* root;

node* nil;

};

(2)區間樹上的重疊區間查詢演算法設計如下:

os_select(x,i)

r=x.left.size+1;

if i==r

return x;

else if ireturn os_select(x.left,i)

else

return os_select(x.right,i-r)

二、演算法實現

#pragma once

#define red 0

#define black 1

//區間

struct interval;

//節點

struct node

int key;

int color;

int max;

interval int;

node* parent;

node* left;

node* right;

};//樹

struct tree

node* root;

node* nil;

};#define maxsize 10

#include "tree.h"

#include #include #include #include using namespace std;

void rb_insert(tree* &t,node* z);

void rb_insert_fixup(tree* &t, node* z);

void left_rotate(tree* &t, node* x);

void right_rotate(tree* &t, node* y);

void inorder(node* tree,tree* t);

void preorder(node* tree,tree* t);

//為區間樹新增的方法

void fixmax(node* node, tree* t);

int max(int a, int b, int c);

node* interval_search(tree* t, interval i);

bool overlap(interval a, interval b);

node* interval_search(tree* t, interval i);

int main()

//插入節點

void rb_insert(tree* &t,node* z)

z->parent=y;

if(y==t->nil)//插入第乙個元素

t->root=z;

else if(z->key < y->key)

y->left=z;

else

y->right=z;

z->left=t->nil;

z->right=t->nil;

z->color=red;

fixmax(z,t);//插入完成自底向上調整max

rb_insert_fixup(t,z);//調整顏色過程只有旋轉需要改變max值,所以該演算法不用改變

}//紅黑樹調整

void rb_insert_fixup(tree* &t, node* z)

else

z->parent->color=black; //case3

z->parent->parent->color=red;

right_rotate(t,z->parent->parent);

}} else

else

z->parent->color=black; //case3

z->parent->parent->color=red;

left_rotate(t,z->parent->parent);

}} }

t->root->color=black;

}//節點左旋

void left_rotate(tree* &t, node* x)

//節點右旋

void right_rotate(tree* &t, node* y)

//前序遍歷

void preorder(node* tree,tree * t)

}//中序遍歷

void inorder(node* tree,tree* t)

}//自node節點逐步向根調整max值

void fixmax(node* node, tree* t)

}//找三個整數a,b,c的最大者

int max(int a, int b, int c)

//尋找區間i

node* interval_search(tree* t, interval i)

else

x=x->right;

} return x;

}//判斷兩個區間a和b是否重疊

bool overlap(interval a, interval b)

三、演算法分析

根據以上實驗過程發現設計的查詢重疊區間演算法能正確的找到重疊區間,並且當查詢失敗是也能正確顯示。另外區間樹為在紅黑樹基礎上通過調整節點結構以及插入演算法,左旋右旋演算法來實現,其中的rb_insert_fixup演算法無須做調整

區間重疊判斷演算法

在一次業務開發中,發現有一種資料,每天都會有乙個值,不論是否是節假日。由於這個值的變化頻率比較低,導致會有連續的n個日期,值是相同的。於是,就想將這些值合併。比如原來的結構是二元組data value date 合併成三元組data value begindate enddate 合併完原始資料後,...

演算法練習 重疊區間個數

一 題目描述 給定多個可能重疊的區間,找出重疊區間的個數。舉例如下 輸入 1,5 10 15 5 10 20 30 輸出 2 說明 題意應該是找出重疊區間中區間的最大個數,當沒有區間重疊時,重疊個數最大為1 比如 輸入為 1,5 10 15 則輸出為1 輸入為 1,2 2,3 3,4 4,5 則輸出...

重疊區間的個數

題目 給定多個可能的重疊的區間,找出重疊區間的個數。區間的定義如下 class interval 首先,要定義區間的類,實現comparable介面,含有起點與止點的值和型別,還要重寫用於排序的compareto函式。class point implements comparable 還需要實現co...