块状链表

块状链表基本操作及相关例题 部分内容参考自 论文 苏煜《对块状链表的一点研究》 1. 数组和链表对比: 数组和链表对比 操作 数组 链表 存储结构 地址连续的存储单元,物理位置相邻 地址不连续,物理位置不相邻 定位 O(1) O(N) 添加 O(N) O(1) 删除 阅读详情
/*
* 本模板支持以下操作:
* 1.在任意位置插入一个整数
* 2.插入一个块(Block),包含多个整数
* 3.删除一个整数
* 4.输出第i位上的整数
* 注意:所有Insert(pos,data),均是在pos之后插入。
* BlockList::N是sqrt(n)的结果,它决定了块状链表的效率
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#define MAXSIZE 1000
namespace BlockList{
    int N;
    class Block{
    public:
        int size;
        Block* next;
        int data[MAXSIZE+2];
        inline Block(){
            size=0;
        }
        inline int& select(int x){
            return data[x];
        }
        void Insert(int pos,int x);
        void Delete(int pos);
    };
    inline void Block::Insert(int pos,int x){
        this->size++;
        for (int i=size;i>pos+1;–i){
            data[i]=data[i-1];
        }
        data[pos+1]=x;
    }
    inline void Block::Delete(int pos){
        for (int i=pos;i<size;++i){
            data[i]=data[i+1];
        }
        size–;
    }
    class List{
    public:
        Block* Head;
        int size;
        inline List(){
            size=0;
        }
        void Insert(const int,const Block*);
        void Insert(const int,const int );
        void Delete(int pos);
        inline int get(int pos);
    };
    inline int List::get(int pos){
        int sum=0;
        if (pos>size) return -1;
        for (Block* p=Head;p;p=p->next){
            if (sum+p->size>=pos){
                return p->data[pos-sum];
            }
        }
    }
    inline void Div(Block *data,const int pos){
        if (pos<=data->size) return ;
        Block *p1=new Block,*p2=new Block;
        p1->size=pos;
        for (int i=1;i<=pos;++i){
            p1->data[i]=data->data[i];
        }
        p2->size=data->size-pos;
        for (int i=1;i<=p2->size;++i){
            p2->data[i]=data->data[i+pos];
        }
        p1->next=p2;
        p2->next=data;
        delete data;
        data=p1;
    }
    inline void Union(Block *a,Block * b){
        Block* p=new Block;
        p->size=a->size+b->size;
        for (int i=1;i<=a->size;++i){
            p->data[i]=a->data[i];
        }
        for (int i=1;i<=b->size;++i){
            p->data[i+a->size]=b->data[i];
        }
        p->next=b->next;
        delete a;
        delete b;
        a=p;
    }
    void List::Insert(const int pos,const Block* x)
    {
        int sum=0;
        if (!Head)
        {
            Block* p=new Block;
            memcpy(p,x,sizeof(p));
            size=x->size;
            Head=p;
            return ;
        }
        if (pos<Head->size){
            Div(Head,pos);
            Block* next=Head->next;
            Block* p=new Block;
            memcpy(p,x,sizeof(p));
            Head->next=p;
            p->next=next;
            if (Head->size+p->size<N) Union(Head,p);
            else if (p->size+next->size<N) Union(p,next);
                return;
        }
        sum+=Head->size;
        Block* pre=Head;
        for (Block *p=Head->next;p;p=p->next)
        {
            sum+=p->size;
            if (sum==pos){
                Block *tmp=new Block;
                memcpy(tmp,x,sizeof(tmp));
                pre->next=tmp;
                tmp->next=p;
                
                if (pre->size+tmp->size<N){
                    Union(pre,tmp);
                }else if (tmp->size+p->size<N){
                    Union(tmp,p);
                }
                return ;
            }
            if (sum>pos){
                Block *tmp=new Block;
                memcpy(tmp,x,sizeof(tmp));
                Block *obj=p;
                Div(p,pos-(sum-p->size));
                Block *next=obj->next;
                obj->next=tmp;
                tmp->next=next;
                if (pre->size+tmp->size<N){
                    Union(obj,tmp);
                }else if (tmp->size+p->size<N){
                    Union(tmp,next);
                }
                return ;
            }
            pre=p;
        }
    }
    void List::Insert(const int pos,const int x)
    {
        int sum=0;
        size++;
        if (!Head)
        {
            Block* p=new Block;
            p->size=1;
            p->data[1]=x;
            Head=p;
            return ;
        }
        if (pos<=Head->size){
            Head->Insert(pos,x);
            return;
        }
        sum+=Head->size;
        Block* pre=Head;
        for (Block *p=Head->next;p;p=p->next)
        {
            sum+=p->size;
            if (sum>=pos){
                p->Insert(pos-(sum-p->size),x);
                return ;
            }
        }
    }
    inline void List::Delete(int pos){
        int sum=0;
        if (pos>size )return;
        size–;
        for (Block *p=Head;p;p=p->next){
            if (sum+p->size>=pos){
                p->Delete(pos-sum);
                return ;
            }
        }
    }
}
BlockList::List d;
int main(){
    BlockList::N=500;
    int op,tmp1,tmp2;
    while (~scanf("%d",&op)){
        if (op==1){
            scanf("%d%d",&tmp1,&tmp2);
            d.Insert(tmp1,tmp2);
        }
        if (op==2){
            scanf("%d",&tmp1);
            d.Delete(tmp1);
        }
        if (op==3){
            scanf("%d",&tmp1);
            printf("%dn",d.get(tmp1));
        }
    }
}


转载自  http://sweetdum.com/wordpress/?p=172

分块与块状链表 文章目录分块与块状链表1. 算法分析1.1 分块思想1.2 块状链表2. 板子2.1 分块2.2 块状链表3. 例题2.1 分块2.2 块状链表 分块与块状链表 1. 算法分析 1.1 分块思想 分块思想就是将整体分为n\sqrt nn​个长度为n\sqrt nn​的区间,这样区间修改和查询的复杂度从O(n)O(n)O(n)降为了O(n)O(\sqrt n)O(n​) 维护两个数组:add代表本段中的所有数都要加上add,sum代表本段的真实和是多少(算上了add) 修改一个区间时,分为完整段的区间修改以及 阅读详情

相关推荐

2-7课:见缝插针地摆放货物:内存中的链表

链表 虽然链表和数组是两种不同的数据结构,但它们都是被存储在连续的存储空间上的。 如果将两种数据结构中的数据比作“货物”,那么放置它们的“仓库”都是一样的,里面都有一排排标好了固定编号的货架(见下图)。 不过和数组那样一下预定一系列连续的货架,就算不放货物也要占着不给别人用的数据组织方式不同,链表是按需分配的——有货物要存储了,才临时申请正好放这些货物的货架,随时加减。 单向链表 最简单的一种链...

YeJuliaLi的博客 511

【数据结构】块状链表(分块大法好)

问题引入 众所周知,数组索引方便,但插入和删除困难(复杂度极高);而链表恰恰相反,索引困难,而插入和删除简单。 那么当我们遇到既要动态插入删除,又要快速索引元素的问题时,有没有一种数据结构能够同时快速支持这两个操作呢? 以我们老祖宗的强大的智慧,答案当然是有,它就是—— 序列之王Splay!!! 不好意思,走错片场了……重来一次。它就是—— 块状链表!!! 整体思想 看到它的名字,估计你都能猜出来...

Fighter的博客 8369

IDEA集成selenium自动化测试(Java+Selenuim+testNG+Maven)

文章目录写在前面01 | 新建Maven项目02 | idea集成Selenium03 | 写在前面 因为软件测试的需求和博主比较经常使用Java,于是,想在Idea中集成selenuim,用Java编写测试代码,因此有了这篇文章来记录一下过程。 资源指路: java使用selenium实现模拟浏览器操作API大全 模拟登录 TestNG入门教程 感谢上面博客的大佬。 01 | 新建Maven项目 不使用骨架创建,直接点击左侧Maven,然后一路next即可。 02 | idea集成Sele

aLinxi的博客 8279

块状链表详解

众所周知,数组可以以\(O(1)\)的复杂度查询、修改元素,但删除和插入元素的复杂度是\(O(n)\)的;链表恰好相反,插入、删除元素的复杂度为\(O(1)\),但查询为\(O(n)\)。有没有能以较优复杂度完成插入、删除、查询、修改操作的线性数据结构?本篇介绍的块状链表就可以。顾名思义,块状链表运用分块的思想,将数组与链表结合起来。这里引用一张经典的图来展示它大概的样子:可以看出块状链表就是以数组为节点(块)的链表。

weixin_37072468的博客 125

图像去雨:超详细手把手写 pytorch 实现代码(带注释)

占个坑,过几天来写

书山有路,学海无涯! 1万+

我用 AI Agent 全自动跑 COMSOL 仿真:从建模到后处理,踩了 10+ 个深坑

本文探讨了利用AI通过COMSOL Java API实现AI芯片液冷冷板全流程自动化仿真的实践。针对700W高功耗AI芯片的散热需求,构建了包含4颗Chiplet和微通道冷板的三维液冷模型。通过严格设计的Prompt工程,AI Agent成功完成了从几何建模到结果验证的全过程,最终实现了芯片最高温度54°C的良好散热效果。文章重点分享了10个关键问题的解决经验,包括流体连通性验证、网格顺序控制、离散阶数选择、收敛判据优化等,并建立了包含流场/热场/网格独立性的三重验证体系。实践表明,AI可高效处理重复性工作

sjjsjjsjjsjjsjj的博客 981

块状链表数据结构

块状链表是结合了链表和线性表的存储结构, 综合性能可观, 可用于部分算法中的空间存储;

Darth_EF的博客 1948

C# 工业视觉性能极致优化:多线程推理池 + 对象复用 + 批量检测,速度提升 10 倍实战

set;} // 输入图像set;} // 异步返回结果set;} // 用于监控延迟性能优化不是魔法,而是对资源生命周期的精细管理和对硬件特性的充分利用。多线程池解决了 CPU/GPU 闲置问题。对象池解决了 GC 停顿问题。零拷贝解决了总线带宽瓶颈。严格的 Dispose解决了内存泄漏问题。这套架构已在多个高速锂电、3C 电子检测产线落地,轻松应对 200ms 甚至 50ms 的严苛节拍。记住,在工业领域,稳定性与速度同等重要。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 306

【数据结构与算法】 01 链表 (单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题)

单链表、双向链表、循环链表、块状链表、头结点、链表反转与排序、约瑟夫环问题

风高秋月白,雨霁晚霞红 1万+

新手必读!2025最全AI智能体入门手册,50个问题全讲透

感知(Perception):能读取环境,比如读取网页数据、识别用户输入、接入 API;思考(Reasoning/Planning):理解任务目标,规划出行动步骤;行动(Action):调工具、查资料、发消息、写入数据库……直接执行任务。有了这三步,智能体才不是“一个会说话的大模型”,而是真正的“能落地执行的工作代理人”。多个 Agent 分工协作,每个智能体负责一个角色或任务节点,像一个“虚拟团队”。一个爬数据的 Agent,一个提炼要点的 Agent,一个撰写报告的 Agent,

互联网架构师笔记 1970

SAP Joule for Consultants 与 Joule for Developers 全面解读

SAP推出面向不同用户群体的Joule AI助手:开发者版(Joule for Developers)专注于编码提效,嵌入开发工具链辅助生成、重构和测试代码;顾问版(Joule for Consultants)聚焦业务场景,集成SAP云应用知识库,为咨询项目提供方案设计、差距分析和实施指引。两者共享AI底座但功能侧重点不同:开发者版优化技术开发流程,顾问版加速项目交付周期。典型应用场景包括制造业云转型方案制定和ABAP代码迁移,分别展示了两版本在业务决策支持和技术实施中的价值。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 547

java 块状链表

节点类 package BlockLinkList; import java.util.ArrayList; public class BlockLinkNode { public BlockLinkNode prev; public BlockLinkNode next;

xyjikl 1188

配置适合Gurobi的机器硬件环境需要考虑的因素

介绍了在为gurobi选择合适的硬件环境时,需要考虑三个方面的因素;

Linshaodan520的博客 1064

【数据结构】块状链表(块状数组)

块状链表(块状数组) 数组与链表 在讨论块状链表(或者称块状数组)之前,我们先回顾一下数组和链表的特点: 操作 数组 (通常考虑有序) 链表 存储结构 地址连续的存储单元,物理位置相邻 地址不连续,物理位置不相邻 定位 O (1) O (N) 插入 O (N) O (1) 删除 O (N) O (1) 数组定位的效率很高,直接通过下标索引就能获取元素的定位,由于长度通常是固定的,因此不适合插入和删除等操作。当数组为有序时,使用二分查找法效率较高,时间复杂度为 O (logN)

Ulrich蚊子Blog 2048

基于DWA算法的机器人动态避障技术实现及matlab代码

DWA算法是一种基于轨迹的运动规划算法,其核心思想是:在机器人当前位置及速度的基础上,结合机器人感知到的环境信息,生成一组合法的速度指令,然后从这组速度指令中选取代价最小的速度指令作为机器人的下一步操作。下面,我们将通过一个实例来演示基于DWA算法的机器人动态避障技术实现。假设机器人在一个宽敞的场地内行驶,但场地内有一些固定障碍物和移动障碍物,机器人需要避开这些障碍物,并在场地内自由移动。本文给出了一种基于DWA算法的机器人动态避障技术实现及相应的matlab代码,读者可以根据自身需求进行修改和调整。

uote_e的博客 1003

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

动态块状链表的Python实现详解与应用

动态块状链表的Python实现详解与应用(包含详细的完整的程序和数据)资源-优快云文库 https://download.youkuaiyun.com/download/xiaoxingkongyuxi/89872726。块状链表结合了链表的灵活性和数组的高效性,非常适合用于频繁插入和删除的场景。实现一个动态块状链表,支持插入、删除、查找等基本操作,并在块的数量或容量超出规定时进行动态调整。以上代码展示了块状链表的基本实现与动态调整的原理,希望能为您在数据结构方面提供帮助和理解。《数据结构与算法分析》

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1004

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

块状链表之代码剖析

对块状链表不熟悉的请移步 块状链表解析 1.链表节点(block): block加入模板 template 构造函数 block(block* to,block* p):next(to),pre(p) ①:属性 ElemType data[MAXN]; int len ; /*本block有效数据的长度*/ bool rev ; block *n

