查找算法

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

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

C 和 C++ 字符串函数操作

ε祈祈猫儿з 提交于 2020-04-07 11:35:44
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1) 查找字符串 strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移 * 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符 2)字符串到数值类型的转换 strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。 strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制

C语言字符串操作详细总结

拥有回忆 提交于 2020-04-07 11:34:55
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1) 查找字符串 strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移 * 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符 2)字符串到数值类型的转换 strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。 strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制

类(元类)对象方法缓存原理

老子叫甜甜 提交于 2020-04-06 18:11:11
一、摘要 1.阅读该篇,需要对runtime底层及类对象数据结构有一定了解,本篇仅着重讲解方法缓存的算法; 2.以下以类对象来论述,元类对象以此类推; 二、类对象数据结构 //rumtime源码 //小码哥图片 说明:其中cache_t类型变量cache就是用来缓存曾经调度过的方法; 三、方法调度原理 Person *per = [[Person alloc] init];createCaches(ORIGINAL_MASK);handleMethod("test1", @selector(test1), [per test1]); handleMethod("test2", @selector(test2), [per test2]); handleMethod("test1", @selector(test1), [per test1]); handleMethod("test3", @selector(test3), [per test3]); handleMethod("test4", @selector(test4), [per test4]); handleMethod("test5", @selector(test5), [per test5]); handleMethod("test4", @selector(test4), [per test4]);

插值查找

懵懂的女人 提交于 2020-04-04 11:55:49
问题描述: 通过插值查找,查找一个数在给定数组中是否存在,若存在找到位置索引,不存在返回-1(给定数组中的数值都不相等) 算法实现: privat int interpolationSearch(int[] arr, int lo, int hi, int key) { if(lo > hi || arr[lo] > key || arr[hi] < key) { return -1; } int mid = lo + (hi - lo) * ((key - arr[lo]) / (arr[key] - arr[lo])); int midValue = arr[mid]; if(key > midValue) { return interpolationSearch(arr, mid + 1, hi, key); } else if(key < midValue) { return interpolationSearch(arr, lo, mid - 1, key); } else { return mid; }} 算法解析: 1.插值查找是对二分查找的优化,主要针对数据量较大&关键字分布比较均匀的查找表; 2.重点关注插值的计算公式的关键部分(key - arr[lo]) / (arr[hi] - arr[lo]); 来源: https://www.cnblogs.com

一文讲透数据结构中的树,建议收藏!

跟風遠走 提交于 2020-04-04 10:32:16
数据结构是 10 年前大学里学的一门课程,也是我北漂唯一携带的一本书。幸运的是,书还没有被孩子给撕碎。 为了让大家都能够搞懂「树」这个苦涩而硬核的知识,今天就重拾记忆,分享一下研发人员心中那些放不下的「树」。 不过,一定要冲好咖啡、沏壶好茶,心平气和去看文。 01. 「树」现实与虚拟的抽象 在「中华姓氏树」中寻找一片属于你的叶子,探寻一下家族的来源。 在脑海里尝试画一下「家谱树」。 看完现实中的树,那来看一看计算机的文件系统组织形式。 无论是现实的姓氏树、家谱树,还是计算机的文件系统,表现形式虽然不同,但是本质上却都是树。 那到底什么是树呢? 树是由 n(n≥0)个结点组成的有限集合。 当 n = 0 时,称为空树; 当 n > 0 时,有一个特殊的节点称为根结点(root),它没有前驱结点;其它结点分为 m 棵互不相交的子树。 如图示意,(a)为空树;(b)为 1 个结点的树;(c)为 n 个结点的树。 知道了什么是树,上面「家谱树」以及「文件系统」用到的树表示法,有没有学名呢?稍微科普一下。 图示法:是树的直观表示法,主要用于描述树的逻辑结构,如上面提到的家谱树。 横向凹入表示法:是用逐层缩进方法表示结点之间的层次关系,主要用于树的屏幕显示和打印输出,如上面提到的文件系统。 知道了什么树以及树的部分表示法,但是猿有猿声,鸟有鸟语,树也有术语。 02.「树」有术语 节点 or

二分法查找算法

