C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

区間木を実装するC++プログラム


区間木は、区間を保持するための順序付けられたツリーデータ構造です。具体的には、任意の間隔またはポイントと重複するすべての間隔を効率的に見つけることができます。これは、区間木を実装するためのC++プログラムです。

アルゴリズム

Begin
   function insert() is used to insert new nodes into the tree:
      If Tree is empty, new node becomes root.
         Get low value of interval at root.
      If root's low value is smaller, then new interval goes to left subtree.
      Else, new node goes to right subtree.
      If needed, update the max value of this ancestor.
End

Begin
   function intervalFind() searches a given interval i in a given interval Tree:
      If tree is empty return null.
      If given interval overlaps with root
      Return root->i
      If left child of root is present and max of left child is
         greater than or equal to given interval, then i may
         overlap with an interval is left subtree
      Else
         interval can only overlap with right subtree.
End

サンプルコード

#include <iostream>
using namespace std;

struct Interval//interval variables declaration {
   int l, h;
};
struct ITNod//node declaration {
   Interval *i;
   int max;
   ITNod *l, *r;
};
ITNod * newNode(Interval i)//to create new node {
   ITNod *t = new ITNod;
   t->i = new Interval(i);
   t->max = i.h;
   t->l = t->r = NULL;
};
ITNod *insert(ITNod *r, Interval i) {
   if (r== NULL)
      return newNode(i);
      int l = r->i->l;
   if (i.l< l)
      r->l = insert(r->l, i);
   else
      r->r = insert(r->r, i);
   if (r->max < i.h)
      r->max = i.h;
      return r;
}
bool Overlap(Interval i1, Interval i2)// check if two intervals overlap or not. {
   if (i1.l <= i2.h && i2.l<= i1.h)
      return true;
      return false;
}
Interval *intervalFind(ITNod *root, Interval i) {
   if (root == NULL)
      return NULL;
   if (Overlap(*(root->i), i))
      return root->i;
   if (root->l!= NULL && root->l->max >= i.l)
      return intervalFind(root->l, i);
      return intervalFind(root->r, i);
}

void inorder(ITNod *root)//perform inorder traversal {
   if (root == NULL)
      return;
      inorder(root->l);
      cout << "[" << root->i->l<< ", " << root->i->h << "]" << " max = "<< root->max << endl;
      inorder(root->r);
}
int main(int argc, char **argv) {
   Interval ints[] = { { 5, 20 }, { 6, 7 }, { 3, 4 }, { 67, 26 }, { 3, 4 } };
   int n = sizeof(ints) / sizeof(ints[0]);
   ITNod *root = NULL;
   for (int i = 0; i < n; i++)
      root = insert(root, ints[i]);
      cout << "In-order traversal of the constructed Interval Tree is\n";
      inorder(root);
      Interval x = { 7, 6 };
      cout << "\nSearching for interval [" << x.l << "," << x.h << "]";
      Interval *res = intervalFind(root, x);
      if (res == NULL)
         cout << "\nNo Overlapping Interval";
      else
         cout << "\nOverlaps with [" << res->l << ", " << res->h << "]";
}
とオーバーラップします

出力

In-order traversal of the constructed Interval Tree is
[3, 4] max = 4
[3, 4] max = 4
[5, 20] max = 26
[6, 7] max = 26
[67, 26] max = 26

Searching for interval [7,6]
Overlaps with [5, 20]

  1. シーザー暗号を実装するC++プログラム

    これは、平文の各文字が別の文字に置き換えられて暗号文を形成するモノアルファベット暗号です。これは、換字式暗号方式の最も単純な形式です。 この暗号システムは、一般にシフト暗号と呼ばれます。コンセプトは、各アルファベットを、0から25の間の固定数で「シフト」された別のアルファベットに置き換えることです。 このタイプのスキームでは、送信者と受信者の両方がアルファベットをシフトするための「秘密のシフト番号」に同意します。この0から25までの数字が暗号化の鍵になります。 「シーザー暗号」という名前は、「3シフト」が使用されている場合のシフト暗号を表すために使用されることがあります。 プロセス

  2. AVLツリーを実装するためのC++プログラム

    AVLツリーは自己平衡二分探索木であり、左右のサブツリーの高さの差がすべてのノードで複数になることはありません。 ツリーの回転は、AVLツリーの要素の順序を妨げることなく構造を変更する操作です。ツリー内で1つのノードを上に移動し、1つのノードを下に移動します。これは、ツリーの形状を変更したり、小さいサブツリーを下に移動したり、大きいサブツリーを上に移動したりして高さを低くしたりするために使用され、多くのツリー操作のパフォーマンスが向上します。回転の方向は、木のノードが移動する側に依存しますが、他の人は、どの子がルートの場所をとるかに依存すると言います。これは、AVLツリーを実装するためのC+