bin314的专栏 2976

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基于C#实现块状链表

这个比较简单,我们在每个链表节点中定义一个 头指针,尾指针和一个数组节点。/// 指向前一个节点的指针/// 指向后一个节点的指针/// 链表中的数组。

神仙别闹的自留地 1205

块状链表与块状树初步

1.块状链表的基本思想 常见的线性表结构修改操作有:再某一位置后插入一段数,从某一位置开始删除连续若干个数,我们不妨先来看看数组和链表这两种常用线性结构的实现效果。 可见,它们各有各的优势和缺点,且恰巧是优势互补。我们不禁想,如果把两者结合起来,是不是会有更优异的表现?块状链表正好是基于这个思想,将数组和链表结合了起来。块状链表整体上看其结构是一个链表,链表上每个节点存放着一段数组,链表上每个节点...

qq_36172410的博客 317

数据结构:块状链表

已转到:http://www.wypblog.com/archives/166一、概述           有时候我们需要设计这样一种数据结构:它能快速在要求位置插入或者删除一段数据。先考虑两种简单的数据结构:数组和链表。数组的优点是能够在O(1)的时间内找到所要执行操作的位置,但其缺点是无论是插入或删除都要移动之后的所有数据,复杂度是O(n)的。链表优点是能够在O(1)的时间内插入和删除一段数据

过往记忆大数据 1万+
上一篇: 扩展欧几里德
下一篇: hdu 2844(背包)
Balloons2012
博客等级 码龄14年 9粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值