首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏算法的秘密

    如何深度理解排序算法(一)

    对于算法理解、可以看成解决问题的过程和方式、无论算法是好还是坏,它都是一个独立的个体。 在众多算法中,排序算法是经常被用到,或者在以往的生活或者面试当中会被提到的,所以理解和学会排序算法是非常重要的。 那么大家思考下,如何排队是最有效的呢?! 1650636843971843230.png 首先,我们第一个想到的是什么呢? 1650636868724257301.gif 根据这个gif动画可以看出、它就像一个泡泡一样慢慢的往上升,这种算法就是冒泡排序,为了便于理解和加深记忆,我们以python代码来模拟下这种思路: # ,或者面试中常问的算法;三个算法的时间复杂度都为O(n2),如果要想使时间更短的话,那么大家就要去考虑下其他的算法或者去了解下堆这个概念和分治思想。

    38651编辑于 2022-04-23
  • 来自专栏张善友的专栏

    如何理解 拓扑排序算法

    查看Castle的代码,在Castle.Core中内部的数据结构采用图,排序使用的拓扑排序算法:        对于一条有向边(u,v),定义u < v;满足所有这样条件的结点序列称为拓扑序列。 拓扑排序就是求一个有向图的拓扑序列的算法。 一个有向图顶点的拓扑序列不是惟一的。并不是任何有向图的顶点都可以排成拓扑序列,有环图是不能排的。 例子:比如排课问题,比如士兵排队问题等。         拓扑排序在实际生活中和算法中都有很大的应用。比如要排一下几门课程的先后次序,我们可以把课程抽象成结点,把什么课是什么课的基础抽象成边,那么该图的一个拓扑序列就是这些课的一个可行的先后次序。 [人度为零的顶点拓扑排序算法]:     Status Topological Sort(ALGraph G){     //有向图G采用邻接表存储结构。      /for }//while if(count<G.vexnum) return ERROR; //该有向图有回路 else return OK;     }//TopologicalSort  算法

    1.4K100发布于 2018-01-19
  • 来自专栏算法的秘密

    普通人如何理解递归算法

    当人们提到“递归”一词,不知道如何理解它,也有人会问递归和迭代有什么区别?首先可以从定义上入手来分析,递归是自身调用自身的函数进行循环、遇到满足终止条件的情况时逐层返回来结束。 如何实现递归算法的设计方法? 适宜用递归算法求解的问题的充分必要条件是: 其一,问题具有某种可借用的类同自身的子问题描述的性质: 其二,某一有限步的子问题(也称做本原问题)有直接的解存在。 如何理解递归算法? 所以该递归算法的时间复杂度为 O(2^n) ,这个复杂度是非常大的,随着n的增大,耗时是指数上升的。 如何理解递归算法的数据推导? ---- 数学中经常有这样的函数,它自己定义自己。 总之,递归算法是程序设计中一种重要的方法,在数学和计算机科学中,使用递归的思想能解决很多运算量较大的问题,节省大量的人力资源和时间,但对于递归的概念,初学者往往感到不容易理解,那么为什么还要引入递归的概念呢

    74311编辑于 2022-05-21
  • 来自专栏人工智能LeadAI

    如何感性地理解EM算法

    如果使用基于最大似然估计的模型,模型中存在隐变量,就要用EM算法做参数估计。个人认为,理解EM算法背后的idea,远比看懂它的数学推导重要。 idea会让你有一个直观的感受,从而明白算法的合理性,数学推导只是将这种合理性用更加严谨的语言表达出来而已。 打个比方,一个梨很甜,用数学的语言可以表述为糖分含量90%,但只有亲自咬一口,你才能真正感觉到这个梨有多甜,也才能真正理解数学上的90%的糖分究竟是怎么样的。 但要估计z,我们又得知道P1和P2,这样我们才能用最大似然概率法则去估计z,这不是鸡生蛋和蛋生鸡的问题吗,如何破? 05 总结 以上,我们用一个实际的小例子,来实际演示了EM算法背后的idea,共性存于个性之中,通过这个例子,我们可以对EM算法究竟在干什么有一个深刻感性的认识,掌握EM算法的思想精髓。

    1.6K30发布于 2018-03-09
  • 来自专栏数据分析1480

    如何理解算法中的偏差、方差和噪声?

    如何降低偏差(bias)?参考Machine Learning Yearning,Andrew Ng 增加算法的复杂度,比如神经网络中的神经元个数或者层数,增加决策树中的分支和层数等。 特征越多方差(variance)也就越大(可能又需要正则化); 削弱或者去除已有的正则化约束(L1正则化,L2正则化,dropout等),不过有增加方差的风险; 调整模型结构,比如神经网络的结构; 如何降低方差 增加正则化约束(比如L1正则化,L2正则化,dropout等),正则化降低方差的同时也可能增大偏差; 筛选输入的特征(feature selection),这样输入的特征变少后,方差也会减小; 降低算法模型复杂度 ,比如对决策树的剪枝、减少神经网络的层数等; 优化模型的结构有时候也会有用; K最近邻算法(K-NearestNeighbor)中随着K的增大bias和variance会怎么变化? 通常来说: 线性或者参数化的算法一般具有高偏差(bias)低方差(variance)的特点,比如线性回归,线性判别分析(Linear Discriminant Analysis),Logistic回归等线性模型

    3.1K30发布于 2019-06-03
  • 来自专栏Python大数据分析

    如何更好地理解递归算法?Python实例详解

    递归是一种较为抽象的数学逻辑,可以简单的理解为「程序调用自身的算法」。 也可以理解为自我复制的过程。 ❞ "递"是传递的意思,"归"是归还的意思,先把一个方法一层层传递下去,然后传递到最后一层再把结果归还回来。 中文译为:人理解迭代,神理解递归。 可见递归是非常神奇的算法,它的神奇之处在于它允许用户用有限的语句描述无限的对象。 当然人无完人,递归也是有缺点的,它一般效率较低,且会导致调用栈溢出。

    1.1K20编辑于 2022-04-03
  • 来自专栏SIGAI学习与实践平台

    理解EM算法

    EM( expectation-maximization,期望最大化)算法是机器学习中与SVM(支持向量机)、概率图模型并列的难以理解算法,主要原因在于其原理较为抽象,初学者无法抓住核心的点并理解算法求解的思路 算法的历史 EM算法即期望最大化算法,由Dempster等人在1976年提出[1]。这是一种迭代法,用于求解含有隐变量的最大似然估计、最大后验概率估计问题。至于什么是隐变量,在后面会详细解释。 EM算法在机器学习中有大量成功的应用,典型是求解高斯混合模型,隐马尔可夫模型。如果你要求解的机器学习模型中有隐变量存在,并且要估计模型的参数,EM算法很多时候是首选算法。 下图直观的解释了EM算法的原理 ? EM算法示意图 图中的蓝色曲线为要求解的对数似然函数,黄色曲线为构造出的下界函数。 求解高斯混合模型 下面介绍EM算法如何求解高斯混合模型。假设有一批样本{x1,...,xi}。为每个样本xi增加一个隐变量zi,表示样本来自于哪个高斯分布。

    1.7K30发布于 2019-01-23
  • 来自专栏owent

    理解Raft算法

    那么这个Raft算法有啥用呢?按照Raft官网的说法,这个算法的错误容忍和性能和Paxos算法类似,但是拥有更加简单易懂的设计。 而且也正是由于能够选举出唯一的主节点(Leader)使得整个通信流程非常地简单,并且易于理解和维护。 那么它是如何做到这些的呢? 其实也是一个javascript的简单实现,有利于我们理解Raft算法的流程。 那如何尽快确认这些消息呢?方法也很简单,前面也提过主节点被成功选举后,立即发一个空消息。这样前面不确定是否会被覆盖的消息就会很快被确认下来了。 但是根据自己对这两算法的差异的理解,我自己也能有一些总结,可能不完全正确。

    1.8K40发布于 2018-08-01
  • 来自专栏SIGAI学习与实践平台

    理解AdaBoost算法

    与随机森林一样,Boosting算法也是一种集成学习算法,随机森林和集成学习在SIGAI之前的公众号文章“随机森林概述”中已经介绍。 AdaBoost算法由Freund等人于1995年提出,是Boosting算法的一种实现,与SVM一样,在其发明后的10多年里,得到了成功的应用。 AdaBoost算法简介 AdaBoost算法的全称是自适应Boosting(Adaptive Boosting),是一种二分类器,它用弱分类器的线性组合构造强分类器。 弱分类器和它们的权重值通过训练算法得到。之所以叫弱分类器是因为它们的精度不用太高。 训练算法 训练时,依次训练每一个弱分类器,并得到它们的权重值。 在VJ算法问世之后,出现了各种改进型的方案。

    2.1K00发布于 2018-09-04
  • 来自专栏SIGAI学习与实践平台

    理解AdaBoost算法

    与随机森林一样,Boosting算法也是一种集成学习算法,随机森林和集成学习在SIGAI之前的公众号文章“随机森林概述”中已经介绍。 AdaBoost算法由Freund等人于1995年提出,是Boosting算法的一种实现,与SVM一样,在其发明后的10多年里,得到了成功的应用。 AdaBoost算法简介 AdaBoost算法的全称是自适应Boosting(Adaptive Boosting),是一种二分类器,它用弱分类器的线性组合构造强分类器。 弱分类器和它们的权重值通过训练算法得到。之所以叫弱分类器是因为它们的精度不用太高。 训练算法 训练时,依次训练每一个弱分类器,并得到它们的权重值。 在VJ算法问世之后,出现了各种改进型的方案。

    68140发布于 2018-09-29
  • 来自专栏计算机技术

    manacher算法通俗理解

    manacher算法是一种求字符串最大回文半径的o(n)的算法。回文就是以一个字符为中心左右两边的字符是相等的,如aba, aa。 但是对于aa来说不是很好求解,manacher算法给出了一种很巧妙的简单放在字符前后左右插入一个特殊字符,如插入#,得到 #a#a#, 最后半径一半就是原来字符的半径。 但是这种算法的复杂度是o(n^2) mancher提出了一种只需要o(n)的方法,方法非常巧妙。举例介绍一下的过程。 先给出几个概念,当前最大回文中心点C, 最大回文右边界R,当前回文中心i。 以python为例的mancher算法 def manacher(st): dst = "" for s in st: dst = dst + "#" + s dst

    94030编辑于 2022-03-26
  • 来自专栏SIGAI学习与实践平台

    理解策略梯度算法

    这很容易理解,假设一个动作a的Q函数值本来在所有动作中是第2大的,把它增加0.0001,就变成第最大的,那这种微小的变化会导致策略完全改变。因为之前它不是最优动作,现在变成最优动作了。 策略梯度算法的基本思想 相比之下,策略梯度算法是一种更为直接的方法,它让神经网络直接输出策略函数π(s),即在状态s下应该执行何种动作。 现在问题的核心就是如何构造这种目标函数L,以及如何生成训练样本。对于后者,采用了与DQN类似的思路,即按照当前策略随机地执行动作,并观察其回报值,以生成样本。 在确定目标函数之后,问题的关键是如何计算函数对策略参数θ的梯度值。你可能会问:这里有多种形式的目标函数,我们要分别推导它们对策略参数θ的梯度值,然后用梯度上升法更新参数的值。 REINFORCE算法流程如下。 ? 为了加快REINFORCE算法的收敛速度,减小偏差,可以在每次迭代时将回报值R减掉一个基准线值b,由此得到带基准线的REINFORCE算法

    1.5K20发布于 2019-11-28
  • 来自专栏智能算法

    通俗理解SLAM算法

    在有了深度图之后呢,SLAM算法就开始工作了,由于Sensor和需求的不同,SLAM的呈现形式略有差异。 这个是Sparse(稀疏)的 这个偏Dense(密集)的 SLAM算法实现的4要素 SLAM算法在实现的时候主要要考虑以下4个方面吧: 1. 信息感知问题,需要考虑如何全面的感知这个环境,RGBD摄像头FOV通常比较小,但激光雷达比较大 3. 数据关联问题,不同的sensor的数据类型、时间戳、坐标系表达方式各有不同,需要统一处理 4. 中国香港科技大学、帝国理工等等都有比较好的代表作品,还有一个比较有前景的就是三维的机器视觉,普林斯顿大学的肖剑雄教授结合SLAM和Deep Learning做一些三维物体的分类和识别, 实现一个对场景深度理解的机器人感知引擎 Mobile Robotics Group主要研究领域是大规模的导航和对自然场景理解。据称,团队所拥有的技术非常牛逼,其复杂和先进性远远超过一般的同步定位与地图构建(SLAM)算法

    25K74发布于 2019-12-27
  • 来自专栏webTower

    理解DOM Diff算法

    本文以 Vue 原码中的 DOM diff 算法为例,介绍一下这个算法的实现原理。 虚拟 DOM 是用 JavaScript 模拟 DOM 结构,通过计算出最小的变更,操作 DOM 结构,更新视图。 而 Diff 算法是虚拟 DOM 最核心、最关键的部分,好的 Diff 算法可以正确、快速的更新 DOM。DOM diff 算法时间复杂度为 O(n)。 patchVnode 函数 接下来是 diff 算法中最为核心的一个函数:updateChildren。 DOM diff 算法有以下几个特点: 先同级比较,再比较子节点; 先判断一方有 children,一方没有 children 的情况; 比较都有 children 的情况; 递归比较子节点; updateChildren 接着又一轮循环,结果发现循环条件不能满足,diff 算法结束,DOM 更新完成。

    1.2K10发布于 2020-07-29
  • 来自专栏全栈程序员必看

    RANSAC算法理解

    后面直到大伟哥面试趟坑被问到: 特征匹配要是遇到误匹配时,如何筛选处理? 答案就是用ransac算法进行过滤。 但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的参数。 三、算法 伪码形式的算法如下所示: 输入: data —— 一组观测数据 model —— 适应于数据的模型 n —— 适用于模型的最少数据个数 k —— 算法的迭代次数 t 中的元素数目大于d ) 已经找到了好的模型,现在测试该模型到底有多好 better_model = 适合于consensus_set中所有点的模型参数 this_error = better_model究竟如何适合这些点的度量 ransac算法迭代时也必须要规定的误差阀值,来确定是否为内点。 * confidence,置信度。ransac算法每次用于更新迭代次数的参数。

    1.3K20编辑于 2022-07-22
  • 理解CAS算法原理

    *,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。 2、CAS算法理解对CAS的理解,CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 4、CAS算法在JDK中的应用在原子类变量中,如java.util.concurrent.atomic中的AtomicXXX,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的CAS操作,而在 imageView2/2/w/670/format/webp由此可见,AtomicInteger.incrementAndGet的实现用了乐观锁技术,调用了类sun.misc.Unsafe库里面的 CAS算法

    26110编辑于 2024-12-25
  • PPO算法理解

    MFC/C++学习系列之简单记录7——句柄和AFX开头的函数的使用 文章链接:MFC/C++学习系列之简单记录7——句柄和AFX开头的函数的使用-腾讯云开发者社区-腾讯云 文章简介:本文介绍了在MFC使如何使用句柄和 前言 PPO(Proximal Policy Optimization)算法在A2C基础上进行样本管理和梯度计算改进。 核心改进点 1. Copy new weights into old policy: self.policy_old.load_state_dict(self.policy.state_dict()) PPO算法分为三个主要部分 (2) ActorCritic 类:PPO 算法的核心模型 模型包含 Actor 和 Critic 网络,用于分别计算策略分布和状态价值。 (3)PPO 类:实现策略的存储、更新和优化,是整个算法的主流程 初始化:包含policy和policy_old 两个模型实例,分别表示当前策略和旧策略。 update :通过多轮优化更新策略网络。

    60140编辑于 2024-11-21
  • 来自专栏小坤探游架构笔记

    如何理解分布式领导者复制算法模型

    其实就是存储系统中存储一份完整的数据库副本节点我们称之为Replica.有了多个Replica, 那么我们的问题来了, 即如何确保所有的数据都能最终完整地出现在每个Replica呢? 怎么理解呢? 如果我追求写性能且同时需要保证读己之所写的线性一致性,那么我就采用单领导者复制的主备方式, 即读写都是走leader节点, follower节点都是备份. 不仅如此,我们选择的共识算法决策还要结合我们对业务层面理解并采用对应的一致性模型综合考虑得出.而写冲突也会影响我们的数据一致性,而这种一致性我想我们应该要识别出来,它是在我们的FLP定理是一个安全性属性问题 第二种方式避免冲突.如何避免? 每个数据中心都有一份全量的数据,比如南方以及东南地区走IDC-1,北方以及西部区域都走IDC-2; 又或者按照范围分区,或者是hash分区等等,这样实现不同用户有不同的数据中心归属的地方.保证同一个用户不论如何请求都只会路由到在本地数据中心执行

    16800编辑于 2025-06-23
  • 来自专栏全栈程序员必看

    gbdt算法理解_gbdt算法原理

    谈及gbdt算法,不得不提GB与dt算法,即使用梯度提升回归树的方式进行回归提升。 以下贴上经典算法图: 1、第一步,算法中的参数,建立M棵回归树,每颗树的深度都为J,其中有一棵树为第一次建立的回归树,其余M-1棵树为残差(在梯度提升回归树里面为使损失函数最小的梯度向量

    53320编辑于 2022-11-07
  • 来自专栏sunsky

    深入理解排序算法

    由于排序是很多其他操作(比如二分查找)能够高效进行的基础,因此我们有必要掌握好常见的排序算法,本篇文章会分析几种最常用的排序算法,并进一步探索排序的本质,从而能够更加全面透彻的理解各种排序算法理解了插入排序的思想后,我们便能够得到它的时间复杂度。 到这里,我们要介绍的基本排序算法就介绍完了,再介绍快速排序、归并排序、堆排序等高级排序算法前,我们先来简单地介绍下如何比较各种排序算法的实际性能,这也能够帮助我们直观的看到希尔排序相比与插入排序等的性能优势 那么下面我们来介绍如何利用上面我们实现的merge方法来实现对一个数据集的归并排序。 相信这种解法的代码在理解了优先队列的实现后我们大家都能写出来。 第二个方案是使用冒泡排序k轮。 第三个方案是使用快速排序中的partition方法。

    58521发布于 2020-08-20
领券