(转)常用的算法设计与分析-一夜星辰的博客

算法设计与分析
分治法
  1. 思想

    1.  将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
    
    2.  divide-and-conquer(P)
    {
        if(|P| <= n0)adhoc(P);
        divide P into samller subinstances P1,P2...,Pk;
        for(int i = 1;i < k;i++)
        {
            yi = divide-and-conquer(Pi);
        }
        return merge(y1,y2...,yn);
    }
    3.如何划分子问题
    -   集合论,找到一个原来集合问题的一个划分,子问题之间不相交,同时子问题的规模类型相同
    -   最优子结构(子问题类型相同)
    -   最好使子问题的规模大致相同,即将一个问题的大小分成相等规模的k个子问题的处理方法是行之有效的。
  2. 例子
    1.  fibonacci 数列
    2.  排列问题
    3.  整数划分问题
    4.  Hanoi 塔问题
    5.  二分搜索
    6.  大整数乘法
    7.  Strassen 矩阵乘法
    8.  合并排序
    9.  快速排序
  3. 复杂度分析
    主定理:T(n) = aT(n/b)+f(n),a>=1,b>1,f(n)是给定的多项式函数,刻画了一个分治算法,生成a个子问题,每个问题的规模是原来的1/b,分解合并步骤共消耗f(n). T(n)的复杂度的分析如下:
    1.  若f(n)<n^(log(a/b)) 则T(n) = n^(log(a/b))
    2.  若f(n)=n^(log(a/b)) 则T(n) = n^(log(a/b))logn
    3.  若f(n)>n^(log(a/b)) 则T(n) = f(n)
动态规划
  1. 思想

    用一个表来记录所有以解决问题子问题的答案,不管该子问题以后是否会用到,只要它被计算过,就将其结果存入到表中,这就是动态规划法的基本思想。
    基本要素:
    1. 最优子结构:当一个问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
    2. 重叠子问题: 在使用递归算法的时候有很多子问题是重叠的,那么我们使用一个表将已经求解过的子问题的结果保存下来

    备忘录方法
    1. 与动态规划一样:备忘录方法也是使用一张表来保存子问题的答案,下次需要解此子问题的时候,我们只需要简单查看该子问题的答案即可,而不是重新计
    算。
    2. 与动态规划不同:备忘录方法的递归方式是自顶向下的,而动态规划是自底向上的。 备忘录方法与直接控制的递归结构是相同的,但是他不用重复求解相同子问题。
    3. 当一个问题的所有子问题都要至少解一次时,使用动态规划算法比备忘录方法好。 当子问题空间中部分子问题不必求解时,用备忘录方法则较为有利,备忘录方法只用来求解那些需要求解的子问题。

  2. 基本步骤

    1. 找出最优解的性质,并刻画其结构特征
    2. 递归地定义最优值
    3. 以自底向上的方式计算出最优值
    4. 根据计算最优值时得到的信息,构造最优解
  3. 例子
    1. 矩阵连乘
    2. 最长公共子序列
    3. 0-1背包问题
贪心算法
  1. 思想

    贪心算法总是做出当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它做出的选择只是在某种意义上的局部最优选择。
    贪心选择的基本要素:
    1.  贪心选择性质: 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
    2.  最优子结构: 一个问题的最优解包含其子问题的最优解时,此问题具有最优子结构性质
  2. 贪心算法VS动态规划
    1.  贪心算法拥有贪心选择性质,动态化算法没有。动态规划算法中,每步所作出的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择; 而贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后去解作出这个选择后产生相应的子问题。 贪心选择依赖于过往所做选择,但是不以利于将来将要作出的选择,也不依赖于子问题的解。
    2. 动态规划算法通常以自底向上的方式解各子问题,贪心算法则是自顶向下方式迭代进行贪心选择,每一次贪心选择将所求问题简化为规模更小的子问题
  3. 例子
    1. 活动安排问题 (最早截止时间优先)
    2. 背包问题 (权重空间比值最大者优先)
    3. 哈夫曼编码 (频率大者优先)
    4. 单源最短路径 (局部最短路径优先)
    5. 最小生成树
        -prim (与源集合相连的权值最小边优先)
        -kruskal-(集合中边权值最小优先)
    6.  多级调度问题(长作业优先)
