算法导论(一)——基础知识

来源:互联网 发布:c语言atan2函数 编辑:程序博客网 时间:2024/04/28 08:39

学习目的:

    1. 掌握各数据结构要解决的问题,优缺点

    2. 算法设计策略

    3. 常用算法要解决的问题,以及如何选择

    4. 可以使用c c++编写算法,java通过jni进行调用c程序

第一部分基础知识

第一章 算法作用

没有一种数据结构适用所有目的,所以明白数据结构的优缺点很重要

第二章 算法入门

1.  循环不变式用来证明递归的正确性

2. 对于一个算法,一般只考察其最坏情况的运行时间,原因如下:

    1. 最坏情况是一个上界

    2. 某些算法最坏情况非常频繁

    3. 大致上来看,最坏情况和平均情况一样差

分治策略

将原问题分解为n个较小规模的相似子问题,递归地解决完小问题,再合并其结果,就得到原问题的解,步骤如下:

        1.  divide 

        2.  conquer  :解决子问题

        3.  combine 

    

4.  两个数组AB存放 n2进制整数,相加结果存放在n+1位的C

        up=0;

        for i=0 to n

            C[i]=(A[i]+B[i]+up)%2

            up=(A[i]+B[i]+up)/2

        c[n]=up

 

归并排序  

3,41,52,26,38,57,9,49进行排序

                     3,9,26,28,41,49,52,57

                 3,26,41,52                  9,28,49,57

             341           2652      3857      949

            3   41         52  26     38  57     9  49

    分解:将数据分解为两部分   1

    解决:对每部分递归调用归并排序    2*T(n/2)

    合并:合并两个有序的子序列     n

            所以时间为  T(n) =2*T(n/2)+n

 

分治法应用案例:

    大整数乘法:A,B为n位的二进制数,使用特殊的分治策略,可达到 O(n)^1.59

    矩阵相乘:使用 Strassen 分治策略

    求 X的n次方  x^n=X^(n/2)*X^(n/2)   时间为 lgn

    斐波那契数列    (1  1)的n次方=   (F[n+1]  F[n])

                                1  0                F[n]   F[n-1]    复杂度为  lgn

解题思路:

    若题目规定了时间限制,则使用主定理推出该使用什么样的递归式

第四章 递归式

求解方法

    代换法:主要是用数学归纳法证明该解的存在性

    递归树:画出每层代价的树,猜测递归式的解

    主方法:求解递归式的公式:非常之强大

 

第五章  概率分析和随机算法

数组随机化算法

      for i=1 to n

           swap  a[i] a[random(i+1, Length(a) ) ]

    如快排中,随机选取种子数来向快排中加入随机化的成分