大型网站建设推荐网站平台建设成本

diannao/2026/1/19 22:00:40/文章来源:
大型网站建设推荐,网站平台建设成本,厦门网站建设68,商标设计网图大全在数据结构的世界里#xff0c;我们会认识各种各样的数据结构#xff0c;每一种数据结构都能解决相应领域的问题#xff0c;当然每个数据结构#xff0c;有他的优点#xff0c;必然就有它的缺点#xff0c;那么如何创造一种数据结构来将某两种数据结构进行扬长避短#…在数据结构的世界里我们会认识各种各样的数据结构每一种数据结构都能解决相应领域的问题当然每个数据结构有他的优点必然就有它的缺点那么如何创造一种数据结构来将某两种数据结构进行扬长避短那就非常完美了。这样的数据结构也有很多比如双端队列还有就是今天讲的块状链表。 我们都知道 数组 具有 O(1)的查询时间O(N)的删除O(N)的插入。。。 链表 具有 O(N)的查询时间O(1)的删除O(1)的插入。。。 那么现在我们就有想法了何不让“链表”和“数组”结合起来来一起均摊 CURD 的时间做法将数组进行分块然后用指针相连接比如我有 N100 个元素那么最理想情况下我就可以将数组分成 x10 段每段 b10 个元素排好序那么我可以用 √N 的时间找到段因为段中的元素是已经排好序的所以可以用 lg√N 的时间找到段中的元素那么最理想的复杂度为 √Nlg√N≈√N。。。 下面我们看看怎么具体使用 一、结构定义 这个比较简单我们在每个链表节点中定义一个 头指针尾指针和一个数组节点。 public class BlockLinkNode{/// summary/// 指向前一个节点的指针/// /summarypublic BlockLinkNode prev;/// summary/// 指向后一个节点的指针/// /summarypublic BlockLinkNode next;/// summary/// 链表中的数组/// /summarypublic Listint list;}二、插入 刚才也说了每个链表节点的数据是一个数组块那么问题来了我们是根据什么将数组切开呢总不能将所有的数据都放在一个链表的节点吧那就退化成数组了在理想的情况下为了保持 √N 的数组个数所以我们定了一个界限 2√N当链表中的节点数组的个数超过 2√N 的时候当下次插入数据的时候我们有两种做法 在元素的数组插入处将当前数组切开插入元素处之前为一个链表节点插入元素后为一个链表节点。将元素插入数组后将数组从中间位置切开。 /// summary/// 添加元素只会进行块状链表的分裂/// /summary/// param namenode/param/// param namenum/param/// returns/returnsprivate BlockLinkNode Add(BlockLinkNode node, int num){if (node null){return node;}else{/** 第一步找到指定的节点*/if (node.list.Count 0){node.list.Add(num);total total 1;return node;}//下一步再比较是否应该分裂块var blockLen (int)Math.Ceiling(Math.Sqrt(total)) * 2;//如果该节点的数组的最后位置值大于插入值则此时我们找到了链表的插入节点//或者该节点的nextnull说明是最后一个节点此时也要判断是否要裂开if (node.list[node.list.Count - 1] num || node.next null){node.list.Add(num);//最后进行排序下当然可以用插入排序解决O(N)搞定node.list node.list.OrderBy(i i).ToList();//如果该数组里面的个数大于2*blockLen说明已经过大了此时需要对半分裂if (node.list.Count blockLen){//先将数据插入到数据库var mid node.list.Count / 2;//分裂处的前段部分var firstList new Listint();//分裂后的后段部分var lastList new Listint();//可以在插入点处分裂也可以对半分裂(这里对半分裂)firstList.AddRange(node.list.Take(mid));lastList.AddRange(node.list.Skip(mid).Take(node.list.Count - mid));//开始分裂节点需要新开辟一个新节点var nNode new BlockLinkNode();nNode.list lastList;nNode.next node.next;nNode.prev node;//改变当前节点的next和listnode.list firstList;node.next nNode;}total total 1;return node;}return Add(node.next, num);}}二、删除 跟插入道理一样既然有裂开就有合并同样也定义了一个界限值 √N /2 当链表数组节点的数组个数小于这个界限值的时候需要将此节点和后面的链表节点进行合并。 /// summary/// 从块状链表中移除元素,涉及到合并/// /summary/// param namenode/param/// param namenum/param/// returns/returnsprivate BlockLinkNode Remove(BlockLinkNode node, int num){if (node null){return node;}else{//第一步 判断删除元素是否在该节点内if (node.list.Count 0 num node.list[0] num node.list[node.list.Count - 1]){//定义改节点的目的在于防止remove方法假删除的情况发生var prevcount node.list.Count;node.list.Remove(num);total total - (prevcount - node.list.Count);//下一步 判断是否需要合并节点var blockLen (int)Math.Ceiling(Math.Sqrt(total) / 2);//如果当前节点的数组个数小于 blocklen的话那么此时改节点需要和后一个节点进行合并//如果该节点时尾节点则放弃合并if (node.list.Count blockLen){if (node.next ! null){node.list.AddRange(node.next.list);//如果下一个节点的下一个节点不为null则将下下个节点的prev赋值if (node.next.next ! null)node.next.next.prev node;node.next node.next.next;}else{//最后一个节点不需要合并如果list0则直接剔除该节点if (node.list.Count 0){if (node.prev ! null)node.prev.next null;node null;}}}return node;}return Remove(node.next, num);}}三、查询 在理想的情况下我们都控制在 √N然后就可以用 √N 的时间找到区块lg√N 的时间找到区块中的指定值当然也有人在查询的时候做 链表的合并和分裂这个就有点像伸展树一样在查询的时候动态调整拼的是均摊情况下的复杂度。 public string Get(int num){var blockIndex 0;var arrIndex 0;var temp blockLinkNode;while (temp ! null){//判断是否在该区间内if (temp.list.Count 0 num temp.list[0] num temp.list[temp.list.Count - 1]){arrIndex temp.list.IndexOf(num);return string.Format(当前数据在第{0}块中的{1}个位置, blockIndex, arrIndex);}blockIndex blockIndex 1;temp temp.next;}return string.Empty;}好了CURD 都分析好了到这里大家应该对 块状链表有个大概的认识了吧这个代码是我下午抽闲写的没有仔细测试最后是总的代码 using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication3 {class Program{static void Main(string[] args){Listint list new Listint() { 8959, 30290, 18854, 7418, 28749, 17313, 5877, 27208, 15771, 4335 };//list.Clear();//Listint list new Listint();//for (int i 0; i 100; i)//{// var num new Random((int)DateTime.Now.Ticks).Next(0, short.MaxValue);// System.Threading.Thread.Sleep(1);// list.Add(num);//}BlockLinkList blockList new BlockLinkList();foreach (var item in list){blockList.Add(item);}//var b blockList.IsExist(333);//blockList.GetCount();Console.WriteLine(blockList.Get(27208));#region MyRegion随机删除150个元素//for (int i 0; i 5000; i)//{// var rand new Random((int)DateTime.Now.Ticks).Next(0, list.Count);// System.Threading.Thread.Sleep(2);// Console.WriteLine(\n**************************************\n当前要删除元素{0}, list[rand]);// blockList.Remove(list[rand]);// Console.WriteLine(\n\n);// if (blockList.GetCount() 0)// {// Console.Read();// return;// }//} #endregionConsole.Read();}}public class BlockLinkList{BlockLinkNode blockLinkNode null;public BlockLinkList(){//初始化节点blockLinkNode new BlockLinkNode(){list new Listint(),next null,prev null};}/// summary/// 定义块状链表的总长度/// /summaryprivate int total;public class BlockLinkNode{/// summary/// 指向前一个节点的指针/// /summarypublic BlockLinkNode prev;/// summary/// 指向后一个节点的指针/// /summarypublic BlockLinkNode next;/// summary/// 链表中的数组/// /summarypublic Listint list;}/// summary/// 判断指定元素是否存在/// /summary/// param namenum/param/// returns/returnspublic bool IsExist(int num){var isExist false;var temp blockLinkNode;while (temp ! null){//判断是否在该区间内if (temp.list.Count 0 num temp.list[0] num temp.list[temp.list.Count - 1]){isExist temp.list.IndexOf(num) 0 ? true : false;return isExist;}temp temp.next;}return isExist;}public string Get(int num){var blockIndex 0;var arrIndex 0;var temp blockLinkNode;while (temp ! null){//判断是否在该区间内if (temp.list.Count 0 num temp.list[0] num temp.list[temp.list.Count - 1]){arrIndex temp.list.IndexOf(num);return string.Format(当前数据在第{0}块中的{1}个位置, blockIndex, arrIndex);}blockIndex blockIndex 1;temp temp.next;}return string.Empty;}/// summary/// 将元素加入到块状链表中/// /summary/// param namenum/parampublic BlockLinkNode Add(int num){return Add(blockLinkNode, num);}/// summary/// 添加元素只会进行块状链表的分裂/// /summary/// param namenode/param/// param namenum/param/// returns/returnsprivate BlockLinkNode Add(BlockLinkNode node, int num){if (node null){return node;}else{/** 第一步找到指定的节点*/if (node.list.Count 0){node.list.Add(num);total total 1;return node;}//下一步再比较是否应该分裂块var blockLen (int)Math.Ceiling(Math.Sqrt(total)) * 2;//如果该节点的数组的最后位置值大于插入值则此时我们找到了链表的插入节点//或者该节点的nextnull说明是最后一个节点此时也要判断是否要裂开if (node.list[node.list.Count - 1] num || node.next null){node.list.Add(num);//最后进行排序下当然可以用插入排序解决O(N)搞定node.list node.list.OrderBy(i i).ToList();//如果该数组里面的个数大于2*blockLen说明已经过大了此时需要对半分裂if (node.list.Count blockLen){//先将数据插入到数据库var mid node.list.Count / 2;//分裂处的前段部分var firstList new Listint();//分裂后的后段部分var lastList new Listint();//可以在插入点处分裂也可以对半分裂(这里对半分裂)firstList.AddRange(node.list.Take(mid));lastList.AddRange(node.list.Skip(mid).Take(node.list.Count - mid));//开始分裂节点需要新开辟一个新节点var nNode new BlockLinkNode();nNode.list lastList;nNode.next node.next;nNode.prev node;//改变当前节点的next和listnode.list firstList;node.next nNode;}total total 1;return node;}return Add(node.next, num);}}/// summary/// 从块状链表中移除元素/// /summary/// param namenum/param/// returns/returnspublic BlockLinkNode Remove(int num){return Remove(blockLinkNode, num);}/// summary/// 从块状链表中移除元素,涉及到合并/// /summary/// param namenode/param/// param namenum/param/// returns/returnsprivate BlockLinkNode Remove(BlockLinkNode node, int num){if (node null){return node;}else{//第一步 判断删除元素是否在该节点内if (node.list.Count 0 num node.list[0] num node.list[node.list.Count - 1]){//定义改节点的目的在于防止remove方法假删除的情况发生var prevcount node.list.Count;node.list.Remove(num);total total - (prevcount - node.list.Count);//下一步 判断是否需要合并节点var blockLen (int)Math.Ceiling(Math.Sqrt(total) / 2);//如果当前节点的数组个数小于 blocklen的话那么此时改节点需要和后一个节点进行合并//如果该节点时尾节点则放弃合并if (node.list.Count blockLen){if (node.next ! null){node.list.AddRange(node.next.list);//如果下一个节点的下一个节点不为null则将下下个节点的prev赋值if (node.next.next ! null)node.next.next.prev node;node.next node.next.next;}else{//最后一个节点不需要合并如果list0则直接剔除该节点if (node.list.Count 0){if (node.prev ! null)node.prev.next null;node null;}}}return node;}return Remove(node.next, num);}}/// summary/// 获取块状链表中的所有个数/// /summary/// returns/returnspublic int GetCount(){int count 0;var temp blockLinkNode;Console.Write(各节点数据个数为);while (temp ! null){count temp.list.Count;Console.Write(temp.list.Count ,);temp temp.next;}Console.WriteLine(总共有:{0} 个元素, count);return count;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些大站用wordpress信用体系建设网站维运工作制度

信息打点-公众号服务&Github监控&供应链&网盘泄漏&证书图标邮箱资产 #知识点: 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指纹…

专业建站报价wordpress表单 慢

点击蓝字关注我们一、通讯录简介实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系…

哈尔滨网站制作案例网站移动端是什么情况

一、我的ubuntu20.04症状描述: 在编辑文字文档的过程中,会不定时的出现鼠标指针随意跳动的情形,严重干扰了做文字编辑、编写代码等工作的进行。先后排除了戴尔笔记本及配件故障、鼠标故障、ubuntu系统中文档编辑软件的故障等可能。 二、原来…

网站模板后台怎么做wordpress哪个版本最好用

一.QPointer QPointer是一个模板类,用于指向QObject或其派生类对象。当QPointer指向的对象销毁时,它会被自动设置为nullptr(在QObject析构时),这和普通C++指针是不同的(普通的C++指针delete后会变为“悬空指针”,需要手动设置为nullptr)。 QPointer的使用场景:QPoint…

给公司做网站的公司邢台市官网

上期回顾:历程[一]描述了基本的树状图的绘制,默认节点类型defaultNode中的type是circle,下面这篇描述的是节点抽离自定义节点并做数据静态渲染。 官网地址:https://g6-next.antv.antgroup.com/manual/introduction 一、案例效果 二、自定义节…

