Advertisement
Guest User

Untitled

a guest
Dec 29th, 2013
638
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8. struct TNode {
  9.     TNode(char letter = '\0')
  10.         : Letter(letter)
  11.     {
  12.     }
  13.     void AddWord(const std::string& word, size_t n) {
  14.         if (n == word.size()) {
  15.             return;
  16.         }
  17.         for (size_t i = 0; i < Childs.size(); ++i) {
  18.             if (Childs[i].Letter == word[n]) {
  19.                 Childs[i].AddWord(word, n + 1);
  20.                 return;
  21.             }
  22.         }
  23.         Childs.push_back(TNode(word[n]));
  24.         Childs[Childs.size() - 1].AddWord(word, n + 1);
  25.     }
  26.     void CalcStats(size_t& singleChildNodesCount, size_t& totalNodesCount) {
  27.         if (Letter) {
  28.             ++totalNodesCount;
  29.             if (Childs.size() == 1) {
  30.                 ++singleChildNodesCount;
  31.             }
  32.         }
  33.         for (size_t i = 0; i < Childs.size(); ++i) {
  34.             Childs[i].CalcStats(singleChildNodesCount, totalNodesCount);
  35.         }
  36.     }
  37.     char Letter;
  38.     vector<TNode> Childs;
  39. };
  40.  
  41. class TRadixTree {
  42. public:
  43.     void AddWord(const std::string& word) {
  44.         Root.AddWord(word, 0);
  45.     }
  46.     void CalcStats(size_t& singleChildNodesCount, size_t& totalNodesCount) {
  47.         Root.CalcStats(singleChildNodesCount, totalNodesCount);
  48.     }
  49. private:
  50.     TNode Root;
  51. };
  52.  
  53. int main()
  54. {
  55.     TRadixTree tree;
  56.     std::ifstream file("/home/fippo/words.txt");
  57.  
  58.     std::string word;
  59.     while (std::getline(file, word)) {
  60.         tree.AddWord(word);
  61.     }
  62.  
  63.     size_t singleChildNodesCount = 0;
  64.     size_t totalNodesCount = 0;
  65.     tree.CalcStats(singleChildNodesCount, totalNodesCount);
  66.  
  67.     cout << "Total:         " << totalNodesCount << "\n";
  68.     cout << "Single childs: " << singleChildNodesCount << "\n";
  69.     cout << "Single childs: " << 100.0 * singleChildNodesCount / totalNodesCount << "\n";
  70.  
  71.     return 0;
  72. }
  73.  
  74. /*
  75. Total:         451238
  76. Single childs: 304670
  77. Single childs: 67.5187
  78. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement