算法设计学习笔记

算法设计分析基础》读书笔记 一、算法与问题 算法是解决问题的一系列步骤; 理解问题,设计算法的一般过程: 二、蛮力法 蛮力法是一种简单直观的解决问题的办法,常常直接基于问题的描述所涉及的概念。蛮力法所能解决的问题域也是最广的,但是效率往往不高; 使用蛮力法算法有: 1、冒泡排序,选择排序 2,、顺序匹配 3、穷举法 三、分治法 分治法设计步骤: 1、将问题实例划分为同一问题的较小的实 阅读详情

一、算法与问题
算法是解决问题的一系列步骤;

理解问题,设计算法的一般过程:

解决问题的时候可以首先考虑蛮力法,因为蛮力法一般都能解决,只是效率比较低。使用蛮力法解决问题之后可以再考虑使用其他算法思想进行优化。在使用蛮力法的时候如果解决起来比较费力,可以再次思考一下问题,看看能不能找到什么规律,然后,在该规律之上再求解。

蛮力法往往需要从头到尾遍历所有的可能,而且有时候一个问题可能会有好几种遍历策略,有的策略能够得到问题的解,有一些不能导出最终问题的解,所以,使用蛮力法的时候遍历策略的选择往往是很重要的。好的遍历策略甚至能起到跟贪婪,动态规划策略一样的作用,从这个意义上来说贪婪,动态规划,回溯,分支界限也算是一种蛮力法,只不过是聪明的蛮力法。
优化的思路有以下3个方向:

1、蛮力法—>贪婪,动态规划—>回溯,分支界限

2、分治,减治,变治

3、时空权衡

二、蛮力法
蛮力法是一种简单直观的解决问题的办法,常常直接基于问题的描述和所涉及的概念。蛮力法所能解决的问题域也是最广的,但是效率往往不高;

使用蛮力法的算法有:

1、冒泡排序,选择排序

2,、顺序匹配

3、穷举法

三、分治法
分治法设计步骤:
1、将问题实例划分为同一问题的较小的实例,最好拥有同样的规模;
2、求解较小的实例;
3、合并较小问题的解;
分治法算法:
1、归并排序,快速排序
2、折半查找
3、二叉树遍历(前序,中序,后序)
4、大整数乘法和矩阵乘法的分治
5、最近对和凸包问题的分治
四、减治法
减治技术应用了问题的解和同样问题较小实例的解之间的关系,减治法主要有一下三种:
1、减去一个常量 每次减去一个规模相同的常量,一般等于1或者2,例如求a的n次方可以理解为f(n)=f(n-1)*a
2、减去一个常量因子 每次迭代减去相同的常数因子,例如每次把问题规模变为原来问题的1/2,还是求a的n次方,但是可以这样写递归公式;

3、减去的规模是可变的 每次迭代减去的问题规模是可变的,例如求最大公约数 gcd(m,n) = gcd(n,m mod n),还有基于快速排序查找第k大的数;

减治法算法(减常量)
插入排序、深度优先查找、广度优先查找、拓补排序、生成排列组合、生成子集

减常因子算法
假币问题、约舍夫斯问题

减可变规模
基于快速排序查找第k大的数、插值查找、二叉查找树的插入和查找
五、变治法
变治主要体现在变换问题实例上,主要有3中类型:
1、问题化简:变换为同样问题一个更简单更方便的实例
2、改变表现:同样问题实例的不同表现
3、问题变换:变换为另一个问题的实例

问题化简: 预排序,高斯消去
改变表现:查找树、堆排序
问题变换:
1、最小公倍数:把求最下公倍数转换为求最大公约数
lcm(m,n) = m*n/gcd(m,n)
六、时空权衡
空间换时间,动态规划和散列也是空间换时间的一种体现

1、计数排序
2、字符串匹配 Horspool, Boyer-Moore, KMP
3、散列
4、B树索引
七、动态规划
动态规划的出现是用来解决交叠子问题的重复求解问题,具体的求解过程一般分以下两步:
1、确定递推关系
2、根据问题性质采取合适的规划策略,自底向上递推或是自顶向下记忆化搜索
记忆化搜索也要维护一张状态表格,但每次要计算新值的时候会先查找表格该值是否计算过,如果已经计算过就直接用,否则递归计算。

动态规划算法:
1、计算二项系数
C(n,k) = C(n-1,k-1)+C(n-2,k)
2、Warshall算法计算传递闭包
3、Floyd算法计算完全最短路径
4、最优二叉树构造
5、背包

