![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 93
ThetaQing
我不懒
展开
-
力扣1206. 设计跳表--SkipList跳表是怎么跳的?
跳表是如何实现的转载 2022-08-02 22:20:35 · 16236 阅读 · 1 评论 -
深度优先、回溯、广度优先搜索算法经典题小结
一、深度优先搜索 DFS深度优先搜索在得到一个新节点时立即对新节点进行遍历,实现时一般需要考虑以下问题:栈:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点,可以使用递归栈;标记:对已经遍历过的节点进行标记。实现方法主要有:递归实现:先序遍历;非递归实现:先序遍历:先遍历当前节点,然后把右节点压栈,再压左节点,最后出栈的时候,如果节点不为空重复前述步骤,如果为空结束遍历。...原创 2021-04-14 20:58:15 · 869 阅读 · 0 评论 -
CAS原理、应用和缺点
文章目录一、基本原理二、基本应用2.1 Atomic类2.2 Lock系列锁的底层实现三、缺点3.1 CPU开销较大3.2 不能保证代码块的原子性3.3 ABA问题一、基本原理CAS 被认为是一种乐观锁,乐观锁,会以一种更加乐观的态度对待事情,认为自己可以操作成功。当多个线程操作同一个共享资源时,仅能有一个线程同一时间获得锁成功,在乐观锁中,其他线程发现自己无法成功获得锁,并不会像悲观锁那样阻塞线程,而是直接返回,可以去选择再次重试获得锁,也可以直接退出。CAS,( Compare And Swap)原创 2021-03-23 10:25:39 · 346 阅读 · 0 评论 -
动态规划经典题
0、动态规划解题基本思路找出三个关键要素:最优子结构;边界;状态转换公式。求解的三种方法:递归;备忘录:就是新开辟空间全部保存之前的结果;动态规划:只需要保留状态转换时用到的那部分之前的结果。示例:爬楼梯,N级楼梯,每次可以爬一级或者两级,问一共有多少种方法边界:f(1) = 1; f(2) = 2;最优子结构:f(3) = f(1) + f(2);状态转换方程:f(n) = f(n-1) + f(n-2)。求解:递归:类似于斐波那契数列备忘录:// 只写了思路,原创 2021-03-12 10:37:39 · 230 阅读 · 1 评论 -
二叉树
序数据结构大致可以分为两种类型:基于数组的实现与基于链表的实现。就其效率而言,二者各有长短。具体来说,前一实现方式允许我们通过下标或秩,在常数时间内找到目标对象;然而,一旦需要对这些结构进行修改,那么无论是插入还是删除,都需要耗费线性的时间。后者允许我们借助引用或位置对象,在常数的时间内插入或删除元素;但是为了找出居于特定次序的元素,我们不得不花费线性的时间,对整个结构进行遍历查找。能否将这两...原创 2020-04-09 12:11:49 · 764 阅读 · 0 评论 -
队列的应用(循环分配器、银行窗口服务)
队列概述从队头入队,从队尾出队;先进先出。应用1 循环分配器为在客户(client)群体中共享的某一资源(比如多个应用程序共享同一CPU),一套公平且高效的分配规则必不可少,而队列结构则非常适于定义和实现这样的一套分配规则。具体地,可以借助队列Q实现一个资源循环分配器,其总体流程大致如下所示:轮值算法:首先令所有参与资源分配的客户组成一个队列Q,接下来是一个反复轮回式的调度过程...原创 2020-03-23 14:53:33 · 535 阅读 · 0 评论 -
数据结构笔记——向量、列表、栈
一、向量向量结构中,各数据项的物理存放位置与逻辑次序完全对应,故可通过秩直接访问对应的元素,此即所谓“循秩访问”,各元素物理地址连续。1.1 排序与下界比较树1、每一内部结点各对应于一次比对操作;2、内部节点的左右分支,分别对应于在两种比对结果(是否等重)下的执行方向;3、叶节点(或等效地,根到叶节点的路径)对应于算法某次执行的完整过程及输出;4、反过来,算法的每一运行过程都对...原创 2020-03-22 16:18:49 · 1657 阅读 · 0 评论 -
递归的四条基本法则
在编写递归程序时,关键是要牢记递归的四条基本法则:1、基准情形。必须总有某些基准情形是不用递归就能求解的。2、不断推进。对于那些需要递归求解的情形,递归调用必须总能朝着基准情形的方向推进。3、设计法则。假设所有的递归调用都能运行。4、合成效益法则。在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。...原创 2020-03-11 09:52:25 · 1128 阅读 · 0 评论 -
赫夫曼树及其应用
赫夫曼树路径长度从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。对于二叉树a,根结点到结点D的路径长度就为4,二叉树b中根结点到结点D的路径长度为2。树的路径长度从树根到每一结点的路径长度之和。二叉树a中的树路径长度为1+1+2+2+3+3+4+4=20,二叉树b的树路径长度为1+2+3+3+2+1+2+2=16。带权结点如果考虑到带权的结点...原创 2020-03-04 19:06:59 · 244 阅读 · 0 评论 -
拓扑排序
一、相关概念AOV网在一个表示工程的邮有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。拓扑序列设G = (V, E)是具有n个顶点的有向图,V中的顶点序列v1, v2, ……, vn,若满足从vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前,则我们称这样的顶点序列为一个拓扑序列。拓扑排序对一个有向图构造拓扑序列的过程。二...原创 2020-02-24 15:37:10 · 191 阅读 · 0 评论 -
迪杰斯特拉算法理解
算法简介迪杰斯特拉算法解决了从某个源点到其余各个顶点的最短路径问题,它最主要的特点是从起始点开始,采用贪心的策略,每次遍历到起始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。算法描述1、令arcs表示弧上的权值,若弧不存在,则设为无穷大;S为已找到的从v出发的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的长度的初值为D = arcs[Locate Vex...原创 2020-02-22 10:33:28 · 537 阅读 · 0 评论 -
Prim算法小结
Prim算法的实现定义为了防止我说不清,先贴一下官方解释,引自《大话数据结构》:假设N = (P, {E})是连通图,TE是N上最小生成树中边的集合。算法从U = {u0}(u0∈V),TE = {}开始。重复执行下述操作:在所有u∈U, v∈V - U的边(u, v)∈E中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U = V为止。此时TE中必有n - 1条边,则T...原创 2020-02-19 17:27:22 · 672 阅读 · 1 评论 -
判断NP完全问题的一些蛛丝马迹
一般来说我们没有简单的办法判断问题是不是NP完全问题,但还是有一些蛛丝马迹可寻(来自《算法图解》)元素较少时算法的运行速度非常快,但是随着元素数量的增加,速度会变得非常慢;涉及所有组合的问题通常都是NP完全问题;不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题;如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能是NP完全问题;如果问题涉及集合(如广播台集...原创 2020-02-16 19:38:45 · 484 阅读 · 0 评论 -
【算法】递归式的时间复杂度小结
注:仅分析递归式,没有将简单for循环的分析涵盖在内一、代入法1、猜2、证3、解举例:T(n) = 4T(n/2) + n, T(1) = Θ(1)第一次猜: ·O(n^3)则有:T(k) ≤ ck^3 for k < n.数学归纳法证明:T(n) ≤ cn^3第二次猜O(n^2)T(n)=4T(n/2)+n ≤4 c(n/2)2 +n=cn2+n ...原创 2019-11-05 10:49:56 · 1758 阅读 · 0 评论 -
十大经典排序算法小结(附源码和菜鸟版注释)
序在十大经典排序算法(动画演示)这篇博客的指导下,博主一点一点码出了十大排序算法,并写了菜鸟级注释,源码戳这里,下面记录一下自己的总结,基本上是从注释搬来的。排序算法主要分两类,一类是比较类排序,一类是非比较类排序。一、比较类排序如题,比较类排序算法和核心在于比较,只是比较的方法不一样,主要有交换排序:即通过数与数之间地交换如冒泡排序和快速排序。冒泡排序:通过相邻两个数之间的...原创 2019-11-07 20:51:22 · 359 阅读 · 0 评论 -
狄克斯特拉算法要点与python实现
使用情况狄克斯特拉算法仅适用于有向无环图,且所有权重都是非负数。算法步骤1、找到从权值最“便宜”的节点,即可在最短时间(路程、花费等)内前往的节点;2、对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销;3、重复上述过程,直到对图中的每个节点都这样处理;4、计算最终路径。Python实现...原创 2020-02-16 15:24:04 · 329 阅读 · 0 评论