首页 > 代码库 > 算法设计原则

算法设计原则

  在平时的工作中遇到纯粹的算法设计的工作内容并不多,但是算法在编程中的重要性是不言而喻的,再怎么拔高算法的地位都不为过。

  那么在设计算法中有什么可以遵循的原则吗?

  答案是有的,算法在设计的过程中可以遵循如下五个原则。

 

  1.穷举算法思想

    穷举算法思想就是从所有的可能结果中一个一个的试验,知道试出正确的结果。具体的操作步骤如下:

    1)对每一种可能的结果,计算其结果;

    2)判断结果是否符合题目要求,如果符合则该结果正确,如果不符合则继续进行第1)步骤。

    穷举算法思想的经典例子为鸡兔同笼为题(又称龟鹤同笼问题),题目为“一个笼子里有鸡兔,共15个头、46条腿,问鸡兔各有多少只?”。代码如下:

      public static void main(String[] args) {

        int head = 0;
        int leg = 0;
        System.out.println( "输入鸡兔头数:");
        Scanner input=new Scanner(System.in);
        head = input.nextInt();
        System.out.println( "输入鸡兔腿数:");
        Scanner input1=new Scanner(System.in);
        leg = input1.nextInt();
        
        boolean existence = false;
        for( int i = 0; i <= head; i++){
          if( 2 * i + 4 * ( head - i) == leg){
            System.out.println( "鸡的个数 :" + i);
            System.out.println( "兔的个数 :" + ( head - i));
            existence = true;
          }
        }
      
        if( !existence){
          System.out.println( "你输入的数据不正确");
        }
      }

 

  2.递推算法思想

    递推算法算法就是根据已知条件,利用特定关系推导出中间推论,直到得到结果的算法。

    递推算法思想最经典的例子是斐波那契数列 : 1,1,2,3,5,8,13......

    上面的数列符合F(n) = F(n-1) + F(n-2).代码如下:

      public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n = input.nextInt();
        System.out.println( fibonacci( n));
      }
      
      public static int fibonacci( int n){
        if( n == 1){
          return 1;
        }else if( n == 2){
          return 1;
        }else{
          return fibonacci( n - 1) + fibonacci( n - 2);
        }
      }

  3.递归算法思想

    递归算法思想是把大问题转换成同类问题的子问题,然后递归调用函数表示问题的解。

    在使用递归的时候一定要注意调回递归函数的终止条件。

    递归算法比较经典的例子是求阶乘。代码如下:

      public static void main(String[] args) {
        System.out.println( "输入一个大于零的数:");
        Scanner input=new Scanner(System.in);
        int n = input.nextInt();
        System.out.println( factorial( n));
      }

      public static int factorial( int n){
        if( n == 0){
          return 1;
        }else if( n == 1){
          return 1;
        }else{
          return ( n * factorial( n-1));
        }
      }

  4.分治算法思想

    分治算法思想就是把一个大问题分解成若干个规模较小的子问题,且这些子问题的都是相互独立的、与原问题性质一致。逐个求出这些子问题的解就能够得到原问题的解了。

    分治算法思想有一个比较经典的例子就是查找假币问题。

    题目描述:现有35枚硬币,其中只有一枚是假币。已知假币与真币外表完全一样,只是比真币轻一点。请找出假币。代码如下:

      public static void main(String[] args) {
        int index = 0;
        System.out.println( "输入金币总数:");
        Scanner input = new Scanner( System.in);
        index = input.nextInt();
        int[] arrayInt = new int[ index];

        for( int i=0; i<index; i++){
          arrayInt[i] = 2;
        }

        int falseCoin = (int)( Math.random() * index);
        System.out.println( "假币:" + falseCoin);
        arrayInt[ falseCoin] = 1;

        System.out.println( "假币是:" + findFalseCoin( arrayInt, 0, index-1));
      }

      public static int findFalseCoin( int[] arrayInt, int low, int high){
        int tmp = 0;

        if( low + 1 == high){
          if( arrayInt[low] > arrayInt[high]){
            return high;
          }else{
            return low;
          }
        }

        tmp = high - low + 1;
        if( tmp % 2 == 0){
          int tmp1 = totalWeight( arrayInt, low, low + tmp/2 -1);
          int tmp2 = totalWeight( arrayInt, low + tmp/2, high);
          if( tmp1 > tmp2){
            return findFalseCoin( arrayInt, low + tmp/2, high);
          }else{
            return findFalseCoin( arrayInt, low, low + tmp/2 -1);
          }
        }else{
          int tmp1 = totalWeight( arrayInt, low, low + tmp/2 -1);
          int tmp2 = totalWeight( arrayInt, low + tmp/2 +1, high);
          if( tmp1 > tmp2){
            return findFalseCoin( arrayInt, low + tmp/2 +1, high);
          }else if( tmp1 < tmp2){
            return findFalseCoin( arrayInt, low, low + tmp/2 -1);
          }else{
            return low + tmp/2;
          }
        }
      }

      public static int totalWeight( int[] arrayInt, int low, int high){
        int sum = 0;

        for( int i = low; i <= high; i++){
          sum += arrayInt[ i];
        }

        return sum;
      }

  5.概率算法思想

    51.数值概率算法

    5.2蒙特卡罗算法

    5.3拉斯维加斯算法

    5.4舍伍德算法

    这个算法思想还没有理解,欢迎大家补充。

算法设计原则