八、贪婪
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。而在贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后再去解作出这个选择后产生的相应的子问题。贪心算法所作的贪心选择可以依赖于以往所作过的选择,但决不依赖于将来所作的选择,也不依赖于子问题的解。正是由于这种差别,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为一个规模更小的子问题。

贪婪算法:
1、Prim,Kruskal算法求最小生成树
2、Dijkstra算法
3、Huffman
九、迭代改进
从某些可行解出发,然后重复应用一些简单的步骤不断改进它:
1、构造可行解;
2、检查当前解是不是最优的,如果不是,替换它;

迭代改进算法:
1、单纯形法与线性规划
2、最大流
3、递归下降
4、稳定婚姻
5、EM
6、二分图匹配
十、回溯法与分治界限法

其实所谓的状态空间树也就是一颗决策树,每一个决策节点也就是一次迭代,通过对决策树不断地减枝,生长,推导出最终结果;
其应用过程如下:
1、确定遍历规律,也就是决策树的生长顺序;
2、通过回溯或分支界限不断地对树进行生长,减枝;

回溯算法应用:
1、n皇后问题
2、哈密顿回路
3、生成子集
分支界限:
1、背包
2、旅行商

算法期末复习总结 || 分治、蛮力、回溯、分支限界、贪心、动态规划算法分析比较 文章目录一、回溯法1. 原理2. 解空间3. 算法框架1. 子集树2. 排列树二、分支限界法1. 原理2. 队列式与优先队列式3. 限界函数设计三、贪心算法1. 原理2. 求解问题应具有的性质3. 贪心准则4. 哈夫曼树四、算法比较1. 回溯法与蛮力法的区别2. 分支限界法与回溯法的区别3. 贪心法与回溯法区别4. 贪心法与分枝限界法区别 一、回溯法 1. 原理 回溯法实际上一个类似穷举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”(即回退),尝试别的路径。 回溯 阅读详情

相关推荐

算法分析设计》笔记整理

