随笔分类 - 算法/数据结构/数学
摘要:暑假写的,主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。描述就不写了,看相关书籍吧。Dijkstra是一个贪心算法。package Section9;/*第九章 贪婪算法 Dijkstra单源最短路径*/public class Dijkstra { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] weight = { {0,3,2000,7,9999999}, {3,0,4,2,9999999}...
阅读全文
摘要:贪心的思想很简单,关键在于用一个什么样的结构来实现贪心过程。package Section9;import java.util.Queue;import java.util.Iterator;import java.util.LinkedList;/*第九章 贪婪算法 Huffman编码*/public class Huffman { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub dou...
阅读全文
摘要:继续动态规划O(∩_∩)O~暑假之前就写了的,只是去实习了,没来及贴上来。关于动态规划的基础知识,参见算法与数据结构之前的文章,(其实我也要再看看,当时理解的自认为还比较深刻,现在又忘得差不多了)LCS问题描述,就不说了,网上一大堆。如果看了我前面的文章,怎样来用动态规划解决,也应该很简单了。不废话,动态规划的难点在于问题刻画和发现最优子结构,以及怎样逆向思维(居然还记得这么多,,,):最长公共子序列的结构:设X={x1,...,xm},Y={y1,...,yn}及它们的最长子序列Z={z1,...,zk}则1、若xm=yn,则zk=xm=yn,且Z[k-1]是X[m-1]和Y[n-1]的最长
阅读全文
摘要:首先对博主的独立思考和专研精神表示膜拜!转载地址:http://blog.csdn.net/jiaomeng/article/details/1435226 在找大规模数据处理的相关资料时,逛到该博主博客,发现了很多独立思考的文章。以下为转载全文,红色字体处为我的标注和添加的理解。---------------------------------------------------------------------------------------------------------------------------------------------------------------
阅读全文
摘要:1 生日悖论一个房间的人数必须要达到多少,才能使得有两个人生日相同的机会达到50%?1)用概率来分析假设一年 n = 365天,两个人的生日都落在某一个固定的天数r上的概率为 1/n * 1/n = 1 / n^2两个人的生日落在同一天上的概率为n * 1 / n^2 = 1 / n 注意两个人的生日落在同一天的概率 = 某个人的生日落在指定一天的概率 = 1 / n 这个巧合依赖于个各人生日独立。k个人中至少有2人生日相同的概率等于1减去所有人生日都不互不相同的概率。即:1 - 1 * (n-1)/n * (n-2)/n......* (n-k+1)/n >= 1/2=> (n-
阅读全文
摘要:在雇佣问题中,如果应聘者是以随机顺序出现的话,雇佣一个新的办公室助理的期望次数是lnn。这个算法是随着输入的变化而变化的。对于某个特定的输入,它总是会产生固定的雇佣次数。如果先对应聘者进行随机排列,此时随机发生在算法上而不是发生在输入分布上。每次运行这个算法,执行依赖于随机的选择,而不是依赖于输入。这就是随机算法和概率分析的区别。RANDOMIZED-HIRE-ASSISTANT(n)1 randomly permute the list of candidates2 best ← 0 ® candidate 0 is a least-qualified dummy candidat
阅读全文
摘要:为了分析包括包括雇佣分析在内的许多算法,我们将使用指示器随机变量,它为概率和期望之间的转换提供了一个便利的方法,给定一个样本空间S和事件A,那么事件A对应的指示器随机变量:Xa = 1 如果A发生 0 如果A没有发生E[Xa] = Pr{A}在很多时候,用指示器随机变量来求期望比用概率简单许多。下面来看一个例子,简单在哪里。利用指示器随机变量分析雇佣问题,求雇佣经理次数的期望值:1)概率分析的方法(高中时候常用的求期望的方法) 假设应聘者以随机的顺序出现,令X作为一个随机变量,其值等于雇佣新的办公室经理的次数。那么 E[X] = ∑xPr{X=x},但这一计算会很麻烦。高中的时候就经常这样来求
阅读全文
摘要:第五章围绕概率分析,随机算法,概率与期望展开了一系列有趣的讨论,其中许多有趣概率习题。------------------------------------------------------------------------------------------------------------------------------------------------雇佣问题描述:假设你要雇佣一个新的办公室助理,雇佣代理每天想你推荐一个应聘者(连续推荐n个),你面试这个人,如果这个应聘者比目前的办公室助理更优秀,你就会辞掉当前的办公室助理,然后聘用这个新的。面试一个人需付给雇佣代理一笔费用
阅读全文
摘要:第一章 算法在计算机中的应用第二章 算法入门 插入排序 算法设计(分治法,分治法分析)第三章 函数增长(渐进记号,时间复杂度)第四章 递归式 代换法 递归树方法 主方法(主定理的证明)第一章是个概要。第二章以一个插入排序为例子,来介绍什么是算法,本书中讲解每个算法的结构,接着讲述了如何分析算法的性能,并介绍了分治算法及分析。第三章数学知识第四章介绍递归,及递归式的时间复杂度分析的3种方法。--------------------------------------------------------------------------------------------------------
阅读全文
摘要:2个问题:1)背包问题的动态规划解法2)动态规划的另一种实现方式,记忆递归(dp的第一篇文章就提到过,professional中也提到过),在这里来讲解,加上全面所有的文章,这一点应该可以算是动态规划里最后一个没有详细介绍的关键点了---------------------------------------------------------------------------------------------------------------------------------------------------给定一组物品:重量为 w1 , w2 , .......wn价值为 v1
阅读全文
摘要:最优二叉查找树的一道思考习题同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像)----------------------------------------------------------------------------------------------------------------------------------------------------分析解答:a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的:1)对于连续的n个矩阵相乘 A1 * A2 *A3.........An,其乘法顺序可以是任意的,可以在上面加括号,改变做乘法的顺序
阅读全文
摘要:前面说过动态规划最典型的就是解决最优化问题的(具有最优子结构的最优化问题),最优二叉查找树就是一个典型的最优化问题。问题描述:给定一个n元素的中序序列,它可以有卡特兰数个不同形状的二叉排序树。(卡特兰数的定义及证明参见组合数学):,如果我们知道每个键的查找概率,怎么来构造一个平均查找代价最小(查找成功)的最优二叉查找树呢?-------------------------------------------------------------------------------------------------------------用动态规划来求解,首先要找到它的最优子结构性质,然后根据这
阅读全文
摘要:上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等。然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。计算二项式系数其实可以看成是不是解决最优问题的一个动态规划的特例,这节我们再来介绍2个动态规划的算法:Warshall算法(也可以说是不是最优问题,但它也可以表现为动态规划的过程)和Floyd算法。------------------
阅读全文
摘要:终于来到了算法设计思想中最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些对动态规划的认识和其中的问题。这包括一些例子:计算二项式系数,Wa...
阅读全文
摘要:散列法的基本思想是把键分布在一个称为散列表的一维数组H[0.......m-1]中,我们可以对每个键计算某些被称为散列函数的预定义函数h的值,来完成这种分布。该函数为每个键确定它在H中的下标。一般来说,hash函数的要求:1)使得键在hash表里尽可能均匀的分布2)hash函数必须容易计算显然,如果选择的散列表长度m小于键的数量n,则会碰撞。这是一种2个或多个键被hash到散列表的同一个单元格的情况。即使m相对于n足够大,这种情况仍会发生。有2种解决碰撞的方法:开散列(分离链)和闭散列(开放地址),以下分别介绍,并用开散列的方式模拟实现一个hash表。---------------------
阅读全文
摘要:引入问题:考虑一个计算函数值的问题: 你可以完全不用任何计算方法,先把函数值计算好(例如计算三角函数的值的那张表),把这些预先就计算好了的值存储于计算机中,当你需要这个函数值时,直接去取就行了,当然这样的时间复杂度是O(1),因为你不需要任何计算,直接取出即可。(在计算机发明之前,事实上就是这样,类似于三角函数查表) 相对于其他再用别的算法来计算函数值的算法,它的时间复杂度是最好滴,它是最快滴。当然,你为时间最快付出了什么代价呢?空间!对,你需要一块空间来存储这些值,而其他的算法不需要或者需要的空间少得多。 这就是时间和空间的考量,有时候需要拿时间换取空间,有时候需要拿空间换取时间。在一些算法
阅读全文
摘要:变治法是指这样一组设计方法:它们都基于变换的思想。这些方法都分为两个阶段,变,把问题的实例变得更容易求解,治,在变的基础上对问题求解。3种变换方式:1)将问题变为一个更简单或方便的实例---实例化简(如预排序,高斯消去法)2)变换同样的实例为不同的表现---改变表现(AVL树,多路查找树)3)变换为另一个问题(这种问题的算法是已知的)的实例---问题化简(堆排序,其他等等,转化)-------------------------------------------------------------------------------------------------------------
阅读全文
摘要:前面3篇文章介绍了减治法的策略和思想,经典数据结构算法中的几个减治算法,排列,子集的减治算法。这些都是属于减一治的减治策略。这篇文章来介绍减常因子和减可变规模的减治策略算法,当然,规模递减的越快的算法也就越难找,所以这样的算法并不是很多。目前前面写过的减常因子的有折半查找(减常因子的减治策略的可以看做分治的变种,前面说过),减可变规模的减治策略有欧几里得最大公约数算法。------------------------------------------------------------------------------------------------------------------
阅读全文
摘要:子集问题是指生成一个集合的全部子集(2^n个,包括空集和全集),今年实验室一个去高盛的同学在技术面中被问到了这个问题,另外记得还有一个快排的时间复杂度证明(这个更难,就算了,有时间去看看算法导论怎么证明的)算法1:减一治策略有了减治生成排列的经验,相信对于子集来说,用减治法来思考就更加简单了。如果有了n-1个元素的全部子集项{ 2^(n-1) 项},那么n个元素的全部子集首先包含这已经有的n-1个元素的全部子集,另外还包括把第n个元素加到每一个子集项里面去生成的子集项{ 也是2^(n-1) 项 },所以,正好这就有了2^(n-1) + 2^(n-1) = 2^n项,正是我们要的结果。为什么说它
阅读全文
摘要:从这篇文章始,将花连续2篇文章来介绍2个很重要的问题:生成排列和生成子集它们都有减一治策略的算法,但这2篇文章将不仅仅局限于减一治策略来实现,而将介绍更多的实现算法。这篇介绍排列,下篇介绍子集。--------------------------------------------------------------------------------------------------------------------------------------------------介绍3种构造排列的方法:算法1:减一治从底向上构造排列假设n-1个元素的排列已经生成好,那么将第n个元素插入到每一
阅读全文
浙公网安备 33010602011771号