2016-11-30 3 views
0

Я реализую список в C++, и у меня есть проблема со сложностью метода split. . Вместо постоянной временной сложности, моя сложность линейна (О (п)) Вот мой код:C++ Разбиение списка в O (n) вместо O (1)

 /* 
     * Destructively splits the list into the two that are returned. 
     * The first list consists of elements formerly in the [begin, place) range. 
     * The second list consists of elements formerly in the [place, end) range. 
     */ 
     std::pair<list, list> list::split(list::const_iterator place) { 
      list first_list{}, second_list{}; 
      if (head == nullptr) { 
       return{ first_list, second_list }; 
      } 
      if (head == place.current_ptr) { 
       swap(second_list); 
       return{ first_list, second_list }; 
      } 
      if (place.current_ptr == nullptr) { 
       swap(first_list); 
       return{ first_list, second_list }; 
      } 
      first_list.head = head; 
      first_list.num_elements = std::distance(cbegin(), place); 
      first_list.tail = place.current_ptr->prev; 

      second_list.head = place.current_ptr; 
      if (second_list.head == nullptr) { 
       second_list.tail = nullptr; 
     } 
     else 
     { 
      second_list.head->prev = nullptr; 
      second_list.tail = tail; 
     } 
     second_list.num_elements = num_elements - first_list.num_elements; 
     first_list.tail->next = nullptr; 

     tail = head = nullptr; 
     num_elements = 0; 

     return{ first_list, second_list }; 
    } 
+0

Что вы думаете? – theV0ID

+0

Почему ваша сложность линейна? Я не вижу петли или рекурсии. – NathanOliver

+0

Ну, это ожидается, если вы сохраните размер. «std :: list :: splice», как известно, имеет такую ​​же проблему сложности O (n), что на самом деле является причиной того, что «список :: сращивание» Boost имеет перегрузку, которая принимает дополнительный параметр «size», чтобы избежать O (n) стоимость 'std :: distance'. Вы можете обеспечить аналогичную перегрузку, чтобы частично решить вашу проблему. – Morwenn

ответ

1

Я нашел проблему. std::pair создал копию двух списков, которые я возвращал, так что это заняло линейное время. Когда I std::move перечисляет пару, он работает во времени, равном где я раскалываю.

Смежные вопросы