递归算法

机器学习——详解KD-Tree原理

混江龙づ霸主 提交于 2020-04-08 10:53:25
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是机器学习的 第15篇文章 ,之前的文章当中讲了Kmeans的相关优化,还讲了大名鼎鼎的EM算法。有些小伙伴表示喜欢看这些硬核的,于是今天上点硬菜,我们来看一个机器学习领域经常用到的数据结构—— KD-Tree 。 从线段树到KD树 在讲KD树之前,我们先来了解一下 线段树 的概念。线段树在机器学习领域当中不太常见,作为高性能维护的数据结构,经常出现在各种算法比赛当中。线段树的本质是一棵维护一段区间的平衡二叉树。 比如下图就是一个经典的线段树: 从下图当中我们不难看出来,这棵线段树维护的是一个 区间内的最大值 。比如树根是8,维护的是整个区间的最大值,每一个中间节点的值都是以它为树根的子树中所有元素的最大值。 通过线段树,我们可以在 的时间内计算出某一个 连续区间的最大值 。比如我们来看下图: 当我们要求被框起来的区间中的最大值,我们只需要 找到能够覆盖这个区间的中间节点 就行。我们可以发现被红框框起来的两个节点的子树刚好覆盖这个区间,于是整个区间的最大值,就是这两个元素的最大值。这样,我们就把一个需要 查找的问题降低成了 ,不但如此,我们也可以 做到 复杂度内的更新 ,也就是说我们不但可以快速查询,还可以更新线段当中的元素。 当然线段树的应用非常广泛,也有 许多种变体 ,这里我们不过多深入

递归与尾递归

假如想象 提交于 2020-04-06 23:54:02
下面两个程序是scheme写的计算阶乘的递归和尾递归实现 线性递归: (define (factorial n) (if (=n 1) 1 (* n (factorial (- n 1))))) 尾递归: (define (factorial n) (fact-iter 1 1 n)) (define (fact-iter product counter max-count) (if (> counter max-count) product (fact-iter (* counter product) (+ counter 1) max-count))) 用C写出来就是这样的: 线性递归: long factorial(long n) { return(n == 1) ? 1 : n * factorial(n - 1); } 尾递归: long fact_iter(long product, long counter, long maxcount) { return (counter > maxcount) ? product : fact_iter(product*counter, counter+1, maxcount); } long factorial(long n) { return fact_iter(1, 1, n); } 线性递归程序基于阶乘的递归定义,即

Google的面试题长啥样?看完被吊打!

那年仲夏 提交于 2020-04-06 02:19:00
本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight’s Dialer; 来源:实验楼,翻译:实验楼扫地阿姨 原文: https://medium.com/@alexgolec/google-interview-questions-deconstructed-the-knights-dialer-f780d516f029 作为一名Google的工程师和面试官,今天是我第二次发文分享科技公司面试建议了。 这里先声明:本文仅代表我个人的观察、意见和建议。请勿当作来自Google或Alphabet的官方建议或声明。 **下面这个问题,是我面试生涯中第一个问题;也是第一个被泄漏出来,以及第一个被禁掉的问题。**我喜欢这个问题,因为它有以下优点: 问题很容易表述清楚,也容易理解。 这个问题有多个解。每个解都需要不同程度的算法和数据结构知识。而且,还需要一点点远见。 每个解都可以简单几行代码实现,非常适合有时间限制的面试。 如果你是学生,或者求职者,我希望你通过本文能够了解到,面试问题一般会是怎么样的。如果你也是面试官,我很乐意分享自己在面试中的风格和想法,如何更好地传达信息、征求意见。 **注意,**我将使用Python写代码;我喜欢Python因为它易学,简洁

我说我不会排序算法,阿里就挂了我

