算法
文章平均质量分 77
炒栗子不加糖
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
图基本算法
图算法 图的表示 图G = (V, E)可以有两种表示方法 邻接链表组合 邻接矩阵 两种表示法都可以表示无向图和有向图。如果表示稀疏图(边的条数|E|远远小于|V|2)通常选择邻接链表,如果是稠密图(|E|接近|V|2的图)通常使用邻接矩阵表示法。如果需要快速判断任意两个节点是否有边相连,也通常选择邻接矩阵表示 对于图G =(V,E)来说,邻接链表表示由一个包含|V|条链表的数组Adj所构成,每个节点有一条链表,对于每个节点u ∈ V,邻接链表Adj[u]包含所有与节点u之间有边相连的节点v,即原创 2021-12-16 14:30:46 · 889 阅读 · 0 评论 -
B树及应用
B树 B树是为磁盘或其他直接存取辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但B树在降低I/O操作方面更好。许多数据库系统使用B树或B树的变种来存储信息 B树与红黑树的不同在于B树的节点可以有多个孩子,一个B树的子节点可以相当大,通常依赖于所使用的磁盘单元特性。一颗含有n个节点的B树其高度为O(lgn)。一颗B树严格高度可能比一颗红黑树的高度小很多,因为其子节点可以有多个。我们可以使用B树在时间O(lgn)内完成一些动态集合操作 如图,B树的内部节点x包含x.n个关键字,那么节点x就有x.n+1原创 2021-09-13 09:33:15 · 1900 阅读 · 0 评论 -
红黑树及JDK中应用
红黑树 我们看到二叉搜索树在动态集合操作时,其时间复杂度均为O(h),在搜索树高度较低时,有不错的性能,但如果树的高度较高时,这些集合操作并不比在链表上快。红黑树是平衡搜索树中的一种,可以保证在最坏情况下动态集合操作的时间复杂度为O(lgn) 红黑树的性质 红黑树是一颗二叉搜锁树,在每个节点上增加一个存储位来表示节点的颜色,可以是RED或BLACK。通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,确保没有一条路径会比其它路径长出2倍,近似于平衡 树中每个节点包含5个属性:color、key、le原创 2021-08-07 14:27:09 · 544 阅读 · 1 评论 -
二叉搜索树
二叉搜索树 搜索树结构支撑许多动态集合操作,包括SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT和DELETE等。使用一颗搜索数既可以作为一个字典 又可以作为一个优先队列 二叉搜索树的基本操作所花费时间与这颗树的高度成正比。对于有n个节点的完全二叉树来说,操作的最坏运行时间为θ(lgn)。但如果这颗树是一条包含n个节点的链表,那操作的最坏运行时间为θ(n) 简介 二叉搜索树是以一个二叉树构建的搜索树。可以使用一条链表数据结构来表示,其中每个节点就是一个对原创 2021-06-24 14:05:47 · 364 阅读 · 0 评论 -
散列表及HashMap
散列表 许多应用都需要一种动态集合结构,可以提供INSERT、SEARCH、DELETE字典操作,而散列表是实现字典操作的一种有效的数据结构。最坏情况下散列表查找一个元素的时间与链表中查找时间相同,达到θ(n),但实际使用是新能是极好的 散列表是普通数组概念的推广,由于普通数组可以直接寻址,因此可以在O(1)时间访问数组的任意位置。如果空间允许,可以使用一个数组,为每个可能的关键字保留一个位置,以利用直接寻址技术的优势 当实际存储的关键字数目比全部的可能关键字总数小时,采用散列表就成为直接数组寻址的一种有效原创 2021-06-10 15:40:26 · 423 阅读 · 0 评论 -
链表
链表 链表中各对象按线性顺序排列。数组的线性顺序是由数组下标决定,链表的顺序是由各个对象中的指针决定。链表为动态集合提供一种简单而灵活的表示方法 双向链表的每个元素都是一个对象,每个对象有一个关键字key和两个指针:next和prev。对象中还可以包含其他辅助数据。设x为链表的一个元素,x.next指向它在链表中的后续元素,x.prev指向它的前驱元素。如果x.prev = NIL,则元素x没有前驱,因此是链表第一个元素,即链表头。如果x.next = NIL,则元素x没有后续,因此是链表的最后一个元素,即原创 2021-04-27 14:22:02 · 511 阅读 · 0 评论 -
栈和队列
栈和队列 栈和队列都是动态集合,在其上进行DELETE操作所移除的元素都是预先设定的。在栈中,被删除的元素是最近插入的元素:栈实现的是一种后进先出(LIFO)策略;队列中被删除的总是集合中存在时间最长的元素:队列实现的是先进先出(FIFO)策略 栈 栈上的INSERT操作被称为压入(push),无参数的DELETE操作称为弹出(pop)。可以使用一个数组S[1…n]来实现一个最多可容纳n个元素的栈,该数组有一个属性S.top,指向最新插入的元素,栈中包含的元素为S[1…S.top],其中S[1]是栈底元素,原创 2021-04-22 16:38:21 · 161 阅读 · 0 评论 -
快速排序
快速排序 快速排序最坏情况时间复杂度为θ(n^2),虽然最坏情况时间复杂度很差,但快速排序通常是实际排序应用中最好的选择,其平均性能很好,期望时间复杂度是θ(nlgn) 快速排序算法描述 与归并排序类似,快速排序使用分治思想进行排序 分解 数组A[p…r]被划分为两个子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1…r]中的每个元素,计算下标q也是划分过程的一部分 解决 通过递归调用快速排序,对子数组A[p…q-1]和A[q+1…原创 2021-04-14 12:58:05 · 184 阅读 · 0 评论 -
优先队列
优先队列 通过堆实现高效的优先队列。优先队列分为两种形式:最大优先队列和最小优先队列。这里我们介绍使用最大堆实现最大优先队列 优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每个元素都有一个相关的值,称为关键字。一个最大优先队列支持一下操作 INSERT(S, x):把元素x插入集合S中,等价于S = S ∪ {x} MAXIMUM(S):返回S中具有最大关键字的元素 EXTRACT-MAX(S):去掉并返回S中具有最大关键字的元素 INCREASE-KEY(S, x, k):原创 2021-04-02 13:45:07 · 209 阅读 · 0 评论 -
堆排序算法
堆排序 堆排序时间复杂度为Ο(nlgn),并且具有空间原址性。同时堆排序还引入了另一种设计技巧:使用堆的数据结构进行信息管理 堆 二叉堆可以近似看成一颗完全二叉树,除了叶子节点,该树是被完全填充,并且是从左到右填充,表示堆的数组包含两个属性,A.length表示数组元素个数;A.heap-size表示有多少个堆元素存储在该数组中。0 ≤ A.heap-size ≤ A.length,根节点为A[1],父节点为i/2, 左孩子为2i,右孩子为2i + 1. 通过将i的值左移一位,LEFT过程可以在一条指令内原创 2021-03-30 14:40:03 · 503 阅读 · 0 评论 -
最大子数组
最大子数组 输入:包含负数的数组 输出:找出和为最大的连续子数组 分治策略求解最大子数组 假定寻找A[low…high]的最大子数组,我们将A数组拆分成规模尽量相等的两个子数组,A[low…mid] 、A[mid+1…high]. A数组的任何子数组A[i…j]必然是以下情况之一 完全位于A[low…mid]中,low ≤ i ≤ j ≤ mid 完全位于A[mid…high]中,mid < i ≤ j ≤ high 跨越中点,low ≤ i ≤ j ≤ high A数组的最大子数组必原创 2021-03-19 13:45:19 · 479 阅读 · 0 评论 -
归并排序
归并排序 分解:分解待排序的n个元素为各具n/2个元素的子序列 解决:使用归并排序递归地排序两个子序列 合并:合并两个已排序的子序列产生已排序的答案 介绍 复杂度:T(n) = cnlgn + cn 关键点:归并排序算法的关键是"合并"步骤中两个已排序序列的合并。我们调用MERGE(A, p, q, r)来完成合并,其中A是一个数组,p、q和r是数组下标,满足p<=q<r。该过程假设子数组A[p…q]和[q + 1…r]都已排序。合并这两个子数组形成单一的已排序好子数组并代替当前的子数组A[p…原创 2021-03-04 13:09:36 · 245 阅读 · 1 评论 -
插入排序
插入排序 输入:n个数的一个序列<a1, a2, a3, …, an> 输出:输出序列的一个排<a1’, a2’, a3’, …, an’>,满足a1’<= a2’<= a3’<= … <= an’ 介绍 复杂度:T(n) = an^2 + bn + c 使用场景:对于少量元素的排序,它是一个有效的算法 伪代码 INSERTION-SORT(A) 1 for j = 2 to A.length 2 key = A[j] 3原创 2021-03-04 13:06:51 · 167 阅读 · 1 评论
分享