算法

算法笔记

僤鯓⒐⒋嵵緔 提交于 2020-02-23 10:59:38
1. 分治法能解决的问题一般具有什么特征 2. 解空间树的动态搜索过程 3. 递归优点?那为什么有的问题还要用非递归 动态规划法与分治法的异同、动态规划法与贪心法的异同、分支限界与回溯 分析性能特点。 例,填表:动态规划法 画图:贪心法求TSP、图着色,回溯法、分支限界法 5、a.为一个分治算法编写伪代码,该算法同时求出一个n元数组的最大元素和最小元素的值。 b.请拿该算法与解同样问题的蛮力算法做一个比较。 解: a.同时求出最大值和最小值,只需要将原数组一分为二,再使用相同的方法找出这两个部分中的最大值和最小值,然后经过比较就可以得到整个问题的最大值和最小值。 算法 MaxMin(A[l..r],Max,Min) //该算法利用分治技术得到数组A中的最大值和最小值 //输入:数值数组A[l..r] //输出:最大值Max和最小值Min if(r=l) Max←A[l];Min←A[l]; //只有一个元素时 else if r-l=1 //有两个元素时 if A[l]≤A[r] Max←A[r]; Min←A[l] else Max←A[l]; Min←A[r] else //r-l>1 MaxMin(A[l,(l+r)/2],Max1,Min1); //递归解决前一部分 MaxMin(A[(l+r/)2+1..r],Max2,Min2); //递归解决后一部分 if Max1

运筹优化问题

一世执手 提交于 2020-02-23 10:57:18
经典运筹优化问题 先考虑容易理解的0/1背包问题、TSP问题、VRP问题等。 1.TSP问题 1.1数学建模 旅行商问题(TSP)的两种模型 主要是针对避免独立环的出现,给出了数学模型,可以让gurobi/cplex等精确求解器求解 代码可参考我的git 1.2 基础算法 TSP的几种求解方法及其优缺点 在分类上,根据我个人理解可以分类为: 还是看这个吧遗传算法,模拟退火算法,粒子群算法,神经网络等智能算法的作用? - 大洪的家园的回答 - 知乎 (1)基础搜索算法(遍历解空间) 深度优先搜索(加上剪枝策略就是回溯法) 广度优先搜索(加上剪枝策略就是分支限界法,上下界的确定可以参考 动态规划 可以参考 这个作者 的系列文章 旅行商(TSP)问题专题——多种方法对比 回溯算法——对解空间(搜索树)的一种策略搜索(深度优先搜索) 分支限界法——对解空间的一种策略搜索(广度优先搜索) 0/1背包问题——动态规划、回溯、分支限界法对比 (2)启发式搜索算法(在遍历解空间树时有比较地选择) 贪心策略 最近插入策略 A星算法 (3)启发式探索算法 这里说明一下这个探索跟上面的搜索,上面的搜索更像是对解空间根据策略进行遍历,但此处说的探索则是根据某种策略直接对可行解进行修改(这种修改结果得到的不一定是可行解但尽可能地设计可以产生可行解结果的算法),其实也有点像强化学习中的exploration

【算法导论】贪心算法,递归算法,动态规划算法总结

主宰稳场 提交于 2020-02-23 10:26:55
一般实际生活中我们遇到的算法分为四类: 一>判定性问题 二>最优化问题 三>构造性问题 四>计算性问题 而今天所要总结的算法就是着重解决 最优化问题 《算法之道》对三种算法进行了归纳总结,如下表所示: 标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要解决 只要解决一个子问题 子问题在最优解里 全部 部分 部分 选择与求解次序 先选择后解决子问题 先解决子问题后选择 先选择后解决子问题 分治算法特征: 1)规模如果很小,则很容易解决。//一般问题都能满足 2)大问题可以分为若干规模小的相同问题。//前提 3)利用子问题的解,可以合并成该问题的解。//关键 4)分解出的各个子问题相互独立,子问题不再包含公共子问题。 //效率高低 【一】动态规划: 依赖:依赖于有待做出的最优选择 实质:就是分治思想和解决冗余。 自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解) 特征:动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。 缺点:空间需求大。 【二】贪心算法: 依赖