女生的网名这么多〃 提交于 2020-04-05 22:40:05
前言 工作已经有一段时间了,有的时候会跟同事们打趣:“ 如果你让我现在去手写一个快速排序,我怕是真的写不出来 ”。 如果不接触一段时间的算法,真的很容易就忘了。不信?你现在想想你自己能不能手写一个堆排序。 经历过校招的人都知道, 算法和数据结构 都是不可避免的。 在笔试的时候,最主要的就是靠算法题。像拼多多、头条这种大公司,上来就来几道算法题,如果你没AC出来,面试机会都没有。 在面试(现场面或者视频面)的时候也会问算法题,难度肯定是没有笔试的时候那么难的。我们可以想象一个场景,一面面试面到一半,面试官让你反转二叉树,问问现在的自己,你还会吗。 不扯远了,如果还在上大学的同学可以先以 排序 和各种的 基本数据结构 开始入门。我花了一个星期将 八大基础排序 和 链表/二叉树/栈/队列 制作成一份 精美的PDF 。 这份PDF阅读体验肯定是要比公众号和各大的博客平台的文章要好的。PDF内容 纯手打 ,有不懂的可以来问我。 下面来简单介绍一下八大基础排序和基础的数据结构,每种排序的思想和基础的 讲解和源码 在PDF里边有。 冒泡排序 思路:俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾。因为俩俩交换,需要 n-1 趟排序(比如10个数,需要9趟排序) 代码实现要点: 两个for循环,外层循环控制排序的趟数,内层循环控制比较的次数 。 每趟过后,比较的次数都应该要减1 选择排序

二分搜索树(Binary Search Tree)

