首页 > 编程语言 > 详细

数据机构与算法分析读书笔记——算法分析

时间:2017-01-06 22:01:16      阅读:109      评论:0      收藏:0      [点我收藏+]

本章内容:

  • 算法的定义

  • 数学基础
  • 要分析的问题
  • 运行时间的计算

 

算法的定义

算法(algorithm)为求解一个问题需要遵循的、被清楚指定的简单指令的集合。

ps:算法的几个特性这里就不赘述。

 

数学基础

为了比较计算算法的性能,需要一些正式的系统架构来计算算法的性能,引入一些数学公式,用来比较:

技术分享

注:

  第一条定义的意义为T(N)的相对增长率小于等于f(N)的相对增长率。

  第二条定义的意义为T(N)的相对增长率大于f(N)的相对增长率。

  第三条定义的意义为T(N)的相对增长率等于f(N)的相对增长率。

  第四条定义的意义为T(N)的相对增长率小于f(N)的相对增长率。

 

要分析的问题

主要因素是所使用的算法以及该算法的输入。

一般来说,若无相反的指定,则所需要的量是最坏情况下的运行时间。

 

运行时间的计算

最大的子序列和问题  

技术分享

ps:恩,没错,这本书居然把这道经常考的面试题当做分析算法的讲解例题。

解法一:

技术分享
 1 int MaxSubSum(int A[], int N)
 2 {
 3     int ThisSum, MaxSum, i, j, k;
 4 
 5     MaxSum = 0;
 6     for (i = 0; i < N; i++)
 7         for (j = i; j < N; j++)
 8         {
 9             ThisSum = 0;
10             for (k = i; k <= j; k++)
11                 ThisSum += A[k];
12 
13             if (ThisSum > MaxSum)
14                 MaxSum = ThisSum;
15         }
16     return MaxSum;
17 }
View Code

运行时间为O(N3),主要运行时间取决于三重循环。

 

解法二:

技术分享
 1 int MaxSubSum(int A[], int N)
 2 {
 3     int ThisSum, MaxSum, i, j;
 4 
 5     MaxSum = 0;
 6     for (i = 0; i < N; i++)
 7     {
 8         ThisSum = 0;
 9         for (j = i; j < N; j++)
10         {
11             ThisSum += A[j];
12 
13             if (ThisSum > MaxSum)
14                 MaxSum = ThisSum;
15         }
16     }
17     return MaxSum;
18 }
View Code

运行时间为O(N2),对第一这种方法进行了改进。

 

解法三:

技术分享
 1 int MaxSubSum(int A[], int Left, int Right)
 2 {
 3     int MaxLeftSum, MaxRightSum;
 4     int MaxLeftBorderSum, MaxRightBorderSum;
 5     int LeftBorderSum, RightBorderSum;
 6     int center, i;
 7 
 8     if (Left == Right)
 9         if (A[Left] > 0)
10             return A[Left];
11         else
12             return 0;
13 
14     center = (Left + Right) / 2;
15     MaxLeftSum = MaxSubSum(A, Left, center);
16     MaxRightSum = MaxSubSum(A, center + 1, Right);
17 
18     MaxLeftBorderSum = LeftBorderSum = 0;
19     for (i = center; i >= Left; i--)
20     {
21         LeftBorderSum += A[i];
22         if (LeftBorderSum > MaxLeftBorderSum)
23             MaxLeftBorderSum = LeftBorderSum;
24     }
25 
26     MaxRightBorderSum = RightBorderSum = 0;
27     for (i = center + 1; i <= Right; i++)
28     {
29         RightBorderSum += A[i];
30         if (RightBorderSum > MaxRightBorderSum)
31             MaxRightBorderSum = RightBorderSum;
32     }
33 
34     return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
35 }
View Code

运行时间为O(N*logN),该方法采用了分治的设计思想,运用递归进行实现。除了小输入外,一定会比前两个快。

值得一提的是分析该运行时间时运用到了学校上课讲的递推的思想,那我必须说一下了:

该算法的时间可以用一个线性时间O(N)加上两个求解子序列问题的时间。即

技术分享

 

数据机构与算法分析读书笔记——算法分析

原文:http://www.cnblogs.com/selfimprovement/p/6257249.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!