sl|deque实现|缓存命中率

deque底层实现与二分查找接口

分块+中控数组

在C++容器中, deque (双端队列)的底层设计和二分查找接口的支持性,结合分块思想与二分逻辑,可清晰梳理其设计原理与应用合理性。

一、deque的底层实现核心

  1. 分块存储机制

deque 并非连续线性存储,而是采用分块+中控数组的设计:数据被拆分到多个固定大小的内存块中,++中控数组存储各个块的指针。++

  1. O(1)插入特性

在 deque 首尾插入元素时,若对应块未存满,可直接放入实现O(1)时间复杂度;

若首尾块已满,则申请新的内存块并更新中控数组,这一设计也导致其操作的常数项略大于 vector / list ------++访问元素时需先通过中控数组定位块,再在块内定位索引。++

二、deque支持二分查找接口的原因

  1. 随机访问特性

尽管 deque 是分块存储,但通过++中控数组的指针偏移+块内索引计算,能实现随机访问++( operator[] ),满足二分查找对"可通过下标快速访问元素"的基础要求。

  1. 分块+二分的复合逻辑

SL (Sorted List)的"分块+二分"设计, deque 的分块架构可结合二分思想优化查找:

先通过二分确定目标元素所在的块,再在块内进行二分/顺序查找,整体仍能保证二分查找的对数级时间复杂度,因此标准库可为其提供二分查找接口(如 std::binary_search )

3.对比

std::deque 虽支持随机访问,但内存分段存储,二分查找时缓存命中率低于内存连续的 std::vector ,实际效率更差。

缓存命中率是CPU缓存能直接命中所需数据的比例, vector 连续内存易被缓存预取,命中率高; deque 分段内存易触发缓存未命中,命中率低。

在C++中,标准库提供的有序关联容器和部分适配器/容器可实现有序列表的功能 set multiset map multimap

分块查找(Segmented Lookup)

分块查找本身就是"先分块、再在块间/块内做二分"的经典算法,"SL是分块+二分"是刷题中替代线段树、主席树的常用技巧。

  1. 数据结构对比
  • 对比红黑树、AVL树、B树/B+树(基于BST的平衡树)与分块+树状数组、线段树(SGT)、树状数组(BIT) 的性能和适用场景。

  • SL (Sorted List)虽时间复杂度带O(\sqrt{n}),但++访存效率优于AVL树的指针跳转++,生产环境中分块+二分比SGT、BIT更实用。

  1. 分块算法特性
  • 分块的插入操作:整体是O(\log n + \sqrt{n}),块内插入类似顺序表,属于"暴力操作",但现代CPU对短列表插入的常数优化能降低实际开销
  1. 线段树的局限性
  • 线段树受值域问题制约,++生产环境中难以实现数据全离线处理,场景适配性弱于分块++
  1. 数据结构性能关键
  • 理论时间复杂度外,访存效率(如分块的++连续内存++ vs 平衡树的指针离散访问)是生产环境性能的重要影响因素

"计算机就是找平衡的哲学(=^‥^=)"

lc1161

class Solution {

public:

int maxLevelSum(TreeNode* root)

{

queue<TreeNode*> q;

int d=0,ret=1,mx=INT_MIN;

q.push(root);

while(q.size())

{

int sz=q.size();

d++;

int sum=0;

while(sz--)

{

auto t=q.front();

q.pop();

sum+=t->val;

if(t->left)

q.push(t->left);

if(t->right)

q.push(t->right);

}

if(sum>mx)

{

ret=d;

mx=sum;

}

}

return ret;

}

};

相关推荐
dazzle4 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵4 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强4 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发4 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
张登杰踩4 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao5 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0075 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零5 小时前
变点检测算法PELT
算法
深鱼~5 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果5 小时前
【PTA】L1-019 谁先倒
数据结构·算法