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

树状数组。 数组修改某个元素的数值/求出前n个元素的和,需要在一百毫秒处理上百万个数字

以16个数字来进行解释。

记住了为啥是16个。。

 

全部遍历求结果的话查询会很慢。

 

可以通过求和弄到同一个数组当中

这样可以计算就少了一半的时间

再一次

 

再一次

 一直这样重复。直到只剩下一个数字为止。结果不就出来了。

这样即使要求和的数字很多。我们也可以利用这些额外的数组来计算出需要的答案

 可以看到 如果我们想计算出来前15个的累加数字

那我们实际用到的数字就 31 10 9 7 四个数字

即使要计算前一百万个数字的和,我们也只需要计算十几次 二十几次的加法。大大加快了计算速度。

上面数字有些是可以完全用不到的。。

比如我们计算前2个 前 3个 前四个 前 五个。。你会发现。

完全可以不用5

所有层数的偶数个数字都是没用的。即使去掉也没有影响。

然后观察剩下的数据。。刚好16个,我们刚才说什么16个。。。。有点。。有点巧合。。

拼接起来

 组合方式也是有规律的哦

 

 

 

 求和时,我们只需要找到对应区间。将这些区间相加就可以找到答案

修改某个数据时,我们只需要向上找到包含的区间进行修改即可

 

 lowbit的使用 

lowbit 函数 精彩计算。_安果移不动的博客-CSDN博客

package com.example.learn1

fun main() {
    repeat(10) {
        println("当前是:${it} 二进制是${it.toUInt().toString(radix = 2)} 结果是 ${lowBit2(it)}")
    }
}
fun lowBit(x: Int): Int {
    return x and (x xor (x - 1))
}

fun lowBit2(x: Int): Int {
    return x and (-x)
}

 

 

下面结合lowBit 就要进行计算了。

 

长度为1的数据。lowbit刚好为1

 第二行数据 长度为2 lowBit结果是2.

lowBit 12 结果为多少。是4 他的序号是对少 是12

 多带入几个可以发现。

lowBit(i)= 以i为结尾的序列

结论是 序号为i的序列 正好就是长度为lowBit(i) 且以i结尾的序列

有了这个规律后 计算前几个元素的和就简单多了

比如我们要计算前14个元素的和

lowBit(14) = 2

14-lowBit(14)=12

我们只需要计算前12个元素的和然后+b[14] 就对了。

我们来写一个公式

fun count(p: Int, b: List<Int>): Int {
    if (p == 0) {
        return 0
    }
    println("p ${p} ")
    return count(p - lowBit(p), b) + b[p]
}
 val list = listOf(8, 6, 1, 4, 5, 5, 1, 1, 3, 2, 1, 4, 9, 0, 7, 4)
    println(count(14, list))

 

 14 12 8 然后结果是19

还有一个结论 就是 序列 b[i] 正上方的序列,正好就是 b[i+lowBit(i)]

 

所以修改值的时候只要找到上方的所有序列进行修改。

最终版来咯

fun main() {
    val list = mutableListOf(8, 6, 1, 4, 5, 5, 1, 1, 3, 2, 1, 4, 9, 0, 7, 4)
    println(count(14, list))
    println(finalCount(14, list))
    
    val res = list.subList(0, 14).sum()
    println(res)
}

fun lowBit(x: Int): Int {
    return x and (x xor (x - 1))
}

fun lowBit2(x: Int): Int {
    return x and (-x)
}

fun count(p: Int, b: MutableList<Int>): Int {
    if (p == 0) {
        return 0
    }
    return count(p - lowBit(p), b) + b[p]
}

//修改某个位置的函数
fun changeIndex(p: Int, x: Int, b: MutableList<Int>, N: Int) {
    var tempP = p;
    while (tempP < N) {
        b[tempP] += x;
        tempP += lowBit(p);
    }
}

//上方count 可以改进下。
fun finalCount(p: Int, b: MutableList<Int>): Int {
    var tempP = p;
    var result = 0;
    while (tempP > 0) {
        result += b[tempP];
        tempP -= lowBit(tempP)

    }
    return result

}

相关文章:

  • 【操作系统】第一章 计算机系统概述
  • 【Vue】Vue的Mustache插值语法、v-bind指令
  • Android7.1.1系统,Toast的Exception: android.view.WindowManager$BadTokenException解决
  • TiKV 监控指标详解
  • 嵌入式系统开发笔记92:感受开源之美
  • VLC 编译安装 [for android, linux, windows]
  • 字节内部私藏的数据结构与算法刷题笔记,太顶了熬夜刷上头
  • 前端性能优化方法与实战开篇词 开启刻意练习之路,进阶前端性能技术专家
  • 实战java高并发程序设计(第2版)学习(1-3)
  • TiCDC 重要监控指标详解
  • T1063 最大跨度值(信息学一本通C++)
  • JavaSE 一些技巧 03——Stream流常用API
  • VMware安装Android-x86示例
  • [HUBUCTF 2022 新生赛]
  • 【Machine Learning】13.逻辑回归小结and练习
  • Google 是如何开发 Web 框架的
  • 345-反转字符串中的元音字母
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • flask接收请求并推入栈
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • LeetCode18.四数之和 JavaScript
  • Making An Indicator With Pure CSS
  • React系列之 Redux 架构模式
  • Yii源码解读-服务定位器(Service Locator)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 如何在 Tornado 中实现 Middleware
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 项目管理碎碎念系列之一:干系人管理
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生js练习题---第五课
  • HanLP分词命名实体提取详解
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # Panda3d 碰撞检测系统介绍
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #vue3 实现前端下载excel文件模板功能
  • (a /b)*c的值
  • (Forward) Music Player: From UI Proposal to Code
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)windows配置JDK环境
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (杂交版)植物大战僵尸
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net 4.0并行库实用性演练
  • .NetCore部署微服务(二)
  • .NET上SQLite的连接
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .pop ----remove 删除
  • /etc/fstab 只读无法修改的解决办法
  • @EnableWebMvc介绍和使用详细demo