使用芬威克树或 BIT 的数组中非递减子序列的最大和

2023-12-03

我们如何使用芬威克树找到数组中非递减子序列的最大和?例如我们有 1 4 4 2 2 3 3 1,这里非递减子序列的最大和是 11 (1 2 2 3 3)。


可以使用动态规划算法找到最大和。扫描数组并将每个元素的值添加到有效的最大子序列和(子序列以不大于该元素的值结束)。

有效的实施需要某种方法来快速找到给定子范围内的最大值。可以使用增强二叉搜索树来做到这一点。芬威克树只是增强二叉搜索树的有效实现。芬威克树最常见的用途是查找某个子范围内的值之和。简单的修改允许使用它来查找子范围最大值(这是有效的,因为在这种特殊情况下,芬威克树中的值永远不会减少)。

有关详细信息,请参阅此 Python 代码:

array = [1, 4, 4, 2, 2, 3, 3, 1]

numbers = sorted(set(array))
n = len(numbers)
indexes = {numbers[v]:v+1 for v in range(0, n)}
n += 1
bit = [0] * n
result = 0

for x in array:
    pos = indexes[x]
    i = pos
    maximum = 0
    while i != 0:
        maximum = max(maximum, bit[i])
        i = i & (i-1)
    x += maximum
    i = pos
    while i < n:
        bit[i] = max(bit[i], x)
        i += i & -i
    result = max(result, x)

print(result)

indexes字典用于将芬威克树的大小从输入数组中的最大数字减小到数组的大小。第一个嵌套while查找 Fenwick 树中的子范围最大值。第二次嵌套while更新其中一项总和后更新 Fenwick 树。

此代码仅适用于正数数组。一般情况下,应通过过滤掉所有非正数来对输入数组进行预处理。

