码迷,mamicode.com
首页 > 其他好文 > 详细

块状链表

时间:2017-12-24 12:40:32      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:build   cst   结构   代码   class   def   als   ++   turn   

块状链表作为一种集成了链表和分块的数据结构,

有着非常优秀的性质

查询和删除都是$O(\sqrt )$复杂度的

需要支持的操作

1.创建一个新节点

2.插入一个新节点

3.删除一个旧节点

4.向已知节点中加入新值

5.删除已知节点中某些值

6.合并某两个相邻的节点

7.把一个节点分离成两个


我们同样需要一个"缓存区"

用于存储初始数据和交换数据

这其中某些操作可以通过其他几种操作组合得来

例如分离两个节点可以删除这个节点,

同时将这个节点中的数据缓存到缓存区

然后创建新节点将缓存区内的数据读取到新节点

所以这个代码好难写……233333

#include<iostream>
#include<cstring>
#include<cstdio>
#define N 5555
using namespace std;

int data[N*N];

struct Block{
    int s[N],len;
};

class BlockList{
    struct Node{
        ListNode* nxt,pre;
        Block data;
    };
    Node* head,tail;
    int len;
    Block newBlock(int n){//Build and read the data from the cache to initialize the new block;
        Block now.len=n;
        for(int i=0;i<n;++i)
            now.s[i]=data[i];
    }
    Node* newnode(int n){//Build and initialize a new ListNode;
        Node* now=(Node*)malloc(sizeof(Node));
        now->nxt=now->pre=NULL;
        now->data=newBlock(n);
        return now;
    }
    BlockList(){//Initialize the BlockList;
        head=newnode(0);
        tail=newnode(0);
        head->nxt=tail;tail->pre=head;
    }
    bool LDTTA(int x){//Load the x‘th data to the cache;
        if(len<x)return false;
        Node* now=head;
        for(int i=0;i<x;++i)
            now=now->nxt;
        for(int i=0;i<now->data.len;++i)
            data[i]=now->data.s[i];
    }
    bool LDTTA(Node* root){//Load root‘ data to the cache;
        if(root==NULL)return false;
        for(int i=0;i<now->data.len;++i)
            data[i]=now->data.s[i];
    }
    bool InsertANode(Node* root,int n){//Insert a new n‘size Node after the Node* root;
        if(root==tail)return false;
        if(root==NULL)return false;
        Listnode* in=newnode(n);
        Listnode* tmp=root->nxt;
        in->nxt=tmp;in->pre=root;
        root->nxt=in;tmp->pre=in;
        len++;
        return true;
    }
    bool Delete(Node* root){//Detele the Node root and Load the date from the root to the cache;
        elem->pre->nxt=elem->nxt;
        elem->nxt->pre=elem->pre;
        if(elem==head)head=elem->nxt;
        if(elem==tail)tail=elem->pre;
        LDTTA(root);free(elem);
    }
};

块状链表

标签:build   cst   结构   代码   class   def   als   ++   turn   

原文地址:http://www.cnblogs.com/qdscwyy/p/8097489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!