算法导论 第三章 and 第四章
第三章
渐进的基本O()....

常用函数

% 和 // 转换

斯特林近似公式

斐波那契数


第四章
分治策略:分解(递归)--解决(递归触底)--合并
求解递归式的3种方法:
1:代入法(替代法):猜测一个(靠经验)--数学归纳法
·2:递归树法:画树p31【第3版中文】p51->递归式--证明
3:主方法:

快速,有些地方不能涉及,递归式不易写出
4.1最大数组问题

分治法:
1.A[low ,mid] 2.A[mid+1, high] 3.包含mid中间(想左和右分别遍历组合找出最大)


import decimal
def FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high):
    left_sum =  decimal.MIN_EMIN
    sum = 0
    for i in range(mid,low - 1,-1):
        sum = sum + A[i]
        if sum > left_sum:
            left_sum = sum
            max_left = i
    right_sum = decimal.MIN_EMIN
    sum = 0
    for i in range(mid + 1,high+1):
        sum = sum + A[i]
        if sum > right_sum:
            right_sum = sum
            m   ax_right = i
    return (max_left,max_right,left_sum + right_sum)    
def FIND_MAXIMUM_SUBARRAY(A,low,high):
    if high == low:
        return (low,high,A[low])
    else:
        mid = (low + high) //2
        (left_low,left_high,left_sum) = FIND_MAXIMUM_SUBARRAY(A,low,mid)
        (right_low,right_high,right_sum) = FIND_MAXIMUM_SUBARRAY(A,mid+1,high)
        (cross_low,cross_high,cross_sum) = FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high)
        if left_sum >= right_sum and left_sum >= cross_sum:
            return (left_low,left_high,left_sum)
        elif right_sum >= left_sum and right_sum >= cross_sum:
            return (right_low,right_high,right_sum)
        else:
            return (cross_low,cross_high,cross_sum)
if __name__ == '__main__':
    A = [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
    temp = FIND_MAXIMUM_SUBARRAY(A,0,len(A)-1)
    print(temp)
'''
========= RESTART: F:/python/algorithms/4_1_find_maximum_subarray.py =========
(7, 10, 43)
O(n*n)
python 3.5.1
win7
和伪代码几乎一模一样 - -!
唯一要注意的问题还是 python 从0开始
'''
线性级改进
O(n)
习题:4.1-5
很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和
def FindGreatestSumOfSubArray(A):
        if A :
                nCurSum = nGreatestSum = 0
                #nCurSum 保存现在和 nCreatestSum 保存最大的
                curStart = curEnd = 0
                start = end = 0
                for i in range(len(A)): #遍历A
                        nCurSum += A[i]
                        curEnd = i
                        if nCurSum < 0: #为负数摒弃 加一个正数=把正数减
小
                                nCurSum = 0
                                curStart = curEnd = i + 1
                        if nCurSum > nGreatestSum: #刷新最大数组
                                nGreatestSum = nCurSum
                                start = curStart
                                end = curEnd
                #都是负数 遍历找最大负数
                if nGreatestSum == 0:
                        nGreatestSum = A[0]
                        start = end = 0
                        for i in range(1,len(A)):
                                if A[i] > nGreatestSum:
                                        nGreatestSum = A[i]
                                        start = end = i
                return [start,end,nGreatestSum]
        else:
                return []
if __name__ =="__main__":
        A =  [13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7]
        temp = FindGreatestSumOfSubArray(A)
        print(temp)
'''
$ python3 4_1_5_find_maximum_subarray.py 
[7, 10, 43]
O(n)
Python 3.4.3+
Ubuntu 15.10
'''
参考引用:http://www.wutianqi.com/?cat=515&paged=6
http://www.cnblogs.com/chinaxmly/archive/2012/10/10/2718621.html
http://blog.csdn.net/yelbosh/article/details/7558981
算法导论 第三章 and 第四章的更多相关文章
- Kafka 权威指南阅读笔记(第三章,第四章)
		
Kafka 第三章,第四章阅读笔记 Kafka 发送消息有三种方式:不关心结果的,同步方式,异步方式. Kafka 的异常主要有两类:一种是可重试异常,一种是无需重试异常. 生产者的配置: acks ...
 - 统计学习导论:基于R应用——第四章习题
		
第四章习题,部分题目未给出答案 1. 这个题比较简单,有高中生推导水平的应该不难. 2~3证明题,略 4. (a) 这个问题问我略困惑,答案怎么直接写出来了,难道不是10%么 (b) 这个答案是(0. ...
 - JavaScript DOM编程艺术-学习笔记(第三章、第四章)
		
第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...
 - 《算法导论》学习总结 — XX.第23章 最小生成树
		
一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...
 - (第三章,第四章)http报文内的http信息,返回结果的http状态码
		
第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...
 - Hadoop: the definitive guide 第三版 拾遗 第四章
		
第四章中提到了通过CompressionCodec对streams进行压缩和解压缩,并提供了示例程序: 输入:标准输入流 输出:压缩后的标准输出流 // cc StreamCompressor A p ...
 - Qt Gui 第三章~第四章
		
一.图片资源的调用 如上图是我图片存放的位置跟qrc的命名: 如下则是qrc对应的编写格式: <RCC> <qresource> <file>images/icon ...
 - 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)
		
2.3-1: 3 9 26 38 41 49 52 59 3 26 41 52 9 38 49 57 3 41 52 26 38 57 9 49 3 41 52 26 38 ...
 - 《算法导论》学习总结 — XX.第22章 图的基本算法
		
BFS(广搜): 广搜就是广度优先搜索,根据名字可以知道,是通过广度来遍历图,也就是层次遍历吧. 在这里以及下面的DFS(深搜),都用到了颜色WHITE,GRAY,BLACK,不过作用不同,具体分别再 ...
 
随机推荐
- springMVC validator验证的使用
			
http://blog.csdn.net/miketom155/article/details/45058195 1. 实现Validator接口,对数据进行校验 @RequestMapping(va ...
 - C/C++ 动态库so的生成与调用
			
1. Linux-(C/C++)动态链接库生成以及使用(libxxx.so) 2. C++文件如何在linux下生成动态库So,以及如何使用这个动态库 3. c++ 发布动态.so 简记1. 编译生成 ...
 - 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列
			
题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...
 - HDOJ 5475 An easy problem
			
题目传送门 题意:一个计算器,两种操作,乘上x,或者除掉之前的某个x,结果取模输出 分析:因为取模不支持除法,然后比赛时想到用逆元,结果发现MOD需要与b互质,结果一直苦苦寻找求逆元的其它方法.后来队 ...
 - JavaScript--字符串常用方法总结
			
JavaScript--字符串常用方法总结 举例模板: var str = "what are you " var str1 = "sss" var txt = ...
 - HTML中div的悬浮标题
			
<div title="我是鼠标悬停文字">我是一个DIV</div> <div class="diggao" title=&qu ...
 - 面试王牌 JAVA并发
			
Java 并发 JavathreadSocketC#C++ 并发 Table of Contents 1 什么是并发问题. 2多线程死锁问题 2 java中synchronized的用法 3 Java ...
 - string类常用方法3
 - 百度地图API简单初始化
			
<script src="http://api.map.baidu.com/api?key=&v=2.0&ak=youkey"></script& ...
 - Git之fatal: remote origin already exists
			
文件提交到远程分支,我们需要提前表明需要提交到哪个远程分支 比如:git remote add origin git@github.com:wqk66/test.git,表示他提交到远程仓库test ...