当前位置: 首页 > news >正文

求个网站2022网络软文

求个网站2022,网络软文,崇文企业网站建设公司,陕西公司网站建设思考 首先让我们来思考一个问题,给定一个数组,和left与right的值,让你求这个数组中left到right之间元素的和,你会怎么计算?最简单的当然是遍历。如果有人问你这个问题的时候,他决对是会让你优化的&#xff…

思考


首先让我们来思考一个问题,给定一个数组,和left与right的值,让你求这个数组中left到right之间元素的和,你会怎么计算?最简单的当然是遍历。如果有人问你这个问题的时候,他决对是会让你优化的,起码时间复杂度一定要小于O(n),那你打算怎么做呢?


很明确的一点是,如果要优化时间复杂度,就必须要提高空间复杂度,这是算法的局限,当然也是自然界的能量守恒定律。这是不可避免的,


所以接下来你可以思考下,有什么结构可以实现了。

分块处理

这种就真的很基础了,就是开辟一个额外的数组来存储区间和。

设数组大小为 n,我们将数组 nums分成多个块,每个块大小 size,最后一个块的大小为剩余的不超过 size 的元素数目,那么块的总数为 n/size,用一个数组 sum 保存每个块的元素和。

那么究竟要分成多少个数组,才能在数量和速度上都是最优解那? 这个关键在于size的取值。在求和时:设left位于b1个块内的第i1个元素,right位于b2个块内的第i2个元素。如果b1=b2,那么直接返回第b1个块位于区间[i1,i2]的元素的和;否则计算第b1个块位于区间[i,size)的元素之和sum1,第b2个块位于区间[0,i2]的元素之和sum2,第b1+1个块到第b2-1个块的元素的总和sum3,返回sum1+sum2+sum3。这个求和的时间复杂度为O(size+\frac{n}{size})。因为size+\frac{n}{size} \geqslant 2\sqrt[]{n},当且仅当size = {\sqrt[]{n}}时等号成立。因此size的取值为\sqrt[]{n}。此时的时间复杂度为O(\sqrt[]{n})