时间复杂度为 O(N log N)。空间复杂度为 O(N)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用芬威克树或 BIT 的数组中非递减子序列的最大和 的相关文章

  • 如何显示多维数组第二层的 json 值?

    解决此代码时遇到问题 这些是数组 Array 0 gt stdClass Object id gt 1 name gt delux price gt 213 description gt tv gt 0 breakfast gt 0 par
  • 删除 NSMutablearray 中的最后一个对象[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 为什么要删
  • java - IBM-IEEE 双精度浮点字节转换

    我需要在 Java 中对字节数组进行 IBM IEEE 浮点转换 我能够使用成功地进行单精度浮点字节的转换http www thecodingforums com threads c code for converting ibm 370
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • 在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素

    studentID 1 StudentName jhon Data schoolname school1 enrolmentInfo year 2015 info courseID csc213 school IT enrollmentda
  • Java中整数数组的排列算法

    我有一个工作示例来生成字符串中的所有字符排列 如下所示 static ArrayList
  • 如何计算加权平均值?

    我的语言是PHP 但是算法应该是相当通用的 我有一个关联数组 比方说 评级和评级次数 ratings array 1 gt 1 2 gt 3 3 gt 6 4 gt 3 5 gt 3 这相当于 1 2 2 2 3 3 3 3 3 3 4 4
  • 如何在 PHP 数组中的另一个已知(通过键或指针)元素之后有效地插入元素?

    给定一个数组 a array abc 123 k1 gt v1 k2 gt v2 78 tt k3 gt v3 当其内部指针指向其元素之一时 如何在当前元素之后插入元素 如何在键已知元素 例如 k1 之后插入元素 表现护理 您可以通过使用拆
  • 数字总和直到作为输入给出的数字

    如果给出一个数字作为输入 则找到该数字之前所有数字的总和 例如输入 11 则答案为 1 2 9 1 0 1 1 蛮力方法是计算所有小于某个数字的数字的数字之和 我已经实现了该方法 我想知道是否有其他方法可以在不实际计算每个数字的数字之和的情
  • 如何 grep 遍历数组,同时过滤掉匹配项?

    有没有一种快速简便的方法来 grep 遍历数组 找到满足某些测试的元素and从原始数组中删除这些 例如我想要 a 1 7 6 3 8 4 b grep filter gt 5 a now b 7 6 8 and a 1 3 4 换句话说 我
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 以编程方式分解大量数字

    好吧 所以我有一个巨大的数字f 实际上 这个数字只有 100 多位数字长 我知道这些因子的大小大致相同 如果我的资源和时间有限 我应该使用什么语言和算法 我包括在限制时间内编写算法的时间长度 想法 编辑 我所说的有限是指在尽可能短的时间内
  • MongoDB 查询 IN 对象数组

    我在检索两个集合之间的信息时遇到问题 第一个集合存储员工信息 id ObjectId 4f9643967f8b9a3f0a00005a birth date 1963 09 09 departments departments id Obj
  • 将两个大数作为字符串相除,而不使用java中的Bignumbers

    我需要在不使用 Biginteger 的情况下划分两个大整数 因为数字不能存储在原始类型中 因为我需要从给定的字符串中逐个字符地执行此操作 我已经创建了一个名为 BigNumber 的类 用这个类我可以 Add multiply 比较两个内
  • Javascript 中 Object.entries 的数组解构

    这是有问题的代码 const posts data id 1 date 2019 02 03 ev filter 1 art foodie ev filter 2 value1 value2 ev filter 3 value1 value
  • 在 Perl 中,如何制作数组的深层复制? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Perl 中制作数据结构深层复制的最佳方法是什么 https stackoverflow com questions 388187 whats the best way to make a dee
  • Java 读取大文本文件时出现 OutOfMemoryError

    我是 Java 新手 正在读取非常大的文件 需要一些帮助来理解问题并解决它 我们有一些遗留代码 必须对其进行优化才能正常运行 文件大小仅在 10mb 到 10gb 之间变化 只有当文件开始大小超过 800mb 时才会出现启动问题 Input
  • 动态规划的复杂组合条件

    我正在探索动态规划设计方法如何与问题的底层组合属性相关 为此 我正在查看的规范实例硬币找零问题 Let S d 1 d 2 d m and n gt 0是请求的金额 我们可以用多少种方式相加n仅使用中的元素S 如果我们遵循一个动态规划如果要
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • 缓存感知树的实现

    I have a tree where every node may have 0 to N children 用例是以下查询 给定指向两个节点的指针 这些节点是否位于树的同一分支内 Examples q 2 7 gt true q 5 4

随机推荐

  • 重写历史记录以撤消对 git 中当前分支上的文件的所有更改

    假设我有一个修改六个文件的功能分支 该分支上的大部分提交都涉及file py 我最终意识到有一种可能更好的方法来实现此功能而无需触摸file py根本不 有没有办法调整我的分支上的所有提交以不触及该文件 我觉得应该有某种交互式变基技巧可以轻
  • shell_exec() 和 exec() 在 PHP 中不起作用

    像许多其他人一样 我对 PHP 中的 shell exec 函数有疑问 我已禁用安全模式并从 php ini 中删除了disabled functions 如果我从终端 php print php 运行 php 脚本 它工作正常 但如果我从
  • 在 MATLAB 中使用 i 和 j 作为变量

    i and j是非常流行的变量名称 例如 参见这个问题 and this one 例如 在循环中 for i 1 10 Do something end 作为矩阵的索引 mat i j 4 Why 不应该它们可以用作 MATLAB 中的变量
  • 教程的版本控制设置

    我正在尝试为与编程相关的教程设置版本控制 事实证明这是有问题的 因为有两种不同的历史 本教程提供了项目构建的历史记录 每个章节都提供了该项目的历史记录 读者将看到这些历史记录 如果我从未打算再次更改教程中已编写的章节 我可以将每个章节作为标
  • 不支持的绑定命名空间“”

    我有一个架构JAXB每次都能完美生成java类 我想得到hyperjaxb处理相同的模式 为此 我下载并解压了hyperjaxbMaven项目从这个链接然后使用导航到根目录cmd exe并通过运行示例数据对其进行测试mvn clean in
  • spring destroy-method + 请求范围 bean

    所以我想做这样的事情 Component Scope value request proxyMode ScopedProxyMode INTERFACES public class MyBean Autowired HttpServletR
  • Distcp - 容器运行超出物理内存限制

    我已经在 distcp 上苦苦挣扎了好几天 我发誓我已经用谷歌搜索得够多了 这是我的用例 USE CASE 我在某个位置有一个主文件夹 hdfs 根目录 有很多子目录 深度不固定 和文件 容量 200 000 个文件 30 GO 我只需要为
  • 提取每月第一个星期一

    如何提取从2010 01 01到2015 12 31每个月的第一个星期一 我们可以用lubridate wday测试这是否是星期一 并且day测试这是否是该月的第一周 library lubridate x lt seq ymd 2010
  • 将项目从 SQL 表插入 bootstrap-dropdown

    我正在开发 asp net 项目 我的代码背后的语言是 c 我有一个引导下拉列表 我想从 SQL 表中获取项目 有没有人可以在这方面帮助我 提前致谢 li class nav item dropdown a class btn btn li
  • durandal 优化器在 Visual Studio 中将其构建为构建后过程时引用了错误的路径

    我在 Visual Studio 中设置了一个构建后事件 以使用 durandal 的优化器 使用 Nodejs 来构建用于生产的 main built js 文件 收到错误消息说找不到 main built js 我相信这是因为它没有正确
  • 使用 ELMAH 配置自定义授权

    如何在没有默认 ASP NET 授权角色管理器的情况下将 ELMAH 配置为仅向某些人员显示 我 以及我认为的许多其他人 使用自己的授权逻辑并从零开始构建我的项目 而不使用提供的模板 我想记录错误 但似乎不可能配置 ELMAH 以某种方式覆
  • YouTube 嵌入上的播放按钮在 android-chrome 上不起作用

    我一直在页面上制作嵌入的 YouTube 视频 在桌面浏览器上运行良好 但是 在 android chrome 上 当您触摸中心的红色播放按钮时 嵌入的视频将不会播放 当你触摸播放按钮外面时 它确实可以正常播放 这很奇怪 我的客户也在 iP
  • 在 Mapbox 中使用 Leafletjs MarkerClusterGroup 和过滤器时出现问题

    我尝试过 Mapbox 及其 API 来创建交互式地图 目的是获取 geojson 文件中的点 并将其显示在地图上 它们必须通过标记图标进行过滤 并根据所应用的缩放进行分组 我在使用 MarkerClusterGroup 插件与 leafl
  • JavaScript 沙箱:隐藏给定范围内的全局变量

    我想创建一个 HTML JS 环境 用户可以在其中输入并运行任意 JavaScript 代码 这些代码将在给定监狱对象的上下文中执行 我已经设置了一个游乐场来说明我到目前为止所拥有的 这个做得相当不错 Basic evaluation wo
  • ASP / 获取行和计数

    为了增强性能和资源 我刚刚开始在一些脚本上使用 getRows 我刚刚遇到一个问题 想请教一下 我这样做是为了获取记录集并获取计数 If NOT rs EOF Then arrResultSet rs GetRows arrRowCount
  • java文本字段中的数据可以在没有数据库交互的情况下发送到jasper报表吗?

    我们正在使用 netbeans 用 java 开发一个桌面应用程序 我们已经安装了 Netbeans 的 jasper 报告 并且能够根据数据库中的数据设计报告 有一个表格 我们想要打印而不将数据存储在数据库中 我们可以将表单数据发送到ja
  • 如何使用 initSelection 附加 jquery select2 值

    这是我使用 ajax 进行的 select2 多重选择 最初我在 initselection 中设置一些值 如下所示 initSelection function element callback var data id 4 zipcode
  • 对引用程序集中的类进行 GetType 失败

    我有一个引用域项目的 asp net Web 项目 在 Web 项目中 我想使用反射从域项目创建类的实例 但我总是得到 null 在 VB 中什么也没有 注意 我使用的是非完全限定的类名 并希望按照 MSDN 似乎指示的那样执行搜索 在程序
  • 如何在不使用 vba 创建 Internet Explorer 对象的情况下解析 html?

    我工作的任何计算机上都没有 Internet Explorer 因此创建 Internet Explorer 对象并使用 ie navigate 解析 html 并搜索标签是不可能的 我的问题是 如何在不使用 IE 的情况下自动将带有标签的
  • 使用芬威克树或 BIT 的数组中非递减子序列的最大和

    我们如何使用芬威克树找到数组中非递减子序列的最大和 例如我们有 1 4 4 2 2 3 3 1 这里非递减子序列的最大和是 11 1 2 2 3 3 可以使用动态规划算法找到最大和 扫描数组并将每个元素的值添加到有效的最大子序列和 子序列以