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

Trieを実装するC++プログラム


ここでは、Trieを実装するためのC++プログラムについて説明します。これはツリーベースのデータ構造であり、文字列の大規模なデータセット内のキーを効率的に取得するために使用されます。

関数と擬似コード

Begin
function insert() :
   If key not present, inserts key into trie. If the key is prefix of trie node, just mark leaf node.
End
Begin
function deleteNode()
   If tree is empty then return null.
   If last character of the key is being processed,
      then that node will be no more end of string after deleting it.
      If given key is not prefix of any other string, then delete it and set root = NULL.
   If key is not the last character,
      Then recur for the child which will be obtained by using ASCII value.
   If root does not have any child left and it is not end of another word,
      Then delete it and set root = NULL.
End
に設定します。

#include <bits/stdc++.h>
using namespace std;
const int ALPHA_SIZE = 26;

struct Trie {
   struct Trie *child[ALPHA_SIZE];
   bool endofstring; //It is true if node represents end of word.
};
struct Trie *createNode(void) //creation of new node {
   struct Trie *tNode = new Trie;
   tNode->endofstring = false;
   for (int i = 0; i < ALPHA_SIZE; i++)
      tNode->child[i] = NULL;
   return tNode;
}
void insert(struct Trie *root, string key) {
   struct Trie *curr = root;
   for (int i = 0; i < key.length(); i++) {
      int index = key[i] - 'A';
      if (!curr->child[index])
         curr->child[index] = createNode();
         curr = curr->child[index];
   }
   curr->endofstring= true; //last node as leaf
}
bool search(struct Trie *root, string key) { //check if key is present in trie. If present returns true
   struct Trie *curr = root;
   for (int i = 0; i < key.length(); i++) {
      int index = key[i] - 'A';
      if (!curr->child[index])
         return false;
      curr = curr->child[index];
   }
   return (curr != NULL && curr->endofstring);
}
bool isEmpty(Trie* root) //check if root has children or not {
   for (int i = 0; i < ALPHA_SIZE; i++)
   if (root->child[i])
   return false;
   return true;
}
Trie* deletion(Trie* root, string key, int depth = 0) {
   //If tree is empty return null.
   if (!root)
   return NULL;
   if (depth == key.size()) { //If last character of key is being processed,
      if (root->endofstring)
         root->endofstring = false; //then that node will be no more end of string after deleting it.
      if (isEmpty(root)) { //If given key is not prefix of any other string,
         delete (root);
         root = NULL;
      }
   return root;
   }
   //If key not last character,
   int index = key[depth] - 'A';
   root->child[index] =
   deletion(root->child[index], key, depth + 1); //Then recur for the child which will be obtained by using ASCII value.
   if (isEmpty(root) && root->endofstring == false) { //If root does not have any child leftand it is not end of another word
      delete (root);
      root = NULL;
   }
   return root;
}
int main() {
   string inputs[] = {"HELLOWORLD","HI","BYE", "THE","THENA"}; // Input keys ( only A to Z in upper case)
   int n = sizeof(inputs)/sizeof(inputs[0]);
   struct Trie *root = createNode();
   for (int i = 0; i < n; i++)
   insert(root, inputs[i]);
   search(root, "HELLOWORLD")? cout << "Key is Found\n" :
   cout << "Key is not Found\n";
   search(root, "HE")? cout << "Key is Found\n" :
   cout << "Key is not Found\n";
   deletion(root, "THEN")? cout << "Key is deleted\n" :
   cout << "Key is not Deleted\n";
   return 0;
}

出力

Key is Found
Key is not Found
Key is deleted

  1. STLにSet_Symmetric_differenceを実装するC++プログラム

    これは、set_symmetric_differenceを実装するためのC++プログラムです。 2つのセットの対称差は、一方のセットには存在するが、もう一方のセットには存在しない要素によって構築されます。 一般的な集合演算は-です セットユニオン 交差点を設定 対称集合の差または排他的論理和 差または減算を設定 アルゴリズム Begin    Declare set vector v and iterator st.   Initialize st = set_symmetric_difference (set1, set1 + n, set2, se

  2. 隣接行列を実装するためのC++プログラム

    グラフの隣接行列は、サイズV x Vの正方行列です。VはグラフGの頂点の数です。この行列では、各辺にV個の頂点がマークされています。グラフにiからjの頂点までのエッジがある場合、i thの隣接行列に 行とjth 列は1(または加重グラフの場合はゼロ以外の値)になります。それ以外の場合、その場所は0を保持します。 隣接行列表現の複雑さ: 隣接行列表現は、計算中にO(V2)のスペースを取ります。グラフに最大数のエッジと最小数のエッジがある場合、どちらの場合も必要なスペースは同じになります。 入力: 出力: 0 1 2 3 4