经典索引算法

索引算法

树索引

1.kd-tree

  • KNN算法的核心是寻找待测样本在训练样本集中的k个近邻,如果训练样本集过大,则传统的遍历全样本寻找k近邻的方式将导致性能的急剧下降。

  • kd-tree以空间换时间,**利用训练样本集中的样本点,沿各维度依次对k维空间进行划分,建立二叉树,**利用分治思想大大提高算法搜索效率。我们知道,二分查找的算法复杂度是O(logN),kd-tree的搜索效率与之接近(取决于所构造kd-tree是否接近平衡树)。
    在这里插入图片描述

1.树深每往下延伸一层,我们就会换一个维度作为衡量标准。原因也很简单,因为我们希望这棵树对于这K维空间都有很好的表达能力,方便我们根据不同的维度快速查询。

2.叶子节点,其实代表样本空间当中的一小块空间

3.可以在一次查询当中直接查找到K个最近的样本

优秀博文:https://zhuanlan.zhihu.com/p/127022333

  1. ball-tree

    在kd-tree 中,一个导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体,求最近邻时使用的是欧式距离(超球),超方体与超球体相交的可能性是极高的,凡是相交的子空间,都需要进行检查,大大的降低运行效率.

    如果划分区域也是超球体,则相交的概率大大降低。如下图所示,为ball-tree通过超球体划分空间,去掉棱角,划分超球体和搜索超球体相交的概率大大降低,特别实在数据维度很高时,算法效率得到大大提升。

在这里插入图片描述

  1. b+

    img

b树:B树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的子节点,子节点的个数一般称为阶,上述图中的B树为3阶B树,高度也会很低。

b+树:B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。之所以这么做是因为在数据库中页的大小是固定的,innodb中页的默认大小是16KB。如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。另外,B+树的阶数是等于键值的数量的,如果我们的B+树一个节点可以存储1000个键值,那么3层B+树可以存储1000×1000×1000=10亿个数据。一般根节点是常驻内存的,所以一般我们查找10亿数据,只需要2次磁盘IO。

优秀博文:https://www.cnblogs.com/gqzdev/p/11901970.html

LSH

LSH的基本思路是使用哈希函数依高概率将相似的数据映射到同一哈希桶中。
根据LSH索引,执行一次相似查询需要两个步骤:
(1)使用LSH函数对给定的查询数据q选取候选数据集。
(2)根据这些候选数据与q的距离进行排序,然后返回Top-K个数据。

由于这样的概率特性保证,可以使得两个距离较远的数据点碰撞的概率是p2M(其中M是LSH函数的个数),但同时也是的相邻的数据碰撞的概率是p2M
这样的基本的LSH索引方法需要很多哈希表来保证涵盖大部分近邻数据,这对空间要求是很大的,一旦哈希表的空间要求超过了主存的容量,我们不得不将哈希表存放在磁盘中,那么磁盘I/O的速度来查询必然大大降低了查询速度。

哈希冲突

数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?
哈希冲突的解决方案有多种:开放地址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式,

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值