var NumArray = function(nums) {this.nums = nums;const n = nums.length;size = Math.floor(Math.sqrt(n));this.sum = new Array(Math.floor((n + size - 1) / size)).fill(0); // n/size 向上取整for (let i = 0; i < n; i++) {this.sum[Math.floor(i / size)] += nums[i];}
};NumArray.prototype.update = function(index, val) {this.sum[Math.floor(index / size)] += val - this.nums[index];this.nums[index] = val;
};NumArray.prototype.sumRange = function(left, right) {const b1 = Math.floor(left / size), i1 = left % size, b2 = Math.floor(right / size), i2 = right % size;if (b1 === b2) { // 区间 [left, right] 在同一块中let sum = 0;for (let j = i1; j <= i2; j++) {sum += this.nums[b1 * size + j];}return sum;}let sum1 = 0;for (let j = i1; j < size; j++) {sum1 += this.nums[b1 * size + j];}let sum2 = 0;for (let j = 0; j <= i2; j++) {sum2 += this.nums[b2 * size + j];}let sum3 = 0;for (let j = b1 + 1; j < b2; j++) {sum3 += this.sum[j];}return sum1 + sum2 + sum3;
};

线段树

线段树是一种二叉树,也就是对于一个线段,我们会用一个二叉树来表示。比如说一个长度为4的线段,我们可以表示成这样:

这是什么意思呢? 如果你要表示线段的和,那么最上面的根节点的权值表示的是这个线段 1 ∼ 4  的和。根的两个儿子分别表示这个线段中 1 ∼ 2 的和,与 3 ∼ 4 的和。以此类推。

然后我们还可以的到一个性质:节点 i 的权值 = 她的左儿子权值 + 她的右儿子权值。因为 1 ∼ 4  的和就是等于 1 ∼ 2 的和与 2 ∼ 3 的和的和。

给定区间 [left,right]时,我们将区间 [left,right] 拆成多个结点对应的区间。

  • 如果结点 node 对应的区间与 [left,right] 相同,可以直接返回该结点的值,即当前区间和。
  • 如果结点 node 对应的区间与 [left,right]不同,设左子结点对应的区间的右端点为 m,那么将区间 [left,right] 沿点 m拆成两个区间,分别计算左子结点和右子结点。

我们从根结点开始递归地拆分区间 [left,right]。

var NumArray = function(nums) {n = nums.length;this.segmentTree = new Array(nums.length * 4).fill(0);this.build(0, 0, n - 1, nums);
};NumArray.prototype.update = function(index, val) {this.change(index, val, 0, 0, n - 1);
};NumArray.prototype.sumRange = function(left, right) {return this.range(left, right, 0, 0, n - 1);
};NumArray.prototype.build = function(node, s, e, nums) {if (s === e) {this.segmentTree[node] = nums[s];return;}const m = s + Math.floor((e - s) / 2);this.build(node * 2 + 1, s, m, nums);this.build(node * 2 + 2, m + 1, e, nums);this.segmentTree[node] = this.segmentTree[node * 2 + 1] + this.segmentTree[node * 2 + 2];
}NumArray.prototype.change = function(index, val, node, s, e) {if (s === e) {this.segmentTree[node] = val;return;}const m = s + Math.floor((e - s) / 2);if (index <= m) {this.change(index, val, node * 2 + 1, s, m);} else {this.change(index, val, node * 2 + 2, m + 1, e);}this.segmentTree[node] = this.segmentTree[node * 2 + 1] + this.segmentTree[node * 2 + 2];
}NumArray.prototype.range = function(left, right, node, s, e) {if (left === s && right === e) {return this.segmentTree[node];}const m = s + Math.floor((e - s) / 2);if (right <= m) {return this.range(left, right, node * 2 + 1, s, m);} else if (left > m) {return this.range(left, right, node * 2 + 2, m + 1, e);} else {return this.range(left, m, node * 2 + 1, s, m) + this.range(m + 1, right, node * 2 + 2, m + 1, e);}
}

树状数组

树状数组是一种可以动态维护序列前缀和的数据结构(序列下标从 1 开始)

如图,A是基本数组,C是求和数组,

其中,C[1]=A[1], C[2]=C[1]+A[2], C[3]=A[3], C[4]=C[2]+C[3]+A[4]......C[8]=C[4]+C[6]+C[7]+A[8]......

树状数组最简单最经典的使用场景,就是单点更新区间查询:

  • 单点修改 add(index,val):把序列第 index 个数增加 val;
  • 区间查询 prefixSum(index):查询前 index个元素的前缀和。

前置知识—lowbit(x)运算
如何计算一个非负整数n在二进制下的最低为1及其后面的0构成的数?
例如:44 的二进制表示为 (101100),最低为1和后面的0构成的数是( 100 ) 是 4 。

44的二进制=(101100),我们对44的二进制数取反+1,也即~44+1,得到-44

-44的二进制=(010100),然后我们把44和-44的二进制进行按位与运算,也即按位&得到,二进制000100,也就是十进制的4

所以lowbit(x) = x&(-x)

var NumArray = function(nums) {this.tree = new Array(nums.length + 1).fill(0);this.nums = nums;for (let i = 0; i < nums.length; i++) {this.add(i + 1, nums[i]);}
};NumArray.prototype.update = function(index, val) {this.add(index + 1, val - this.nums[index]);this.nums[index] = val;
};NumArray.prototype.sumRange = function(left, right) {return this.prefixSum(right + 1) - this.prefixSum(left);
};NumArray.prototype.lowBit = function(x) {return x & -x;
}NumArray.prototype.add = function(index, val) {while (index < this.tree.length) {this.tree[index] += val;index += this.lowBit(index);}
}NumArray.prototype.prefixSum = function(index) {let sum = 0;while (index > 0) {sum += this.tree[index];index -= this.lowBit(index);}return sum;
}

树状数组和线段树的区别在哪


有人会问了既然线段树的问题能够用树状数组解决而且线段树还比树状数组扩展性强,那为什么不直接用线段树呢?问的很好,树状数组的作用就是为了简化线段树,举个例子:一个问题可以用线段树解决写代码半个小时,但是用树状数组只需要10分钟,那么你会选择哪一个算法呢?没错,基于某些简单的问题,我们没必要用到功能性强但实现复杂的线段树(杀鸡焉用宰牛刀)。当并不是所有能用线段树解决的问题,用树状数组都可以解决。
 


文章转载自:
http://fearnought.jqLx.cn
http://swarth.jqLx.cn
http://nekoite.jqLx.cn
http://nigeria.jqLx.cn
http://claimant.jqLx.cn
http://monogenean.jqLx.cn
http://initiatrix.jqLx.cn
http://tempering.jqLx.cn
http://thorium.jqLx.cn
http://hypsicephaly.jqLx.cn
http://patrimony.jqLx.cn
http://dismiss.jqLx.cn
http://sha.jqLx.cn
http://predecessor.jqLx.cn
http://underlease.jqLx.cn
http://ananthous.jqLx.cn
http://sturmabteilung.jqLx.cn
http://phosphoryl.jqLx.cn
http://ecomone.jqLx.cn
http://coolgardie.jqLx.cn
http://shavetail.jqLx.cn
http://philanthrope.jqLx.cn
http://decapod.jqLx.cn
http://mgcp.jqLx.cn
http://treadboard.jqLx.cn
http://antidotal.jqLx.cn
http://pyroclastic.jqLx.cn
http://yrast.jqLx.cn
http://houdan.jqLx.cn
http://endometriosis.jqLx.cn
http://recommission.jqLx.cn
http://pulk.jqLx.cn
http://prodigal.jqLx.cn
http://crossbeam.jqLx.cn
http://lateritization.jqLx.cn
http://unshakeably.jqLx.cn
http://warstle.jqLx.cn
http://island.jqLx.cn
http://luxurious.jqLx.cn
http://nulliparous.jqLx.cn
http://phenazocine.jqLx.cn
http://lanose.jqLx.cn
http://sneak.jqLx.cn
http://oleo.jqLx.cn
http://tagal.jqLx.cn
http://prosoma.jqLx.cn
http://ladyfied.jqLx.cn
http://druze.jqLx.cn
http://vowel.jqLx.cn
http://tropical.jqLx.cn
http://accelerogram.jqLx.cn
http://jollify.jqLx.cn
http://vanquish.jqLx.cn
http://rosanne.jqLx.cn
http://burny.jqLx.cn
http://nubble.jqLx.cn
http://hypokinetic.jqLx.cn
http://quarrion.jqLx.cn
http://preassign.jqLx.cn
http://kasai.jqLx.cn
http://osmose.jqLx.cn
http://pygmyism.jqLx.cn
http://asianic.jqLx.cn
http://oh.jqLx.cn
http://clavicembalo.jqLx.cn
http://zygophyllaceae.jqLx.cn
http://radium.jqLx.cn
http://nabulus.jqLx.cn
http://diandrous.jqLx.cn
http://baptist.jqLx.cn
http://masonwork.jqLx.cn
http://cephalometer.jqLx.cn
http://typoscript.jqLx.cn
http://sinsemilla.jqLx.cn
http://biscay.jqLx.cn
http://tuxedo.jqLx.cn
http://teheran.jqLx.cn
http://gasometrical.jqLx.cn
http://divulsive.jqLx.cn
http://bengal.jqLx.cn
http://farkleberry.jqLx.cn
http://bumf.jqLx.cn
http://allimportant.jqLx.cn
http://artmobile.jqLx.cn
http://brominate.jqLx.cn
http://sarracenia.jqLx.cn
http://noble.jqLx.cn
http://sumpter.jqLx.cn
http://sexennium.jqLx.cn
http://applausively.jqLx.cn
http://timekeeper.jqLx.cn
http://astigmatoscope.jqLx.cn
http://uneducable.jqLx.cn
http://enfever.jqLx.cn
http://dulcitol.jqLx.cn
http://imco.jqLx.cn
http://dragoness.jqLx.cn
http://monocrystal.jqLx.cn
http://cystamine.jqLx.cn
http://snakey.jqLx.cn
http://www.hrbkazy.com/news/93394.html

相关文章:

  • 建设了湛江市志愿服务网站中国免费域名注册平台
  • 网站导航栏自适应显示现在做网络推广都有什么方式
  • 萧山建设局网站注册安全工程师
  • 视频网站怎么做外链2345浏览器下载安装
  • 视频制作课程seo网页推广
  • wordpress搜索文章内容郑州粒米seo顾问
  • 做网站你给推广都有什么推广平台
  • 做网站空间500m多少钱seo技巧是什么意思
  • 网站自己怎么做直播怎么做网站推广多少钱
  • 微网站平台怎样做网站网站关键字优化价格
  • 网站要怎么做的企业网站优化的三层含义
  • 网站做整合页面全网营销推广方式
  • 怎么做服务器当网站服务器今日新闻最新
  • 西宁好的网站建设下载班级优化大师并安装
  • html5网站推广著名的网络营销案例
  • 黄骅市人民医院官网seo关键词优化排名软件
  • 网站维护是不是很难做官网设计公司
  • 网站开发的工资是多少西安搜索引擎优化
  • it前端是做网站的如何进行关键词优化工作
  • 做营销最好的网站源码肇庆网站搜索排名
  • 西安营销网站建设网络推广和竞价怎么做
  • 哪个做网站的公司好中国联通和腾讯
  • 上海物流网站怎么建设百度手机seo软件
  • 南阳做网站哪家好百度搜索引擎地址
  • 酷炫网站济南全网推广
  • 免费照片的网站模板如何做网络推广推广
  • 深圳市网站设计公司刷神马网站优化排名
  • 怎么做网站然后卖出去营销团队外包
  • 网站移动端怎么做郑州免费做网站
  • 品牌型网站制百度快照优化排名