博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于分块思想的个人理解
阅读量:6973 次
发布时间:2019-06-27

本文共 826 字,大约阅读时间需要 2 分钟。

刚刚做A1057 Stack题的时候遇到超时问题,查阅了相关的资料,发现这道题最优的两种做法分别是分块思想和树状数组;

这章先介绍一下分块思想:

首先分块思想针对的是在线队列,也就是会对队列进行修改和操作,包括树状数组针对的也是这个问题;

其实分块思想下的一个典型问题就是实时查询序列元素第K大的问题。

分块思想的本质就是将序列按照索引划分为不同的块,所以每个元素就有隶属的块;
在每一块中,为每一个元素建立hash数组,用来存储每个元素的重复个数。当我们需要查询第k大问题的时候,就可以先通过每一块的元素个数,计算它在那一块,再通过块中的每一个元素的hash值,从而判断需要查询的第k个元素是哪一个元素;

使用分块思想的优势就是可以通过分块来计算相应的值,省去了排序的步骤;例如对于我们A1057题,最蠢最笨的思路就是把序列提出来,排序,然后找第k个值,这样就徒劳的增加了时间复杂度;

具体的分块计算策略如下所示:

1.当我们的序列长度为n,出最后的一块,剩下的每块中的元素应该为√n(向下取整),并且块数应该为√n(向上取整)。之所以对块数向上取整的目的是将最后不满的块独立划分为一块;
2.同时,我们建立两个数组,一个为block数组,一个为table数组;
其中,block[i]代表的第i个块中所含有的元素个数,table[i]代表的是所有序列中第i个元素所现在存在的重复个数;

例如,我们当前分了316块,我们可以添加和查询以及删除元素;

当我们添加元素的时候,应该先寻找在那一块,例如304/316=0,代表304号元素在第0块,block[0]++,table[304]++;
当我们需要查询第k个元素的时候,我们需要对比每一个块,也就是block[i],看看在第几块中,找到在第几块的的时候,逐个枚举属于该块的table[i],看看是第k个元素是否是i;
删除元素同理,寻找在第几块,相应的block[i]--,table[j]++;

转载地址:http://jdrsl.baihongyu.com/

你可能感兴趣的文章
iOS 中实现功能引导页面
查看>>
3年路漫漫,告别老东家
查看>>
呼吁身份证号码识别生日的问题
查看>>
函数依赖的公理化系统
查看>>
open Command window here
查看>>
Spring boot 启动过程解析 logback
查看>>
@ActiveMQ简单介绍以及安装
查看>>
php实现简单视图模板(视图引擎)
查看>>
[改善Java代码]多线程使用Vector或HashTable
查看>>
Linux开机禁用开启防火墙
查看>>
js事件之event.preventDefault()与event.stopPropagation()用法区别
查看>>
Ubuntu 上 执行命令 java -version 显示 没有那个文件或目录
查看>>
jQuery补充之jQuery扩展/form表单提交/滚动菜单
查看>>
Html5拖拽复制
查看>>
Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A. Broken Clock 水题
查看>>
An attempt was made to load a program with an incorrect format
查看>>
Spark RDD概念学习系列之Spark Hash Shuffle内幕彻底解密(二十)
查看>>
期货术语-关于升、贴水,点价,洗船
查看>>
ASP.NET Core 中文文档 第四章 MVC(4.5)测试控制器逻辑
查看>>
js基础参数获取
查看>>