【编程珠玑】第八章 算法设计技术

一,概述

       问题:求一维数组中连续子向量的最大和。

       例如:a[6]={3,4,-2,-9,10,8}; 则最大连续子向量的和 为 10+8 = 18

       1)解法一:简单算法

       2)两个平方算法

             算法一:


              算法二:


            3)分治算法

思想:以m为分界线,最大值有三种情况

            一:在m左侧

            二:在m右侧

            三:跨越m

关键:最初求解左右最大值时候,一定要从中间向两侧递增。看源码解释……


【注意】 max2() 如果用宏  #define  max(a,b,c)    max(a,b) >c?max(a,b):c  则不会得到正确结果

 

           4)扫描算法

 

二,总结

        优化算法的策略

         1)保存已经计算的状态,避免重复计算。

         2)将信息预处理到数据结构中。例如算法二

         3)分治算法,采取更高级的算法

         4)扫描算法,巧妙

         5)下界:证明某个匹配的下界,确定最优算法

三,习题

      10)可以采用两种方法:O(n*n)


返回结果是 1



可以采用O(nlogn)的算法

 


返回结果是 1


13)最大子数组问题,给定n*n数组,求矩形子数组的最大总和。

详见博客:http://blog.csdn.net/tianshuai11/article/details/7487882

 

 

 

 

 



 

posted @ 2012-05-15 10:49  Java EE  阅读(178)  评论(0编辑  收藏  举报