代码之家  ›  专栏  ›  技术社区  ›  NOBUD

最大堆插入函数实现C++

  •  -1
  • NOBUD  · 技术社区  · 2 年前

    我正在尝试将键值插入堆中。我正在使用TestUnit。cpp查找错误。我发现以下错误:

    断言失败。 应为:<[(10100),(7,70),(6,60),(5,50),(2,20),(1,10),(3,30),(4,40)]gt; 实际值:<[(7,70),(5,50),(6,60),(4,40),(2,20),(1,10),(3,30),(10100)]gt;

    断言失败。 应为:<[(10100),(4,40),(5,50),(1,10),(2,20),(3,30)]> 实际值:<[(5,50),(4,40),(3,30),(1,10),(2,20),(10100)]>

    断言失败。 应为:<[(9,90),(7,70),(8,80),(6,60),(2,20),(1,10),(3,30),(5,50)]gt; 实际值:<[(9,90),(7,70),(8,80),(5,50),(2,20),(1,10),(3,30),(6,60)]gt;

    断言失败。 应为:<[(6,60),(5,50),(4,40),(1,10),(2,20),(3,30)]> 实际值:<[(6,60),(5,50),(3,30),(1,10),(2,20),(4,40)]>

    我的插入功能是:

    void insert(KeyValueType const& keyValue)
        {
    
            size_t asize = size();
            if (asize == 0)
            {
                table.push_back(keyValue);
            }
            else
            {
                table.push_back(keyValue);
                for (int i = asize / 2 - 1; i >= 0; i--)
                {
                    heapify(i);
    
                }
            }
        } 
    
    

    我的heapify函数是:

    void heapify(size_t index)
        {
            auto previous_index = index;
            do
            {
                previous_index = index;
                auto largest = getLargestFromParentAndHisChildren(index);
                if (index != largest)
                {
                    std::swap(table[index], table[largest]);
                    index = largest;
                }
            } while (index != previous_index);
        }
    
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   trincot    2 年前

    循环从错误的值开始。它应该是:

    for (int i = (asize - 1) / 2; i >= 0; i--)
    

    不是你的问题,而是:

    • 使命感 heapify 不是冒充值的最快方法,因为该函数还需要检查同级值,这是不必要的。
    • i-- 将使此循环为O(n),这不是堆所需的复杂性。此操作应为O(logn),依此类推 i 应该在每次迭代中从子级跳到父级。
    • 此外,当实现前一点时,当不再发生交换时,此循环可能会退出。