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. webpack echarts配置实例

    简单介绍 本例介绍怎样在webpack中构建依赖echats的项目,echarts有好几种方式引入项目: 标签单文件引入:自1.3.5開始,ECharts提供标签式引入.假设项目本身并非基于模块化开发 ...

  2. phpStudy 2014的Apache虚拟主机配置

    安装phpStudy直接百度下载,傻瓜式安装很简单,一直点击下一步即可,中途根据个人爱好设置WWW目录,我的设置在D盘根目录里. 打开虚拟主机配置,打开D:\phpStudy\Apache\conf下 ...

  3. hdu 5569 matrix dp

    matrix Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5569 D ...

  4. MyBatis之二:简单增删改查

    这一篇在上一篇的基础上简单讲解如何进行增删改查操作. 一.在mybatis的配置文件conf.xml中注册xml与注解映射 <!-- 注册映射文件 --> <mappers> ...

  5. epoll使用具体解释(精髓)

    epoll - I/O event notification facility 在linux的网络编程中,非常长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就 ...

  6. ant脚本打jar包 自动获取时间以及项目svn版本号

    1.关键代码,获取时间 <tstamp> <format property="touch.time" pattern="yyyy/MM/dd hh:mm ...

  7. NopCommerce 数据库初始化

    NopCommerce数据库初始化比较复杂,我简化了,只初始化创建一张表,不多说,直接上代码: //数据实体 /// <summary> /// Represents an affilia ...

  8. javascript获取鼠标位置

    首先不同浏览器中event位置属性的分析: 1. IE的event.x,event.y是以事件触发元素的父元素外界为参考点(不包括滚动距离) 2. Firefox的event.pageX,event. ...

  9. 炼数成金hadoop视频干货03

    视频地址:http://pan.baidu.com/s/1dDEgKwD 着重介绍了HDFS 运行了示例程序wordcount,自己也试了一遍(用的伪分布式) 1.建立数据(和讲师的操作有些不一样,不 ...

  10. Asp.Net 之 WebService部署到服务器后出现" The test form is only available for requests from the local machine "

    最近由于任务需要开发了一个WebService, 部署到服务器以后,出现上述问题,网上查找到如下解决方案: 问题原因: 从 NET Framework 1.1 起定义了一个名为 HttpPostLoc ...