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

吉首网站制作上海优化seo排名

吉首网站制作,上海优化seo排名,wordpress网站如何添加内链,wordpress免费服务器文章目录 摘要描述题解答案(Swift 实现 – 树状数组版)题解代码分析为什么选择树状数组?初始化和更新逻辑区间和查询 示例测试及结果时间复杂度空间复杂度总结 摘要 在很多业务场景中,数据不仅要查询区间和,还会被实时…

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案(Swift 实现 – 树状数组版)
    • 题解代码分析
      • 为什么选择树状数组?
      • 初始化和更新逻辑
      • 区间和查询
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

在很多业务场景中,数据不仅要查询区间和,还会被实时修改。比如商城的库存系统、在线游戏中的积分榜,甚至是股票价格的区间统计。LeetCode 第 307 题正是针对这种“可修改+可查询”场景设计的,它要求你设计一个数据结构支持快速更新数组中的某个位置,同时还能高效查询任意区间的和。

本篇文章我们使用 Swift 实现两种经典数据结构方案:树状数组(Fenwick Tree)线段树,并提供可运行代码、思路分析和示例演示,帮助你真正掌握区间查询加更新的优化思路。

描述

题目的要求是这样的:

设计一个 NumArray 类,它支持:

  1. 初始化一个整数数组 nums
  2. 方法 update(index, val) 用来修改数组中 nums[index] 的值;
  3. 方法 sumRange(left, right) 返回当前数组在 [left, right] 范围内所有元素的和。

数组长度可达 3*10^4,操作次数也最多如此,如果每次 sumRange 都遍历数组,效率会非常低。我们需要在支撑快速更新的前提下,实现常数或对数级别的查询。

题解答案(Swift 实现 – 树状数组版)

我们首先给出使用 树状数组(Fenwick Tree)实现的代码,结构简洁,运行高效:

import Foundationclass NumArray {private var nums: [Int]private var bit: [Int]private let n: Intinit(_ nums: [Int]) {self.nums = numsn = nums.countbit = Array(repeating: 0, count: n + 1)for i in 0..<n {initUpdate(i, nums[i])}}private func initUpdate(_ idx: Int, _ val: Int) {var i = idx + 1while i <= n {bit[i] += vali += i & -i}}func update(_ index: Int, _ val: Int) {let diff = val - nums[index]nums[index] = valvar i = index + 1while i <= n {bit[i] += diffi += i & -i}}private func prefixSum(_ idx: Int) -> Int {var sum = 0var i = idx + 1while i > 0 {sum += bit[i]i -= i & -i}return sum}func sumRange(_ left: Int, _ right: Int) -> Int {return prefixSum(right) - (left > 0 ? prefixSum(left - 1) : 0)}
}

此外,如果更喜欢面向范围分治的思想,也可以用线段树实现。但本文重心放在 Fenwick Tree,代码更简洁高效。

题解代码分析

为什么选择树状数组?

树状数组适合支持两类操作:

  • 对单点进行增量更新(O(log n));
  • 查询前缀和(O(log n))。

正好满足“两类操作都频繁”的场景,比起每次重新累加数组快得多,且实现相比线段树要简单。

初始化和更新逻辑

  • 初始化时,我们先清 BIT(全 0),然后通过 initUpdate 方法把每个元素累加到 BIT 中;
  • 更新时,调整 nums[index],并计算差值 diff,然后用 while 根据 BIT 的结构逐级更新影响范围。

区间和查询

通过两个前缀和差值:

sumRange(l, r) = prefixSum(r) - prefixSum(l - 1)

其中 prefixSum(idx) 用标准的 BIT 查询方式累加相关节点即可。

示例测试及结果

我们可以建立几个测试用例,用来验证代码正确性:

let numArray = NumArray([1, 3, 5])
print(numArray.sumRange(0, 2))  // 输出 9
numArray.update(1, 2)           // nums 变为 [1,2,5]
print(numArray.sumRange(0, 2))  // 输出 8// 更多测试
let arr = NumArray([0,1,2,3,4])
print(arr.sumRange(1,3))        // 输出 6
arr.update(2, 10)
print(arr.sumRange(1,3))        // 输出 1+10+3=14

测试结果完全符合预期,并且执行速度非常快。

时间复杂度

  • 初始化:构建 BIT 时为 O(n log n)
  • 每次 updateO(log n)
  • 每次 sumRange:两次前缀和查询,各 O(log n),总共 O(log n)

总操作次数 ≤ 3*10^4,logn 在数万量级下也在 15 左右,性能远超过暴力方法。

空间复杂度

  • 存储原始数组 numsO(n)
  • 存储 BIT 数组:O(n + 1)
  • 总空间复杂度约为:O(n)

这非常适合内存充足的现代设备。

总结

  • 树状数组 是解决“支持更新+快速求前缀和”类问题的高效工具;
  • 通过巧妙利用二进制分段求和原理,实现每次查询 O(log n)
  • 实际应用场景非常多,比如滑动窗口交易统计、用户访问计数、时序分析等;
  • 如果你想处理更加复杂的区间更新或区间查询,也可以继续学习线段树、差分数组、BIT 范畴进阶。
http://www.dtcms.com/wzjs/27511.html

相关文章:

  • 装修设计公司公司价格表某网站seo诊断分析
  • 上海软件网站建设全国十大跨境电商公司排名
  • 做竞猜网站犯法吗百度视频下载
  • 湖南省政府网站集约化建设图片外链生成工具
  • 电子商务网站建设域名b2b免费发布网站大全
  • 数据库2008做企业网站网站关键词全国各地的排名情况
  • 做网站怎么买服务器电脑培训学校
  • 营销型网站有哪些类搜索自媒体平台
  • 做外贸兼职的网站体验式营销经典案例
  • vps 网站打不开windows7系统优化工具
  • 常用于做网站的软件晚上看b站
  • 广州番禺区网站建设搜索引擎优化简称
  • 企业网站开发公司-北京公司谷歌搜索引擎下载安装
  • 南京电子商务网站建设seo培训学校
  • 做包装的网站有哪些百度seo原理
  • 苏州吴中网站建设seo服务顾问
  • 淘宝网站的建设目标制作网站的步骤
  • 上饶市建设局官方网站购物网站页面设计
  • 厦门医疗网站建设seo人才招聘
  • 湖南学校网站建设seo和sem是什么意思啊
  • 做百度商桥网站网络营销专业就业方向
  • 网站的佣金怎么做会计分录网站推广的意义和方法
  • 珠海政府网站集约化建设引擎优化seo怎么做
  • 乌鲁木齐新市区建设局网站买卖友链
  • 江西南昌网站建设哪家好百度快照替代
  • 百度创意产品网站万能搜索引擎入口
  • 网站 制作 中心百度快照在哪里
  • 做网站软件A开头的企业seo顾问公司
  • 西安网站开发xamokj淘宝关键词排名查询网站
  • 网站内链工作做足网站推广 方法