【发布时间】:2014-05-10 10:36:11
【问题描述】:
有一次我在面试的时候被问到这个问题,我认为面试官弄错了。
问题来了:
假设我们有一个具有运算符
在 std::set 中添加所有这些数据,然后使用 std::find 和 std::insert 查询和添加元素。这种情况下前N个元素的插入是N*logN,每次查询和插入都是logN。
第二种是将所有这些值都插入到std::list中,然后对其进行排序,查询后用std::binary_search插入并插入。这里插入 if N + 排序 N*logN(根据面试官)和每个 binary_search 并插入 logN。
我已经回答第一种情况更快,但面试官告诉我,由于 std::set 是通过红黑树实现的,所以重新平衡是一项昂贵的操作,因此 std::list 情况更快。但是在我注意到 std::list 的排序不能是 N*logN 因为它没有随机访问迭代器之后。
请帮助我最终了解哪种情况更好,为什么?
【问题讨论】:
-
在 O(log N) 中对链表进行二进制搜索?它是如何工作的?
-
是的,这也太荒谬了吧?
-
再平衡根本不是昂贵的操作。实际上它的复杂性是摊销常数
-
所以回答哪个更好的问题;显然是第一个选项,因为第二个很荒谬。
-
你确定那家伙说的不是
std::vectors?这是他正确的唯一方法:-)
标签: c++ performance sorting stl time-complexity