基础算法思想

来源:互联网 发布:spring boot源码分析 编辑:程序博客网 时间:2024/06/05 20:13
算法设计的任务就是:针对一个具体的问题,利用特定的方法和步骤来获取最佳结果。

1.编程的灵魂:算法+数据结果

         刚开始学编程的人总是会陷入这样的误区,以为学会了一门语言就学会了编程,总会学各种各样的语言。实际上,语言只是一个工具,解决具体的问题必须依赖于算法,而算法从本质上讲是数学方法的表达。通过一定的数学知识来解答。一个好的系统分析师或设计师,或许他们可以不会任何一种语言,但如果他们能通过数学公式或图形等准确的表达出解决问题的方法和步骤,他们照样可以成为这个行业的佼佼者,拿高工资。

2.地推思想:

   从已知条件出发,利用特定的关系得出中间推论,逐步递推,直至得到结果为止。

1)顺推法

   所谓顺推法,就是从已知条件出发,逐步推算出要解决问题的方法。例如:斐波那契数。

算法实现:

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">#include <stdio.h>  
  2. #define NUM 13   
  3.   
  4. void main()  
  5. {  
  6.     int i;  
  7.     long fib[NUM] = {1,1};  
  8.     for(i = 2; i < NUM; i++)  
  9.     {  
  10.         fib[i] = fib[i-1] + fib[i-2];  
  11.     }  
  12.     for(i = 0; i < NUM; i++)  
  13.     {  
  14.         printf("%d\n",fib[i]);  
  15.     }  
  16. }</SPAN>  
#include <stdio.h>#define NUM 13void main(){    int i;    long fib[NUM] = {1,1};    for(i = 2; i < NUM; i++)    {        fib[i] = fib[i-1] + fib[i-2];    }    for(i = 0; i < NUM; i++)    {        printf("%d\n",fib[i]);    }}
2)逆推法

   所谓逆推法,就是从已知的结果出发,用迭代表达式逐步推算出问题开始的条件。例如:

   父亲准备为小龙的4年大学生活一次性在银行存一笔钱,使用整存零取的方式,控制小龙每月月底只能取1000元准备下一个月使用。假设银行一年整存零取的利率为1.71%,请编程实现父亲至少一次性存入多少钱才够小龙4年的生活费。

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">#include "stdio.h"  
  2. #define FETCH 1000   
  3. #define RATE 0.0171   
  4.   
  5. void main()  
  6. {  
  7.     double corpus[49];  
  8.     int i;  
  9.     corpus[48] = (double)FETCH;  
  10.     for(i = 47;i > 0; i--)  
  11.     {  
  12.         corpus[i] = (corpus[i+1]+FETCH)/(1+RATE/12);  
  13.     }  
  14.     for(i = 48; i > 0; i--)  
  15.     {  
  16.         printf("第%d月末本利合计:%.2f\n",i,corpus[i]);  
  17.     }  
  18. }</SPAN>  
#include "stdio.h"#define FETCH 1000#define RATE 0.0171void main(){double corpus[49];int i;corpus[48] = (double)FETCH;for(i = 47;i > 0; i--){corpus[i] = (corpus[i+1]+FETCH)/(1+RATE/12);}for(i = 48; i > 0; i--){printf("第%d月末本利合计:%.2f\n",i,corpus[i]);}}


3.穷举算法思想:

  计算机最大的优势就是遍历和循环,一些人工计算很麻烦的问题,利用计算机穷举法就可以很好地解决。例如:百钱买鸡。

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">#include "stdio.h"  
  2. void BuyChicken()  
  3. {  
  4.     int x,y,z;  
  5.     for(x = 0; x <= 20; x++)  
  6.     {  
  7.         for(y = 0; y <= 33; y++)  
  8.         {  
  9.             z = 100 - x - y;  
  10.             if(z % 3 == 0 && x*5 + y*3 + z/3 == 100)  
  11.             {  
  12.                 printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);  
  13.             }  
  14.         }  
  15.     }  
  16. }  
  17. void main()  
  18. {  
  19.     BuyChicken();  
  20. }</SPAN>  
#include "stdio.h"void BuyChicken(){int x,y,z;for(x = 0; x <= 20; x++){for(y = 0; y <= 33; y++){z = 100 - x - y;if(z % 3 == 0 && x*5 + y*3 + z/3 == 100){printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);}}}}void main(){BuyChicken();}


算法实现:

4.递归算法思想:

        递归算法的思想就是通过对问题的分解,使其能够分解为与原问题相似的子问题的过程,最后得出结果。例如:求阶乘、汉诺塔等。

求阶乘算法实现:

[cpp] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">int fact(int n)  
  2. {  
  3.     if(n <= 1)  
  4.     {  
  5.         return 1;  
  6.     }  
  7.     else  
  8.     {  
  9.         return n*fact(n-1);  
  10.     }  
  11. }</SPAN>  
int fact(int n){if(n <= 1){return 1;}else{return n*fact(n-1);}}


5.分治算法思想:

   对于一个规模为n的问题,若该问题可以很容易的解决,则直接解决,否则将其分解为M个规模较小的子问题,这些子问题相互独立,并且与原问题有相同的形式。

6.贪婪算法思想:

   贪婪算法是一种不追求最优解,只希望得到较为满意的方法。例如:换零钱。

7.回溯算法思想:

   也称试探法,基本思想:为了求解问题的解,先选择某一种试探,在试探过程中,一但发现以前的选择假设有错误,则会退到上一步,如此反复进行,直至得到最终解。

例如:迷宫问题。

8.模拟算法:

   通过计算机来模拟对应的一些数学模型。例如:模拟随机抛硬币的结果。

算法的评价:

1)时间复杂度:通过统计算法中基本操作重复执行的次数来近似的得到算法的执行效率,用O(n)表示。

2)空间复杂度:程序在运行过程中所需占用的最大内存空间。

3)程序的可读性:程序的可读性有时比高效性更重要,因为可读性增强,易于调试和维护。

原创粉丝点击