• 均摊时间复杂度


    二分查找
    int binarySearch(int arr[],int l,int r,int target){
        
        if(l > r)
            return -1;
            
        int mid = l + (r - l)/2;
        if( arr[mid] == target)
            return mid;
        else if(arr[mid] > target)
            return binarySearch(arr,l,mid-1,target);
        else
            return binarySearch(arr,mid+1,r,target);
            
    }
    -----log(n)

    归并算法

     

    -----logn层(从第0层开始),每层n次计算

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    均摊时间复杂度分析

    #include <iostream>
    #include <cassert>
    #include <cmath>
    #include <ctime>
    #include "Myvector.h"

    using namespace std;

    int main(){
        
        for( int i = 10; i <= 26 ; i++){
            
            int n = pow(2.0,(double)i);
            
            clock_t startTime = clock();
            MyVector<int> vec;
            for(int i = 0; i < n; i++){
                
                vec.push_back(i);
            }
            clock_t endTime = clock();
            cout << n <<" operations: " ;
            cout << double(endTime - startTime)/CLOCKS_PER_SEC << " s"<< endl;
            
        }    
        return 0;
    }

    //
    // Created by liuyubobobo on 12/01/2017.
    //

    #ifndef INC_06_AMORTIZED_TIME_MYVECTOR_H
    #define INC_06_AMORTIZED_TIME_MYVECTOR_H

    template <typename T>
    class MyVector{

    private:
        T* data;
        int size;       // 存储数组中的元素个数
        int capacity;   // 存储数组中可以容纳的最大的元素个数

        // O(n)
        void resize(int newCapacity){

            assert( newCapacity >= size );
            T *newData = new T[newCapacity];
            for( int i = 0 ; i < size ; i ++ )
                newData[i] = data[i];
            delete[] data;

            data = newData;
            capacity = newCapacity;
        }

    public:
        MyVector(){

            data = new T[100];
            size = 0;
            capacity = 100;
        }

        ~MyVector(){

            delete[] data;
        }

        // Average: O(1)
        void push_back(T e){

            if( size == capacity )
                resize( 2* capacity );

            data[size++] = e;
        }

        // O(1)
        T pop_back(){

            assert( size > 0 );
            size --;

            return data[size];
        }

    };

    #endif //INC_06_AMORTIZED_TIME_MYVECTOR_H

    -----resize时copy到新数组的耗费为n,但是均摊下去,每一个数组元素耗费为1+1=2

     -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    元素增加到一定大小应该resize更大的空间,那么当删除一个元素的时候是否应该减小空间呢

        T pop_back(){
            
            assert( size > 0);
        
            T ret = data[size - 1];
            size-- ;
            if( size == capacity/2)
                resize( capacity/2);
            return ret;
        }

    注意:应当在resize之前将需要pop出来的这个元素保存起来,否则resize之后的数组中将不再包含该元素

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    删除元素时应该等一等,当元素个数为1/4时再resize为1/2,为增加元素留出余地

    #include <iostream>
    #include <cassert>
    #include <cmath>
    #include <ctime>
    #include "Myvector.h"

    using namespace std;

    int main(){
        
        for( int i = 10; i <= 26 ; i++){
            
            int n = pow(2.0,(double)i);
            
            clock_t startTime = clock();
            MyVector<int> vec;
            for(int i = 0; i < n; i++){
                
                vec.push_back(i);
            }
            for(int i = 0; i < n; i++){
                
                vec.pop_back();
            }
            
            clock_t endTime = clock();
            cout << 2*n <<" operations: " ;
            cout << double(endTime - startTime)/CLOCKS_PER_SEC << " s"<< endl;
            
        }    
        return 0;
    }


    using namespace std;

    template <typename T>
    class MyVector{
        
    private:
        T* data;
        int size;
        int capacity;
        
        void resize(int newCapacity){
            
            assert( newCapacity >= size);
            T* newData = new T[newCapacity];
            for(int i = 0; i < size; i++)
                newData[i] = data[i];
            delete[] data;
            
            data = newData;
            capacity  = newCapacity;
        }
        
    public:
        MyVector(){
            
            data = new T[100];
            size = 0;
            capacity = 100;
        }
        
        ~MyVector(){
            
            delete[] data;
        }
        
        void push_back(T e){
            
            if( size == capacity)
                resize( 2* capacity);
            data[size++] = e ;
        }
        
        T pop_back(){
            
            assert( size > 0);
        
            T ret = data[size - 1];
            size-- ;
            if( size == capacity/4)
                resize( capacity/2);
            return ret;
        }
    };

  • 相关阅读:
    如何搭建SVN的客户端和使用
    SVN服务器的本地搭建和使用
    grep命令
    cat命令
    cut命令
    yum 命令
    XPath、XQuery 以及 XSLT 函数
    XPath 实例
    XPath 运算符
    XPath Axes(轴)
  • 原文地址:https://www.cnblogs.com/rosyYY/p/8450147.html
Copyright © 2020-2023  润新知