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

本文共 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://fofsx.baihongyu.com/

你可能感兴趣的文章
mybatis
查看>>
序列、视图、索引(面试看这个就GO了)
查看>>
JSON 与 JS 对象的区别与对比
查看>>
Python学习笔记__6.4章 获取对象信息
查看>>
第九单元 oppenssh-server
查看>>
网络工程师成长日记320-西安奥林巴斯项目回忆录
查看>>
自动化运维工具介绍(第一章)
查看>>
Easy Touch Controls 组件运用
查看>>
Java的新项目学成在线笔记-day8(二)
查看>>
VMware vSphere 5.5 把新增主机加入已配LAG的分布式交换机端口组
查看>>
解决P2P键盘不能用
查看>>
字符串的处理以及相关知识整理
查看>>
php报错:
查看>>
查看Linux并发连接数
查看>>
Python 读取目录、文件
查看>>
代码质量检查平台Sonar环境搭建说明
查看>>
HSRP+NAT
查看>>
【转】PHP foreach 小结
查看>>
Windows Server 2012版本介绍
查看>>
windows xp系统本地连接提示受限制或无连接怎么办
查看>>