Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Ordered2DSet.h"
- Ordered2DSet::Ordered2DSet() {
- root =0;
- }
- Ordered2DSet::Ordered2DSet(const Ordered2DSet& orig) {
- root = new Node;
- if (orig.root!= 0)
- copy (orig.root, root);
- else
- root=0;
- }
- Ordered2DSet::~Ordered2DSet() {
- clear_all (root);
- root=0;
- }
- void Ordered2DSet::copy (Ordered2DSet *a, Ordered2DSet *b){
- Node *p[2*n+1];
- if (a !=0){
- for (int i=0; i < a->RAmount; i++){
- b->massiv[i].key = a->massiv[i].key;
- }
- if ( (a->children!=0)){
- p[0] = new Node;
- p[1] = new Node;
- }
- else{
- p[0]=0;
- p[1]=0;
- }
- for(int i=1;i<2*n;i++){
- if ((a->RAmount >=i+1) && (a->children!=0))
- p[i+1]= new Node;
- else p[i+1]=0;
- }
- b->children = p[0];
- for(int i=1;i<2*n+1;i++){
- b->massiv[i].p = p[i];
- }
- if (a->RAmount >= 1)
- {
- copy (a->children, p[0]);
- copy (a->massiv[0].p, p[1]);
- }
- for(int i=1;i<2*n;i++){
- if (a->RAmount >=i+1) copy (a->massiv[i].p, p[i+1]);
- }
- }
- }
- void Ordered2DSet::Add (const Node key){
- bool grow;
- BNT u;
- Node *bufer_root;
- search_add_key (key, root, grow, u);
- if (grow == true)
- {
- bufer_root = root;
- root = new Node;
- root->children = 0;
- for (int i=0;i<2*n+1;i++){
- root->massiv[i].p =0;
- }
- root->RAmount = 1;
- root->children = bufer_root;
- root->massiv[0] = u;
- }
- }
- void Ordered2DSet::search_add_key (const Node k, Node *a, bool& grow, BNT& m) {
- int i, L, R;
- Node *b;
- BNT u;
- if (a==0){
- grow = true;
- m.key=k;
- m.p =0;
- }
- else{
- L=0;
- R=a->RAmount;
- while (L<R){
- i = (L+R)/2;
- if ((bolshe(a->massiv[i].key,k)==0)&&(bolshe(a->massiv[i].key,k)==-1))
- L = i+1;
- else
- R=i;
- }
- R = R-1;
- if ((R>=0) && (bolshe(a->massiv[R].key,k) ==0)){
- grow=false;}
- else{
- if (R==-1){
- search_add_key(key,v, a->children, grow, u);
- }
- else
- search_add_key(key,v, a->massiv[R].p, grow, u);
- if (grow==true){
- if (a->RAmount<2*n){
- grow= false;
- a->RAmount++;
- for (i=a->RAmount-1;i>=R+2;i--)
- a->massiv[i] =a->massiv[i-1];
- a->massiv[R+1]=u;
- }
- else{
- b=new Node;
- b->children=0;
- for(int c=0;c<2*n+1;c++){
- b->massiv[c].p=0;
- }
- if (R<=(n-1)){
- if (R==(n-1))
- m=u;
- else{
- m=a->massiv[n-1];
- for (i=n-1; i>=R+n-1; i--)
- a->massiv[i]=a->massiv[i-1];
- a->massiv[R+1]=u;
- }
- for (i=0; i<=n; i++)
- b->massiv[i] = a->massiv[i+n];
- }
- else{
- R=R-n;
- m=a->massiv[n];
- for (i=0; i<=R-1; i++)
- b->massiv[i] = a->massiv[i+n+1];
- b->massiv[R]=u;
- for (i=R+1; i<=n-1; i++)
- b->massiv[i] = a->massiv[i+n];
- }
- a->RAmount = n;
- b->RAmount = n;
- //a->massiv[b->RAmount-1]-> b->massiv[b->RAmount-1]->parent=b;
- b->children = m.p;
- m.p=b;
- }
- }
- }
- }
- }
- bool Ordered2DSet::Search (const Point k){
- return (search_key (k, root));
- }
- bool Ordered2DSet::search_key (const Point k,const Node *a)const{
- int i, L, R;
- if (a==0){
- return (false);
- }
- else{
- L = 0;
- R = a->RAmount;
- while (L < R){
- i = (L+R)/2;
- if ((bolshe(a->massiv[i].key, k)==0)&&(bolshe(a->massiv[i].key, k)==-1))
- L = i+1;
- else
- R = i;
- }
- R = R-1;
- if ((R >= 0) && (bolshe(a->massiv[R].key,k)==0)
- return (true);
- else
- if (R == -1)
- return search_key (k,a->children);
- else
- return search_key (k,a->massiv[R].p);
- }
- }
- void Ordered2DSet::Delete (const Point k){
- bool smallsize;
- Node *bufer_root;
- delete_key (k, root, smallsize);
- if (smallsize==true){
- if (root->RAmount == 0){
- bufer_root = root;
- root = bufer_root->children;
- bufer_root=0;
- }
- }
- }
- void Ordered2DSet::delete_key (const Point k, Node *a, bool& smallsize){
- int i, L, R;
- Node *q;
- if (a==0)
- smallsize=false;
- else{
- L=0;
- R=a->RAmount;
- while (L < R){
- i = (L+R)/2;
- if (bolshe(a->massiv[i].key, k)==-1)
- L = i+1;
- else R = i;
- }
- if (R == 0)
- q = a->children;
- else
- q = a->massiv[R-1].p;
- if ((R <= a->RAmount-1) && (bolshe(a->massiv[R].key,k==0)){
- if (q==0){
- a->RAmount--;
- smallsize = (a->RAmount < n);
- for (i=R; i<a->RAmount; i++)
- a->massiv[i] = a->massiv[i+1];
- }
- else{
- del(R, a, q, smallsize);
- if (smallsize==true)
- fusion (a, q, R-1, smallsize);
- }
- }
- else{
- delete_key (k, q, smallsize);
- if (smallsize == true)
- fusion (a, q, R-1, smallsize);
- }
- }
- }
- void Ordered2DSet::del (int R, Node *a, Node *q, bool& smallsize){
- Node *b;
- b = q->massiv[q->RAmount-1].p;
- if (b !=0){
- del (R, a, b, smallsize);
- if (smallsize==true)
- fusion (q, b, q->RAmount-1, smallsize);
- }
- else{
- q->massiv[q->RAmount-1].p = a->massiv[R].p;
- a->massiv[R] = q->massiv[q->RAmount-1];
- q->RAmount--;
- smallsize = (q->RAmount < n);
- }
- }
- void Ordered2DSet::fusion (Node *father, Node *son, int R, bool& smallsize)
- {
- Node *b;
- int i, k, RAb, RAfather;
- RAfather = father->RAmount;
- if (R < RAfather-1){
- R++;
- b = father->massiv[R].p;
- RAb = b->RAmount;
- k = (RAb-n+1)/2;
- son->massiv[n-1] = father->massiv[R];
- son->massiv[n-1].p = b->children;
- if (k > 0){
- for (i=0; i <= k-1; i++)
- son->massiv[i+n] = b->massiv[i];
- father->massiv[R] = b->massiv[k];
- father->massiv[R].p = b;
- b->children = b->massiv[k].p;
- RAb = RAb-k-1;
- for (i=0; i < RAb; i++)
- b->massiv[i] = b->massiv[i+k+1];
- b->RAmount = RAb;
- son->RAmount = n-1+(k+1);
- smallsize = false;
- }
- else{
- for (i=0; i < n; i++)
- son->massiv[i+n] = b->massiv[i];
- for (i=R; i < RAfather-1; i++)
- father->massiv[i] = father->massiv[i+1];
- son->RAmount = 2*n;
- father->RAmount--;
- smallsize = (father->RAmount < n);
- b=0;
- }
- }
- else{
- if (R == 0)
- b = father->children;
- else
- b = father->massiv[R-1].p;
- RAb = b->RAmount+1;
- k = (RAb-n)/2;
- if (k > 0){
- son->massiv[k] = son->massiv[0];
- son->massiv[k-1] = father->massiv[R];
- son->massiv[k-1].p = son->children;
- RAb = RAb-k-1;
- son->children = b->massiv[RAb].p;
- father->massiv[R] = b->massiv[RAb];
- father->massiv[R].p = son;
- b->RAmount--;
- son->RAmount = n-1+k;
- smallsize = false;
- }
- else{
- b->massiv[RAb-1] = father->massiv[R];
- b->massiv[RAb-1].p = son->children;
- b->massiv[RAb] = son->massiv[0];
- b->RAmount = 2*n;
- father->RAmount--;
- smallsize = (father->RAmount < n);
- son=0;
- }
- }
- }
- int Ordered2DSet::Amount() const{
- return amount_allkey(root, 0);
- }
- int Ordered2DSet::amount_allkey(Node *a,int b)const{
- int i;
- if (a!=0){
- for (i=0; i<a->RAmount; i++)
- b++;
- b=b+amount_allkey(a->children,0);
- for (i=0; i<a->RAmount; i++)
- b=b+amount_allkey(a->massiv[i].p,0);
- }
- return b;
- }
- void Ordered2DSet::Clear (){
- clear_all (root);
- root=0;
- }
- void Ordered2DSet::clear_all (Node *a){
- Node *p[2*n+1];
- if (a!=0){
- if (a->RAmount >=1){
- p[0] = a->children;
- p[1] = a->massiv[0].p;
- }
- else{
- p[0]=0;
- p[1]=0;
- }
- for(int i=1;i<2*n;i++){
- if (a->RAmount >= i+1)
- p[i+1]=a->massiv[i].p;
- else
- p[i+1]=0;
- }
- a=0;
- for(int i=0;i<2*n+1;i++) clear_all(p[i]);
- }
- }
- void Ordered2DSet::Print (){
- print_b_tree (root, 0);
- }
- void Ordered2DSet::print_b_tree (Node *a, int level){
- int i;
- if (a != NULL){
- for (i=0; i<level; i++)
- cout << "---";
- for (i=0; i<a->RAmount; i++)
- {
- cout << a->massiv[i].key;
- if (i != a->RAmount-1)
- cout << ", ";
- }
- cout << endl;
- print_b_tree (a->children, level+1);
- for (i=0; i<a->RAmount; i++)
- print_b_tree (a->massiv[i].p, level+1);
- }
- }
- ostream& operator<<(ostream& out, const Point& k)
- {out<<"(";
- out<<k.x;
- out<<" , ";
- out<<k.y;
- out<<")";
- return out;
- };
- istream& operator>>(istream& in, Point& k){
- in>>k.x;
- in>>k.y;
- return in;
- };
- int bolshe(Point a, Point b)
- {if(a.x>b.x) return 1;
- if(a.x==b.x) {if(a.y>b.y) return 1;if(a.y==b.y) return 0;if(a.y<b.y) return -1;}
- if(a.x<b.x) return -1;
- };
Advertisement
Add Comment
Please, Sign In to add comment