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 };
}
Что вы думаете? – theV0ID
Почему ваша сложность линейна? Я не вижу петли или рекурсии. – NathanOliver
Ну, это ожидается, если вы сохраните размер. «std :: list :: splice», как известно, имеет такую же проблему сложности O (n), что на самом деле является причиной того, что «список :: сращивание» Boost имеет перегрузку, которая принимает дополнительный параметр «size», чтобы избежать O (n) стоимость 'std :: distance'. Вы можете обеспечить аналогичную перегрузку, чтобы частично решить вашу проблему. – Morwenn