zoukankan      html  css  js  c++  java
  • 时隔几年,再写传统的简单问题算法,又有何不同?

    问题一:变量交换

    int swap(int &a,int &b){
         a ^= b;
         b ^= a;
         a ^= b;
    } 

     利用异或操作来进行变量交换,可以省下一个空间,即不借用第三变量。

    问题二:数组求和

    //1.一般算法,迭代形式 
    int sum1(int A[],int n){
        
        int sum=0;
        for(int i=0;i<n;i++)
        {
            sum+=A[n];
        }
        return sum;
        
    } 
    
    //2.减而治之,递归形式
    int sum2(int A[],int n){
        
        return (n<0) ? 0 : sum2(A,n-1) + A[n-1];
        
    } 
    
    //3.分而治之,递归形式
    int sum3(int A[],int lo,int hi){
        
        if(lo==hi) return A[lo];
        int mi= (lo+hi)>>2;
        return sum3(A,lo,mi)+sum3(A,mi+1,hi);
        
    }

      

      问题求解过程更加注重 “套路” ,注重问题本身的描述(归纳)。

              mi= (lo+hi)>>2 

    为脱离“递归基”o(1)的时间刻度而造成实际效率下降的困扰,游标取中的操作中 使用“移位运算”而不采用“除法”,衡量了计算机底层对两者的执行效率。


    问题三:数组反转

    //1.减而治之,递归形式 
    int reverse1(int *A,int lo,int hi){
    
        if(lo<hi)
        {
            swap(A[lo],A[hi]);reverse1(A,lo+1,hi-1); 
        }
    
    //2.迭代形式
    int
    reverse1(int *A,int lo,int hi){ while(lo<hi) swap(A[lo++],A[hi--]) ; }

      

      似乎,熟悉多钟形式之间的转化。

     

    开始,我们为了成长,试着脱离“解决问题”的苦难开始理解“抽象”,离开迭代,学习递归。

    后来,我们为了成熟,试着摆脱“依赖问题”的蜜糖开始追求“效率”,离开递归,再学迭代。

      

      加油,我们在成长!

     

  • 相关阅读:
    后端程序员之路 6、Python fabric
    后端程序员之路 5、.conf、libconfig
    后端程序员之路 4、一种monitor的做法
    后端程序员之路 3、fastcgi、fastcgi++
    后端程序员之路 2、nginx、php
    后端程序员之路 1、linux、centos
    F#之旅9
    F#之旅8
    F#之旅7
    F#之旅6
  • 原文地址:https://www.cnblogs.com/labixiaohei/p/10974481.html
Copyright © 2011-2022 走看看