2352-2299-3067.pdf

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2352-2299-3067.pdf

树状数组/线段树 数据结构的引入与讨论 树状数组部分 ——杨挺 引入 Example: 给出一数列: A[ 1 ]、A[ 2 ]、A[ 3 ]……A[ n ] 对其有两种操作: Add  ij : A[ i] = A[ i] + j; Sum ij : 询问A[ i]至A[ j ]的和并输出。 共有m次操作。 思路一 Add  i j :  以O( 1 )的时间A[ i ] += j; Sum i j :  以O( n )的时间累加出结果。 总时间复杂度为O( n * m )。 Time Limit Exceeded !!! 思路二 增开S数组:S[ i ]表示从A[ 1 ]到A[ i ]之和; Sum i j :  O( 1 )时间求出,即ans = S[ j ] –S[ i –1 ]; Add  I j :  O( n )时间,对于A[ i ]修改,必须更新S[ i ]至 S[ n ]的值。 复杂度仍为O( n * m )。 时间就是生命!!! 急需引进一种修改与查询耗时相对较少的数据结构 ——树状数组即为所求 Lowbit函数 lowbit函数: 表示二进制中最后一个不为零的位。 如: lowbit( (10100) ) = (100) ; 2 2 lowbit( (10010) ) = (  10) 。 2 2 可得出: lowbit( X ) = X  ( X ^ ( X –1 ) ); ※根据机器补码的性质还可以得出: lowbit( X ) = X  ( –X )。 树状数组 定义: 若A为原数组,定义数组C为树状数组。 C数组中元素C[ i ]表示A[ i –lowbit( i ) + 1] 至A[ i ]的结合值。 ※结合值:满足结合律的交运算结果。 如: 求和则为这一段的和; 求最优值,则表示这一段的最优值。 树状数组 此图中结合值即为元素之和: C[ 1 ] = A[ 1 ]; C[ 2 ] = A[ 1 ] + A[ 2 ]; C[ 3 ] = A[ 3 ]; C[ 4 ] = A[ 1 ] + A[ 2 ] + A[ 3 ] + A[ 4 ]; C[ 5 ] = A[ 5 ]; C[ 6 ] = A[ 5 ] + A[ 6 ]; C[ 7 ] = A[ 7 ]; C[ 8 ] = A[ 1 ] + A[ 2 ] + A[ 3 ] + A[ 4 ] + A[ 5 ] + A[ 6 ] + A[ 7 ] +  A[ 8 ]; …… 树状数组支持的操作 更新最优值(improve操作) 引理1:若对A[ k ]值有修改(权值不变坏), 设它影响的C数组为C[ p ]、C[ p ]……C[ p ], 1 2 m 则p = k;p = p+ lowbit( p )。 1  i+1  i  i Void improve( int k ) { for ( int j = k; j = n; j += lowbit( j ) )  C[ j ]

文档评论(0)

cai + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档