Fractional Cascading算法是用于将零散的多个数组(亦可理解成比较高维的空间)中的数据的二分查找速度增加,用的是空间换时间的方法。然而这种方法并不是很好懂,而且中文文献很少。在这里介绍一种简单的伪Fractional Cascading算法。其实它与Fractional Cascading并没有任何关系,这里提到只是借个名声罢了。

  假设这些数据是二维的。即:有k个一维数组,其中一共存储了n个元素。要实现快速查找的目的,一般都会先进行排序,然后每次对于每个数组进行二分查找。时间复杂度为。考虑极限情况,即k=n时,显然,时间复杂度会退化到,显然不是一个好办法。

  现在就要谈我们的“伪Fractional Cascading”了。我们可以按照类似的思想,以空间换时间,建立一个大数组存储所有的键值对,顺带坐标信息。搜索时只需在这个大数组内进行,时间复杂度稳定为,且无退化情况。

  顺便我做了一个实际时间的对比表,结果如下(在Win10下,CPU:E3 1230V2,g++5.1.0编译,编译优化开关“-O3”,表中n,k如上文所述,查询重复times次):

# n k times 朴素二分查找(ms) 伪Fractional Cascading(ms)
1 1000000 200 10000 163 9
2 1000000 20000 10000 5763 8
3 10000000 200 10000 311 13
4 10000000 20000 10000 14433 20

  对比1,2与3,4可以明显看出,朴素二分查找的速度与k即数组的个数的关系很大。所以在k大的时候,伪Fractional Cascading更能发挥出优势。

  对比1,3与2,4可以明显看出,朴素二分查找的速度受n的影响也是随着k的增大而增大的。

  现在讲讲实现。STL很好的支持了数据检索这个需求,在朴素二分查找中可以直接使用binary_search函数查找。但是在伪Fractional Cascading算法中,不仅要保存值,还要保存坐标,这时候使用关联容器map系列更加方便。然而,在这个测试中同一个随机数可能分布在多个数组内,所以我还是用了multi_map。测试时间的样例程序可以在这里下载:FakeFractionalCascading.cpp(使用了一些c++11特性,编译时请加上相应的编译开关)

Updated 2015-12-5 18:11:

  这里把文下的一个评论提前:“@Antineutrino忘了在文章里写了,其实这就是为什么称为“伪Fractional Cascading”的原因。Fractional Cascading使用树结构,插入删除后调整也是对数级别的复杂度。然而像你所看到的,这个伪算法显然不能满足这个需求,所以就称它为离线结构吧。虽然 离线结构看起来没有什么意义,但是在一次性查询次数与修改次数差距悬殊时,对于程序的效率提升还是很明显的。”

  是的,这个结构有一个致命的弱点就是不支持动态修改(或者说很慢)。

简单快速的伪Fractional Cascading的更多相关文章

  1. CocoaPods 的简单快速安装方法

    CocoaPods 的简单快速安装方法(Setting up CocoaPods master repo 卡着不动,是因为淘宝镜像已经不能用了. 一.git clone方法安装cocoapods 镜像 ...

  2. 【转】让你10分钟搞定Mac--最简单快速的虚拟安装

    文章出处:让你10分钟搞定Mac--最简单快速的虚拟安装http://bbs.itheima.com/thread-106643-1-1.html (出处: 黑马程序员训练营论坛) 首先说明一下. 第 ...

  3. PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件

    PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...

  4. 一种简单快速的模板解析方法,活用with javascript版

    //一种简单快速的模板解析方法,活用with var parseTpl = function( str, data ) { var tmpl = 'var __p=[];' + 'with(obj|| ...

  5. Mario是一个基于.NETCore的简单快速开发框架

    Mario .NET Core简单快速开发框架 Mario是一个基于.NET Core的简单快速开发框架 GitHub:https://github.com/deeround/Mario 技术特点 基 ...

  6. 简单快速搭建钓鱼wifi

    前言 钓鱼wifi是很久的话题了,但是传统的方法可能比较麻烦需要手动配置dhcp,dns,网卡,流量转发,比较麻烦,而且还有根据每次的网络环境需要重新的配置,这里介绍用WIFIpumpkin3工具简单 ...

  7. 简单快速安装Apache+PHP+MySql服务环境(四)—— 将php版本升级到7.2

    书接上文,简单快速安装Apache+PHP+MySql服务环境(二)-- centos使用yum安装指定版本的php. 随着各种PHP框架的升级,对PHP的版本也有了更高的要求,所以笔者也尝试着更新升 ...

  8. 简单快速的开发框架-SRF

    1.是什么 SRF(simply and rapid development framework) 一套基于asp.net mvc的开发框架,致力于提供简单.快速的企业应用开发方案,旨在解决企业应用开 ...

  9. iOS简单快速集成Cordova

    如果你对于什么是Cordova还不了解,可以先移步到我另一个文章:Cordoval在iOS中的运用整理 里面有详细的介绍跟如何搭建Cordova:而本文则是要介绍JiaCordova插件,如果你有一点 ...

随机推荐

  1. 梦断代码3-message center消息的集中分发

    上一代产品模块有30多个,从底层硬件基础组件到上层应用控制.qos,各个模块通信据说都是直接向模块索要信息.最坏的死锁情况大概就是这样: 在产品升级后,加入了一个消息中心的模块,负责统一管理各个模块的 ...

  2. 深度学习论文笔记-Deep Learning Face Representation from Predicting 10,000 Classes

    来自:CVPR 2014   作者:Yi Sun ,Xiaogang Wang,Xiaoao Tang 题目:Deep Learning Face Representation from Predic ...

  3. [MODX] 3. Placeholder +

    A chunk may be used in many pages, different page may require different style. We can use Placeholde ...

  4. debian创建apt-proxy代理

    由于公司网络比较慢.所以需要建立一个代理服务器或镜象站点!考虑到创建和维护镜象的投入比较大!所以选择apt-proxy代理来做!可以缓解公司带宽不足的矛盾.而且只有在代理缓存,没有相应组件的情况下才去 ...

  5. AngularJS - 定时器 倒计时例子

    <body> <div ng-app="myApp"> <div ng-controller="firstController"& ...

  6. PHP中::、->、self、parent::、$this操作符的区别

    在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就必须使用操作符::,反之如果被引用的变量或者方法没有被声明成const或者 ...

  7. uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型(转)

    在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等.咋一看, 好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样 ...

  8. memcahced 更新

    memcahc特性: 在 Memcached中可以保存的item数据量是没有限制的,只要内存足够 . Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位 ...

  9. How to Setup Replicated LevelDB Persistence in Apache ActiveMQ 5.9--转载

    原文地址:https://simplesassim.wordpress.com/2013/11/03/how-to-setup-replicated-leveldb-persistence-in-ap ...

  10. 琐碎-到底要不要SSH免密码设置

    搭建了很多次hadoop2.2.0了,尝试过很多不同的启动方法.配置参数.位置,其中涉及到到底要不要配置SSH免密码登录的问题 先是搞清楚为什么需要SSH免密码登录 SSH免密码登录操作步骤: ... ...