zoukankan      html  css  js  c++  java
  • 【待补充】算法导论 笔记

    (一)插入排序

     

     

    时间复杂度:

    原址排序,只需要一个key,稳定排序算法

    插入排序是随机访问模型(random access machine->RAM)

    RAM常见指令:算数指令(加减乘除取余取模)、数据移动指令(装入、存储、复制)、控制指令(条件与无条件转移、子程序调用与返回)

    (二)归并排序:

    分解(divide):分解待排序的n个元素的序列成各具n/2个元素的两个子序列

    解决(conquer):使用归并排序递归地排序两个子序列

    合并(combine):合并两个已经排序的子序列 以产生已排序的答案

     

    时间复杂度:

    渐进记号(asymptotic)

    只有渐进上界用O(n),表示:所有在cn函数下方的函数集合

    (三)分治法

    求最大子数组(maximum subarray)

    找到2个规模尽量相等的子数组,即找到子数组中点位置即为mid。递归求解A[low..mid] A[mid+1..high]的最大子数组

     

    图(a)表示:最大子数组可能存在的3种位置

    (四)求解递归(recurrence

    1、  代入法(substitution)

     

    2、  递归树法

    3、  主方法

     

    (五)堆排序

    1、维护最大堆性质,时间复杂度:

     

    2、建堆

     

    3、  堆排序算法  不稳定

     

    (六)优先队列(priority queue)

    1、  返回s中具有最大键值的元素

     

    2、  去掉并返回s中的具有最大键字的元素

     

    3、  将元素x的关键字值增加到k,(假设k的值不小于x的原关键字值)

     

    (七)快速排序(分治思想)

    1、普通版

     

    原址排序,时间复杂度:

    2、随机版

     

    (八)线性时间排序

    比较排序——> 在排序的最终结果中,各元素的次序依赖于他们之间的比较。比较排序在最坏的情况下要经过Ω(nlgn)次比较。堆排序和归并排序都是渐进最优的比较排序方法。

    1、决策树模型

     

    2、计数排序(counting-sort)

     

    稳定;时间复杂度:

    计数排序被用于计数排序的子过程。

    3、基数排序(radix sort)

    非原址排序;一位数排序算法必须是稳定的;时间复杂度:

     

    4、  桶排序(bucket sort)

     

    (九)动态规划

    最优子结构(optimization solution)+重叠子问题(overlapping subproblem)

    动态规划的两种等价实现方法:

    (1)       带备忘的自顶向下(top-down with memoization)

    按递归形式编写,但过程中会保存每个子问题的结(通常列在一个数组或算了吧中)。当需要一个子问题的解时,先减产是否已经保存过此解。如果是,则直接返回保存的值,从而节省计算时间;否则按通常方式计算此子问题。

    (2)       自底向下(bottom-up method)

    将子问题按规模排序,由小到大求解。每个子问题都只用求解一次。

    1、  钢条切割

     

    (1)       自顶向下加入备忘

     

    (2)       自底向上

     

    重构解

     

    2、  矩阵链乘

     

    (1)       自底向上表格法

     

     构造最优解

     

    优化核心算法(加入递归):

     

    (2)       带备忘的自顶向下

     

    3、  无权最短路径:找到一条从u到v边数最少的路径。有最优子结构。

    4、  无权最长路径:无最优子结构。

    5、  最长公共子序列

     

    计算LCS长度(long-common-subsequence 子序列 & substring子串ß必须连续)

     构造LCS  

    6、  0-1背包

     

    I的值是---装了几个物品

    J的值是---现在背包的容量

    存的元素---现在的价值

    令V(i,j)表示在前i(1<=i<=n)个物品中能够装入容量为j(1<=j<=C)的背包中的物品的最大价值,则可以得到如下的动态规划函数:

    (1)   V(i,0)=V(0,j)=0 

    (2)           V(i-1,j)                        j<wi

     V(i,j)=

           max{V(i-1,j) ,V(i-1,j-wi)+vi) }   j>wi

    (1)式表明:如果第i个物品的重量大于背包的容量,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,即物品i不能装入背包;

     

    (2)式表明:如果第i个物品的重量小于背包的容量,则会有一下两种情况:

    (a)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。

    (b)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量位j-wi 的背包中的价值加上第i个物品的价值vi; 

    显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。

     

    打印出当前的v数组和被选中物品的x数组。

    7、  求最大子段和

     B数组记录了以当前元素为结尾时,最大字段的和,用第一个循环完成。

    第二个循环,打印B数组。

    第三个循环,遍历B数组,找到最大值。

    (十)贪心算法

    最优子结构+贪心性选择

    1、  活动选择问题

    2、  部分背包

    (1)构造并输出二维数组b数组。第一行:单位重量的价值增序;第二行:对应的重量;第三行:对应的价值。(2)构造并输出x数组贪心性选择是单位重量的价值最大的。(3)根据b和x数组计算最大价值s并输出。

    3、  赫夫曼编码

    每个步骤合并频率最低的两颗树

    (十一)单结点对

    1、  bellman-ford

     

    Bellman-ford算法在求解过程中,每次循环每个顶点的dist[]值都有可能要修改,也就是说源点到各顶点最短路径长度一直要到Bellman-ford算法结束才确定下来。

    2、  dijkstra(贪心算法)

    贪心性选择:选择集合V-S中“最轻”或“最近”的结点来加入集合S中。每次选择结点u来加入到集合S中时,有

    Dijkstra在求解过程中,源点到集合S内各顶点的最短路径一旦求出,则不变化了,修改的仅仅是从源点到T集合中个顶点的最短路径长度。

    (十二)所有结点对

    1、  最短路径和矩阵乘法(动态规划)

      

    自底向上

     

    改进

     

    2、  Floyd-warshall(动态规划)

     

     

    3、  Johnson(给予稀疏矩阵)

     

    (十三)回溯法

    问题状态(problem state)解决问题时,树中的一个节点定义了一个问题状态

    状态空间(state space)所有从根到结点的路径(蛮力法)

    解状态(solution state)满足显式约束

    答案状态(answer state)同时满足隐式约束

    状态空间树     E-node(扩展结点)可以继续生成孩子结点的结点

                                Alive-node(活结点)被DFS,此结点在等待生成结点

                                Dead-node(死结点)不能生成孩子结点的结点

    限界函数bound-function:不生成全部problem state—》杀死一部分活结点

    1、8-Queen

    2、给定n+1个整型,找子集使和为M  (DFS)

    3、0-1背包

    对一组数据,有两种可能:选或不选,在树种用左右字数表示。

    使用递归,在遍历完n个数时,判断最终的数是否比最佳价值大,如比最佳大,则把值付给besrv。

    上界函数:当前的价值cw+剩余可容纳的最大价值<=当前最优解

     

    (十四)分支限界

    15-Puzzle (BFS)

    定理:是偶数,则可达。

    ĉ(X)=f(X)+ĝ(X)代价估计函数。

    f(X) is the length of  the path from the root to X

    ĝ(X) is the minimum number of movings from X to the target state.

    ĝ(X)=the number of blocks which are not in its target position (except the blank space)

    (十五)NP问题,

    Computability

         Undecidable Problem

             Hilbert’s 10th Problem.

             Post’s Correspondence Problem.

             Halting Problem.

         NP-Complete

             P, EXP, NP, NP-Complete

             SAT is the first NP-Complete problem

             Other NP-Complete problems: 3-color, TSP, CIRCUIT-SAT

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/olivegyr/p/7017607.html
Copyright © 2011-2022 走看看