std::list.sort()的奇怪效率
Strange efficiency of std::list.sort()
好的,那么下面的内容:
我想使用一个双链表,并希望对其中的对象进行排序。对象属于另一个类。奇怪的是:当我使用我自己创建的双链表时,我在将元素添加到列表中时对它们进行排序。这就像插入排序,效率是n^2。
但是这比使用std::list排序更快,在std::list排序中,我将所有元素添加到列表中,然后调用sort()。我真的不明白为什么....
进一步的信息:在这一刻,我排序~ 500个元素。
我的列表做错了吗?
编辑:一些代码
std::list 的代码for every object:
list.push_back(object);
list.sort();
我的列表:
struct node{
someObject* data;
float depth;
node* prev;
node* next;
node(someObject* o){
data = o;
prev = NULL;
next = NULL;
depth = depthFunc(o);
}
float depthFunc(someObject* o);
};
struct myList{
node* head;
node* tail;
void insertAfter(node* toAdd, node* n);
void insertBefore(node* toAdd, node* n);
void addNode(someObject* o){
node* n = new node(o);
if (head == NULL) {
head = n;
tail = n;
} else {
node* temp = head;
while(temp != NULL && temp->depth < n->depth){
temp = temp->next;
}
if (temp != NULL) insertBefore(n, temp);
else insertAfter(n, tail);
}
}
};
您手写的排序函数具有O(N^2
)时间复杂度。每个元素被插入(你调用addNode
n
次),并且你需要n
操作来找到插入点(给出n * n = n^2
)。
std::list<T>::sort()
要求复杂度为0 (n lg n
),比0 (N^2
)快得多。(lg n
比n
长得慢得多)
你手写的排序是插入排序的一个变体。
请注意,对于大多数输入,使用std::vector
和std::sort
而不是std::list
和std::list::sort
会给出更快的结果。
如果你的问题是问"为什么手写版本更快?",这取决于你的输入。对于某些输入,插入排序可以是O(n)
。(对于您的实现,当元素以反向顺序插入时,就会发生这种情况)
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- C++中带有List类的迭代器Segfault
- 使用"std::unordereded_map"映射到"std::list"对象
- GCC对可能有效的代码抛出init list生存期警告
- 使用std::list创建循环链表
- 重载Singly Linked List中的赋值运算符
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 代码的效率. 转到和函数调用
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 对于循环C++可能效率低下
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 包含 std::list 的结构体的 C++ 初始化
- 调用"list<T>::end()"不是效率低下吗?
- std::list.sort()的奇怪效率