算法导论 第三章 and 第四章 python

第三章

渐进的基本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

时间: 2024-08-16 16:22:08

算法导论 第三章 and 第四章 python的相关文章

算法导论笔记——第十二~十四章 数据结构(二)树

第十二章 二叉搜索树 >=左子树的所有key,<=右子树的所有key 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH,MINIMUM,MAXIMUM,SUCCESSOR,PREDECESSOR,INSERT和DELETE可以在O(h)时间内完成. h>=(lgn向下取整) 和快速排序算法一样,其平均性能更接近于最好情形. 随机构建二叉搜索树期望高度为O(lgn). 各种操作请自行查阅. 第十三章 红黑树 是一种(近似)平衡的二叉搜索树.可以保证在最坏情况下基本动态集合操作的时

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

算法导论 第三版 中文版

下载地址:网盘下载 算法导论 第三版 中文版 清晰 PDF,全书共8部分35章节,内容涵盖基础知识.排序和顺序统计量.数据结构.高级设计和分析技术.高级数据结构.图算法.算法问题选编.以及数学基础知识.非常实用的参考书和工程实践手册.此外,其他资源也已经上传,全部免费,欢迎大家下载! 第3版的主要变化 1.新增了van Emde Boas树和多线程算法,并且将矩阵基础移至附录. 2.修订了递归式(现在称为"分治策略")那一章的内容,更广泛地覆盖分治法. 3.移除两章很少讲授的内容:二项

Welcome to Swift (苹果官方Swift文档初译与注解二十四)---163~170页(第三章完--第四章 流程控制)

Mutability of Collections (可变集合) 字典和数组都是在一个集合里储存多个值.如果你创建数组或字典后赋值给一个变量,那么这个集合就是可变的( mutable).这就意味着你在创建这个集合之后,依然可以改变这个集合的 大小,添加元素到集合里或者删除已有的元素.相反地,如果你创建的数组或者字典赋值给一个常量,那么这个集合就是不能修改的,也就是说字典或者数组是不可变的(immutable) 对于字典,不可变就意味着你不能替换里面已有的键值对,一个不可变的字典在它一创建出来就是

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

字符串匹配算法的C语言实现-算法导论第三版(1)

因为最近准备开始学习做一些小的Android项目练手,看上了系统级的三个应用,拨号盘,通讯录和短信,准备从最简单的拨号做起,但是因为这些应用中都不可避免的会有自动提示,我觉得设计到的就是字符串匹配问题,这里准备使用C语言来实现,将来通过JNI集成到应用当中. 1.首先是朴素匹配,实际上就是穷举: 用C语言实现的函数我放到这里: 1 void naive_string_match(char *t,char *p){ 2 int n = strlen(t); 3 int m = strlen(p);

(第三章,第四章)http报文内的http信息,返回结果的http状态码

第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的,会消耗更多的cpu资源. 2.压缩传输的内容编码: 内容编码后的实体由客户端接受并负责解码. 3.分割发送的分块传输编码 在传输大量数据时,通过数据分割成多块,能够让浏览器逐步显示页面. 4.获取部分内容的范围请求: 可以处理大文件突然下载中断的问题. 5.内容协商返回最合适的内容 比如根据浏览器

JavaScript DOM编程艺术-学习笔记(第三章、第四章)

第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯一一个没有被其它元素包含的元素. 3.元素节点并非直接包含文本节点,例如:<ul><li>你好</li><ul>    ul元素并没有直接包含文本元素 4.获取元素的方法: ①getElementById() ②getElementsByTagName ()  

统计学习导论:基于R应用——第四章习题

第四章习题,部分题目未给出答案 1. 这个题比较简单,有高中生推导水平的应该不难. 2~3证明题,略 4. (a) 这个问题问我略困惑,答案怎么直接写出来了,难道不是10%么 (b) 这个答案是(0.1*0.1)/(1*1),所以答案是1% (c) 其实就是个空间所占比例,所以这题是(0.1**100)*100 = 0.1**98% (d) 这题答案显而易见啊,而且是指数级别下降 (e) 答案是0.1**(1).0.1**(1/2).0.1**(1/3)...0.1**(1/100) 5. 这题