javascript_算法
文章平均质量分 54
以javascript为编程语言,来探究算法的美!!
轻盈的风
欢迎大家一起讨论技术,共同进步!
展开
-
js数据结构与算法_18_删除排序数组中的重复项
给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。原创 2022-10-23 23:42:42 · 260 阅读 · 0 评论 -
js数据结构与算法_17_贪心算法
贪心算法认识贪心算法使用贪心算法解决背包问题认识贪心算法贪心算法就是一种比较简单的算法。贪心算法总是会选择当下的最优解,而不去考虑这一次的选择会不会对未来的选择造成影响。使用贪心算法通常表明,实现者希望做出的这一系列局部“最优”选择能够带来最终的整体“最优”选择。如果是这样的话,该算法将会产生一个最优解,否则,则会得到一个次优解。然而,对很多问题来说,寻找最优解很麻烦,这么做不值得,所以使用贪心算法就足够了。这段话来自《数据结构与算法:JavaScript描述》。我的理解就是在对问题求解时,选择当前最原创 2022-04-22 19:35:12 · 867 阅读 · 0 评论 -
js数据结构与算法_16_动态规划
动态规划认识动态规划动态规划案例计算斐波那契数列寻找最长公共子串认识动态规划动态规划,听起来高大上,其实并不难,在你看完这篇博客后还可能感叹,这么简单呀!在了解动态规划之前,我们得先谈谈递归,在我们的js里递归的本质就是在函数执行栈中调用函数,一层一层的深入,直到小问题被解决,开始回溯,最后大问题被解决;递归虽然代码简洁,但是执行效率低下,使用动态规划设计的算法从它能解决的最简单的子问题开始,继而通过得到的解,去解决其他更复杂的子问题,直到整个问题都被解决。所有子问题的解通常被存储在一个数组里以便于原创 2022-04-21 17:26:36 · 1445 阅读 · 1 评论 -
js数据结构与算法_15_基于快排的二分查找
二分查找加快速排序了解二分查找实现二分查找了解二分查找二分查找大家应该都比较熟悉,每次去除一半的的查找范围,平均时间复杂度O(log n);搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半;二分查找的数组一定得是有序的,所以这次我的标题是基于快排的二分查找,当然你也可以基于插入排原创 2022-04-18 16:14:55 · 764 阅读 · 0 评论 -
js数据结构与算法_14_基数排序
文章目录认识基数排序实现基数排序认识基数排序基数排序是桶排序的扩展,桶排序是将序列里面的元素尽可能均匀的放置到桶内,在对桶内元素排序,最后依次把桶中元素拿出来。而基数排序也会用到桶,桶的数量与序列元素的基数有关,如果是10进制那么就有10个桶,将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。比如我们试试排序[72,66],72的个位是2,我们就将72放到第三个桶(下标为2),原创 2022-04-17 16:48:08 · 574 阅读 · 0 评论 -
js数据结构与算法_13_桶排序
桶排序认识桶排序桶排序实现认识桶排序桶排序和上次实现的计数排序一样不是比较比较排序,所以平均时间复杂度比O(n logn )要小点;桶排序的时间复杂度与怎样对每个桶中的元素进行排序有关,可以采用快排甚至是递归调用桶排序进行排序;所以最坏时间复杂度为O(n**2),最好时间复杂度接近O(n),这里就不具体探究时间复杂度了,我们主要学习思想;桶排序的核心思想就是将序列中的元素尽可能均匀分布到有序的桶中,在对桶中元素排序,最后依次把桶中元素放入序列中即可;在写具体代码之前我们来思考一下,如何尽可能均匀原创 2022-04-17 09:53:59 · 189 阅读 · 0 评论 -
js数据结构与算法_12_堆排序
一、了解堆结构这个排序算法是我花费时间比较多的一个,核心思路就是将序列转化成大顶堆,然后每次将大顶堆的根节点和最后一个子节点(在数组中最后一个元素),所以我们得先了解堆这个结构;堆是一个完全二叉树(除了倒数第二层,其他层每个父节点都有两个子节点,最后一层的节点都靠左排列);当一个堆里面的父节点值恒大于子节点的值,这个堆我们称为最大堆或大顶堆;当一个堆里面的父节点值恒小于子节点的值,这个堆我们称为最小堆或小顶堆;而我们堆排序要用的就是大顶堆了,顾名思义,大顶堆的根节点就是堆中最大的值了;原创 2022-04-14 14:11:19 · 203 阅读 · 0 评论 -
js数据结构与算法_11_计数排序
一、认识计数排序这个排序我是真心喜欢,它帮助我打破了我的思维禁锢,以前我认为给序列排序是一定要在元素之间比较的,而且排序算法的时间复杂度的下限就是O(nlogn),比如我们熟知的快排、希尔、堆排序等等;计数排序在某些情况下是快过上面说的比较排序算法的,比如0-100排序,计数排序是最好的;当输入的元素是n个0~k之间的整数时,它的运行时间是O(n+k);计数排序的核心思想就是用统计数组的下标来表示原始数组的值,而统计数组对应下标的值就是原始数组中值出现的次数;排序就只需要遍历统计数组,按照值原创 2022-04-13 20:20:33 · 230 阅读 · 0 评论 -
js数据结构与算法_10_归并排序
一、实现希尔排序归并排序和快数排序一样采用”分治法“,也就是分而治之;分割:递归地把当前序列平均分割成两半。 集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。简单来说就是利用递归每次将数组从中间分成两部分,直到数组的长度小于2后,开始回溯,将分好的两个数组排好序并合成一个新数组,继续回溯直到完成整个算法;我觉得归并排序的实现没快排难,或者说会快排,写归并就简单很多,这里简单谈一下这两个排序:归并排序的平均时间复杂度为O(nlogn),快排平均时间复杂度也为O(nlogn原创 2022-04-12 18:30:48 · 584 阅读 · 0 评论 -
js数据结构与算法_09_快速排序
一、实现快排排序20世纪十大算法之一的快速排序,在大部分情况下都是好于其他排序算法的;维基百科上对快排的描述:快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼.霍尔提出。在平均状况下,排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序O(nlogn)通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地.原创 2022-04-12 09:42:04 · 152 阅读 · 0 评论 -
js数据结构与算法_08_希尔排序
一、实现希尔排序希尔排序可以说是排序算法中的一个里程碑了,打破人们对排序算法的时间复杂度只能是O(n**2)的思维禁锢;上一节我们知道了效率比冒泡和选择高的插入排序,那有没有思考过当标记位是一个很小的元素,那岂不是要从有序队列的最后一位一直比较到最前面吗,这样效率不是很高;可不可以,减少比较次数呢?比如大的往后面靠靠,小的往前面靠靠,可以的,希尔排序就是依次为核心:希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越原创 2022-04-10 17:14:07 · 487 阅读 · 0 评论 -
js数据结构与算法_07_插入排序
一、实现插入排序插入排序很重要,是高级排序的基础,如希尔排序、快排等等;选择排序的核心:局部有序,标记并取出一个元素,其左边部分是局部有序,然后从排好队的元素序列中从后向前比较,比标记元素大的,向后移动一个位置,比标记元素小,则标记元素插入其后面;这里就不用for循环了,因为你不知道要循环多少次,我们使用while循环;比如这是一个要排序的无规则数组:let arr = [4, 8, 1, 9, 6, 7];第一次循环时,第一个元素可以看成是局部有序,那么标记元素为8(index=1)原创 2022-04-10 11:54:53 · 1405 阅读 · 0 评论 -
js数据结构与算法_06_选择排序
一、实现选则排序选则排序和冒泡排序一样时间复杂度都是O(n**2);选择排序的核心是每次循环从剩下的元素里选择最小的一个,然后和前面对应的位置交换位置;比如这是一个要排序的无规则数组:let arr = [4, 8, 1, 9, 6, 7];第一次循环时,剩下的元素就是数组本身,那么最小的元素是谁?可以看出是1,当然,这是我们用肉眼看的,等下用js来实现;拿到最小元素1后,就和第一个元素4(index=0)交换位置:let arr = [1, 8, 4, 9, 6, 7];第原创 2022-04-10 10:43:08 · 1142 阅读 · 0 评论 -
js数据结构与算法_05_冒泡排序
一、实现冒泡排序冒泡排序就像鱼儿吐泡泡一样,从小到大,也暗示着排列的顺序是从小到大;核心思想是依次比较前后位置元素的大小,哪个大哪个就放后面,这样一轮下来,最后一个位置一定是最大的;这里的最后一位不用继续比较了,因为倒数第二位就是与它比较;比如这是一个要排序的无规则数组:let arr = [4, 8, 1, 9, 6, 7];那我们安照上面的来一轮前后比较试试:function demo(array) { let N = array.length; for (let原创 2022-04-09 23:26:15 · 299 阅读 · 0 评论 -
js_判断一个数是否是质数的两种思路
一、什么是质数质数(Prime number,又称素数),指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。二、实现判断质数大于1,且只能被1和自身整除,也就是 2到~num-1不能整除;那我们先做个边界判断:if (typeof num !== "number" || num <= 1) return false;然后依次遍历2~num-2,如果能被num整除则表示不是质数,返回false;循环结束都没有re原创 2022-03-26 11:39:31 · 2547 阅读 · 0 评论 -
js数据结构与算法_04_反转链表
题来自leetcode《剑指offer》题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。摘要:我们js是没有链表这种数据结构的,需要自己封装。简单说一下,链表以节点为单位,每个元素都是一个独立对象,在内存空间的存储是非连续的。链表的节点对象具有两个成员变量:「值 val」,「后继节点引用 next」 。链表属性有head、length,一个指向头节点,一个表示链表节点的个数;这是题目给的节点类:/** * Definition for singly-link原创 2022-03-21 13:39:42 · 99 阅读 · 0 评论 -
js数据结构与算法_02_包含min函数的栈
题来自leetcode的《剑指Offer》题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。摘要:时间复杂度O(1)意思是在调用min等方法时,运行次数和数据量N成常数关系,就是不会随数据量N的变化而变化:那么我们就不能用循环,递归之类的;一开始我打算用sort排序解决min,但还是不太符合题意:let copyArr = [...this.stackArr]; copyArr.原创 2022-03-15 20:11:03 · 702 阅读 · 0 评论 -
js数据结构与算法_01_用两个栈实现队列
题来自leetcode的《剑指Offer》题目要求是:// 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,// 分别完成在队列尾部插入整数和在队列头部删除整数的功能。// (若队列中没有元素,deleteHead 操作返回 - 1 )摘要:队列是先进先出,而栈是先进后出;那么我们就可以用一个栈来作为队列,一个栈用来辅助队列删除;将satckOne中的元素弹出压入到stackTwo中,再在stackTwo中弹出,是不原创 2022-03-14 23:03:23 · 769 阅读 · 0 评论 -
js数据结构与算法_03_从尾到头打印链表
题来自leetcode《剑指offer》题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。摘要:我们js是没有链表这种数据结构的,需要自己封装。简单说一下,链表以节点为单位,每个元素都是一个独立对象,在内存空间的存储是非连续的。链表的节点对象具有两个成员变量:「值 val」,「后继节点引用 next」 。链表属性有head、length,一个指向头节点,一个表示链表节点的个数;这是题目给的节点类:/** * Definition for singly-linked原创 2022-03-17 20:51:19 · 487 阅读 · 0 评论