[PATCH] [libc++] Fix std::make_heap's worst case time complexity

Marshall Clow mclow.lists at gmail.com
Fri Jul 18 06:51:12 PDT 2014


On Jul 15, 2014, at 12:18 PM, David Majnemer <david.majnemer at gmail.com> wrote:

> Ping.
> 
> On Wed, Jul 9, 2014 at 3:14 AM, David Majnemer <david.majnemer at gmail.com> wrote:
>> std::make_heap is currently implemented by iteratively applying a
>> sift_up-type algorithm.
>> Since sift-up is O(ln n), this gives std::make_heap a worst case time
>> complexity of O(n ln n).  Since the C++ standard mandates that
>> std::make_heap make no more than O(3n) comparisons, this makes our
>> std::make_heap out of spec.
>> 
>> Fix this by introducing an implementation of __sift_down and switch
>> std::make_heap to create the heap using it.  This gives std::make_heap
>> linear time complexity in the worst case.
>> 
>> This fixes PR20161.

I added some more bits to the tests.
Your change to “make_heap.pass.cpp” is not right because:
1) It passes a comparison function to make_heap, but that test is testing the version that does not take a comparison predicate.
2) It uses a lambda, which fails when the tests are run with -std=c++03

Revised test attached.

— Marshall

-------------- next part --------------
A non-text attachment was scrubbed...
Name: PR20161-test.patch
Type: application/octet-stream
Size: 1275 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140718/885e0843/attachment.obj>


More information about the cfe-commits mailing list