算法
CloneableX
这个作者很懒,什么都没留下…
展开
-
数据结构与算法之美笔记——前言
初心当我查看源码时,我总是难以弄清其基本的原理,为何他人的源码的如此设计。工程上没有随性而为,每行代码都应该是因果所以的必然,弄清这些道理我也不得其法,而数据结构与算法我觉得会是把打开新世界的钥匙,这便是我学习数据结构与算法并写下笔记的原因。背景知识学习知识之前必需清晰一些概念,学习数据结构和算法就必需清楚什么是数据结构,什么是算法,以下并不是严格定义,只是对概念的解释。数据结构...原创 2019-03-02 18:03:01 · 290 阅读 · 0 评论 -
数据结构与算法之美笔记——二分查找(下)
摘要:基础的二分查找算法无论是概念还是实现都比较简单(关于 二分查找基础实现文章 可点击此处查看),但二分查找存在相对复杂的变体问题,如数据组中存在重复数据时需要查找第一个或最后一个等于目标数据的情况等,而类似的变体问题也是二分查找的应用场景,也就是查找近似值。二分查找的变体基础的二分查找实现比较简单,简单的二分查找能够解决的问题应用其他查找算法也同样可以实现,执行效率也相差无几,但二分...原创 2019-07-07 17:06:30 · 131 阅读 · 0 评论 -
数据结构与算法之美笔记——跳表
摘要:跳表是基于链表的数据结构,查找、插入及删除数据时间复杂度都为 O(logn)O(\log{n})O(logn),空间复杂度为 O(n)O(n)O(n),也是利用了空间换时间的概念提高了链表的执行效率。基于链表的二分查找在之前的文章有提到过二分查找基于链表实现时会导致算法效率严重下降,但 O(logn)O(\log{n})O(logn) 的执行效率实在诱人,难道链表没有办法在不降...原创 2019-07-07 17:07:00 · 174 阅读 · 0 评论 -
数据结构与算法之美笔记——排序优化
摘要:快速排序有普适性、原地算法节省空间的优秀特质,当使用「三点取中」和「随机法」降低快排时间复杂度的退化概率后,快排在底层的排序实现中成为广泛应用的算法。为何是快排排序算法多种多样,在之前章节中我们已经学习了常见的几种排序算法,各有特点,我们先对它们进行执行效率的比较。算法名称时间复杂度是否原地是否稳定冒泡排序O(n2)O(n^2)O(n2)✔️✔️...原创 2019-06-23 21:37:42 · 217 阅读 · 0 评论 -
数据结构与算法之美笔记——二分查找(上)
摘要:二分查找是一种高效的查找算法,时间复杂度为 O(logn)O(\log{n})O(logn),但需要依赖有序数组。原理记得曾经看过一个节目的游戏环节,节目组会拿出一件商品,选手在规定时间内可多次对商品估价,选手每次估价主持人都会告诉选手,这个价格相对商品正确价格高了或者低了,选手根据此信息再次估价,直到规定时间结束或者估价正确,如果估价正确选手就可以免费获得此商品。如果你是选手...原创 2019-06-23 21:38:46 · 247 阅读 · 0 评论 -
数据结构与算法之美笔记——散列表(下)
摘要:在实际生产中,散列表常常与链表结合使用,这种结合使链表操作效率得到提高,也使散列表无序的数据可以保持有序,可谓双赢。散列表与链表的互补链表查找操作的时间复杂度为 O(n)O(n)O(n),而插入和删除操作都需要基于查找操作,这也导致了原本高效的插入和删除执行效率下降。而散列表也不是十全十美,因为数据需要散列存储的原因,导致数据成为无序状态,需要数据排序显示或者查找某个范围内的数据时...原创 2019-08-04 20:57:00 · 129 阅读 · 0 评论 -
数据结构与算法之美笔记——哈希算法
摘要:哈希算法是将不同长度二进制串转换为固定长度二进制串的算法,在加密,唯一性校验,数据分片等方面都有应用该叫散列函数还是哈希函数看到哈希函数时心中总是会泛起疑问,哈希算法需要单独列出,那散列函数又是什么?之前我们讨论过散列表以及散列函数,散列其实就是哈希,只是翻译的不同而已,不过散列表中的散列函数只是哈希算法的一种应用而已。哈希算法的定义比较简单,就是将不同长度二进制串转换为固定长度...原创 2019-08-04 20:57:26 · 246 阅读 · 0 评论 -
数据结构与算法之美笔记——散列表(上)
摘要:「散列表」(Hash Table)或「Hash 表」是基于数组扩展的数据结构,能够将复杂信息通过「Hash 算法」生成「Hash 值」,以对应数组下标,完成快速随机访问数据的功能。"我"从哪里来我们已经知道随机访问数组元素时间复杂度只有 O(1)O(1)O(1) ,效率极高,当我们想利用数组的这个特性时就需要将元素下标与存储信息对应。例如,一个商店只有四件商品,依次编号 0 至 3...原创 2019-07-27 21:36:38 · 175 阅读 · 0 评论 -
数据结构与算法之美笔记——树与二叉树
摘要:树是一种非线性表结构,多用链表的方式存储,也可使用数组存储,以节点为数据存储单元,节点的链接表示父子关系,二叉树是树的其中一种,一个父节点最多可以有两个子节点,遍历节点的时间复杂度为 O(n)O(n)O(n)。树(Tree)树长什么样这种数据结构称为树,那一定和现实中的树存在着某些联系。首先我们来回忆一下现实中的树是什么模样,树都由根长起,然后分叉为枝丫,枝丫顶端生长出叶子,数据...原创 2019-08-11 18:06:12 · 399 阅读 · 0 评论 -
数据结构与算法之美笔记——二叉查找树
摘要:二叉查找树(Binary Search Tree)是一种用于快速查找、插入和删除数据的二叉树结构,虽然二叉查找树的平衡性无法保持时会存在退化为链表,时间复杂度增高的情况,但在某些方面二叉查找树还是保持一定的优势。二叉树进化——二叉查找树二叉查找树与二叉树在「二叉」两个字上讲述了其血缘关系,两者在外形上并没有本质的区别,但是二叉查找树对具体数据的存储位置进行了处理,形成了自己的规则。...原创 2019-09-28 09:24:18 · 408 阅读 · 0 评论 -
数据结构与算法之美笔记——线性排序
摘要:本章主要介绍三种线性排序,分别是「桶排序」「计数排序」「基数排序」,时间复杂度都为 O(n)O(n)O(n),但是只适合于某些特殊场景下的数据排序。本章主要会介绍三种「线性排序」算法,为何会称为线性排序?因为这三种排序算法的时间复杂度都是 O(n)O(n)O(n),时间复杂度是呈线性增长,所以称为线性排序。桶算法( Bucket Sort )原理桶算法的原理是将原数据的数据范围...原创 2019-06-09 08:51:41 · 125 阅读 · 0 评论 -
数据结构与算法之美笔记——排序(下)
摘要:本章节主要讲解「归并排序」( Merge Sort )和「快速排序」( Quick Sort ),这两种排序主要应用了分治的思想,时间复杂度都为 O(nlogn)O(nlogn)O(nlogn),但是在实际生产中快速排序使用更加广泛。归并排序原理归并排序将一组数据进行一分为二的分解操作,直到子数组中只有一个元素为止,此时将分解的子数组进行合并,在合并的过程中进行排序,合并后的数组...原创 2019-06-09 08:51:22 · 112 阅读 · 0 评论 -
数据结构与算法之美笔记——排序(上)
摘要:排序是算法中基础的算法,对于一个排序算法的评价需要从时间复杂度、空间复杂度和是否稳定三个方面综合分析。这章节主要讲解冒泡排序、插入排序和选择排序,这三个排序都是时间复杂度为O(n2)O(n^2)O(n2)的算法,但在实际使用中更加偏向插入排序。排序算法的执行效率分析一个排序算法的执行效率需要从时间复杂度、空间复杂度和是否稳定三个维度进行。时间复杂度最好、最坏、平均时间复杂度...原创 2019-06-09 08:51:07 · 131 阅读 · 0 评论 -
数据结构与算法之美笔记——复杂度分析(上)
前言关于算法的笔记我调整了一下书写的方式,接下来的笔记我都会以总结开篇,通过自己对总结的发问倒推详情,最后以解答老师的思考题结束。复杂度分析(上)摘要:一段代码所需执行时间和执行时需要的存储空间在算法中有统一的评价标准,被称为复杂度,分为(渐进)时间复杂度和(渐进)空间复杂度,都以大O表示法表示。对于上述摘要,初看的人会对几个名词疑惑不解。时间复杂度和空间复杂度是什么,大O表示法如何...原创 2019-03-17 22:43:24 · 129 阅读 · 0 评论 -
数据结构与算法之美笔记——复杂度分析(下)
摘要:时间复杂度中还有一些相关复杂度分析相关概念,分别有最好、最坏时间复杂度,平均时间复杂度和均摊时间复杂度。为什么会引入这几种时间复杂度,是由于一段代码会出现几种情况,而在这几种不同的执行情况下代码的执行效率是不一样的,所以需要引入这几种时间复杂度来更加全面地表达一段代码的执行效率。接下来分别解释分析一下这几种时间复杂度。##最好、最坏时间复杂度对于如下一段代码先来分析其时间复杂度...原创 2019-03-30 17:15:33 · 149 阅读 · 0 评论 -
数据结构与算法之美笔记——数组
摘要:数组是最简单基本的数据结构,属于一种线性表数据结构,它有着可以快速随机访问元素的优势,但也有低效的删除和插入操作,容器对数组的封装会简化对数组的操作,也会对带来一些劣势。特性原理数组可以说是日常工作学习中最常见到的数据结构,但也因为常见往往忽视了其重要性,包括数组这种数据结构适合的使用场景,它的优势也劣势等,要了解这些需要从数组的原理说起。数组是其实是一组连续的内存空间,用来存储...原创 2019-03-31 19:43:24 · 299 阅读 · 0 评论 -
数据结构与算法之美笔记——链表(下)
摘要:要正确写出操作链表的代码有一些技巧,明确指针或引用的含义、注意指针的丢失、使用哨兵简化实现难度、明确边界条件以及画图分析,并且也需要多写多练。学习了链表的基础知识后当要写出正确的链表操作代码并不容易,当然亲自动手写得不多也是原因之一,但在写出正确的链表操作代码上是有一些技巧的。明确指针或引用的含义链表的结点之间依靠指针进行关联,有些语言中有指针的概念,而有的语言中是使用引用,...原创 2019-04-15 23:09:45 · 123 阅读 · 0 评论 -
数据结构与算法之美笔记——链表(上)
摘要:链表和数组一样,也是非常基本常用的数据结构,不同于数组的存储方式导致了在随机访问、插入和删除操作上表现出与数组相反的特性,链表有单链表、循环链表和双向链表等类型。链表的特性链表有许多类型,接下来先以最简单的单链表进行分析。要了解链表的特性先得了解链表是如何存储的,链表每个存储单元被称为结点,结点不仅会存储数据本身,还会存储一个指向下一结点的指针,这个指针称为后继指针,链表的第一个结...原创 2019-04-09 23:19:43 · 134 阅读 · 0 评论 -
数据结构与算法之美笔记——线性排序
摘要:本章主要介绍三种线性排序,分别是「桶排序」「计数排序」「基数排序」,时间复杂度都为 O(n)O(n)O(n),但是只适合于某些特殊场景下的数据排序。本章主要会介绍三种「线性排序」算法,为何会称为线性排序?因为这三种排序算法的时间复杂度都是 O(n)O(n)O(n),时间复杂度是呈线性增长,所以称为线性排序。桶算法( Bucket Sort )原理桶算法的原理是将原数据的数据范围...原创 2019-06-09 08:50:05 · 239 阅读 · 0 评论 -
数据结构与算法之美笔记——栈
摘要:栈是一种受到限制的线性表数据结构,有先进后出后进先出的特点,栈这种数据结构在表达式计算和浏览器前进后退功能上都有使用。这章节主要介绍栈这种数据结构,栈是一种受到限制的线性表数据结构,数据只能从一端插入和删除数据,虽然限制使栈失去了灵活性,但操作的可控性得到提高。顺序栈栈可以使用数组或链表来实现,使用数组实现的栈称为顺序栈,使用链表实现的栈叫做链式栈,接下来使用数组实现一个栈。...原创 2019-06-09 08:50:23 · 106 阅读 · 0 评论 -
数据结构与算法之美笔记——队列
摘要:队列也是一种受限的线性表数据结构,有先入先出的特点,可以使用数组或链表实现,也有很多的真实应用场景。队列队列也是线性表数据结构的一种,不过操作受到一定的限制,只能从一端插入数据,另一端取出数据,这样受限的操作也就使队列有了数据先入先出的特点,插入数据和取出数据的操作分别称为入队和出队。队列的实现可以用数组和链表两种方式实现,用数组实现的称为顺序队列,使用链表方式实现的称为链式队列...原创 2019-06-09 08:50:36 · 106 阅读 · 0 评论 -
数据结构与算法之美笔记——递归
摘要:递归是一种经常遇到的算法,主要用于一个问题可拆解为多个相似解决思路的小问题进行解决,递归的优势就是代码简洁高效,但是递归也会存在堆栈溢出、发生重复计算、空间复杂度较高等问题。递归递归在编程技巧中十分常见,当一个大问题可拆解为多个类似解决思路的小问题时便可以使用递归解决,但是书写递归代码很多人会觉得复杂,其实递归代码的书写也是有自己的技巧的。分析递归的过程其实主要是在分析其递推公式...原创 2019-06-09 08:50:49 · 174 阅读 · 0 评论 -
数据结构与算法之美笔记——平衡二叉查找树
摘要:「平衡二叉查找树(Balance Binary Search Tree)」用以解决二叉查找树因不平衡情况而导致的执行效率下降问题,不过为了提高整体操作的效率,基本上使用非严格的平衡二叉查找树,代表是「红黑树(Red-Black Tree)」。平衡才是美前面关于二叉查找树的文章已经提到过,平衡情况下二叉查找树的时间复杂度才是 O(logn)O(\log{n})O(logn),但按照...原创 2019-09-28 09:24:50 · 199 阅读 · 0 评论