
算法知识合集
文章平均质量分 86
林恒smileZAZ
这个作者很懒,什么都没留下…
展开
-
说说你对贪心算法、回溯算法的理解?应用场景?
贪心算法,又称贪婪算法,是算法设计中的一种思想其期待每一个阶段都是局部最优的选择,从而达到全局最优,但是结果并不一定是最优的举个零钱兑换的例子,如果你有1元、2元、5元的钱币数张,用于兑换一定的金额,但是要求兑换的钱币张数最少如果现在你要兑换11元,按照贪心算法的思想,先选择面额最大的5元钱币进行兑换,那么就得到11 = 5 + 5 + 1 的选择,这种情况是最优的但是如果你手上钱币的面额为1、3、4,想要兑换6元,按照贪心算法的思路,我们会 6 = 4 + 1 + 1这样选择,这种情况结果就不是最优的选择原创 2024-04-28 18:58:52 · 989 阅读 · 0 评论 -
说说你对分而治之、动态规划的理解?区别?
动态规划,同样是算法设计中的一种方法,是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。分而治之是算法设计中的一种方法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的,而分而治之的子问题是相互独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。原创 2024-04-26 17:38:33 · 941 阅读 · 0 评论 -
说说你对二分查找的理解?如何实现?应用场景?
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。二分查找法的O(logn)让它成为十分高效的算法。在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。实际上,除了有序的数组可以使用,还有一种特殊的数组可以应用,那就是轮转后的有序数组。对比普通的二分查找法,为了确定目标数会落在二分后的哪个部分,我们需要更多的判定条件。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束。原创 2024-04-25 18:52:19 · 736 阅读 · 0 评论 -
说说你对归并排序的理解?如何实现?应用场景?
所以可以得到:S(n) = S(n/2) + O(1) = S(n/4) + O(2) = S(n/8) + O(3) = S(n/2^k) + O(k) = S(1) + O(logn) = O(logn)如果对T(n) = 2 * T(n/2) + O(n)进行左右 / n的操作,得到 T(n) / n = (n / 2) * T(n/2) + O(1)现在令 S(n) = T(n)/n,则S(1) = O(1),然后利用表达式带入得到S(n) = S(n/2) + O(1)原创 2024-04-24 17:32:48 · 846 阅读 · 0 评论 -
说说你对选择排序的理解?如何实现?应用场景?
第一次内循环比较N - 1次,然后是N-2次,N-3次,……+ 1,求等差数列和,得 (N - 1 + 1)* N / 2 = N^2 / 2,舍去最高项系数,其时间复杂度为 O(N^2)从上面可以看到,对于具有 n 个记录的无序表遍历 n-1 次,第i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。选择排序(Selection sort)是一种简单直观的排序算法,无论什么数据进去都是 O(n²)的时间复杂度,所以用到它的时候,数据规模越小越好。原创 2024-04-23 14:52:26 · 453 阅读 · 0 评论 -
说说常见的排序算法有哪些?区别?
即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后的序列中,r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;快速排序是对冒泡排序算法的一种改进,基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小。稳定性指的是假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变。排序算法属于算法中的一种,而且是覆盖范围极小的一种,彻底掌握排序算法对程序开发是有很大的帮助的。原创 2024-04-20 18:26:25 · 901 阅读 · 0 评论 -
说说你对图的理解?相关操作有哪些?
通过上面的初步了解,可以看到图就是由顶点的有穷非空集合和顶点之间的边组成的集合,分成了无向图与有向图图的表达形式可以分成邻接矩阵和邻接表两种形式,在javascript中,则可以通过二维数组和对象的形式进行表达。原创 2024-04-19 17:38:41 · 497 阅读 · 0 评论 -
说说你对堆的理解?如何实现?应用场景?
堆化的过程是顺着节点所在路径比较交换的,所以堆化的时间复杂度跟树的高度成正比,也就是Olog(n),插入数据和删除堆顶元素的主要逻辑就是堆化。然后进行下移操作,将新的堆顶和它的子节点进行交换,直到子节点大于等于这个新的堆顶,删除堆顶的时间复杂度为O(logk)将这个值和它父节点进行交换,直到父节点小于等于这个插入的值,大小为k的堆中插入元素的时间复杂度为O(logk)将值插入堆的底部,即数组的尾部,当插入一个新的元素之后,堆的结构就会被破坏,因此需要堆中一个元素做上移操作。原创 2024-04-18 17:15:14 · 841 阅读 · 0 评论 -
说说你对树的理解?相关的操作有哪些?
树是一个非常重要的非线性结构,其中二叉树以二叉树最常见,二叉树的遍历方式可以分成前序遍历、中序遍历、后序遍历同时,二叉树又分成了完成二叉树和满二叉树。原创 2024-04-17 18:27:42 · 945 阅读 · 0 评论 -
说说你对集合的理解?常见的操作有哪些?
所以,可以利用Set的一些原生方法轻松的完成数组去重,查找数组公共元素及不同元素等操作。集合(Set),指具有某种特定性质的事物的总体,里面的每一项内容称作元素。使用set集合的场景一般是借助其确定性,其本身只包含不同的元素。当添加实例中已经存在的元素,set不会进行处理添加。删除某个值,返回一个布尔值,表示删除是否成功。一般情况下,使用数组的概率会比集合概率高很多。返回一个布尔值,判断该值是否为Set的成员。添加某个值,返回 Set 结构本身。清除所有成员,没有返回值。体现了集合的互异性特性。原创 2024-04-16 18:27:55 · 344 阅读 · 0 评论 -
说说你对链表的理解?常见的操作有哪些?
相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)链表(Linked List)是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,由一系列结点(链表中每一个元素称为结点)组成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。原创 2024-04-15 18:41:01 · 752 阅读 · 1 评论 -
说说你对栈、队列的理解?应用场景?
包括编译器的在对输入的语法进行分析的时候,例如"()“、”{}“、”[]"这些成对出现的符号,借助栈的特性,凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错。所以其按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据,具有记忆作用。生活中的例子,排队买票,排在队头的永远先处理,后面的必须等到前面的全部处理完毕再进行处理,这也是典型的先进先出模型。原创 2024-04-11 18:42:59 · 604 阅读 · 0 评论 -
说说你对数据结构的理解?有哪些?区别?
树是典型的非线性结构,在树的结构中,有且仅有一个根结点,该结点没有前驱结点。在程序设计中,为了处理方便, 一般情况把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。跟栈基本一致,也是一种特殊的线性表,其特性是先进先出,只允许在表的前端进行删除操作,而在表的后端进行插入操作。堆是一种特殊的树形数据结构,每个结点都有一个值,特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。一种特殊的线性表,只能在某一端插入和删除的特殊线性表,按照先进后出的特性存储数据。原创 2024-04-10 18:26:33 · 741 阅读 · 1 评论 -
说说你对算法中时间复杂度,空间复杂度的理解?如何计算?
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述通常会遇到一种情况,时间和空间维度不能够兼顾,需要在两者之间取得一个平衡点是我们需要考虑的一个算法通常存在最好、平均、最坏三种情况,我们一般关注的是最坏情况。原创 2024-04-09 17:38:50 · 659 阅读 · 0 评论