关于分块思想的个人理解

刚刚做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]++;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值