时间: 2024-12-23 20:16:57

(转)常用的算法设计与分析-一夜星辰的博客的相关文章

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

算法设计与分析 ------最近对问题与8枚硬币问题

利用减治法实现8枚硬币问题: 参考资料:http://blog.csdn.net/wwj_748/article/details/8863503    算法设计--八枚硬币问题 1 #include "stdafx.h" 2 #include <iostream> 3 #include <stdio.h> 4 using namespace std; 5 6 7 void eightcoin(int arr[]); 8 void compare(int a,in

《计算机算法设计与分析》v4 第1章 算法概述 算法实现题答案

博主今年刚上大三,正好开算法这门课.由于博主本人比较喜欢算法但又比较懒,啃不动算法导论,所以决定拿这本书下手. 这本书是王晓东的第四版<计算机算法设计与分析>.初步打算将每章后面的算法题都用代码实现. 有些题跟某个ACM题目很像,我会把该ACM题的链接贴上.有的题没OJ交所以可能是错的.如有发现,还望指出. 1-1 统计数字问题 http://poj.org/problem?id=2282 这个题要按位分解,一位一位的来处理. #include<iostream> #include

【通知】《算法设计与分析》实验课、理论课补课、考试时间、加分等安排 及 个人目标设定

Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素之间关系的一种多 变量分析方法.通常的问题是,研究某些因素条件下某个结果是否发生,比如医学中根据病人的一些症状来判断它是 否患有某种病. 在讲解Logistic回归理论之前,我们先从LR分类器说起.LR分类器,即Logistic Regression Classifier. 在分类情形下,经过学习后的LR分类器是一组权值,当测试样本的数据输入时,这组权值与测试数据按 照线性加和得到 这里是每个样本的个特征. 之后按照s

算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)

算法设计与分析基础(第3版) p16 in-place翻译为'在位'?'就地'更合适点 p38 amortized应翻译为'均摊','摊销'这个词简直莫名其妙(可能因为翻译是做算法交易导致的?) p64 迭代优于递归(迭代始终是增量式的,而递归就没办法增量了,除非能够dump整个运行时栈) p73 通过算法可视化得到一个更好的非递归算法(人的图像认知直觉思维?) p79 验证一个拓扑是环.星.还是团?(这个地方有点意思,因为我想到了动态的Verify) p87 凸包问题:从数据结构上讲,Set<

算法设计与分析(屈婉玲)pdf

下载地址:网盘下载 算法设计与分析本教材为计算机科学技术专业核心课程"算法设计与分析"教材.<算法设计与分析>以算法设计技术和分析方法为主线来组织各知识单元,主要内容包括基础知识.分治策略.动态规划.贪心法.回溯与分支限界.算法分析与问题的计算复杂度.NP完全性.近似算法.随机算法.处理难解问题的策略等.书中突出对问题本身的分析和求解方法的阐述,从问题建模.算法设计与分析.改进措施等方面给出适当的建议,同时也简要介绍了计算复杂性理论的核心内容和处理难解问题的一些新技术. &

算法设计与分析——回溯法算法模板

以深度优先方式系统搜索问题解的算法称为回溯法.在回溯法中,解空间树主要分为了四种子集树.排列树.n叉树和不确定树. 在<算法设计与分析课本>中介绍了11个回溯法的问题样例,这里根据解空间树的类型做一个分类. 子集树 装载问题 符号三角形问题 0-1背包问题 最大团问题 算法模板: void backtrack(int t) { if(搜索到叶子结点) { return; } for(i=0; i<=1; i++) //01二叉树 { if(满足约束函数和限界函数)//剪枝 { backt

算法设计与分析-Week12

题目描述 You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the c

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排