Algorithm
文章平均质量分 81
笔者学习算法原理记录
Lam Tang
十年编程两茫茫,工期短,需求长。千行代码,Bug何处藏。纵使上线又如何,新版本,继续忙。黑白颠倒没商量,睡地铺,吃食堂。夜半梦醒,无人在身旁。最怕灯火阑珊时,手机响,心里慌。
展开
-
二分查找杂谈之旋转排序数组
前言笔者在之前文章中整理了二分查找的相关内容及其变式内容,这里笔者同样也整理出一些二分查找相关的习题以便自己以后能够方便的复习二分查找相关内容。这些习题全部出自LeetCode,大家按照题号自行搜索即可。0033. 搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定...原创 2020-03-15 15:53:41 · 150 阅读 · 0 评论 -
LeetCode股票交易问题系列记录
在LeetCode上有六道股票交易系列的算法习题,虽然这些习题的标签基本都是动态规划,但是初学者似乎很难短时间内写出高效的解决方案。笔者之前在刷这些习题的时候碰到了一个十分不错的想法,即动态规划结合有限状态机的思想来确定状态转移方程,笔者这里简单的记录一下供大家阅读拓展思路。通用模板利用“状态”进行穷举,具体到每一天,看看总共有集中可能的“状态“,再找出每个状态对应的选择。伪代码如下:for...原创 2020-03-14 20:53:11 · 709 阅读 · 0 评论 -
背包问题之最优方案总数
此处的最优方案是指物品总价值最大的方案。这里以0-1背包问题为例。给定数据如下:c = [2,3,4,5,6,7,8];v = [3,4,5,6,7,8,9];V = 23;结合求最大总价值和方案总数两个问题的思路,最优方案的总数可采取如下方式求解:令 dp[i][j]dp[i][j]dp[i][j] 表示前 i 件物品在代价为 j 时的最大价值,key[i][j]key[i][j]ke...原创 2020-03-13 13:21:05 · 1368 阅读 · 0 评论 -
背包问题之输出最优方案
一般而言,背包问题要求一个最优解,若要求输出这个最优值的方案,可参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,也就是说,记录下它是由哪一项决策推出来的,便可以根据这个决策找到上一个状态,从上一个状态接着往前推即可,这里以0-1背包为例子,给定输入如下:c = [2,3,4,5,6,7,8];v = [3,4,5,6,7,8,9];V = 23;...原创 2020-03-13 13:19:53 · 2352 阅读 · 0 评论 -
背包问题之分组背包问题
问题描述:有N件物品和一个容量为V的背包。第 i 件物品的代价是 c[i],价值是 v[i]。这些物品被划分为若干组,每组中的物品相互冲突。最多选一件。求解将哪些物品放入背包可以在总代价不超过V的条件下(物品必须保持完整)使其其总价值最大。现有数据如下:c = [[1,2,3],[2,3,4],[5,6,7,8],[7,9]];v = [[2,3,4],[1,2,3],[4,5,6,7],[8...原创 2020-03-13 13:17:57 · 449 阅读 · 0 评论 -
背包问题之二维费用背包问题
问题描述:对于每种物品,都具有两种不同的代价 c1[i]c_1[i]c1[i] 与 c2[i]c_2[i]c2[i];选择该物品必须同时付出这两种代价;对于每种代价都有一个可付出的最大值(上限)。问在每个物品只能使用一次的条件下,怎么选择物品(物品保持完整)可得到最大的价值。现有数据如下:c1 = [2,3,4,5,6,7,8]; // 代价1cap1 = 27; // 代价1的上限c2...原创 2020-03-13 13:16:43 · 428 阅读 · 0 评论 -
背包问题之混合背包问题
即前面三种背包问题混合起来,也就是说,有些物品只能取一次,有些物品可以取无限次,而有些物品可以取的次数有一个上限。问题描述如下:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]且第 i 种物品最多有 p[i] 件(其中 p[i]=0表示完全背包,p[i]=1表示0-1背包,剩下就表示多重背包问题。注意0-1背包问题是多重背包问题的特例)。背包容量...原创 2020-03-13 13:14:48 · 434 阅读 · 0 评论 -
背包问题之多重背包问题
问题描述:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]且第 i 种物品最多有 p[i] 件。背包容量为 V,试问在每个物品不超过其上限的件数(物品必须保持完整)的情况下,如何让背包装入的物品具有更大的价值总和。现有数据如下:w = [2,3,4,5];v = [3,4,5,6];p = [1,1,1,1]; // 结果与0-1背包一样。...原创 2020-03-13 13:13:02 · 558 阅读 · 0 评论 -
背包问题之完全背包问题
问题描述:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]。背包容量为 V,试问在每个物品有无限个(物品必须保持完整)的情况下,如何让背包装入的物品具有更大的价值总和。现有数据如下:w = [2,3,4,5];v = [3,4,5,6];V = 10;解题思路:令 dp[i][j]dp[i][j]dp[i][j] 表示从编号 1~i 的...原创 2020-03-13 13:11:11 · 648 阅读 · 0 评论 -
背包问题之0-1背包问题
问题描述:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]。背包容量为 V,试问在每个物品最多使用一次(物品必须保持完整)的情况下,如何让背包装入的物品具有更大的价值总和。现有数据如下:w = [2,3,4,5];v = [3,4,5,6];V = 8;解题思路:令 dp[i][j]dp[i][j]dp[i][j] 表示容量为 j 时放...原创 2020-03-13 13:07:35 · 843 阅读 · 0 评论 -
背包问题之分数背包问题
问题描述:有n个物品,第 i 个物品的重量与价值分别为 w[i]w[i]w[i] 与 v[i]v[i]v[i]。背包容量为 V,如何让背包装入的物品具有更大的价值总和(物品可以取一部分)。现有数据如下:w = [2,3,4,5];v = [3,4,5,6];V = 8;解题思路:该问题与0-1背包问题不同的是,该问题的求解可以使用贪心算法做出贪心策略,而0-1背包问题的求解需动态规划。本...原创 2020-03-13 13:05:15 · 2809 阅读 · 0 评论 -
二分查找杂谈之变式
笔者今天无意间看到了之前收藏的一个公众号推文,内容是关于二分查找的。笔者在这里就和大家絮叨絮叨。说起二分查找,想必大家应该比较熟悉吧,Java中Arrays中的binarySearch()函数表示的正是二分查找算法。该算法主要用于在有序数组中查找指定元素key,若元素存在,则直接返回下标。这里笔者在LeetCode上找了一个二分查找的直接例子——传送门。二分查找代码如下 public in...原创 2020-03-09 21:27:00 · 206 阅读 · 0 评论 -
排序算法总结
排序算法作为基础算法,相信大家在学校上C语言课程的时候都接触过一些。笔者这里暂时将之前写的排序算法博客简单的总结一下。冒泡排序及双向冒泡排序选择排序插入排序合并排序(或归并排序)及扩展堆排序快速排序计数排序基数排序桶排序比较排序算法以上算法中的部分算法有个特点,即在排序的最终结果中,各元素的次序依赖于它们之间的比较。这类排序算法称之为比较排序算法。其中上述排序算法...原创 2020-01-11 16:53:34 · 106 阅读 · 0 评论 -
浅谈排序算法之桶排序(9)
本篇博客是今天笔者写的最后一篇排序算法的博客了。桶排序(bucket sort)假设输入数据服从均匀分布,平均情况下其时间代价为O(n)。计数排序假设数据都属于一个小区间的整数,而桶排序则假设数据均匀、独立分布在[0,1)上。桶排序将区间[0,1)划分为n各大小相同的子区间,称之为桶,然后将数组中的所有元素都放在对应的桶中。为了得到排序结果,先对桶中的元素进行排序,然后依次遍历每个桶把桶中的元素...原创 2020-01-11 16:23:20 · 152 阅读 · 0 评论 -
浅谈排序算法之基数排序(8)
基数排序(radix sort)是一种用于卡片排序机上的算法。对待排序数组A,算法先按最低有效位来进行排序,即首先根据所有元素的个位上的值进行排序,然后再根据十位上的值进行排序,直至超过数组中最大元素的宽度。为了确保基数排序算法的正确性,一位数排序算法必须是稳定的,即若两个数的某一位上的值一样,那么排序后这两个数的相对位置也不能发生改变。基数排序只是一种策略,并没有给出具体的代码实现,其伪代码如...原创 2020-01-11 16:02:11 · 241 阅读 · 0 评论 -
浅谈排序算法之计数排序(7)
接下来的三篇博客里,笔者将会简单聊聊三种线性时间复杂度的排序算法,即计数排序、基数排序以及桶排序,均出自《算法导论》。计数排序假设数组A中的所有元素都是0~k区间内的一个整数,其中k为某个整数值。计数排序的思想是对每一个数组元素x,计算小于x的元素的个数。计数排序的实现过程分为三步:计算数组A中每个元素出现的次数。统计数组A中存在多少个元素小于等于A中的指定元素。从后往前依次遍历数组A,...原创 2020-01-11 15:30:17 · 150 阅读 · 0 评论 -
浅谈排序算法之快速排序(6)
忙完论文的事,笔者终于有时间继续学习算法了。以前一直觉得快速排序(Quick Sort)很神秘,今天笔者就学习一下《算法导论》关于快速排序的部分内容。快速排序是一种最快情况时间复杂度为O(n^2)的排序算法,但是其平均性能较好,且为原址排序算法,因此像Java的Arrays类中的静态函数sort就是使用快速排序实现的。与归并排序算法一样,快速排序也是使用了分治思想。对一个数组A[p…r]快速排序...原创 2020-01-11 11:26:35 · 167 阅读 · 0 评论 -
浅谈排序算法之堆排序(5)
近日,笔者忙里偷闲,学习了下堆排序(Heap-Sort)。堆排序算法,就时间复杂度而言,堆排序跟合并排序(Merge-Sort)算法是一样的,都是O(n * log(n));就排序方式而言,堆排序跟插入排序(Insertion-Sort)一样,都具有空间原址性。这里首先介绍下堆的概念。堆,或者称为二叉堆,可以看作是一棵近似的完全二叉树。在这棵树中,除了最底层以外,该树是完全充满的,而且是从左至右...原创 2019-10-26 11:25:29 · 169 阅读 · 0 评论 -
浅谈排序算法之冒泡排序(1)续
今天下午笔者在网上查阅算法时,无意间发现了一个算法,名曰“鸡尾酒排序”。啥?没听过啊,点击去一看,该算法是冒泡排序算法的一种改进。在每一次循环的时候,从当前剩下未排序的数组里选择最小值放在数组前面,最大值放在数组后面(这里的前面与后面指的是在未排序部分)。因此,该算法本身外层迭代次数为数组长度的一半。例如,对于原始数组14, 12, 18, 12, 1, 6, 18, 4, 0, 2, 0...原创 2019-10-24 18:52:17 · 146 阅读 · 0 评论 -
浅谈排序算法之合并排序(4)续
笔者在上一篇博客中谈到了合并排序算法,其是分治思想的一种体现。在《算法导论》后的一道例题上,笔者看到了一道例题如下:假设A[1…n]是一个由n个不同元素构成的数组。若i<j且A[i]>A[j],则对偶(i, j)称为数组A的一个逆序对。给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏的情况是O(n * log(n))(提示,修改合并排序算法)。首先,通过最简单方式,即双...原创 2019-10-17 13:58:23 · 233 阅读 · 0 评论 -
浅谈排序算法之合并排序(4)
在前三篇博客中,笔者分别讲述了冒泡排序、选择排序以及插入排序,这三种排序算法是比较基本算法,原理也好,实现也罢,难度都不是很大。笔者在这篇博客中,打算聊聊归并排序(Merge-Sort)。《算法导论》中提到,归并排序是分治(Divide-and-Conquer)思想的第一个应用。分治思想中,对于一个给定的问题,将该问题分解为多个子问题,每个子问题又可以向下继续分解,直到分解出的子问题十分容易地就...原创 2019-10-16 23:24:32 · 546 阅读 · 0 评论 -
浅谈排序算法之插入排序(3)
笔者在前面两篇文章当中简单介绍了下冒泡排序以及选择排序,这里顺带介绍下插入排序(Insertion-Sort)。举个栗子(出自《算法导论》第三版)。一堆无序的扑克牌,从上面抽取第一张,放在手上,然后抽取第二张,比较和第一张的大小。若小于第一张扑克,则放在第一张扑克的前面,否则放在第一张扑克的后面。然后抽取第三张,若小于第一张扑克,在放在最前面;若大于等于第一张扑克且小于等于第二张扑克,则放在两...原创 2019-10-16 20:22:03 · 138 阅读 · 0 评论 -
浅谈排序算法之选择排序(2)
笔者在上一篇博客中回顾了下冒泡排序(Bubble-Sort),这里写篇博客讲讲选择排序(Selection-Sort)。选择排序在每一次的迭代中,不直接交换相邻元素,而是从数组中选择出当前数组中的最小值(最大值)的索引,并于当前待排序位置的索引进行比较。若不相等,则交换之,亦即会出现如下情况当前最小值: 3 -> [7, 36, 18, 7, 39, 35, 12, 29, 37, 3,...原创 2019-10-16 19:49:39 · 171 阅读 · 0 评论 -
浅谈排序算法之冒泡排序(1)
今日打算入手学习一下算法相关的东西,就先从排序算法说起。冒泡排序(Bubble-Sort)应该是大学里C语言课堂上学到的最早几个排序算法之一的吧。考虑排序后数组为升序排序的情况。冒泡排序,就是在每一次迭代循环中,从当前剩下的数组中选择最小或者最大的值,并将其移动带数组前面或者后面,直到整个数组呈现出升序排序。由于算法本身偏于简单,因此这里就没有动态图来做演示(主要是因为自己不会做)。另外,由于笔...原创 2019-10-16 19:26:47 · 290 阅读 · 0 评论