(1)全排列问题 问题:打印出给定的n个字符的全排列。 思想:递归,将问题转化为前缀+n-1个字符的全排列 Notations: list[]:一定顺序的n个字符字符串 k:当前前缀设置位置k号 m:字符总数量 void Perm(list[],int k,int m) { if(k ==m) { for(int i=0;i<m;i++) cout<<list[i]<<' '; cout<<endl; } for(int i=k;i<

LongXinKou的博客 1975

减治法分治法贪心算法动态规划一些算法概念

分治法是把一个问题分成多个小问题解决, 减治法是把一个问题化成一个小问题解决。 分治法的经典算法是归排序。 归排序:先使每个子序列有序,再合子序列。 减治法的经典算法是约瑟夫问题。 分治法是把一个大问题划分为若干个子问题,分别求解各个子问题,然后再把子问题的解进行合得到原问题的解。 减治法是把一个大问题划分为若干个子问题,只需求解一个子问题。 贪心算法总是做出在当前看来是最好的选择。总是局部最优选择。这种局部最优选择不总能获得整体最优解。 动态规划是多阶段决策最优解。自底向上的方式来递推。 堆排序

Ferbc的博客 868

算法设计分析学习笔记与习题4

笔记 为一个分治算法编写伪代码,该算法同时求出一个 n 元素数组的最大元素 最小元素的值。 b. 假设 n = 2 k ,为该算法的键值比较次数建立递推关系式求解。 c. 将该算法与同样问题的蛮力算法做一个比较。 a. 解: 算法思想:将数组 A 划分为大小大致相等的两个子数组;递归地对这两个子数 组求最大元素最小元素;将两个子数组的最大元素进行比较,返回数组 A 的 最大元素,将其最小元素进行比较,返回数组 A 的最小元素;当 n 不超过 2 时, 递归终止,此时最多通过一次比较就可得到最大元素

weixin_44216820的博客 3311

蛮力法-分治法-处理最近对问题

两种方法对最近对问题的解释 背景描述:   终于,隔了将近一周,开始更新第二篇算法博客。今天的问题是最近对问题。问题描述如下:对于二维坐标系中的若干个点,从中判断出相距最近的两个点,输出最近的这个距离。   我之前也翻看了很多篇博客,大家都解释的很好,但是都只是输出了最近的距离,而我希望这个程序不仅能输出最近距离,同时还能锁定是哪两个点得到的这个最近距离。于是,经过反复试错后,终于得到满意的结果,马不停蹄过来更新博客了。 蛮力法:   首先介绍蛮力法的思路。顾名思义,就是从第一个点开始,求它第二个点之间

Santer的博客 4295

算法设计分析学习笔记

记录一下在学习`算法设计分析`过程中的一些笔记。

renshy5的博客 980

算法分析设计 学习笔记

算法分析设计学习笔记 算法概述及复杂性理论 一,问题 在日常生活中碰到的许多实际性问题,都涉及到如何选取一个目标 在满足一定约束条件下,是目标达到最优,即f(x) x包含于S 最大值(最小值)问题,别的问题 目标函数 解空间与约束条件 可行解与不可行解 最优解近似解 问题实例与问题规模 问题的分类: 1.可计算问题 2.困难问题 3.p np npc 二.算法的概念 算法: 解决问题的一种方法或一个过程,是一个由若干运算或指令组成的有穷序列 算法-问题: 求解问题可以看作是输入实例与输出之间函数 算

赵宸的博客 2405

Python 学习笔记2--函数、类算法设计

不然在其后面的参数都会没法定义(除非使用关键词定义)。关键词参数:函数的形参赋值默认都是按位置的,但是如果知道形参的名字,也可以指定赋值,比如。

Nepapple的博客 1004

算法设计分析基础》学习笔记-0-写在前面

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown扩展Markdown简洁的语法 代码块高亮 图片链接图片上传 LaTex数学公式 UML序列图流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q 插入链接

taozi_LOVE_cs的博客 338

算法设计分析学习笔记与习题1

算法概述求两个正整数的最大公因子写出将十进制正整数转换为二进制正整数的标准算法证明关于下列n个顶点二叉树高度的不等式:⌊logn⌋<=h<=n-1 算法是有限条操作指令的集合,这些指令确定了解决问题的方法与步骤。能够对符合一定规范的输入,在有限时间内获得所要求的输出。 求两个正整数的最大公因子 算法思想:E(m,n) 第一步:求余数 r= m mod n; 第二步:判断 若 r = 0 算法结束,n即为所求;否则进入第三步。 第三步:赋值 m=n,n=r;返回第一步 解释:由于m,n与余数r之

weixin_44216820的博客 1215

算法设计分析学习笔记(一)

二分查找 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法,可以在数据规模的对数时间复杂度内完成查找。 二分查找可以应用于数组,是因为数组具有有随机访问的特点,且数组是有序的。 二分查找体现的数学思想是「减而治之」,可以通过当前看到的中间元素的特点推测它两侧元素的性质,以达到缩减问题规模的效果。 二分查找问题也是面试中经常考到的问题,虽然它的思想很简单,但写好二分查找算法不是一件容易的事情。 以下是二分查找的相关练习,可以帮助你进一步了解二分查找,快来试试吧!

qq_49146564的博客 590

算法设计学习笔记(一)

一、 稳定匹配问题 1)问题 完美匹配问题:有n个男人n个女人,现要求将男女两两配对得到一个完美匹配,且这个匹配中没有不稳定配对。 2)设计算法 G-S算法: 初始化 S to empty matching While 男人 m 是自由的且没对每个女人都求过婚 选择这个m w 是 m 优先表中的最高位,且没有向她求过婚的女人 if w 是自由的 (m,w) else w 当前与 m'约会 if w 更偏爱 m'

JING0_0的博客 488

算法设计学习笔记(十一)近似算法

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文是对于算法设计学习笔记,如有错误,不吝赐教。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warni

weixin_43869415的博客 5583

算法设计分析学习笔记之——算法引论

算法引论 1、算法与程序 通俗地来讲,算法是指解决问题的方法或过程。严格地来将,算法是满足以下性质的指令序列: 输入:有零个或多个外部量作为算法的输入。 输出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令是清晰的、无歧义的。 有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。 程序与算法有所不同。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的性质(4)即有限性。例如操作系统,它是在无限的循环中执行的程序,因而不是算法。 2、表达算法的抽象机制 算法从非形式的自然

前尘忆梦的博客 1106

学习笔记|算法设计分析

算法设计分析 注:笔记摘自《计算机算法设计分析》王晓东 第五版 第二章 递归与分治策略 2.1 递归的概念 递归算法:一个直接或间接地调用自身的算法 递归函数:使用函数自身给出定义的函数 递归方程:对于递归算法,一般可把时间代价表示为一个递归方程 解递归方程最常用的方法是进行递归扩展 阶乘函数 边界条件 递归关系 n!={1,n=1n(n−1)!,n>1 n!=\begin{cases} 1,n=1\\ n(n-1)!,n>1\end{cases} n!={1,n

一只废球w的博客 1277
上一篇: 朝花夕拾学习笔记
下一篇: Java 多线程一篇解决你的安全问题
IShowCode
博客等级 码龄7年 622粉丝 · 20原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IShowCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值