
算法学习
文章平均质量分 72
magic-zhu
菜的抠脚的前端
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
纯Javascript实现平滑曲线生成
平滑曲线生成是一个很实用的技术很多时候,我们都需要通过绘制一些折线,然后让计算机平滑的连接起来,先来看下最终效果(红色为我们输入的直线,蓝色为拟合过后的曲线) 首尾可以特殊处理让图形看起来更好:)实现思路是利用贝塞尔曲线进行拟合贝塞尔曲线简介贝塞尔曲线(英语:Bézier curve)是计算机图形学中相当重要的参数曲线。二次贝塞尔曲线二次方贝塞尔曲线的路径由给定点P0、P1、P2的函数B(t)追踪:三次贝塞尔曲线对于三次曲线,可由线性贝塞尔曲线描述的中介点Q0、Q1、Q2,和由二.原创 2021-07-12 11:42:47 · 2061 阅读 · 0 评论 -
《算法导论》第四部分-贪心算法浅析及其 Javascript 实现
系列目录:《算法导论》一,二部分算法浅析及其 Javascript 实现《算法导论》第四部分-动态规划浅析及其 Javascript 实现完整的代码都在这里贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。贪心算法原创 2021-04-15 10:04:56 · 253 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第十五章 - 最优二叉搜索树(包含js版代码实现)
《算法导论》ʚ读书笔记&浅析ɞ 第十五章 - 最优二叉搜索树(包含js版代码实现)背景简介关于二叉搜索树关于最优二叉搜索树,算法导论给了一个生动的例子。以下是描述截图:从上述的截图中可以知道搜索一个单词是有搜索成本的,我们将它定义为dx 代表伪节点(正常节点都未命中时的虚拟节点)pi 第i个节点命中的概率qi 第i个伪节点命中的概率举个例子:第2个节点的搜索代价 = (K2深度+1)*P2 + (D2深度+1)*Q2 = (0+1)**0.10 + (3+1)**0.02我原创 2021-02-03 15:59:33 · 202 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第十五章 - 最长公共子序列(包含js版代码实现)
背景简介什么是子序列?某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列大概意思能在父序列串中按照对应的前后顺序找到的序列 就是子序列举个例子X {A,B,C,B,D,A,B}Y {B,D,C,A,B,A}DA 是x的子序列 AD不是算法思路假定我们称最长公共子序列是lcsX的长度为mY的长度为n当只有1个字符的时候,那么就是判断x1等于y1否 假定最终lcs b1当有2个字符的时候,从后往前遍历 如果x2=y2 那么只要.原创 2021-01-26 20:07:28 · 208 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第十五章 - 矩阵链乘法(包含js版代码实现)
背景简介矩阵链乘法是什么意思呢?举个例子有3个矩阵相乘A(10*100)B(100*5)C(5*50)那么我们可以知道A x B x C = (A x B)x C = A x (B x C)我们先计算 A x B 需要10X100X5 = 5000次计算;再与C计算需要 10X5X50=2500次 一共7500次计算我们先计算B x C 需要100X5X50=25000次计算; 再与A计算需要10X100X50=50000次 一个75000次计算可以看到不同的顺序计算会带来计.原创 2021-01-26 17:47:10 · 170 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第十五章 - 钢条切割(包含js版代码实现)
背景简介大概的意思是这样的给定一根长度为L的钢条 可以把它切割成任意长度不同长度的售价是不一样的我们要求最好的切割方案,就是切割下来的每一段加起来总价值最高算法思想从常规思路 我们第一时间会想到递归解释一下这段伪代码1,2行就是 钢条是0的时候返回03行 把收益设置为负无穷 (或者-1) 表示没有收益的意思即可4,5行是遍历1到n的情况max中两个值得意思:q —> q是之前的最佳收益p[i]+n-i的最优方案i=1的时候 取切开1+剩下的长度最佳收益i=2.原创 2021-01-26 11:41:39 · 208 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第八章 - 桶排序(包含js版代码实现)
什么是桶排序桶排序可以看做是计数排序的一种升级方式桶排序是指将一组数据按照一定的区间进行分类,可以简单理解就是看第一位数子 把他们分类。然后在每个桶内进行排序 此时你可以使用任意的排序方法桶排序对数据有限制 如果不是同等位数的 数字的话 桶排序就没有太大的意义了算法过程将数据分类组内排序组合算法实现function BucketSort(arr) { let l = arr.length if (l <= 1) return arr let max =原创 2020-12-09 14:58:24 · 414 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第八章 - 基数排序(包含js版代码实现)
什么是基数排序如下图所示,我们对个位,十位,百位依次进行排列,然后就可以得到一个完整的排序过程算法过程因为每一个基数只可能是0-9所以可以对每一列进行计数排序循环所有的列算法实现function createZero(num, targetLength) { let t = targetLength - num.toString().length let str = '' while (t > 0) { t--; str +=原创 2020-12-09 14:56:52 · 144 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第八章 - 计数排序(包含js版代码实现)
啥是计数排序计数排序有点类似于穷举的味道,我们把数字中每个数字出现的次数都记录下来最后只要依次在组合起来。比如下图 9 出现了两次 就在数组中放入两个9算法过程获取数组中的最大值把他们分类整理并记录每个数字出现的次数重新整理输出数组算法实现function CountingSort(arr) { let len = arr.length; let max = Math.max.apply(null, arr); let temp = new Array(max +原创 2020-12-09 14:55:43 · 129 阅读 · 0 评论 -
《算法导论》ʚ读书笔记&浅析ɞ 第六章 - 优先队列(包含js版代码实现)
什么是优先队列算法导论中的定义,如下图所示算法过程优先队列是用堆来实现的,刚好我们上面的堆排序只要稍加改造就可以实现一个最大堆从而实现一个优先队列:)有了之前堆排序的基础 这个的实现就很容易理解了MAXIMIUM:只要取堆顶的元素就可以了extractMax:只要取堆顶元素然后把该元素踢出 然后进行一次堆得维护就好了increase: 只要不停的与父节点进行比较,若比父节点大则互换位置。若比父节点小则位置恰好,结束循环。insert:有了increase后只要在堆尾新增一个元素,将其优先级原创 2020-12-09 14:38:42 · 129 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第六章 - 堆排序(包含js版代码实现)
什么是堆排序堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。在javascript中我们用数组来实现这一种数据结构堆排序就是利用这种数据结构进行排序算法思路就是建立一个最大堆,然后利用堆顶永远是最大数值来排序如下图所示,每次都将黄色区域的值(堆顶)与粉红区域的值(末位)进行交换然后排除末位 在剩下的数组中进行最大堆重塑如此往复,到这.原创 2020-12-08 17:22:25 · 127 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第七章 -快速排序(包含js版代码实现)
快速排序简介快速排序是一种最坏情况时间复杂度位n^2的排序方法。虽然最坏情况下的复杂度很差,但是快速排序通常是实际应用排序中比较好的选择。因为它的平均性能是非常好的nLgn。算法思路选出某一个数组中的数值作为标准。把小于标准值的放到数组左边,大于标准值得放到数组右边。对上述过程进行递归直到不能分解为止算法过程我们定义一个快速排序的方法 QuickSort,我们还需要传入排序的起点和终点以便每一次的递归我们需要一个方法去执行上述的思路中的1,2步骤 最后返回一个中间值得坐标 以便把数组原创 2020-12-07 20:56:24 · 184 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第四章 -Strassen算法(包含js版代码实现)
文章目录Strassen算法是干啥的算法思路算法过程算法实现Strassen算法是干啥的算法思路算法过程算法实现原创 2020-11-25 20:28:45 · 220 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第四章 - 最大子数组(包含js版代码实现)
最大子数组问题介绍算法导论上举了一个例子[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vj5KKdMm-1606284575218)(http://magiczhu.cn/zb_users/upload/2020/11/202011251344171938858.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mMxbb88S-1606284575219)(http://magiczhu.cn/zb_users/upload/2.原创 2020-11-25 14:11:56 · 118 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第二章 - 归并排序(包含js版代码实现)
什么是归并排序先理解一个概念,算法中有一种设计思想叫分治法。在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……算法思路归并排序就是分解待排序的n各元素序列成各具n/2个元素的两个子序列递归两个子序列做相同的操作合并已经排序的.原创 2020-11-19 10:28:10 · 159 阅读 · 0 评论 -
《算法导论》@读书笔记@ 第二章 - 插入排序(包含js版代码实现)
什么是插入排序算法导论中举了一个十分形象的例子算法过程下图记录了一个排序的过程首先2和5比较 2比5小2和5交换位置4和5比较 5比4大 然后和2比较 然后插入当前位置…一直往前比较 直到比较的数字比这个数字小算法实现(javascript版本)function InsertionSort(arr) { for (let j = 1; j < arr.length-1; j++) { let key = arr[j]; let i = j - 1;原创 2020-10-27 22:50:19 · 108 阅读 · 0 评论 -
斐波那契数列的动态规划解法
自底向上求出f(1) f(2)…到f(n)保存在一张map表中先求出最小单元的值function test(n) { if (n <= 0) return n; let map = { 1: 1, 2: 1, }; if (n <= 2) return map[n]; for (let i = 3; i < n + 1; i++) { map[i] = map[i - 1] + map[i - 2] } return ma原创 2020-10-11 15:05:35 · 251 阅读 · 0 评论 -
《算法导论》@读书笔记@ 字符串匹配算法 并:各个算法javascript实现
概念在a字符串中匹配b字符串所在的位置各个算法对比朴素算法如上图所示 思路就是 滑动窗口 把str2当作一个滑板从左向右滑动js版本代码/** * @param {string} haystack * @param {string} needle * @return {number} */var strStr = function(haystack, needle) { if (needle === '') return 0; let l = haystack.l原创 2020-07-09 23:31:35 · 400 阅读 · 0 评论 -
《算法导论》@读书笔记@ 二叉搜索树
概览什么是二叉搜索树查询什么是二叉搜索树归纳:具有如下特点的二叉树若左子树不空,则左子树上所有结点的值均小于它的根结点的值若右子树不空,则右子树上所有结点的值均大于它的根结点的值左右树的子树也符合上述两条可以通过一个简单的递归算法来按序输出二叉树中的所有关键字//假设x为节点function print(x){ if(x!=null){ print(x.left) ...原创 2020-05-06 21:45:05 · 280 阅读 · 0 评论 -
冒泡、选择、插入排序 javascript版本
冒泡排序 javascript版代码var array=[];var int=0;for(var i=0;i<1000;i++){ int = Math.ceil(Math.random()*1000); array.push(int);}console.log(array)/** * 冒泡法排序 Ver 1.0 * @param arr {number[...原创 2020-03-31 11:02:57 · 91 阅读 · 1 评论 -
堆排序 javascript版
堆排序 javascript版算法思路参考《算法导论》代码/** * 时间复杂度 平均:O(nlog2n)。 * 空间复杂度:O(1)。 * 稳定性:不稳定 */var array = [];var int = 0;for (var i = 0; i < 9; i++) { int = Math.ceil(Math.random() * 10); array.pu...原创 2020-02-25 22:14:10 · 202 阅读 · 0 评论