Advertisement
mrlantan

Untitled

Dec 20th, 2020
811
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.74 KB | None | 0 0
  1. #include <chrono>
  2. #include <iostream>
  3. #include <iterator>
  4. #include <memory>
  5. #include <vector>
  6. #include <cstdlib>
  7. #include <set>
  8. #include <random>
  9.  
  10. template <typename ValueType>
  11. struct Node {
  12.     Node() = default;
  13.  
  14.     Node(Node* left, Node* right, Node* parent, const ValueType& value)
  15.         : left(left), right(right), parent(parent), value(value) {
  16.     }
  17.     Node* left = nullptr;
  18.     Node* right = nullptr;
  19.     Node* parent = nullptr;
  20.     ValueType value = ValueType();
  21. };
  22.  
  23. template <typename ValueType>
  24. class Set;
  25.  
  26. template <typename ValueType>
  27. class SetIterator : public std::iterator<struct bidirectional_iterator_tag, ValueType, size_t,
  28.                                          ValueType*, ValueType&> {
  29. public:
  30.     friend class Set<ValueType>;
  31.     SetIterator() : node(nullptr) {
  32.     }
  33.  
  34.     explicit SetIterator(Node<ValueType>* node) : node(node) {
  35.     }
  36.  
  37.     SetIterator(const SetIterator&) = default;
  38.     SetIterator& operator=(const SetIterator&) = default;
  39.  
  40.     SetIterator& operator++() {
  41.         if (node->right) {
  42.             node = node->right;
  43.             while (node->left) {
  44.                 node = node->left;
  45.             }
  46.         } else {
  47.             while (node->parent->right == node) {
  48.                 node = node->parent;
  49.             }
  50.             node = node->parent;
  51.         }
  52.  
  53.         return *this;
  54.     }
  55.  
  56.     SetIterator& operator--() {
  57.         if (node->left) {
  58.             node = node->left;
  59.             while (node->right) {
  60.                 node = node->right;
  61.             }
  62.         } else {
  63.             while (node->parent->left == node) {
  64.                 node = node->parent;
  65.             }
  66.             node = node->parent;
  67.         }
  68.  
  69.         return *this;
  70.     }
  71.  
  72.     SetIterator operator++(int) {
  73.         SetIterator<ValueType> result(node);
  74.         ++*this;
  75.         return result;
  76.     }
  77.  
  78.     SetIterator operator--(int) {
  79.         SetIterator<ValueType> result(node);
  80.         --*this;
  81.         return result;
  82.     }
  83.  
  84.     bool operator==(SetIterator other) {
  85.         return node == other.node;
  86.     }
  87.  
  88.     bool operator!=(SetIterator other) {
  89.         return node != other.node;
  90.     }
  91.  
  92.     const ValueType& operator*() {
  93.         return node->value;
  94.     }
  95.  
  96.     const ValueType* operator->() {
  97.         return &(node->value);
  98.     }
  99.  
  100. private:
  101.     Node<ValueType>* node;
  102. };
  103.  
  104. template <typename ValueType>
  105. class Set {
  106. private:
  107.     void SetRoot(Node<ValueType>* node) {
  108.         root_ = node;
  109.         begin_ = node;
  110.         end_->left = root_;
  111.         root_->parent = end_;
  112.     }
  113.  
  114.     Node<ValueType>* DeepCopy(Node<ValueType>* cur) {
  115.         //        auto new_cur = new Node<ValueType>(nullptr, nullptr, nullptr, cur->value);
  116.         auto new_cur = object_pool_.data() + pool_counter_++;
  117.         new_cur->value = cur->value;
  118.         if (!(new_cur->value < begin_->value) && !(begin_->value < new_cur->value)) {
  119.             //            delete begin_;
  120.             begin_ = new_cur;
  121.         }
  122.  
  123.         if (cur->left) {
  124.             new_cur->left = DeepCopy(cur->left);
  125.             new_cur->left->parent = new_cur;
  126.         }
  127.  
  128.         if (cur->right) {
  129.             new_cur->right = DeepCopy(cur->right);
  130.             new_cur->right->parent = new_cur;
  131.         }
  132.  
  133.         return new_cur;
  134.     }
  135.  
  136.     void ZigZig(Node<ValueType>* node) const {
  137.         auto parent = node->parent;
  138.         auto grand_parent = parent->parent;
  139.         auto grand_grand_parent = grand_parent->parent;
  140.  
  141.         bool is_root = root_ == grand_parent;
  142.  
  143.         parent->parent = grand_parent->parent;
  144.         if (grand_grand_parent->left == grand_parent) {
  145.             grand_grand_parent->left = parent;
  146.         } else {
  147.             grand_grand_parent->right = parent;
  148.         }
  149.  
  150.         grand_parent->left = parent->right;
  151.         if (parent->right) {
  152.             parent->right->parent = grand_parent;
  153.         }
  154.  
  155.         grand_parent->parent = parent;
  156.         parent->right = grand_parent;
  157.  
  158.         if (is_root) {
  159.             const_cast<Set<ValueType>*>(this)->root_ = parent;
  160.         }
  161.     }
  162.  
  163.     void ZagZag(Node<ValueType>* node) const {
  164.         auto parent = node->parent;
  165.         auto grand_parent = parent->parent;
  166.         auto grand_grand_parent = grand_parent->parent;
  167.  
  168.         bool is_root = grand_parent == root_;
  169.  
  170.         parent->parent = grand_parent->parent;
  171.         if (grand_grand_parent->left == grand_parent) {
  172.             grand_grand_parent->left = parent;
  173.         } else {
  174.             grand_grand_parent->right = parent;
  175.         }
  176.  
  177.         grand_parent->right = parent->left;
  178.         if (parent->left) {
  179.             parent->left->parent = grand_parent;
  180.         }
  181.  
  182.         grand_parent->parent = parent;
  183.         parent->left = grand_parent;
  184.  
  185.         if (is_root) {
  186.             const_cast<Set<ValueType>*>(this)->root_ = parent;
  187.         }
  188.     }
  189.  
  190.     void ZagZig(Node<ValueType>* node) const {
  191.         auto parent = node->parent;
  192.  
  193.         parent->parent->left = node;
  194.         node->parent = parent->parent;
  195.  
  196.         parent->right = node->left;
  197.         if (node->left) {
  198.             node->left->parent = parent;
  199.         }
  200.  
  201.         node->left = parent;
  202.         parent->parent = node;
  203.  
  204.         ZigZig(parent);
  205.     }
  206.  
  207.     void ZigZag(Node<ValueType>* node) const {
  208.         auto parent = node->parent;
  209.  
  210.         parent->parent->right = node;
  211.         node->parent = parent->parent;
  212.  
  213.         parent->left = node->right;
  214.         if (node->right) {
  215.             node->right->parent = parent;
  216.         }
  217.  
  218.         parent->parent = node;
  219.         node->right = parent;
  220.  
  221.         ZagZag(parent);
  222.     }
  223.  
  224.     void Zig(Node<ValueType>* node) const {
  225.         auto parent = node->parent;
  226.  
  227.         parent->parent->left = node;
  228.         node->parent = parent->parent;
  229.  
  230.         parent->left = node->right;
  231.         if (node->right) {
  232.             node->right->parent = parent;
  233.         }
  234.  
  235.         node->right = parent;
  236.         parent->parent = node;
  237.  
  238.         const_cast<Set<ValueType>*>(this)->root_ = node;
  239.     }
  240.  
  241.     void Zag(Node<ValueType>* node) const {
  242.         auto parent = node->parent;
  243.  
  244.         parent->parent->left = node;
  245.         node->parent = parent->parent;
  246.  
  247.         parent->right = node->left;
  248.         if (node->left) {
  249.             node->left->parent = parent;
  250.         }
  251.  
  252.         node->left = parent;
  253.         parent->parent = node;
  254.  
  255.         const_cast<Set<ValueType>*>(this)->root_ = node;
  256.     }
  257.  
  258.     void SplayNode(Node<ValueType>* node) const {
  259.         while (node != root_) {
  260.             if (node->parent == root_) {
  261.                 if (root_->left == node) {
  262.                     Zig(node);
  263.                 } else {
  264.                     Zag(node);
  265.                 }
  266.                 continue;
  267.             }
  268.  
  269.             auto parent = node->parent;
  270.             bool is_left_child = node->parent->left == node;
  271.             bool is_parent_left_child = parent->parent->left == parent;
  272.  
  273.             if (is_parent_left_child) {
  274.                 if (is_left_child) {
  275.                     ZigZig(node);
  276.                 } else {
  277.                     ZagZig(node);
  278.                 }
  279.             } else {
  280.                 if (is_left_child) {
  281.                     ZigZag(node);
  282.                 } else {
  283.                     ZagZag(node);
  284.                 }
  285.             }
  286.         }
  287.     }
  288.  
  289.     SetIterator<ValueType> LowerBound(Node<ValueType>* node, const ValueType& value) const {
  290.         if (!(value < node->value) && !(node->value < value)) {
  291.             return SetIterator{node};
  292.         }
  293.  
  294.         auto child = node;
  295.  
  296.         bool is_left = true;
  297.  
  298.         if (value < node->value) {
  299.             is_left = true;
  300.             child = node->left;
  301.         } else {
  302.             is_left = false;
  303.             child = node->right;
  304.         }
  305.  
  306.         if (!child) {
  307.             if (is_left) {
  308.                 return SetIterator{node};
  309.             } else {
  310.                 auto iter = SetIterator<ValueType>(node);
  311.                 ++iter;
  312.                 return iter;
  313.             }
  314.         } else {
  315.             return LowerBound(child, value);
  316.         };
  317.     }
  318.  
  319.     void Delete(Node<ValueType>* cur) {
  320.         if (cur->left) {
  321.             Delete(cur->left);
  322.         }
  323.  
  324.         if (cur->right) {
  325.             Delete(cur->right);
  326.         }
  327.  
  328.         delete cur;
  329.     }
  330.  
  331.     Node<ValueType>* root_ = nullptr;
  332.     Node<ValueType>* end_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  333.     Node<ValueType>* begin_ = end_;
  334.     size_t size_ = 0;
  335.     size_t pool_counter_ = 0;
  336.     std::vector<Node<ValueType>> object_pool_ =
  337.         std::vector<Node<ValueType>>(1000000 / sizeof(ValueType));
  338.  
  339. public:
  340.     typedef SetIterator<ValueType> iterator;
  341.  
  342.     Set() {
  343.     }
  344.  
  345.     template <typename ForwardIT>
  346.     Set(ForwardIT begin, ForwardIT end) {
  347.         for (auto it = begin; it != end; ++it) {
  348.             insert(*it);
  349.         }
  350.     }
  351.  
  352.     explicit Set(std::initializer_list<ValueType> ilist) {
  353.         for (const auto& elem : ilist) {
  354.             insert(elem);
  355.         }
  356.     }
  357.  
  358.     Set(const Set& other) {
  359.         if (other.size_ == 0) {
  360.             return;
  361.         }
  362.  
  363.         //        begin_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  364.         begin_ = object_pool_.data() + pool_counter_++;
  365.         begin_->value = other.begin_->value;
  366.         root_ = DeepCopy(other.root_);
  367.  
  368.         end_->left = root_;
  369.         root_->parent = end_;
  370.  
  371.         size_ = other.size_;
  372.     }
  373.  
  374.     Set& operator=(const Set& other) {
  375.         if (this == &other) {
  376.             return *this;
  377.         }
  378.  
  379.         //        this->~Set();
  380.         //        end_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  381.         //        end_ = object_pool_.data() + pool_counter_++;
  382.  
  383.         if (other.size_ == 0) {
  384.             size_ = 0;
  385.             root_ = nullptr;
  386.             begin_ = end_;
  387.             end_->left = root_;
  388.  
  389.             return *this;
  390.         }
  391.  
  392.         //        begin_ = new Node<ValueType>(nullptr, nullptr, nullptr, ValueType());
  393.         begin_ = object_pool_.data() + pool_counter_++;
  394.         begin_->value = other.begin_->value;
  395.         root_ = DeepCopy(other.root_);
  396.  
  397.         end_->left = root_;
  398.         root_->parent = end_;
  399.  
  400.         size_ = other.size_;
  401.         return *this;
  402.     }
  403.  
  404.     ~Set() {
  405.         //        if (end_) {
  406.         //            std::vector<Node<ValueType>*> nodes(size_);
  407.         //            int counter = 0;
  408.         //            for (auto iter = begin(); iter != end(); ++iter) {
  409.         //                nodes[counter] = iter.node;
  410.         //                ++counter;
  411.         //            }
  412.         //
  413.         //            for (size_t i = 0; i < nodes.size(); ++i) {
  414.         //                delete nodes[i];
  415.         //            }
  416.         //
  417.         //            delete end_;
  418.         //        }
  419.         if (end_) {
  420.             delete end_;
  421.         }
  422.     }
  423.  
  424.     size_t size() const {
  425.         return size_;
  426.     }
  427.  
  428.     bool empty() const {
  429.         return size_ == 0;
  430.     }
  431.  
  432.     void insert(const ValueType& value) {
  433.         //        auto node = new Node<ValueType>(nullptr, nullptr, nullptr, value);
  434.         auto node = object_pool_.data() + pool_counter_++;
  435.         node->value = value;
  436.  
  437.         if (!root_) {
  438.             SetRoot(node);
  439.             ++size_;
  440.             return;
  441.         }
  442.  
  443.         find(value);
  444.  
  445.         if (!(root_->value < value) && !(value < root_->value)) {
  446.             //            delete node;
  447.             return;
  448.         }
  449.  
  450.         if (value < root_->value) {
  451.             node->right = root_;
  452.             root_->parent = node;
  453.  
  454.             if (root_->left) {
  455.                 node->left = root_->left;
  456.                 root_->left->parent = node;
  457.                 root_->left = nullptr;
  458.             }
  459.         } else {
  460.             node->left = root_;
  461.             root_->parent = node;
  462.  
  463.             if (root_->right) {
  464.                 node->right = root_->right;
  465.                 root_->right->parent = node;
  466.                 root_->right = nullptr;
  467.             }
  468.         }
  469.  
  470.         node->parent = end_;
  471.         end_->left = node;
  472.         root_ = node;
  473.  
  474.         if (node->value < begin_->value) {
  475.             begin_ = node;
  476.         }
  477.  
  478.         ++size_;
  479.     }
  480.  
  481.     void erase(const ValueType& value) {
  482.         if (!root_) {
  483.             return;
  484.         }
  485.  
  486.         find(value);
  487.  
  488.         if ((root_->value < value) || (value < root_->value)) {
  489.             return;
  490.         }
  491.  
  492.         if (begin_ == root_) {
  493.             auto iter = SetIterator<ValueType>(root_);
  494.             ++iter;
  495.             begin_ = iter.node;
  496.         }
  497.  
  498.         if (!root_->left) {
  499.             //            auto old_root = root_;
  500.             end_->left = root_->right;
  501.  
  502.             if (root_->right) {
  503.                 root_->right->parent = root_->parent;
  504.                 root_ = root_->right;
  505.             } else {
  506.                 root_ = nullptr;
  507.             }
  508.  
  509.             //            delete old_root;
  510.             --size_;
  511.             return;
  512.         }
  513.  
  514.         auto right_tree = root_->right;
  515.  
  516.         //        Node<ValueType>* old_root = root_;
  517.         root_ = root_->left;
  518.         find(value);
  519.  
  520.         root_->right = right_tree;
  521.         if (right_tree) {
  522.             right_tree->parent = root_;
  523.         }
  524.         end_->left = root_;
  525.         root_->parent = end_;
  526.         --size_;
  527.         //        delete old_root;
  528.     }
  529.  
  530.     SetIterator<ValueType> find(const ValueType& value) const {
  531.         if (size_ == 0) {
  532.             return SetIterator{end_};
  533.         }
  534.  
  535.         int depth = 0;
  536.  
  537.         Node<ValueType>* node = root_;
  538.  
  539.         while (node) {
  540.             if (!(node->value < value) && !(value < node->value)) {
  541.                 SplayNode(node);
  542.                 return SetIterator(node);
  543.             }
  544.  
  545.             Node<ValueType>* child = nullptr;
  546.             if (node->value < value) {
  547.                 child = node->right;
  548.             } else {
  549.                 child = node->left;
  550.             }
  551.  
  552.             if (!child) {
  553.                 SplayNode(node);
  554.                 return SetIterator{end_};
  555.             } else {
  556.                 node = child;
  557.             }
  558.  
  559.             ++depth;
  560.         }
  561.  
  562.         return SetIterator{end_};
  563.     }
  564.  
  565.     SetIterator<ValueType> lower_bound(const ValueType& value) const {
  566.         if (size_ == 0) {
  567.             return SetIterator{end_};
  568.         }
  569.  
  570.         return LowerBound(root_, value);
  571.     }
  572.  
  573.     SetIterator<ValueType> begin() const {
  574.         return SetIterator{begin_};
  575.     }
  576.  
  577.     SetIterator<ValueType> end() const {
  578.         return SetIterator{end_};
  579.     }
  580. };
  581.  
  582. std::ostream& operator<<(std::ostream& os, const std::vector<int> vec) {
  583.     for (auto elem : vec) {
  584.         os << elem;
  585.     }
  586.  
  587.     return os;
  588. }
  589.  
  590. void TestInsert() {
  591.     std::vector<int> sorted = {1, 2, 3, 4, 5, 6, 7, 8};
  592.     std::vector<int> shuffled = sorted;
  593.  
  594.     while (std::next_permutation(shuffled.begin(), shuffled.end())) {
  595.         Set<int> s(shuffled.begin(), shuffled.end());
  596.         std::vector<int> from_set;
  597.         for (auto elem : s) {
  598.             from_set.push_back(elem);
  599.         }
  600.  
  601.         if (from_set != sorted) {
  602.             std::cout << shuffled;
  603.             exit(0);
  604.         }
  605.     }
  606. }
  607.  
  608. void TestFind() {
  609.     Set<int> s{1, 6, 3, 8, 2, 4, 7, 5};
  610.     auto iter = s.find(1);
  611.     assert(*iter == 1);
  612.     assert(iter == s.begin());
  613.     assert(iter != s.end());
  614.  
  615.     iter = s.find(9);
  616.     assert(iter == s.end());
  617.     assert(iter != s.begin());
  618. }
  619.  
  620. void TestErase() {
  621.     Set<int> s{1, 6, 3, 8, 2, 4, 7, 5};
  622.  
  623.     for (int i = 0; i <= 9; ++i) {
  624.         s.erase(i);
  625.         assert(s.find(i) == s.end());
  626.     }
  627.  
  628.     assert(s.empty());
  629.  
  630.     s = Set{1, 6, 3, 8, 2, 4, 7, 5};
  631.  
  632.     s.erase(9u);
  633.     assert(s.size() == 8u);
  634.     s.erase(4);
  635.     s.erase(4);
  636.     s.erase(4);
  637.     assert(s.size() == 7u);
  638. }
  639.  
  640. void TestLowerBound() {
  641.     Set<int> s = Set{1, 5, 6, 9, 12};
  642.  
  643.     std::vector<int> ans = {1, 1, 5, 5, 5, 5, 6, 9, 9, 9, 12, 12, 12};
  644.     for (int i = 0; i <= 12; ++i) {
  645.         auto iter = s.lower_bound(i);
  646.         assert(*iter == ans[i]);
  647.     }
  648.  
  649.     assert(s.lower_bound(13) == s.end());
  650. }
  651.  
  652. void TestBig() {
  653.     Set<int> s;
  654.     std::vector<int> vec;
  655.  
  656.     for (int i = 0; i < 1000000; ++i) {
  657.         vec.push_back(i);
  658.     }
  659.  
  660.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  661.  
  662.     for (auto i : vec) {
  663.         s.insert(i);
  664.     }
  665.  
  666.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  667.  
  668.     for (int i = 0; i < 1000000; ++i) {
  669.         s.find(vec[i]);
  670.     }
  671.  
  672.     std::shuffle(vec.begin(), vec.end(), std::mt19937());
  673.  
  674.     for (int i = 0; i < 1000000; ++i) {
  675.         s.erase(vec[i]);
  676.     }
  677. }
  678.  
  679. int main() {
  680.     TestLowerBound();
  681.     TestInsert();
  682.     TestErase();
  683.     TestFind();
  684.     TestBig();
  685.  
  686.     return 0;
  687. }
  688.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement