树状数组基础应用

树状数组

前置知识

  • lowbit函数

    lowbit(x) = x & (-x)

    Q:这么简单的一个运算作用是什么呢?

    A:首先我们知道任何一个正整数都有其二进制表示,负整数的二进制表示为:该数绝对值的二进制表示的反码+1。

    例如,对于一个数-7,我们知道其绝对值的二进制表示为0111,那么我们就可以知道-7的二进制表示为1000+1=1001,那么此时7&(-7)的结结果就是0001。

    同理我们可以通过任意给定的x得到其x&(-x)的值。这里我们展示1-8之间的lowbit计算结果。

    数值x x对应二进制表示 -x对应二进制表示 x&(-x)
    1 0001 1111 0001
    2 0010 1110 0010
    3 0011 1101 0001
    4 0100 1100 0100
    5 0101 1011 0001
    6 0110 1010 0010
    7 0111 1001 0001
    8 1000 1000 1000

    通过上表我们可以发现,x&(-x)的二进制表示中永远只存在一个1位,当然这个性质是由其运算规则得到的统一性质,对全体实数有效。且我们容易发现1所在的位置就是x的二进制表示中最末位的1的位置。

    也就是说,如果x的二进制表示第一次出现1的位置为k位,那么lowbit(x)= 2 k 2^k 2k

  • 前缀和
    Q:前缀和是如何定义的?

    A:不妨定义原数组为a,存在一个数组s,如果s与a之间满足如下关系,我们就称数组s为数组a的前缀和数组。

    如果输入索引从0开始,那么

    ∀ x ∈   t h e   r a n g e   o f   i n p u t , a r e   r e l a t e d   t o : s [ x + 1 ] = s [ x ] + a [ x ] \forall x\in \ the \ range \ of \ input,are\ related\ to:s[x + 1] = s[x] + a[x] x the range of inputare related to:<

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将数组转换为树形控件格式通常涉及到以下步骤: 1. 创建根节点:这个数组中没有给出根节点的信息,但你可以创建一个根节点。例如,我们将其命名为"root"。 2. 遍历数组并创建子节点:对于数组中的每个元素,如果它有一个"lot"属性,我们就将其视为一个子节点。如果"lot"数组包含子节点,我们就可以创建更细的层次结构。 3. 为每个节点添加链接:你可能还需要添加一些链接到你的树形控件以使它更有意义。这可能涉及到对数组元素或节点的键(例如上面的"gongdan"和"lot")添加前缀或后缀。 这是一个简单的示例JavaScript代码片段,演示了如何将给定的数组转换为树形控件格式: ```javascript // 假设你的数组是这样的 let array = [ { "gongdan": "000400000398", "lot": ["24002417"] } ]; // 创建根节点 let root = { id: 'root', name: 'Root' }; // 遍历数组并创建子节点 array.forEach(item => { let lot = item.lot; if (lot && lot.length > 0) { let children = lot.map(subLot => { return { id: `child-${item.gongdan}-${subLot}`, name: `Child ${item.gongdan}-${subLot}` }; }); root.children = root.children || []; root.children.push({ type: 'group', items: children }); } else { item.id = `item-${item.gongdan}`; item.name = `Item ${item.gongdan}`; root.children || (root.children = []); root.children.push(item); } }); ``` 这只是一个基础的例子,实际的应用可能会根据你具体的需求和数据进行相应的调整。比如,你可能需要考虑更多的情况,比如一个对象可以有多个子节点,一个节点可能有父节点等。你可能还需要添加一些额外的逻辑来处理这些情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值