diff --git a/main.cpp b/main.cpp index cec38db6bca6a26ae9b79cb363b2a87e0409b675..41f74a235ea96fccc70edbfdc37d5cffc31678de 100644 --- a/main.cpp +++ b/main.cpp @@ -64,13 +64,37 @@ public: void erase_child(node<T>& t) { - for(auto it= std::begin(_childs);it!=std::end(_childs);it++) + for(auto&& it= std::begin(_childs);it!=std::end(_childs);it++) if((*it)->id() == t.id()) - _childs.erase(it); + { + if(it == std::begin(_childs)) + { + _childs.erase(it); + it=std::begin(_childs); + it--; + } + else + { + _childs.erase(it); + it--; + } + } - for(auto it= std::begin(_bad_childs);it!=std::end(_bad_childs);it++) + for(auto&& it= std::begin(_bad_childs);it!=std::end(_bad_childs);it++) if((*it).lock()->id() == t.id()) - _bad_childs.erase(it); + { + if(it == std::begin(_bad_childs)) + { + _bad_childs.erase(it); + it=std::begin(_bad_childs); + it--; + } + else + { + _bad_childs.erase(it); + it--; + } + } } void flow_after(std::function<bool(node<T>&)> funct) @@ -81,12 +105,11 @@ public: child->flow_after(funct); } - void flow_before(std::function<bool(node<T>&)> funct) + void flow_before(std::function<void(node<T>&)> funct) { for(auto& child : _childs) child->flow_before(funct); - if (funct(*this)) - return; + funct(*this); } node<T>& add_child(node<T>* w) @@ -129,13 +152,12 @@ int node<T>::_id=0; template<class T> class graph { -private: +public: static void erase(node<T>& root , node<T>& to_del) { root.flow_after([&to_del](node<T>& t){ t.erase_child(to_del); return false; }); } -public: static void erase(node<T>& root , node<T>* t) { erase(root,*t); @@ -222,7 +244,7 @@ public: bool foundround=false; int id=n.id(); - flow_after(o,[&id,&foundround](node& n){if(n.id()==id) foundround=true;}); + flow_after(o,[&id,&foundround](node& n){if(n.id()==id) foundround=true; return foundround;}); if(!foundround) connections.push_back(connection{n.id(),o.id()}); else @@ -294,15 +316,30 @@ public: return ret; } - void run(std::function<void(T&)> funct) + std::vector<node*> get_not_inf_round_childs(node& n) + { + std::vector<node*> ret{}; + for(auto& i : connections) + { + if(n.id()==i.A) + for(auto& re:nodes) + if(re.id()==i.A) + ret.push_back(&re); + } + return ret; + } + + void run(std::function<bool(graph<T>::node&)> funct) { for(auto& i:nodes) - funct(i.data()); + if(funct(i)) + return; } - void flow_after(node& node, std::function<void(graph<T>::node&)> funct) + void flow_after(node& node, std::function<bool(graph<T>::node&)> funct) { - funct(node); + if(funct(node)) + return; for(auto& i : connections) { if(node.id()==i.A) @@ -333,30 +370,13 @@ template<class T> int graph<T>::node::_id=0; } -void test() -{ - std::vector<recursive_storage::node<int>> a; - for(int i=0;i<1000000;i++) - a.push_back(recursive_storage::node<int>{5}); - a[0].add_child(int{6}); - a[0].childs()[0]->add_child(int{7}); - a[0].childs()[0]->add_child(int{8}); - auto to_del = a[0].childs()[0]->childs()[0]; - a[0].childs()[0]->add_child(a[0]); - a[0].flow_after([]( recursive_storage::node<int>& elem ){ std::cout<<"inf rounds from here:"<<elem.inf_round_childs().size()<<" .id:"; std::cout<< elem.id() << ":" << elem.data() <<std::endl; return false; }); - recursive_storage::graph<int>::erase(a[0],to_del); - a[0].flow_after([]( recursive_storage::node<int>& elem ){ std::cout<<"inf rounds from here:"<<elem.inf_round_childs().size()<<" .id:"; std::cout<< elem.id() << ":" << elem.data() <<std::endl; return false; }); -} - -int main() +void test1(int num) { time_t start,end; - //std::cout<<localtime(&now)->tm_sec<<std::endl; - - std::cout<<"test1 : create 10000000 1 node graph"<<std::endl; + std::cout<<"test1 : create "<<num<<" 1 node graph"<<std::endl; start=time(0); { - for(size_t i=0;i<10000000;i++) + for(size_t i=0;i<num;i++) { local_storage::graph<int> graph{}; graph.add_node(6); @@ -364,31 +384,32 @@ int main() } end=time(0); std::cout<<"local_storage: " - <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m" - <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"<<std::endl; + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; start=time(0); { - for(size_t i=0;i<10000000;i++) + for(size_t i=0;i<num;i++) { recursive_storage::node<int> node{6}; } } end=time(0); std::cout<<"recursive_storage: " - <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m" - <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"; + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; +} - std::cout<<"test1 : create 100000 5 node full connected graph"<<std::endl; +void test2(int num) +{ + time_t start,end; + std::cout<<"test2 : create "<<num<<" 5 node full connected graph"<<std::endl; start=time(0); { - for(size_t i=0;i<100000;i++) + for(size_t i=0;i<num;i++) { local_storage::graph<int> graph{}; - graph.add_node(6); - graph.add_node(6); - graph.add_node(6); - graph.add_node(6); - graph.add_node(6); + for(size_t j=0;j<5;j++) + graph.add_node(6); for(size_t j=0;j<5;j++) for(size_t l=0;l<5;l++) graph.connect(graph[j],graph[l]); @@ -396,34 +417,71 @@ int main() } end=time(0); std::cout<<"local_storage: " - <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m" - <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"<<std::endl; + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; start=time(0); { - for(unsigned int i=0;i<100000;i++) + for(size_t i=0;i<num;i++) { recursive_storage::node<int> node{6}; for(size_t j=0;j<4;j++) node.add_child(6); - auto& childs= node.childs(); - for(auto& child:childs) - for(auto& child2:childs) - child.add_child(child2); + for(auto& child:node.childs()) + for(auto& child2:node.childs()) + child->add_child(*child2); } } end=time(0); std::cout<<"recursive_storage: " - <<localtime(&end)->tm_min-localtime(&start)->tm_min<<"m" - <<localtime(&end)->tm_sec-localtime(&start)->tm_sec<<"s"; - local_storage::graph<int> g{}; - g.add_node(6); - auto& t2=g.add_node(6); - auto& t = g.add_node(52); - g.connect(g[0],t); - g.connect(g[0],t2); - g.connect(t2,g[0]); - std::cout<<std::endl<<g.get_childs(t2).size()<<std::endl; - g.flow_before(g[0],[](local_storage::graph<int>::node& a){std::cout<<a.data()<<":"<<a.id()<<std::endl;}); - //test(); + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; +} + +void test3(int num) +{ + time_t start,end; + std::cout<<"test3 : create "<<num<<" 30 node line graph, search for the deepest and delete it."<<std::endl; + start=time(0); + { + for(size_t i=0;i<num;i++) + { + local_storage::graph<int> graph{}; + for(size_t j=0;j<29;j++) + graph.add_node(6); + graph.add_node(30); + for(size_t j=1;j<30;j++) + graph.connect(graph[j-1],graph[j]); + local_storage::graph<int>::node* target; + graph.run([&target](local_storage::graph<int>::node& node){if(node.data()==30) {target=&node;return true;}return false;}); + graph.erase(*target); + } + } + end=time(0); + std::cout<<"local_storage: " + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; + start=time(0); + { + for(size_t i=0;i<num;i++) + { + recursive_storage::node<int> node{6}; + int j=1; + node.flow_after([&j](recursive_storage::node<int>& n){n.add_child(++j); if(j==30)return true; return false;}); + recursive_storage::node<int>* target=nullptr; + node.flow_after([&target](recursive_storage::node<int>& n){if(n.data()==30){target=&n;return true;} return false;}); + recursive_storage::graph<int>::erase(node,target); + } + } + end=time(0); + std::cout<<"recursive_storage: " + <<localtime(&end)->tm_min*60+localtime(&end)->tm_sec- + localtime(&start)->tm_min*60-localtime(&start)->tm_sec<<"s"<<std::endl; +} + +int main() +{ + test1(10000000); + test2(1000000); + test3(1000000); return 0; }