这一生的挚爱 提交于 2020-04-04 09:12:11
目录 什么是二叉树? 什么是二分搜索树? 二分搜索树的基本操作 二分搜索树添加新元素 二分搜索树的遍历(包含非递归实现) 删除二分搜索树中的元素 什么是二叉树?   在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。   树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有 唯一的根节点 ,二叉树每个节点 最多 有两个孩子节点,二叉树的每个节点 最多有一个父亲节点 ,二叉树具有天然递归结构,每个节点的左子数也是一棵二叉树,每个节点的右子树也是一颗二叉树。二叉树如下图: 什么是二分搜索树?   二分搜索树也是一种二叉树,但二分搜索树种每个节点的值都要大于其左子树所有节点的值,小于其右子树所有节点的值,每一棵子树也是二分搜索树。正因为二分搜索树的这种性质,二分搜索树存储的元素必须具有可比较性。下图就是一棵二分搜索树: 我们可以根据二分搜索树的特点,构建一颗二分搜索树,代码实现如下: /** * 由于二分搜索树中的元素必须具有可比较性

【封装】二叉树相关算法的实验验证

天大地大妈咪最大 提交于 2020-04-01 08:34:40
二叉树的一些基本知识: 二叉树与树有许多相似之处,但二叉树不是树的特殊情形。 定义 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二 叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点; 深度为k 的二叉树至多有2^k-1个结点; 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。 一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。 相关术语 树的结点:包含一个数据元素及若干指向子树的分支; 孩子结点:结点的子树的根称为该结点的孩子; 双亲结点:B 结点是A 结点的孩子,则A结点是B 结点的双亲; 兄弟结点:同一双亲的孩子结点; 堂兄结点:同一层上结点; 祖先结点: 从根到该结点的所经分支上的所有结点子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙 结点层:根结点的层定义为1;根的孩子为第二层结点,依此类推; 树的深度:树中最大的结点层 结点的度:结点子树的个数 树的度: 树中最大的结点度。

递归归并排序 二路归并排序

五迷三道 提交于 2020-03-31 15:34:53
归并算法的两种方法: 1、使用分治法的递归归并算法: /*递归归并排序 *将有二个有序数列list[first...mid]和list[mid+1,...last]合并 *list:待排序数组 *first:子序列1的下界 *mid:子序列1的上界 *last:子序列2的上界 *temp:临时保存数组 */ void Merge(element list[], int first, int mid, int last, element temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (list[i] < list[j]) temp[k++] = list[i++]; else temp[k++] = list[j++]; } while (i <= m) temp[k++] = list[i++]; while (j <= n) temp[k++] = list[j++]; for (i = 0; i < k; i++) list[first + i] = temp[i]; return ; } /*递归归并排序 *分治,完成递归归并 *list:待排序数组 *first:list下界 *last:list上界 *temp

Python-递归初识-50

六月ゝ 毕业季﹏ 提交于 2020-03-30 17:21:52
#递归函数 # 了解什么是递归 : 在函数中调用自身函数 # 最大递归深度默认是997/998 —— 是python从内存角度出发做得限制 # 能看懂递归 # 能知道递归的应用场景 # 初识递归 —— # 算法 —— 二分查找算法 # 三级菜单 —— 递归实现 # while True: # print('从前有座山') def story(): print('从前有座山') story() print(111) story() #RecursionError: maximum recursion depth exceeded while calling a Python object# 递归的错误,超过了递归的最大深度 import sys sys.setrecursionlimit(1000000) n = 0 def story(): global n n += 1 print(n) story() story() def age(n): if n == 4: return 40 elif n >0 and n < 4: return age(n+1) + 2 # print(age(1)) 来源: https://www.cnblogs.com/LXL616/p/10708472.html

python实现二叉树和它的七种遍历

时间秒杀一切 提交于 2020-03-28 18:37:16
介绍: 树是数据结构中非常重要的一种,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。 代码: 用python实现树的构造和几种遍历算法,虽然不难,不过还是把代码作了一下整理总结。实现功能: 树的构造 递归实现先序遍历、中序遍历、后序遍历 堆栈实现先序遍历、中序遍历、后序遍历 队列实现层次遍历 #coding=utf-8 class Node(object): """节点类""" def __init__(self, elem=-1, lchild=None, rchild=None): self.elem = elem self.lchild = lchild self.rchild = rchild class Tree(object): """树类""" def __init__(self): self.root = Node() self.myQueue = [] def add(self, elem): """为树添加节点""" node = Node(elem) if self.root.elem == -1: # 如果树是空的,则对根节点赋值 self.root = node self.myQueue.append(self.root) else: treeNode = self.myQueue

机器人逆动力学(Robot Inverse Dynamics)

白昼怎懂夜的黑 提交于 2020-03-28 03:15:24
(作者建议您在 这里 下载本文pdf版获得更清晰的阅读方式)。 逆动力学问题是指:已知某一时刻机器人各关节的位置 ,关节速度 及关节加速度 ,求此时施加在机器人各杆件上的驱动力(力矩) 。 逆动力学问题在机器人控制与计算机动画领域都有广泛的应用。例如当给出期望的机器人运动状态时,我们可以通过逆动力学解算来分析其力矩是否可以由作动系统实现。在计算机动画领域,可以利用优化算法求解力矩消耗最小的动画过程(如文献[1])来得到一个自然的动画。另外,逆动力学也常作为正动力学的一个子部分来求解正动力学(正动力学指已知力和力矩,求系统状态)。 逆动力学可以利用牛顿欧拉(Newton-Euler)方程来求解,也可以利用拉格朗日(Lagrange)方程来求解(二者的等价性与区别读者可以参看文献[2]中的2.3节)。本文旨在讲解如何基于牛顿欧拉(Newton-Euler)方程来求解机器人逆动力学,其算法被称为“迭代牛顿欧拉算法(Recursive Newton-Euler Algorithm)”。 1. 预备知识 在介绍“迭代牛顿欧拉算法(Recursive Newton-Euler Algorithm)”之前,让我们先看一下什么是牛顿欧拉方程: 其中 表示线加速度, 表示角加速度(角速度的导数),等式左边的求和符号表示公式中应该使用合力与合力矩。关于如何得出牛顿欧拉方程,请参看我的前一篇文章: