随笔分类 -  算法

摘要:一,部分背包问题介绍 首先介绍下0-1背包问题。假设一共有N件物品,第 i 件物品的价值为 Vi ,重量为Wi,一个小偷有一个最多只能装下重量为W的背包,他希望带走的物品越有价值越好,请问:他应该选择哪些物品? 0-1背包问题的特点是:对于某件(更适合的说法是:某类)物品,要么被带走(选择了它),要 阅读全文
posted @ 2016-06-11 15:45 大熊猫同学 阅读(18371) 评论(0) 推荐(0) 编辑
摘要:这篇文章主要用来记录我对《算法导论》 贪心算法一章中的“活动选择问题”的动态规划求解和贪心算法求解 的思路和理解。 主要涉及到以下几个方面的内容: ①什么是活动选择问题 粗略提下,详细请参考《算法导论》 ②活动选择问题的DP(Dynamic programming)求解--DP求解问题的思路 ③活动 阅读全文
posted @ 2016-06-10 17:17 大熊猫同学 阅读(9458) 评论(1) 推荐(0) 编辑
摘要:一,问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB 则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二,算法求解 这是一个动态规划的题目。对于可用动态规划求解的问题 阅读全文
posted @ 2016-06-09 16:52 大熊猫同学 阅读(55171) 评论(14) 推荐(15) 编辑
摘要:一,介绍 分治算法主要包含两个步骤:分、治。分,就是递归地将原问题分解成小问题;治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式;比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代 阅读全文
posted @ 2016-05-29 10:15 大熊猫同学 阅读(8502) 评论(0) 推荐(1) 编辑
摘要:一,希尔排序算法介绍 ①希尔排序又称缩小增量排序 ,它本质上是一个插入排序算法。为什么呢? 因为,对于插入排序而言,插入排序是将当前待排序的元素与前面所有的元素比较,而希尔排序是将当前元素与前面增量位置上的元素进行比较,然后,再将该元素插入到合适位置。当一趟希尔排序完成后,处于增量位置上的元素是有序 阅读全文
posted @ 2016-05-28 21:50 大熊猫同学 阅读(6637) 评论(1) 推荐(3) 编辑
摘要:一,介绍 ①什么是桶排序? 桶排序是在已经数据的范围的条件下,创建若干个桶,根据相应的比较规则将待排数据落入各个对应的桶中,最后扫描 桶 来实现排序。 ②桶排序需要的附加条件 数据的范围已知。 比如,输入整数数据 A(1) A(2)......A(n-1) A(n),它们都是由小于M的整数组成,此时 阅读全文
posted @ 2016-05-27 15:17 大熊猫同学 阅读(4837) 评论(4) 推荐(0) 编辑
摘要:一,快速排序介绍 快速排序与归并排序一样,也是基于分治的递归算法,体现在:在每一趟快速排序中,需要选出枢轴元素,然后将比枢轴元素大的数组元素放在枢轴元素的右边,比枢轴元素小的数组元素都放在枢轴元素的左边。然后,再对分别对 枢轴元素左边 和 枢轴元素右边的元素进行快速排序。 二,快速排序算法分析 ①相 阅读全文
posted @ 2016-05-25 16:59 大熊猫同学 阅读(10099) 评论(0) 推荐(0) 编辑
摘要:一,归并排序介绍 归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组(可能相差1),最终当划分的子数组大小为1时(下面代码第17行left小于right不成立时) ,将划分的有序子数组合并成一个更大的有序数组。为什么是有序子数组??? 归并排序的递归公式:T(N) = 阅读全文
posted @ 2016-05-24 11:10 大熊猫同学 阅读(37240) 评论(1) 推荐(0) 编辑
摘要:一,堆排序介绍 堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大。将 待排序的数组 建堆,然后不断地删除堆顶元素,就实现了排序。关于堆,参考:数据结构--堆的实现之深入分析 下面的堆排序算法将数组中的元素从小到大排序,用大顶堆来实现。 二,堆排序算法分析 现给定了一维数组,需要将数组中的元素使 阅读全文
posted @ 2016-05-24 10:14 大熊猫同学 阅读(9701) 评论(0) 推荐(0) 编辑
摘要:一,插入排序介绍 插入排序是基于比较的排序。所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置。 因此,对于这类排序,就有两种基本的操作:①比较操作; ②交换操作 其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先 阅读全文
posted @ 2016-05-22 22:32 大熊猫同学 阅读(40359) 评论(0) 推荐(1) 编辑
摘要:都是基于内存的排序算法,包括插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序 14年在网易Blog上写的,现把它放到这里。 一,直接插入排序 总体思路:位于表中后面的元素依次与表中前面的元素比较,若比之小,则还需继续和更前面的元素比较,直至遇到一个比它大的元素或者比较到第一个元 阅读全文
posted @ 2016-05-22 20:28 大熊猫同学 阅读(4220) 评论(0) 推荐(0) 编辑
摘要:一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点。 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低的,要么用排序,要么用堆。用堆的话,出堆的复杂度为O(logN),而向堆中插入一个元素的平均时间复杂 阅读全文
posted @ 2016-05-15 20:38 大熊猫同学 阅读(2444) 评论(2) 推荐(0) 编辑
摘要:一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点。求出图中所有顶点到源点的最短路径。 无向图的最短路径其实是源点到该顶点的最少边的数目。 本文假设图的信息保存在文件中,通过读取文件来构造图。文件内容的格式参考这篇文章第一部分。 二,算法实现思路 无向图的最短路径实现相对于带权的有向图最短路 阅读全文
posted @ 2016-04-26 16:56 大熊猫同学 阅读(26154) 评论(3) 推荐(2) 编辑
摘要:一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常。 要想实现图的算法,如拓扑排序、最短路径……并运行看输出结果,首先就得构造一个图。由于构造图的方式有很多种,这里假设图的数据存储在一个文件中, 每一行包含如下的信息: LinkID,SourceID,Destina 阅读全文
posted @ 2016-04-25 22:19 大熊猫同学 阅读(26996) 评论(0) 推荐(2) 编辑
摘要:一,问题描述 需要生成一个[0,1]的随机数。即随机生成 0 或者 1。使用java.util.Random类的 nextInt(int)方法,当构造Random类的对象并提供随机数种子时,发现了一个奇怪的问题: 当使用 47 作为随机数种子构造 Random对象时: 使用该对象调用 nextInt 阅读全文
posted @ 2016-04-19 16:57 大熊猫同学 阅读(1796) 评论(2) 推荐(0) 编辑
摘要:一,问题描述 给定(可能有负数)整数a(1)、a(2)、……a(n),求 a(1)+a(2)+……+a(j)的最大值。为方便起见,若所有的整数为负数,则最大子序列和为0. 也就是:在一系列整数中,找出连续的若干个整数,这若干个整数之和 最大。 二,求解思路 下面介绍两种思路,一种的时间复杂度为O(N 阅读全文
posted @ 2016-04-18 17:03 大熊猫同学 阅读(11658) 评论(0) 推荐(3) 编辑
摘要:一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相加的最大值,其中被加数的下标大于加数的下标。由加法运算的可逆性,j >i 这个条件可以去掉。 即求出: maxValue = max{arr[j]+arr[i] and j > i} 在数组arr中没有重复的元素情况 阅读全文
posted @ 2016-04-18 10:09 大熊猫同学 阅读(2124) 评论(0) 推荐(0) 编辑
摘要:一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标。 即求出: maxValue = max{arr[j]-arr[i] and j >= i} 二,求解思路 下面采用两种不同的算法来求解,第一种算法的时间复杂度为O(N) 阅读全文
posted @ 2016-04-17 22:20 大熊猫同学 阅读(3680) 评论(0) 推荐(1) 编辑
摘要:一,介绍 本文主要二叉树的两种基本的典型应用: 1) 输出某个文件夹下所有文件名称(可以有子文件夹) 用先序遍历实现 2) 统计某个文件夹的大小(该文件夹下所有文件的大小--用后序遍历实现 二,实现分析 对于问题 1),输出文件名称的过程如下: 如果是文件夹,先输出文件夹名,然后再依次输出该文件夹下 阅读全文
posted @ 2016-04-15 20:51 大熊猫同学 阅读(2702) 评论(0) 推荐(0) 编辑
摘要:一,介绍 对于二叉排序树而言,其相关操作与树的高度息息相关。设树中有N个节点, 尽管各个操作的平均时间复杂度为O(logN),但当输入的序列有序时,构造出来的树是一个单分支的树,其高度为O(N) 故对二叉排序树的各个操作(如,findMax、contains、findMin...)的时间复杂度也退化 阅读全文
posted @ 2016-04-14 16:42 大熊猫同学 阅读(4550) 评论(0) 推荐(0) 编辑