递归调用

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

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

chapter20_File类、递归

为君一笑 提交于 2020-04-07 15:41:49
chapter20_File类、递归 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示 java把电脑中的文件和文件夹(目录)封装为一个File类,我们可以使用File类对文件/文件夹进行操作 主要用于文件和目录的创建、查找和删除等操作。 File类是一个与系统无关的类,任何的操作系统都可以使用类中的方法 重点:记几个单词 file:文件 path:路径 separator:分隔器 directtory:文件夹/目录 1.2 构造方法 public File(String pathname) :通过将给定的 路径名字符串 转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从 父路径名字符串和子路径名字符串 创建新的 File实例。 public File(File parent, String child) :从 父抽象路径名和子路径名字符串 创建新的 File实例。 操作路径不能写死了 Windows 和Linux系统的分隔符不同 windows: C:\develop\a\a.txt Linux: C:/develop/a/a.txt 所以正确写法 "C:"+File.separator+"develop"+File.separator+"a"+File

递归与尾递归

假如想象 提交于 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); } 线性递归程序基于阶乘的递归定义,即

【Python学习笔记】递归函数

余生颓废 提交于 2020-04-06 21:50:38
★特殊的一种函数——递归函数 通常,函数是靠调用其他函数完成自己的功能的,但是还存在一种调用方式是:函数调用它自身,这样的函数称为递归函数 递归函数是利用'栈'实现的,递归函数的优点是定义简单,逻辑清晰,缺点是比较占用资源,且容易造成栈溢出,甚至导致崩溃 # 常见的递归函数是计算阶乘 def fact(n): if n==1: return 1 return n * fact(n - 1) print fact(5) 运行效果: # 理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 # ★★★如非必须,尽量不用递归函数★★★ #每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 # print fact(1000) # 报错 # 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。 # 尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况# # 使用尾递归优化的计算阶乘 def fact(n): return fact_iter(n, 1) def fact_iter

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因为它易学,简洁

Javascript函数声明与递归调用

元气小坏坏 提交于 2020-04-05 23:02:55
Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Javascript还是令人着迷的。Javascript众多优美的特性的核心,是作为顶级对象(first-class objects)的函数。函数就像其他普通对象一样被创建、被分配给变量、作为参数被传递、作为返回值以及持有属性和方法。函数作为顶级对象,赋予了Javascript强大的函数式编程能力,也带来了不太容易控制的灵活性。 1、函数声明 变量式声明先创建一个匿名函数,然后把它赋值给一个指定的变量: var f = function () { // function body }; 通常我们不必关心等号右边表达式的作用域是全局还是某个闭包内,因为它只能通过等号左边的变量f来引用,应该关注的是变量f的作用域。如果f指向函数的引用被破坏(f = null),且函数没有被赋值给任何其它变量或对象属性,匿名函数会因为失去所有引用而被垃圾回收机制销毁。 也可以使用函数表达式创建函数: function f() { // function body } 与变量式不同的是,这种声明方式会为函数的一个内置属性name赋值

二分搜索树(Binary Search Tree)

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

java 基础之 IO

霸气de小男生 提交于 2020-04-02 20:29:22
第1章 File 1.1 IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作。 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作。 因此我们把这种输入和输出动作称为IO操作。 简单了解IO是怎么一回事之后,接下来就要进一步做系统了解。 在我们操作系统中,数据都保存在文件中,而文件存放相应的文件夹中。那么Java中是如何描述这些的呢? 1.2 File类的出现 打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式。即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。那么我们就要研究研究File这个类中都有那些功能可以操作文件或者文件夹呢? 1.3 File类的构造函数 l 通过构造方法创建File对象,我们进行演示: public class FileDemo { public static void main

java IO操作File类

纵饮孤独 提交于 2020-04-02 20:28:01
---恢复内容开始--- IO操作 把内存上的数据写到可持久化存储的设备上叫输出(Output) 把持久存储数据的设备写到内存上叫输入(Input) File类 把文件和文件夹都封装成文件对象 File类获取对象 1 import java.io.File; 2 3 public class Demo02 { 4 5 public static void main(String[] args) { 6 File f = new File("E:\\java学习\\6月5号"); 7 System.out.println(f.getAbsolutePath()); 8 9 }返回了 E:\\java学习\\6月5号 import java.io.File; public class Demo02 { public static void main(String[] args) { File f = new File("E:\\java学习\\6月5号"); System.out.println(f.getName()); }返回了6月5号 1 import java.io.File; 2 3 public class Demo02 { 4 5 public static void main(String[] args) { 6 File f = new File("E:\

Java的递归、IO流

99封情书 提交于 2020-04-02 20:25:31
/*--> */ /*--> */ 一、递归 [递归]   1、 在函数自身内部,调用函数本身的方式,称为递归。    2、 注意: 递归包括递进去、归出来两步。     首先,依次执行【函数调自身语句】上半部分的代码,直到最里层。 {递进去}      然后,再从最里层开始,依次执行【函数调自身语句】下半部分的代码。 {归出来}   3、 递归必须通过合适的语句,及时的跳出。 否则,容易造成死循环。 public static int num=0;//2 public static void test(){ System.out.println("这是一个函数"); num++; if(num<=2){ test();//if()不成立不再调用自己 }//先执行三次 System.out.println("hahah");//执行完num大于2,hahah在执行之前的三次 } //test类 test(); 结果: 练习:5的阶乘 方法1: /** * 用递归实现5的! */ static int jie=1; public static long jiecheng(int n){ jie*=n; n--; if(n>=1){ jiecheng(5); } return jie; } //Test类: System.out.println(jiecheng(5)); 方法2: