
算法/数据结构/数学
文章平均质量分 77
mengzhejin
不畏改变、只为不被改变。
展开
-
图简介1- 图的基本数据结构和算法
图里面的东西太多,先写一个概要。在后面的文章中将继续逐个探讨和实现。1,一些概念顶点边(无向图) 或 弧(有向图)完全图,子图,连通图路径,简单路径(顶点不重复)生成树(无向图),关键路径,拓扑排序2,存储结构非常重要!!!2种存储方式,邻接矩阵和邻接表目前我写的都是用邻接表写的,但后来发现大家还是用邻接矩阵比较多,后原创 2014-07-15 18:53:56 · 362 阅读 · 0 评论 -
算法设计与分析-减治法2:生成排列的减治算法及其他算法
从这篇文章始,将花连续2篇文章来介绍2个很重要的问题:生成排列和生成子集它们都有减一治策略的算法,但这2篇文章将不仅仅局限于减一治策略来实现,而将介绍更多的实现算法。这篇介绍排列,下篇介绍子集。---------------------------------------------------------------------------------------------原创 2014-07-16 13:19:07 · 1204 阅读 · 0 评论 -
邻接矩阵实现图+深度/广度优先遍历+最小生成树
用邻接矩阵存放图中顶点的关系,实现无向图的邻接矩阵存储。1)图的建立,删除(添加,删除边/顶点)2)广度和深度优先遍历3)prim最小生成树1,成员变量,构造函数,以及数组扩展实现策略:维护一个顶点的数组,以及一个二维的数组来表示顶点之间的关系,维护2个基本变量记录顶点和边的数量。重点是:1)可以动态扩展顶点数组,并保持数组的连续性,这意味着删除顶点时后原创 2014-07-15 19:04:23 · 15989 阅读 · 0 评论 -
算法设计与分析-减治法4
前面3篇文章介绍了减治法的策略和思想,经典数据结构算法中的几个减治算法,排列,子集的减治算法。这些都是属于减一治的减治策略。这篇文章来介绍减常因子和减可变规模的减治策略算法,当然,规模递减的越快的算法也就越难找,所以这样的算法并不是很多。目前前面写过的减常因子的有折半查找(减常因子的减治策略的可以看做分治的变种,前面说过),减可变规模的减治策略有欧几里得最大公约数算法。----原创 2014-07-16 13:24:12 · 2989 阅读 · 0 评论 -
拓扑排序算法
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。一个有向无环图的拓扑序列不是唯一的:进行拓扑排序的算法并不复杂:1)在有向图中选一个没有前驱(入度为0)的顶点且输出之2)从图中删除该顶点及它发出的弧(这样就得到了别的入原创 2014-07-15 19:09:41 · 1038 阅读 · 0 评论 -
理解最小生成树 prim算法
在无向加权图中,n个顶点的最小生成树有n-1条边,这些边使得n个顶点之间可达,且总的代价最小。prim算法是一种贪心算法,将全部的顶点划分为2个集合,每次总在2个集合之间中找最小的一条边,局部最优最终达到全局最优,这正是贪心的思想。具体的描述参见相关书籍:描述从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。输入:一原创 2014-07-15 19:02:06 · 487 阅读 · 0 评论 -
算法分析与设计-减治法3:生成子集的减治算法及二进制法
子集问题是指生成一个集合的全部子集(2^n个,包括空集和全集),今年实验室一个去高盛的同学在技术面中被问到了这个问题,另外记得还有一个快排的时间复杂度证明(这个更难,就算了,有时间去看看算法导论怎么证明的)算法1:减一治策略有了减治生成排列的经验,相信对于子集来说,用减治法来思考就更加简单了。如果有了n-1个元素的全部子集项{ 2^(n-1) 项},那么n个元素的全原创 2014-07-16 13:20:33 · 1460 阅读 · 1 评论 -
算法设计与分析-时间和空间的权衡
引入问题:考虑一个计算函数值的问题: 你可以完全不用任何计算方法,先把函数值计算好(例如计算三角函数的值的那张表),把这些预先就计算好了的值存储于计算机中,当你需要这个函数值时,直接去取就行了,当然这样的时间复杂度是O(1),因为你不需要任何计算,直接取出即可。(在计算机发明之前,事实上就是这样,类似于三角函数查表) 相对于其他再用别的算法来计算函数值的算法,它原创 2014-07-16 13:26:35 · 4340 阅读 · 1 评论 -
算法设计与分析绪论学习-几个经典算法
《算法设计与分析》 Anany Levitin著,潘彦译 清华大学出版社1.1 什么是算法简答介绍了算法的概念,举出了2个例子:欧几里得算法和埃拉托色尼筛。呵呵,这里说一下之前在校内上许多计算机专业的学生转载的有趣的一个段子:"早上去图书馆一女生背着一堆书进了阅览室,结果警报响了,大妈让女生看看是哪本书把警报弄响了,那女生把书倒出来,准备一本一本的测。大妈见状急了,原创 2014-07-15 19:25:18 · 867 阅读 · 0 评论 -
算法设计与分析-减治法1
这篇文章将讨论:1) 减治法的思想和策略2) 几个数据结构里面经典的使用减治策略的算法:插入排序,深度和广度优先查找,拓扑排序(都是减一治的)通过 1) 2)明白减治策略的基本思想和方法,也对经典数据结构做一番新的审视,从减治策略的角度来重新看待这些算法。而在后面,将继续花几篇文章讨论减治策略的其他问题:排列问题,子集问题,减常因子算法,减可变规模算法。-原创 2014-07-16 13:17:37 · 995 阅读 · 0 评论 -
算法设计与分析学习-分治法2
参考 《算法设计与分析》 第四章 分治法 Anany Levitin著 翻译版 清华大学出版社 在上一篇文章中,介绍了分治策略的思想,主定理,以及几个用分治策略的经典案例。这一篇文章将继续探讨分治算法的其他应用,包括大整数乘法和Strassen矩阵乘法,最近点对问题和凸包问题这4个算法,一般来说常规的数据结构教程上不包括这些内容。--------------原创 2014-07-16 13:10:51 · 1082 阅读 · 0 评论 -
动态规划4-最优二叉查找树
前面说过动态规划最典型的就是解决最优化问题的(具有最优子结构的最优化问题),最优二叉查找树就是一个典型的最优化问题。问题描述:给定一个n元素的中序序列,它可以有卡特兰数个不同形状的二叉排序树。(卡特兰数的定义及证明参见组合数学):,如果我们知道每个键的查找概率,怎么来构造一个平均查找代价最小(查找成功)的最优二叉查找树呢?--------------原创 2014-07-16 16:25:47 · 3392 阅读 · 0 评论 -
算法导论学习笔记-5.4 概率分析和指示器随机变量的应用-几个有趣的问题
1 生日悖论一个房间的人数必须要达到多少,才能使得有两个人生日相同的机会达到50%?1)用概率来分析假设一年 n = 365天,两个人的生日都落在某一个固定的天数r上的概率为 1/n * 1/n = 1 / n^2两个人的生日落在同一天上的概率为n * 1 / n^2 = 1 / n 注意两个人的生日落在同一天的概率 = 某个人的生日原创 2014-07-16 16:41:05 · 687 阅读 · 0 评论 -
算法导论学习笔记-5.3 随机算法
在雇佣问题中,如果应聘者是以随机顺序出现的话,雇佣一个新的办公室助理的期望次数是lnn。这个算法是随着输入的变化而变化的。对于某个特定的输入,它总是会产生固定的雇佣次数。如果先对应聘者进行随机排列,此时随机发生在算法上而不是发生在输入分布上。 每次运行这个算法,执行依赖于随机的选择,而不是依赖于输入。这就是随机算法和概率分析的区别。RANDOMIZED-HIRE-ASSIS原创 2014-07-16 16:42:29 · 562 阅读 · 0 评论 -
动态规划
终于来到了算法设计思想中最难,也最有趣的这部分,在去年的google笔试中,7道算法设计题有2道动态规划(Dynamic Programming)。看了这么久的算法,这部分也是唯一感觉到了比较难的地方,从这篇文章开始,将花连续的篇幅来讨论一些动态规划的问题。这包括书上介绍过的计算二项式系数,Warshall算法求传递闭包,Floyd算法求完全最短路径,构造最有二叉查找树,背原创 2014-07-16 16:22:02 · 5590 阅读 · 4 评论 -
动态规划6-LCS(最长公共子序列)
继续动态规划O(∩_∩)O~暑假之前就写了的,只是去实习了,没来及贴上来。关于动态规划的基础知识,参见算法与数据结构之前的文章,(其实我也要再看看,当时理解的自认为还比较深刻,现在又忘得差不多了)LCS问题描述,就不说了,网上一大堆。如果看了我前面的文章,怎样来用动态规划解决,也应该很简单了。不废话,动态规划的难点在于问题刻画和发现最优子结构,以及怎样逆向思维(原创 2014-07-16 16:54:21 · 460 阅读 · 0 评论 -
贪心算法-哈夫曼树
贪心的思想很简单,关键在于用一个什么样的结构来实现贪心过程。package Section9;import java.util.Queue;import java.util.Iterator;import java.util.LinkedList;/*第九章 贪婪算法 Huffman编码*/public class Huffman { /** * @para原创 2014-07-16 17:02:36 · 1089 阅读 · 0 评论 -
内存分配-堆和栈的区别
1、数据结构的栈和堆 堆栈,实际上堆栈是两种数据结构:堆和栈。 堆和栈都是把一些数据项按序排列的数据结构。2、内存分配中的栈和堆 这里有必要把内存分配:一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息,如下图(数据在内存中的存储图示)所示:0xc0000000 内核虚拟原创 2014-07-16 16:45:05 · 470 阅读 · 0 评论 -
算法导论学习笔记-5.1 雇佣问题
第五章围绕概率分析,随机算法,概率与期望展开了一系列有趣的讨论,其中许多有趣概率习题。------------------------------------------------------------------------------------------------------------------------------------------------原创 2014-07-16 16:40:18 · 950 阅读 · 1 评论 -
算法导论学习笔记-5.2 指示器随机变量
为了分析包括包括雇佣分析在内的许多算法,我们将使用指示器随机变量,它为概率和期望之间的转换提供了一个便利的方法,给定一个样本空间S和事件A,那么事件A对应的指示器随机变量:Xa = 1 如果A发生 0 如果A没有发生E[Xa] = Pr{A}在很多时候,用指示器随机变量来求期望比用概率简单许多。下面来看一个例子,简单在哪里。利用指示原创 2014-07-16 16:38:38 · 840 阅读 · 1 评论 -
算法导论学习笔记-1-4章
第一章 算法在计算机中的应用第二章 算法入门 插入排序 算法设计(分治法,分治法分析)第三章 函数增长(渐进记号,时间复杂度)第四章 递归式 代换法 递归树方法 主方法(主定理的证明)第一章是个概要。第二章以一个插入排序为例子,来介绍什么是算法,本书中讲解每个算法原创 2014-07-16 16:36:28 · 653 阅读 · 0 评论 -
动态规划6-背包问题+记忆递归
2个问题:1)背包问题的动态规划解法2)动态规划的另一种实现方式,记忆递归(dp的第一篇文章就提到过,professional中也提到过),在这里来讲解,加上全面所有的文章,这一点应该可以算是动态规划里最后一个没有详细介绍的关键点了--------------------------------------------------------------------原创 2014-07-16 16:36:07 · 886 阅读 · 0 评论 -
动态规划5-矩阵连乘问题
最优二叉查找树的一道思考习题同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像)------------------------------------------------------------------------------------------------------------------------------原创 2014-07-16 16:35:01 · 1201 阅读 · 0 评论 -
动态规划3-Warshall算法和Floyd算法
上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等。然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。计原创 2014-07-16 16:26:47 · 2682 阅读 · 0 评论 -
链式结构实现堆
1,堆的特征1)堆是一颗完全二叉树,这跟前面的二叉树,二叉查找树均不同,这意味着,建堆的时候,堆的插入位置是按顺序固定的2)每个节点小于或等于其左右子节点(最小堆)3)堆中的任意一颗子树也是一个堆,注意概念都是递归定义的2,堆实现的接口为了便于来测试写的堆是否正确,除了实现接口中的操作外,还实现了前面二叉树里面的3种遍历迭代器(用来检测堆是否正确原创 2014-07-15 18:51:16 · 713 阅读 · 0 评论 -
数组实现堆
用数组来实现堆比链式实现简单,这是因为:1)在插入操作中,链式实现需要一个getInsertNode方法去找插入在哪个结点之下,而在数组中,插入结点的位置下标是依次递增的,(完全二叉树)插入操作的向上调整也可以直接根据下标来找父节点(思维和链式一样)2)在删除堆顶的操作中,链式实现把lastNode的值赋给堆顶后,还要去找倒数第二个结点来更新lastNode,而在数组里就不原创 2014-07-15 18:52:07 · 975 阅读 · 0 评论 -
数组实现二叉查找树
1,实例变量,构造器,数组扩展private Object[] contents; private int count; public ArrayBinarySearchTree(Object root) { //Object[] contents = new Object[10]; 悲剧啊!!!!局部变量覆盖了类成员变量原创 2014-07-15 18:47:02 · 952 阅读 · 0 评论 -
转载:解答Google的一道面试题
首先对博主的独立思考和专研精神表示膜拜!转载地址:http://blog.youkuaiyun.com/jiaomeng/article/details/1435226 在找大规模数据处理的相关资料时,逛到该博主博客,发现了很多独立思考的文章。以下为转载全文,红色字体处为我的标注和添加的理解。----------------------------------------转载 2014-07-16 16:45:38 · 420 阅读 · 0 评论 -
谈谈递归
1)递归是一种调用自身的编程技术,能够进行递归编程的关键是能够以递归的方式进行思考。2)任何递归的定义都必须包含一个称为基本条件的非递归部分,是递归最终能够终止,否则会导致无穷递归3)递归编程:方法的每次递归调用都将创建新的局部变量和参数4)在某些情况下,迭代方法显得极为复杂,对于某些问题,递归能够创建简短,高效的程序。5)间接递归是指一个方法调用另一个方法,另一个原创 2014-07-11 15:20:07 · 549 阅读 · 0 评论 -
小猴子下落-一个简单的二叉树问题
描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D 次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一 个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。 一些小猴子从结点1处开始往下跑,最后一个小猴儿会原创 2014-07-15 19:01:07 · 594 阅读 · 0 评论 -
算法设计与分析-哈希表
散列法的基本思想是把键分布在一个称为散列表的一维数组H[0.......m-1]中,我们可以对每个键计算某些被称为散列函数的预定义函数h的值,来完成这种分布。该函数为每个键确定它在H中的下标。一般来说,hash函数的要求:1)使得键在hash表里尽可能均匀的分布2)hash函数必须容易计算显然,如果选择的散列表长度m小于键的数量n,则会碰撞。这是一种2个或多个键原创 2014-07-16 13:27:56 · 1492 阅读 · 0 评论 -
算法设计与分析-变治法
变治法是指这样一组设计方法:它们都基于变换的思想。这些方法都分为两个阶段,变,把问题的实例变得更容易求解,治,在变的基础上对问题求解。3种变换方式:1)将问题变为一个更简单或方便的实例---实例化简(如预排序,高斯消去法)2)变换同样的实例为不同的表现---改变表现(AVL树,多路查找树)3)变换为另一个问题(这种问题的算法是已知的)的实例---问题化简原创 2014-07-16 13:22:50 · 6126 阅读 · 0 评论 -
算法设计与分析学习-分治法1
参考 算法设计与分析 第四章 分治法这篇文章将讨论:1) 分治策略的思想和理论2) 几个分治策略的例子:合并排序,快速排序,折半查找,二叉遍历树及其相关特性。说明:这几个例子在前面都写过了,这里又拿出来,从算法设计的策略的角度把它们放在一起来比较,看看分治是如何实现滴。由于内容太多,我将再花一篇文章来写4个之前没有写过的分治算法:1,大整数乘法原创 2014-07-16 13:08:44 · 802 阅读 · 0 评论 -
算法设计与分析学习-蛮力法
参考 : 算法设计与分析 第三章 蛮力法接下来的每章中,我们专注于一种特定的算法设计策略。蛮力法是一种最简单和直接的解决问题的办法,往往是低效的,但我们不应该忽略它的地位,1)它可以解决广阔领域的各种问题2)在规模允许时,多少可以产生一些实用的算法3)往往可以以蛮力法为准绳,来衡量高效的算法,或者找不到其他算法时,先设计蛮力算法,再做改进好了,很原创 2014-07-16 13:09:17 · 2855 阅读 · 0 评论 -
算法设计与分析学习-算法效率分析
参考 第二章 算法效率分析基础2.1 分析框架输入规模,运行时间,增长次数,最优最差平均效率2.2 基本符号和效率类型一张图,注意一般的效率类型都是什么情况2.3 非递归算法的效率分析很直观--找到基本操作建立基本操作执行次数的求和表达式2.4 递归算法的效率分析不那原创 2014-07-15 19:26:15 · 1084 阅读 · 0 评论 -
各种基本数据结构和算法总结清单
差不多把数据结构里面的主要算法都写了,写一个概要吧。1,数组有序数组与无序数组的删除,插入,查找操作,时间复杂度,很简单:2,简单排序时间复杂度在O(n^2)级别的,虽然都是平方级别的,但也有快慢之分:一般来说: 插入 > 选择 > 冒泡冒泡:不变性:在排序过程中,已排好的那部分(即冒泡到的最终位置就原创 2014-07-15 19:08:16 · 854 阅读 · 0 评论 -
图简介2- 邻接表实现无向图+深度/广度优先搜索
用邻接表实现了一个无向图,在实现时,包含了添加和删除顶点,添加和删除边,size方法(顶点个数),isEmpty方法,广度和深度优先迭代器1,成员变量,构造方法,数组扩展private VNode[] VNodes; //将顶点放在数组中 private int nodeCount; //顶点个数,也表示下一个可用的顶点数组原创 2014-07-15 18:58:48 · 1594 阅读 · 0 评论 -
简单排序-选择、插入、冒泡排序
3种顺序排序方法。简单排序是指时间复杂度为O(n^2)的排序方法。1)选择排序将某个特定值有序的放置在最终位置上---外层循环控制最终位置的序号,内层循环从外层循环序号处向后遍历,找到最小值。2)插入排序插入排序将某个特定值插入到值列的某个子集中,并重复该过程---外层循环控制要插入的数据(从第二个数到最后一个),内层循环控制前面已排好序的的值后移。3)冒泡原创 2014-07-11 15:22:00 · 606 阅读 · 0 评论 -
括号配对问题
描述 现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No样例输入3[(])(])([[]()])样例输出NoNoYes123456789101112131415161718192021222324252627282930原创 2014-07-15 18:53:41 · 456 阅读 · 0 评论 -
分别用数组和链表实现集合数据结构
1,怎样来定义一个数据结构?一般来说,你要1)先定义这个数据结构的抽象机制(即ADT),用一个接口来表示,2)用一个类(即表示数据结构)来实现这个接口(即实现这个数据结构)3)考虑怎样来实现这个数据结构(例如存储形式,维护那些变量等)例如,要写一个集合的数据结构,1)先要根据你需要的功能设计好集合里面需要定义哪些操作(方法),可以把它写成一个接口ADT,原创 2014-07-15 18:18:19 · 910 阅读 · 0 评论