从0开始学算法--数据结构(2.6块状链表)
时间:2019-10-21
本文章向大家介绍从0开始学算法--数据结构(2.6块状链表),主要包括从0开始学算法--数据结构(2.6块状链表)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组可以O(1)查询元素,但需要O(n)才能插入元素
链表可以O(1)插入元素,但需要O(n)才能查询元素
那么是否能让查询和插入的时间复杂度都变为根号n-块状链表(分块数据结构)
假设数据又n个,则建立根号n个头节点(用链表连接),每个节点下有一个根号n长度的数组,这样查询第x个元素只用在链表部分(头节点)跳转至多根号n次后进入数组,在数组中O(1)查询,插入元素只用在头节点跳转根号n次在用根号n的时间在数组中插入元素
注释:把一个块插入到2倍的根号n大小的时候要分成两个块,保证时间复杂度,同理如果相邻两个块大小都太小则合并
const int m=350;//m在根号n大小左右 struct data{ int s,a[2*m+5]; data *next; }; data *root; void insert(int x,int pos){ if(root==NULL){ root=new(data); root->s=1; root->a[1]=x; return; } data *k=root; while(pos>k->s&&k->next!=NULL){ pos-=k->s; k=k->next; } memmove(k->a+pos+1,k->a+pos,sizeof(int)*(k->s-pos+1)); k->s++; k->a[pos]=x; if(k->s==2*m){ data *t=new(data); t->next=k->next; k->next=t; memcpy(t->a+1,k->a+m+1,sizeof(int)*m); t->s=k->s=m; } } void del(int pos){ data *k=root; while(pos>k->s&&k->next!=NULL){ pos-=k->s; k=k->next; } memmove(k->a+pos,k->a+pos+1,sizeof(int)*(k->s-pos)); k->s--; } int find(int pos){ data *k=root; while(pos>k->s&&k->next!=NULL){ pos-=k->s; k=k->next; } return(k->a[pos]); } void destroy(data *k){ if(k->next!=NULL){ destroy(k->next); } delete(k); }
原文地址:https://www.cnblogs.com/wz-archer/p/11713095.html
- es6 对象的扩展
- 自定义WordPress 标签云小工具相关参数
- 检查.NET程序平台目标(Platform Target)工具CorFlags
- 哪些行业最适合抢驻小程序?
- WordPress 一键关闭/禁止页面评论功能
- 在一个.net sln中包含多个project,project引用同一个dll导致的错误
- Windows下安装MariaDB
- Quartz.net官方开发指南 第一课:使用Quartz.net
- Quartz.net官方开发指南 第二课:Jobs And Triggers
- 为你的WordPress 主题添加结构化数据/丰富文本摘要,高亮搜索结果(上)
- 复合事件处理(Complex Event Processing)介绍
- Quartz.net官方开发指南 第三课:更多关于Jobs和JobDetails
- 为你的WordPress 主题添加结构化数据/丰富文本摘要,高亮搜索结果(下)
- Quartz.net官方开发指南 第四课:关于Triggers更多内容
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- js字符串/数组常用方法总结
- ThinkPHP5+mpdf 实现富文本生成 PDF文件
- nodejs使用readline逐行读取和写入文件
- go语言逐行读取和写入文件
- SpringBoot中Tomcat是如何启动的
- 自定义注解详解及应用
- 微服务开源框架TARS 之 框架服务解析
- dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用
- K8s集群上使用Helm部署2.4.6版本Rancher集群
- VMware下安装CentOS
- leetcode多线程之按序打印
- 表格的实现
- 使用 Node.js 定制你的技术雷达:中篇
- 数据库PostrageSQL-在Windows上从源代码安装
- Redis的过期策略和内存淘汰策略及LRU算法详解