zoukankan      html  css  js  c++  java
  • LintCode "Heapify"

    My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only failed with TLE with the last test case. The problem is, partial sort cannot guaratee O(n) every time.

    class Solution
    {
        void kth(vector<int> &A, int s, int e, int k) // all zero based
        {
            if(s >= e) return;
            
            //    Partition
            int i = e, j = e;
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(s, e);
                
                int pi = dis(gen);
                int pivot = A[pi];
                swap(A[pi], A[s]);
                
                while(j > s)
                {
                    if(A[j] >= pivot)
                    {
                        swap(A[i], A[j]);
                        i --; j = i;
                    }
                    else
                    {
                        j --;
                    }
                }
                swap(A[i], A[s]);
            }
            
            //    Recursion
            if(i < k)
            {
                kth(A, i + 1, e, k);
            }
            else if(i > k)
            {
                kth(A, s, i - 1, k);
            }
        }
    public:
        /**
         * @param A: Given an integer array
         * @return: void
         */
        void heapify(vector<int> &A)
        {
            size_t n = A.size();
            int s = 0, e = n - 1;
            while (s < e)
            {
                int cnt = e - s + 1;
                int h = ceil(log2(cnt));
                int k = (pow(2, h) - 1)/2;
                kth(A, s, e, k - 1);
                e = k - 1;
            }
        }
    };
    View Code

    A smarter way is as below. Its strategy is "per-node maintanence".

    class Solution {
        void help(vector<int> &A, int i)
        {
            int n = A.size();
            int li = i * 2 + 1, ri = i * 2 + 2;
            int left = li < n ? A[li] : INT_MAX;
            int right= ri < n ? A[ri] : INT_MAX;
            
            if(left < right  && left < A[i])
            {
                swap(A[li], A[i]);
                help(A, li);
            }
            else if(right < left && right < A[i])
            {
                swap(A[ri], A[i]);
                help(A, ri);
            }
        }
    public:
        /**
         * @param A: Given an integer array
         * @return: void
         */
        void heapify(vector<int> &A) {
            for(int i = A.size() / 2; i >= 0; i --)
                help(A, i);
        }
    };
  • 相关阅读:
    基于Adaboost的人脸检测算法
    操作系统笔试题及答案
    eclipse Maven plugin 配置
    网站服务管理系统系列教程之五
    2017第4周日
    2017春节~人生智慧箴言
    2017年初夕
    2017农历二十九
    王国维收藏真伪
    2017第3周二假期里该做的事
  • 原文地址:https://www.cnblogs.com/tonix/p/4862781.html
Copyright © 2011-2022 走看看