
算法学习
华都烟梦
这个作者很懒,什么都没留下…
展开
-
使用链表实现环结构以解决约瑟夫环问题
自从上次面试后,发现自己的基础很不行,应该说一直不行(因为是电信专业的,只学过简单地VB和C,当然这只是一个借口而已)。总之,决定以后争取每天写个小程序动动脑筋,东西可能写的很烂。但是只要动脑筋的目的达到了,也就没有什么好计较了得。 今天写的是一个关于约瑟夫环的问题。关于约瑟夫环,百度复制一下:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一原创 2013-09-17 18:42:54 · 1215 阅读 · 0 评论 -
Dijkstra算法的Java实现
迪科斯彻(Dijkstra)算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法最终得到一个最短路径树。在一个有向非负权重的图中,可以知道如AC>AB,这AC+CB>AB,这一不等式有点贪心算法的思想,每次选择时都做出贪心选择。在迪科斯彻算法中就是使用了上面的原理进行求解的。具体的介绍可以wiki一下:http://zh.wikipedia.org/wiki/Dijkstra算法.里面已经包含了伪代码。下面是Java版的实现代码,需要注意的是这里没有使用伪代码中的优先队列,而是使用一个布尔类型的原创 2013-12-09 17:39:17 · 3998 阅读 · 0 评论 -
算法基础_递归的例子
写了几个常见的简单的递归的例子,包括n阶乘、三角形数、二分查找以及汉诺塔问题。很简单,不过确实是用递归的思想解的,那么递归是什么呢?不去百度,就现在用我自己的语言来说就是通过不断的调用自身使得问题的规模越来越小,直到最小规模。这里的最小规模就是递归的"基值情况"。要想用递归解问题,首先需要知道基值情况是什么,比如求N阶乘的基值情况是n=1。不再废话,上代码。 package原创 2013-11-03 19:06:21 · 1298 阅读 · 0 评论 -
IDDFS(Iterative deepening depth-first search)的Java实现
IDDFS,本人译作迭代深度的深度优先搜索。其实上就是深度优先搜索,只不过它对搜索深度进行了限制,使得在搜索到限制深度后必须开始新的搜索路径。以至于看上去像是广搜(总是先完成第n的所有节点的搜索,再开始第n+1的节点的搜索。放在这里的话,n指的就是当前的限制深度)。代码如下:原创 2013-12-17 20:36:14 · 2992 阅读 · 2 评论 -
A*算法搜索地图的Java实现
写了下A*(读作A星,或者A Star)算法的地图搜索,作为一个算法新手来说,感觉真的很好啊,因为据说如果存在最优解,那么在使用一个合理的估价函数的前提下A*算法能够得到最优解。我会说在检查完运行结果后,我的内心不经涌起了一股成就感吗? 什么是A*算法,个人觉得A*算法是基于Dijkstra算法的一种优化,同样是基于广搜,并有一个当前列表检索列表,并不断的从优先队列中移除已完成节点。但是A*算法中多了一个开放队列,我想正是因为这个开放队列的存在,才使得A*算法能够求的最优解,因为最优解总是会包含在这个开放原创 2013-12-12 16:58:07 · 3834 阅读 · 1 评论 -
java排序算法(一)_冒泡排序、插入排序、选择排序
回顾了下数据结构,写了几个简单的排序,包括冒泡排序,插入排序,选择排序。 冒泡排序,从左到右依次判断相邻的两元素的大小如果左边的比右边的大,则交换位置。这样一次从左到右的遍历就能得到一个为排序队列中的最大值。然后将这个最大值放置到数组的右侧。因为未完成排序的元素越来越少,那么当所有元素都以完成排序时,循环结束。这里需要一个两侧的循环机制,算法耗时:O(N*N)。见代码:pa原创 2013-10-20 13:27:04 · 1664 阅读 · 0 评论 -
排序算法(二)_希尔排序、快速排序、归并排序的Java实现
希尔排序(Shell Sort):希尔排序其实就是一种特殊处理过的插入排序,是按指定的间隔增量进行插入排序,所以希尔排序也叫增大间隔插入排序。相对于普通的插入排序而言,希尔排序会对排序的过程加以控制,从而避免了一些极端输入情况(如一个倒序输入数列)对于算法运行时间的影响。 归并排序(Merge Sort):归并排序是通过分治法思想来实现的。通过不断将问题切割成两个规模更小的子问题,知道基本情况(Base Case),然后将这些子问题的解整合起来合成问题的解。一般情况下归并排序优于希尔排序原创 2013-12-25 09:30:09 · 1495 阅读 · 0 评论 -
排序算法(三)_计数排序、基数排序的Java实现
继续排序相关的内容,上次聊了几个theta(nlgn)的比较型排序,今天聊一下线性时间theta(n)甚至theta(lgn)的排序算法。都比较简单,大部分内容来自<算法导论>公开课视频。两个算法分别是计数排序、基数排序,如果不看书的话,真的很难凭空想到。 计数排序:设有待排序数组A,辅助数组B,结果数组C。计数排序的关键有两点: 一、在于辅助数组的设计,辅助数组C上元素的索引对应数组A中的某个具体的元素。而C上的元素C[i],则表示了A中有C[i]个元素小于等于值i。原创 2013-12-27 08:38:46 · 1427 阅读 · 0 评论 -
算法学习_字符匹配算法(BF,KMP,BM)
本文的内容都是来自<Cpp数据结构原理与经典问题求解>一书,除了一些笔者自己的理解描述外,并无原创。仅作笔记之用。 转入正题,首先是问题的定义,这里的字符匹配指的是连续的子串匹配,而不是公共子序列。举例:asdfgge和dfg是匹配的,因为asdfgge包含了dfg。问题就是判断子串A中是否包含子串B。 概要的介绍了BF,BM,KMP三种字符串匹配算法。原创 2014-03-11 21:47:48 · 1552 阅读 · 0 评论 -
基于图的深度优先搜索和广度优先搜索java实现
为了解15puzzle问题,了解了一下深度优先搜索和广度优先搜索。先来讨论一下深度优先搜索(DFS),深度优先的目的就是优先搜索距离起始顶点最远的那些路径,而广度优先搜索则是先搜索距离起始顶点最近的那些路径。我想着深度优先搜索和回溯有什么区别呢?百度一下,说回溯是深搜的一种,区别在于回溯不保留搜索树。那么广度优先搜索(BFS)呢?它有哪些应用呢?答:最短路径,分酒问题,八数码问题等。言归正传,这里笔者用java简单实现了一下广搜和深搜。其中深搜是用图+栈实现的,广搜使用图+队列实现的,代码如下:原创 2013-12-06 16:49:06 · 10625 阅读 · 3 评论 -
斐波那契数列3种解法(朴素递归、动态规划、数学归纳)及算法分析
本文来自网易公开课的第3讲分治法。让我对分治法的使用有了一个新的认识。今天论述的主要对象是斐波那契数列,先了解一下什么是斐波那契数列。斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契原创 2013-11-28 15:41:34 · 9205 阅读 · 0 评论 -
动态规划_最大子序列和问题以及最大子序列问题
看书看到用分治法解最大子序列和的问题。看懂了思路后自己试着写了一下。所谓的分治法就是通过不断将求解范围划分成更小的的求解问题,知道问题范围不再可分为止。这里用到了递归。那么我不禁要想,递归和分治有什么区别,也不去Google了。递归的使用通常是当前问题是基于上一个更小范围的问题求解,这种关联关系是连续的。分治则是由"分"和"治"两部分组成的,这中间当然也是有递归的思想在的。这么说吧,求N阶乘问题就原创 2013-11-04 12:33:59 · 1574 阅读 · 0 评论 -
动态规划_矩阵链连乘问题
矩阵链连乘问题:由于不同的矩阵相乘顺序会导致不同的矩阵标量元素相乘的操作数,求设矩阵队列A1A2A3...An-1An的最小相乘操作数。好吧,先让我们回顾一下线性代数中矩阵乘法的相关知识(其实看到这个题目时我已经忘了两个矩阵是怎么相乘的了,刚好回顾一下),两个矩阵只有相容才能相乘。即A x B要求A的列数等于B的行数。如[n x m]和[m x p]的两个矩阵是可以相乘的,且它们相乘的标量运算原创 2013-11-17 15:52:59 · 1716 阅读 · 0 评论 -
贪心算法_活动安排问题
看了下贪心算法,直觉上以为适用于用贪心算法解决的问题好像并不多啊,不过现在先不说这个。先讨论下动态规划和贪心算法的不同之处,下面是一些本人结合书本得出的体会:1、动态规划通常是自底向上求解问题的(当然也可以是"带备忘"的自顶向下求解问题),每一次选择都面向多个子问题选择,只不过这些子问题的解都是基于那些已经求解的子子问题的解。从本质上说动态规划遍历了所有的可能解,只是在求解子问题时使用了“子子原创 2013-11-21 10:37:17 · 5242 阅读 · 2 评论 -
贪心算法_哈夫曼编码问题(Huffman Coding)
哈夫曼编码问题,可以用贪心算法来解还是比较爽的啊(上一篇博客我在想贪心算法能解的问题不多)。下面来详细讨论一下哈夫曼编码问题。问题描述:现有一个文本文件,其中包含的字符数据出现的次数各不相同,先要求对该文本中包含的字符进行编码,使文本占用的位数更小。问题分析:我们知道文件的存储都是以二进制数表示的,如:字符c可以表示为010101之类的。因为不同的操作系统对于不同的数据类型会分配给相同的数原创 2013-11-26 15:21:30 · 9330 阅读 · 1 评论 -
动态规划_01背包问题
01背包,很经典的背包问题。为什么叫01背包呢?就是有或者没有,或者说一件物品装或者不装进背包。0表示不装,1表示装。好了,01背包问题就是有n个物品P1,P2,P3...Pn,对应的价值分别是V1,V2,V3...Vn。又有一个背包,容量为C。求该背包中能装下物品的最大价值。原创 2013-11-08 21:27:58 · 1431 阅读 · 0 评论 -
动态规划_最大子路径和问题
看到动态规划,目前还是不能很透彻的理解状态转移的思想,不过基于“每日一题”的目标,在看了一个动态规划的问题(即最大子路径和问题)的介绍之后还是动手写了一个程序,关于动态规划的思想,可能还需要在做更多的题目,慢慢的体会吧。package com.wly.algorithmbase.dailyproblem;import java.util.ArrayList;/** * 动态规原创 2013-11-06 19:24:57 · 1452 阅读 · 0 评论 -
回溯法_n皇后问题
尼玛,终于写好了~~~,菜鸟写个题目不容易啊 昨晚看了下回溯法,回溯法其实就是深度优先检索,不断的按最优解先进,当前面没有可用解时,在回溯到上一个可用解,重新选择新的可用解。之后了解了下8皇后问题,就动手写了。这篇文章叫每日一题,不知道自己能坚持几天。原创 2013-11-05 20:36:30 · 1288 阅读 · 0 评论 -
动态规划_钢条切割问题
继续扯动态规划的思想,首先动态规划的关键在于重复子问题特性。因为这一特性导致了动态规划思想优于分治法,动态规划将重复子问题的解保存起来,再自底向上求解上层子问题(也可以称为子阶段,如背包问题中,我认为称为子阶段更恰当)。动态规划很仔细的安排子问题的求解顺序,即在求解一个某个子问题时,该子问题的子子问题的解都已经求的,并被保存起来了,只需从内存中读取,而无需再次求解。这就话很重要啊,这就是为什么在解目标长度为n的钢条切割问题时,要使n从1开始递增的原因了。好了,关于动态规划的思想,留些下次再扯吧,下面是程序代原创 2013-11-14 18:50:04 · 1817 阅读 · 0 评论 -
动态规划_最大公共子序列长度问题
昨晚部门出去吃火锅,十来个人有说有笑的,感觉很不错,不过因此昨天的"每日一题"也就没时间了,现在补上。问题:有两个字符串A=a1 a2 a3 ... an和B=b1 b2 b3 ... bm,求两者的最大公共子序列的长度,这里的公共子序列就是相同的两个字符串中字符相同的子序列。如:abcdefg 和 acghlm的最大公共子序列是acg。下面来聊聊本人对动态规划的一点浅显的想法,权当抛砖引玉只原创 2013-11-08 18:55:49 · 1095 阅读 · 0 评论 -
Alogrithm_百元组合问题
/** * 拆分100元问题 * 描述:现有若干1元,5元,10元,20元,50,求有多少中组合能组成100元。 * 求解思路一:通过for循环遍历所有可能的组合 * 求解思路二:问题拆分 * S100 = S99 + S95 + S10 + S20 + S50 * S50 = S49 + S45 + S40 + S30 + 1 * S20 = S19 + S15 + S10 + 1原创 2015-12-17 22:27:55 · 588 阅读 · 0 评论