北京做网站建设价格常州 做网站

XML Schema 简介XSD 为何使用XML Schema 是基于 XML 的 DTD 替代者。XML Schema 可描述 XML 文档的结构。XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。在继续学习之前,您需要对下面的知识有基本的了解:HTML / XHT…

长沙公司网站模板制作方案东莞h5网站制作

离职在即,在准备下一个工作环境的这段时间,忽然有一阵感慨,工作近五年,在这段时间中,体验了两种不同的工作环境:一个规模很大,各种开发体系完备的大公司,另一个(也是目前…

免费ppypp网站网站建站 上海

题目说明: 语法定义涉及数字、括号和运算符和-的表达式的语法。起始符号为Expression。一个表达式应该对应于以下之一:一个数字标记Expression ExpressionExpression - Expression- Expression( Expression ) level help 通过语法来描述高级语言的…

网站开发工具6免费做公司手机网站

STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件 functi…

慈溪做网站哪家好免费发帖推广的平台

文章目录 1 复习一元函数复合函数求导2 一元函数与多元函数复合的情形3 多元函数与多元函数复合的情形4 其他情形5 抽象复合函数求导6 全微分不变性结语 1 复习一元函数复合函数求导 y f ( u ) , u ϕ ( x ) ⇒ f [ ϕ ( x ) ] d y d x d y d u ⋅ d u d x f ′ ( u ) ⋅ ϕ…

做h5小程序的网站盐城做网站哪家公司好

作业调度对于应用程序来说是如此重要。 尤其是在大型项目中,处理大量工作可能是一个问题。 Spring和Quartz为解决该问题带来了巨大的好处。 本文介绍了如何通过使用Spring和Quartz轻松地计划多个作业。 二手技术: JDK 1.6.0_21 春天3.1.1 石英1.8.5 M…

山西网站建设多少钱wordpress如何备份 网站

目录 力扣LCR 091. 粉刷房子 解析代码 力扣LCR 091. 粉刷房子 LCR 091. 粉刷房子 难度 中等 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相…

dns网站建设网站效果演示

在这篇简短的文章中,我将重点介绍与在任务流中创建新记录的一种非常常见的方法有关的一个小陷阱。 让我们考虑一个简单的任务流示例,该任务流创建一个新的VO行,如果用户单击“确定”按钮,则在页面片段上显示该行并提交事务&#…

静态门户网站源码外包网络安全管理

作为一个关键词,你可以将 const 视为对数据的权限控制机制之一,它主要用于限制数据的可变性,从而提高代码的安全性和可靠性。通过使用 const,可以缩小对数据的修改权限,确保数据在某些情况下不被意外修改。 而根据使用…

游戏前端转网站开发网络广告是什么意思

QueryByExampleExecutor 的使用 按示例查询(QBE)是一种用户友好的查询技术,具有简单的接口,它允许动态查询创建,并且不需要编写包含字段名称的查询。从 UML 图中,可以看出继承 JpaRepository 接口后&#…

免费网站优化软件app免费制作平台有哪些

题目 给定一个数组,找出数组中乘积最大的三个数。 原理 一个数组中最大值只有两种情况:两个最小的负数和一个最大的正数 & 三个最大的正数。线性扫描找出这五个数字,即可求出最大值。 代码 public static void main(String[] args) {…

网站tag标签湖南营销网站建设

实现两个目标框的交并比候选框在多目标跟踪中的表达方式及相应转换方法 IOU(Intersection over Union),“交并比”,是计算机视觉和图像处理中常用的一个评价指标,尤其在目标检测任务中用来衡量模型预测的目标框与真实目标框的重合程度。 具体…

空间里怎么放多个网站阿里云 个人网站备案

1。Linux下编译X264: 其实在windows下使用vc已经编译过了,不过听到有人说在linux下编好了,我也就尝试做一下,况且x264源代码的makefile已经做好了,我只需要做的就是把文件copy一下,然后make 一下就可以了。…

如何修改管理网站网站备案格式

有时我们在打字的时候,输入法不显示,能打出汉字,但无法选字,这就给输入字体造成了很大的麻烦。怎么解决呢?下面以搜狗输入法为例,描述详细解决过程。解决方法一1、我在某个网页输入字体的时候,没…