![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 58
爱划水de鲸鱼哥~
一只自由生长的野生程序猿
展开
-
算法的时间复杂度、空间复杂度
时间复杂度O(1)O(n)O(1) + O(n) = O(n)O(n^2)O(log^n)空间复杂度O(1)O(n)O(n^2)常用算法的时间\空间复杂度时间复杂度用来描述算法的运行时间。用 O 表示,常见的有O(1), O(n), O(n^2), O(log^n)…张图直观的表示了O(1), O(n), O(n^2), O(log^n)的大小关系。O(1) let i = 1; i++;上述代码执行一遍就结束了,所以其时间复杂度为O(1)。O(n) for(let i =原创 2021-08-19 19:54:44 · 164 阅读 · 0 评论 -
JavaScript实现数据结构 -- 栈
文章目录栈代码实现入栈出栈过程入栈过程出栈过程栈的应用例:有效的括号(leetcode:20)思路代码实现原代码栈栈是一种后进先出的数据结构。代码实现虽然JavaScript中没有栈,但是我们可以用数组来实现栈的功能。 // 定义一个数组用来模拟栈 const stack = []; // 用数组的Push方法模式入栈 stack.push(0); stack.push(1); stack.push(2); // 用数组的pop方法模拟出栈 const item0 = stack.原创 2021-08-21 11:43:58 · 387 阅读 · 1 评论 -
JavaScript实现数据结构 -- 队列
文章目录队列代码实现入队出队过程入队过程出队过程队列的应用例:计算最近请求次数(leetcode:933)思路代码实现源代码队列队列是一个先进先出的数据结构。代码实现虽然JavaScript中没有队列,但是我们可以用数组来实现队列的功能。 // 用数组来模拟队列 const queue = []; // 入队 queue.push(0); queue.push(1); queue.push(2); // 出队 const item0 = queue.shift(); const原创 2021-08-21 16:18:34 · 296 阅读 · 1 评论 -
JavaScript实现数据结构 -- 链表
文章目录链表链表和数组的区别JS模拟链表遍历链表插入节点删除节点链表应用删除链表中的节点(leetcode:237)思路源代码反转链表(leetcode:206)思路源代码链表链表和数组一样是有多个元素组成的列表;不同的是链表元素存储不连续,用next指针连接在一起;链表和数组的区别数组:增删非首尾元素时,后面的元素需要移动。链表:增删非首尾元素时,不需要移动元素,修改next指向即可。JS模拟链表虽然JavaScript中没有链表,但是我们可以用对象 来实现链表的功能。// 用对象模拟原创 2021-08-25 14:16:35 · 455 阅读 · 0 评论 -
JavaScript实现数据结构 -- 集合
文章目录集合集合的常用操作去重判断元素是非在集合中交集差集集合的应用两个数组的交集(leetcode:349)思路源代码集合集合是一种无序且唯一的数据结构, 在ES6中有集合Set。集合的常用操作去重使用Set结合展开运算符实现数组去重。判断元素是非在集合中使用Set的has方法判断元素是非在集合中。交集交集:两个集合都存在的元素。差集差集:元素在一个集合中存在,而在另一个集合中不存在。集合的应用两个数组的交集(leetcode:349)思路首先对nums1去重,原创 2021-08-31 13:09:26 · 125 阅读 · 0 评论 -
JavaScript实现数据结构 -- 字典
文章目录字典字典的常用操作增删改查字典的应用两个数组的交集(leetcode:349)思路代码两数之和(leetcode:1)思路代码无重复字符串的最长子串(leetcode:3)思路代码字典字典与集合类似,也是一种存储唯一值的数据结构,字典以键值对的形式进行存储,在ES6中有字典Map。字典的常用操作增使用set()方法可以向字典中添加新成员,可连续添加。删使用delete()方法可以删除字典成员,删除字典中不存在的成员不报错。使用clear()方法清空字典成员。改使用set()原创 2021-09-01 11:47:23 · 892 阅读 · 0 评论 -
JavaScript实现数据结构 -- 树
文章目录树树的常用操作定义树深度优先遍历深度优先遍历过程代码实现广度优先遍历广度优先遍历过程代码实现二叉树二叉树的常用操作定义二叉树前序遍历前序遍历过程代码实现中序遍历中序遍历过程代码实现后序遍历后序遍历过程代码实现树树是一种抽象的分层数据模型,例如前端常见的DOM树:JavaScript中没有树,但是可以用数组和对象来模拟树。以虚拟DOM为例:vdom就是JS用数组和对象来模拟的树。vdom = { type: 'div', props: { 'i原创 2021-09-01 23:51:14 · 909 阅读 · 1 评论 -
JavaScript 实现 -- 冒泡排序
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。原创 2021-06-11 15:28:55 · 605 阅读 · 0 评论 -
JavaScript 实现 -- 选择排序
选择排序是一种简单直观的排序算法。第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。依次类推完成整个数组的排序。数组 arr = [4,1,6,3,5,2] 进行选择排序。首先遍历一次数组找出最小值 1 ,放在首位。然后遍历第二次找出次小值 2 放在第二位,接着遍历排序,直到排完这个数组。原创 2021-06-11 20:00:03 · 251 阅读 · 0 评论 -
JavaScript 实现 -- 快速排序
文章目录思路代码实现思路将数组分区;以数组第一个元素为基准元素;小于基准元素的放到基准元素前,大于基准元素的放到基准元素后;然后对分区的子数组进行递归,重复上述操作;代码实现 Array.prototype.quicksolt = function(){ const rec = (arr) => { if(arr.length === 1){ return arr; } const left =原创 2021-08-25 12:38:59 · 261 阅读 · 0 评论 -
JavaScript 实现 -- 归并排序
归并排序归并排序是建立在归并操作(即将两个的数组合并成一个有序数组)上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。归并排序首先将数组分为若干组,然后将这些组两两归并,直到排序完成。思路分:把数组分成两半,再对数组进行递归操作,直到将数组分成一个一个单独的数组。合:将单独的数组合并为有序数组,再对有序数组进行合并排序,直到合并排序完这个数组。代码实现 Array.prototype.mergSort = function(){ const rec = (arr) =原创 2021-06-13 11:28:05 · 293 阅读 · 4 评论 -
JavaScript 实现 -- 插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。插入排序的基本思路是,除数组的第一个元素外,对每个元素进行遍历,比较前面元素与当前元素,然后将当前元素插入到比前一个元素小(或小于原创 2021-06-12 11:24:19 · 326 阅读 · 1 评论 -
JavaScript实现 -- 顺序搜索
顺序搜索顺序搜索是一种寻找某一特定值的搜索算法,按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。顺序搜索是最简单的一种搜索算法。思路遍历数组,并对目标值进行比较;相等返回数组下标,不相等返回-1;代码实现 Array.prototype.sequentialSearch = function( item ){ for(let i = 0;i < this.length;i++){ if(this[i] === item){原创 2021-08-23 23:52:45 · 129 阅读 · 0 评论 -
JavaScript 实现 -- 希尔排序
什么是希尔排序希尔排序是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的一种更高效的改进版本。希尔排序实际上就是分组的插入排序,希尔排序以步长为分组,然后不断减少步长。当步长为1时,数组就是有序的了,先看一下希尔排序的过程,图中各色彩线的两端为不同分组。*arr = [9,2,5,4,7,1,3,6,8,0]*是图中待排序的数组,第一次遍历时步长为 5,所以待排序的数组分为[9,1],[2,3],[5,6],[4,8],[7,0]五个子数组,将原创 2021-06-12 17:15:19 · 230 阅读 · 5 评论 -
JavaScript实现 -- 二分搜索
二分搜索(binary search),也称折半搜索(half-interval search)、对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。从数组的中间元素开始,如果中间元素正好是要查找的元素,则返回数组下标搜索结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果直到数组为空,也没找到,则返回-1。...原创 2021-08-24 11:08:16 · 446 阅读 · 0 评论 -
JavaScript 算法 -- 分而治之
分而治之是算法设计的一种方法。它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将结果合并以解决原来的问题。原创 2021-10-09 00:23:03 · 142 阅读 · 0 评论 -
JavaScript 算法 -- 动态规划
动态规划动态规划是算法设计中的一种方法。它将一个问题分解为相互重叠的子问题,通过反复求解子问题,来解决原问题。动态规划与分而治之的区别动态规划的子问题是相互重叠的;分而治之的子问题是相互独立的;例题一:爬楼梯原创 2021-10-09 15:03:26 · 206 阅读 · 0 评论 -
JavaScript 算法 -- 贪心算法
文章目录贪心算法例题一:分饼干例题二:买卖股票的最佳时机 II贪心算法贪心算法是算法设计的一种方法。期盼通过每个阶段的局部最优选择,从而达到全局的最优,但最后的结果不一定最优。例题一:分饼干 /** * @param {number[]} g 胃口 * @param {number[]} s 饼干尺寸 * @return {number} */ var findContentChildren = function(g, s) { const mysort = (a,原创 2021-10-09 18:17:35 · 391 阅读 · 0 评论