[亡魂溺海] 提交于 2020-04-02 08:15:00
二分法查找算法 二分法算法,也叫折半算法,是一种检索效率比较高的方式,当数据量较大时用二分法查找会更快,但是数据需要先排好顺序,可以调用.sort();方法进行排序。 先确定该区间的中间位置K(2)将要查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。如果没有查到,则将当前查找区间将缩小一半,递归查找,直到找到为止。 在检索的时候我们需要先对其进行排序: Arrays.sort(arr); 为了便于操作,建议对其查找方法进行封装处理,定义好参数值: public static int myBinarySearch(int[] arr,int value) { } 在写这个方法之前我们需要先对其首位进行定义,我们可以对其声明一个变量: int start=0; int end=arr.length-1; 用while循环进行判断: while (start<=end) { int mid=(start+end)/2; if (value==arr[mid]) { return mid; } if (value>arr[mid]) { start=end+1; } if (value<arr[mid]) { end=mid-1; } } return -1; 如果没有查找到,则返回-1。 定义main方法和声明数组。 public

K近邻法(KNN)原理小结

不想你离开。 提交于 2020-04-01 06:10:06
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用。比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了。这里就运用了KNN的思想。KNN方法既可以做分类,也可以做回归,这点和决策树算法相同。     KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同。KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别。而KNN做回归时,一般是选择平均法,即最近的K个样本的样本输出的平均值作为回归预测值。由于两者区别不大,虽然本文主要是讲解KNN的分类方法,但思想对KNN的回归方法也适用。由于scikit-learn里只使用了蛮力实现(brute-force),KD树实现(KDTree)和球树(BallTree)实现,本文只讨论这几种算法的实现原理。其余的实现方法比如BBF树,MVP树等,在这里不做讨论。 1. KNN算法三要素     KNN算法我们主要要考虑三个重要的要素,对于固定的训练集,只要这三点确定了,算法的预测方式也就决定了。这三个最终的要素是k值的选取,距离度量的方式和分类决策规则。     对于分类决策规则,一般都是使用前面提到的多数表决法。所以我们重点是关注与k值的选择和距离的度量方式。     对于k值的选择

Linux 常用命令总结(一)

我们两清 提交于 2020-03-25 01:15:36
一、基本概念 1、为什么学习命令操作而不用界面操作?   Linux 作为服务器,使用图形界面会占用更多的系统资源,且影响稳定性、安全性。而且一个服务器连个显示屏都没有,图形界面毫无作用,所以命令行操作是 Linux 的必备技能。 常用命令手册:   https://www.runoob.com/linux/linux-command-manual.html 2、命令格式 【格式:】 [root@localhost ~]# 命令 [选项] [参数] 注: [root@localhost ~]# 是登录系统后看到的内容。 其中 []、@ 没有特殊含义,作为分隔符号。 root 表示当前登录的用户,切换成普通用户,会显示普通用户名。 localhost 表示当前主机名。 ~ 表示当前所在的目录,初始登录时显示 ~,表示为家目录(主目录)。 root 用户家目录在 /root,普通用户家目录在 /home/用户名。 # 表示当前登录用户为管理员,若为普通用户,则显示为 $。 命令 [选项] [参数] 其中 选项,为可选项,用于调整命令的功能。 参数,为可选项,用于调整命令的操作对象。 3、文件类型   Linux 内部一切皆文件,不同的类型的文件代表不同的意义。 【类型:】 - 表示常规文件,如 文本文件、压缩文件、二进制文件。 d 表示目录文件(directory) b 表示块设备文件

【算法】剑指第二版面试题4 :二维数组中的查找

我的梦境 提交于 2020-03-23 13:28:01
题干 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 func Find(board [][]int, target int) bool {} 直觉思路 二分查找的思想,不断缩小查找范围。 怎么想到的 不断缩小查找范围。 代码编写思路 多少行:rlen := len(board) 多少列: clen := len(board[0]) 行索引和列索引最大值: rlen-1,clen-1 从右上角开始查找:初始化 r: 行索引,第一行, 0 c: 列索引,最后一列, clen-1 查找继续的条件:(最后一列最后一行都是可以继续查找的) 行索引(不断增加): r < rlen 列索引(不断减少): c >=0 时间复杂度 (TODO) m行,n列: r从0到m-1,c从n-1到0. 循环最多执行m+n次,所以O(m+n) 来源: https://www.cnblogs.com/yudidi/p/12350645.html