【算法导论】贪心算法,递归算法,动态规划算法总结

痴心易碎 提交于 2020-02-23 10:24:55
一般实际生活中我们遇到的算法分为四类: 一>判定性问题 二>最优化问题 三>构造性问题 四>计算性问题 而今天所要总结的算法就是着重解决 最优化问题 《算法之道》对三种算法进行了归纳总结,如下表所示: 标准分治 动态规划 贪心算法 适用类型 通用问题 优化问题 优化问题 子问题结构 每个子问题不同 很多子问题重复(不独立) 只有一个子问题 最优子结构 不需要 必须满足 必须满足 子问题数 全部子问题都要解决 全部子问题都要解决 只要解决一个子问题 子问题在最优解里 全部 部分 部分 选择与求解次序 先选择后解决子问题 先解决子问题后选择 先选择后解决子问题 分治算法特征: 1)规模如果很小,则很容易解决。//一般问题都能满足 2)大问题可以分为若干规模小的相同问题。//前提 3)利用子问题的解,可以合并成该问题的解。//关键 4)分解出的各个子问题相互独立,子问题不再包含公共子问题。 //效率高低 【一】动态规划: 依赖:依赖于有待做出的最优选择 实质:就是分治思想和解决冗余。 自底向上(每一步,根据策略得到一个更小规模的问题。最后解决最小规模的问题。得到整个问题最优解) 特征:动态规划任何一个i+1阶段都仅仅依赖 i 阶段做出的选择。而与i之前的选择无关。但是动态规划不仅求出了当前状态最优值,而且同时求出了到中间状态的最优值。 缺点:空间需求大。 【二】贪心算法: 依赖

【POJ3243】Clever Y-扩展BSGS算法

徘徊边缘 提交于 2020-02-23 07:36:50
测试地址: Clever Y 题目大意: 求关于 x x 的方程 A x mod C = B A x mod C = B 的最小非负整数解。 做法: 本题需要用到扩展BSGS算法。 这个东西我觉得这篇文章讲得很清楚了,我自己来说可能讲得不比原来的题解清楚,所以这里就直接贴出链接: 点我 。 以下是本人代码: #include <bits/stdc++.h> #define ll long long #define hashsiz 1000007 using namespace std; ll A,B,C,mp[hashsiz+10],hash[hashsiz+10]; ll gcd(ll a,ll b) { return (b==0)?a:gcd(b,a%b); } ll power(ll a,ll b) { ll s=1,ss=a; while(b) { if (b&1) s=(s*ss)%C; ss=(ss*ss)%C,b>>=1; } return s; } ll hashfind(ll x) { ll s=x%hashsiz; while (hash[s]!=-1&&hash[s]!=x) s++; return s; } ll hashinsert(ll x) { ll s; hash[s=hashfind(x)]=x; return s; } int main() {

数据结构和算法(绪论)

会有一股神秘感。 提交于 2020-02-23 04:29:58
数据结构和算法绪论 数据结构:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之 间的关条和操作等相关问题的学科。 数据结构就是关糸,就是数据元素相互之间存在的一种或多种特定关系的集合。 程序设计=数据结构+算法 传统上,数据结构分为逻辑结构和物理结构。 逻辑结构:是指数据对象中数据元素之间的相互关系。 物理结构:是指数据的逻辑结构在计算机中的存储形式。 四大逻辑结构: 集合 结构中的数据元素除了同属于一个集合外,它们之间没有任何其他关系。 线性结构 中的数据元素之间是一对一的关系。 树形结构 中的数据元素之间存在一种一对多的层次关系。 图形结构 (网状结构)中的数据元素之间是多对多关系。 物理结构又称存储结构,实际上研究的的就是如何把数据元素存储到计算机的存储器中。(存储器主要是针对内存而言的,像硬盘、光盘等外部存储器的数据组织通常用文件结构来描述。) 数据元素的存储结构形式有两种:顺序存储和链式存储。 顺序存储结构 :是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。例如我们编程语言的数组结构就是这样滴。 链式存储结构 :是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。这样说的话链式存储结构的数据元素存储关糸并不能反映其逻辑关糸,因此需要用一个指针存放数据元素的地址

数据结构和算法-面试题

为君一笑 提交于 2020-02-23 03:02:20
########################################## """ 数据结构: 1,用Python代码简单实现一个栈。实现pop/push及max方法,要求能在O(1)时间内取得最大值。 排序算法: 写个快速排序热热身,分析一下复杂度,如果不使用额外的空间,应该怎么写?快排平均复杂度多少,最坏情况如何优化; 请列举常见排序并通过代码实现任意三种。冒泡/选择/插入/快排 几种常用排序的算法复杂度是多少; 单向链表如何使用快速排序算法进行排序; 查找算法: 用Python实现一个二分查找的函数。 请列举常见查找并通过代码实现任意三种。无序查找/二分查找/插值查找 如何遍历一个内部未知的文件夹(两种树的优先遍历方式) 算法复杂度 手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,你的算法复杂度是多少; 手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少; list,dict和数据结构和算法 1,Python中的列表是如何实现的?Python中的列表使用了分离式技术实现的动态顺序表。 2,Python中列表的索引查询的时间复杂度是多少?O(1) 3,dict与list的查找复杂度?dict用hash实现,查找的时间复杂度是O(1),list则为O(n)。 """ ##############

机器学习-周志华-第一章

我怕爱的太早我们不能终老 提交于 2020-02-23 01:38:28
绪论 1.1 引言 什么是机器学习? 它是一门致力于研究如何通过计算的手段,利用经验来改善系统自身性能的一门学科。所研究的主要内容是计算机如何通过数据产生模型,即学习算法。有了学习算法后,当我们给它提供经验数据时就能基于这些数据产生模型。在面对新数据时学习算法会给我们相应的判断。经验通常以数据的形式存在 名词理解 模型:一类问题的解题步骤 算法:一个问题的解题步骤 学习算法:由数据产生的一类问题的解题步骤。通过学习算法从数据中获得模型 ps:阿尔法狗零自学三天以100:0战胜阿尔法狗。这里阿尔法狗零利用人类经验提升自身能力,这就是机器学习 1.2 基本术语 数据集 示例 属性、特征 属性空间、样本空间、输入空间:数据的维度空间 特征向量: 学习、训练:从数据中学得模型的过程 训练数据:训练过程中使用的数据 训练样本: 训练集:多个训练样本的集合 假设:学到的模型 真相:数据某种潜在的规律 标记:示例的结果信息 样例:有标记信息的示例 标记空间、输出空间:(x,y),y:所有标记的集合 分类:预测值是离散的学习任务 二分类:只涉及两个类别的分类 多分类: 回归:预测值是连续的学习任务 聚类:将训练集中的示例分组 监督学习:训练数据中拥有标记信息的学习任务 。如分类和回归 无监督学习:训练数据中不包含标记信息的雪人任务;如聚类 泛化能力:学得模型适用于新样本的能力 1.3 假设空间

C++ STL介绍——简介

守給你的承諾、 提交于 2020-02-22 22:48:07
目录 1、什么是STL 2、STL中六大组件 2.1 容器(Container) 2.2 迭代器(Iterator) 2.3 算法(Algorithm) 2.4 仿函数(Functor) 2.5 适配器(Adaptor) 3、其他部分链接 @目录 1、什么是STL STL Standard Template Library ,即标准模板库,是一个具有工业强度的,高效的C++ 程序库。它被容纳于C++ 标准程序库 C++ Standard Library 中,是 ANSI/ISO C++ 标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。 STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的 sort() 函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组; STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;