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

做的较好的拍卖网站手机百度账号登录入口

做的较好的拍卖网站,手机百度账号登录入口,一起做网站17杭州女装,中外政府网站建设比较有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的。 一、概序 假如我现在有个需求,就是要频繁的求数组的前 n 项和&#x…

有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的。

一、概序

假如我现在有个需求,就是要频繁的求数组的前 n 项和,并且存在着数组中某些数字的频繁修改,那么我们该如何实现这样的需求?当然大家可以往真实项目上靠一靠。
**① 传统方法:**根据索引修改为 O(1),但是求前 n 项和为 O(n)。
**② 空间换时间方法:**我开一个数组 sum[],sum[i]=a[1]+…+a[i],那么有点意思,求 n 项和为 O(1),但是修改却成了 O(N),这是因为我的 Sum[i]中牵涉的数据太多了,那么问题来了,我能不能在相应的 sum[i]中只保存某些 a[i]的值呢?好吧,下面我们看张图。
image.png
从图中我们可以看到 S[]的分布变成了一颗树,有意思吧,下面我们看看 S[i]中到底存放着哪些 a[i]的值。

S[1]=a[1];
S[2]=a[1]+a[2];
S[3]=a[3];
S[4]=a[1]+a[2]+a[3]+a[4];
S[5]=a[5];
S[6]=a[5]+a[6];
S[7]=a[7];
S[8]=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7]+a[8];

之所以采用这样的分布方式,是因为我们使用的是这样的一个公式:S[i]=a[i-2k+1]+…+a[i]。
其中:2k 中的 k 表示当前 S[i]在树中的层数,它的值就是 i 的二进制中末尾连续 0 的个数,2k 也就是表示 S[i]中包含了哪些 a[],举个例子: i=610=01102 ;可以发现末尾连续的 0 有一个,即 k=1,则说明 S[6]是在树中的第二层,并且 S[6]中有 21 项,随后我们求出了起始项:
a[6-21+1]=a[5],但是在编码中求出 k 的值还是有点麻烦的,所以我们采用更灵巧的 Lowbit 技术,即:2k=i&-i 。
则:S[6]=a[6-21+1]=a[6-(6&-6)+1]=a[5]+a[6]。

二、代码

1、神奇的 Lowbit 函数

 #region 当前的sum数列的起始下标/// <summary>/// 当前的sum数列的起始下标/// </summary>/// <param name="i"></param>/// <returns></returns>public static int Lowbit(int i){return i & -i;}#endregion

2、求前 n 项和

比如上图中,如何求 Sum(6),很显然 Sum(6)=S4+S6,那么如何寻找 S4 呢?即找到 6 以前的所有最大子树,很显然这个求和的复杂度为 logN。

 #region 求前n项和/// <summary>/// 求前n项和/// </summary>/// <param name="x"></param>/// <returns></returns>public static int Sum(int x){int ans = 0;var i = x;while (i > 0){ans += sumArray[i - 1];//当前项的最大子树i -= Lowbit(i);}return ans;}#endregion

3、修改

如上图中,如果我修改了 a[5]的值,那么包含 a[5]的 S[5],S[6],S[8]的区间值都需要同步修改,我们看到只要沿着 S[5]一直回溯到根即可,同样它的时间复杂度也为 logN。

 public static void Modify(int x, int newValue){//拿出原数组的值var oldValue = arr[x];for (int i = x; i < arr.Length; i += Lowbit(i + 1)){//减去老值,换一个新值sumArray[i] = sumArray[i] - oldValue + newValue;}}

最后上总的代码:

 using System;using System.Collections.Generic;using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;namespace ConsoleApplication2
{public class Program{static int[] sumArray = new int[8];static int[] arr = new int[8];public static void Main(){Init();Console.WriteLine("A数组的值:{0}", string.Join(",", arr));Console.WriteLine("S数组的值:{0}", string.Join(",", sumArray));Console.WriteLine("修改A[1]的值为3");Modify(1, 3);Console.WriteLine("A数组的值:{0}", string.Join(",", arr));Console.WriteLine("S数组的值:{0}", string.Join(",", sumArray));Console.Read();}#region 初始化两个数组/// <summary>/// 初始化两个数组/// </summary>public static void Init(){for (int i = 1; i <= 8; i++){arr[i - 1] = i;//设置其实坐标:i=1开始int start = (i - Lowbit(i));var sum = 0;while (start < i){sum += arr[start];start++;}sumArray[i - 1] = sum;}}#endregionpublic static void Modify(int x, int newValue){//拿出原数组的值var oldValue = arr[x];arr[x] = newValue;for (int i = x; i < arr.Length; i += Lowbit(i + 1)){//减去老值,换一个新值sumArray[i] = sumArray[i] - oldValue + newValue;}}#region 求前n项和/// <summary>/// 求前n项和/// </summary>/// <param name="x"></param>/// <returns></returns>public static int Sum(int x){int ans = 0;var i = x;while (i > 0){ans += sumArray[i - 1];//当前项的最大子树i -= Lowbit(i);}return ans;}#endregion#region 当前的sum数列的起始下标/// <summary>/// 当前的sum数列的起始下标/// </summary>/// <param name="i"></param>/// <returns></returns>public static int Lowbit(int i){return i & -i;}#endregion}
}

image.png

http://www.15wanjia.com/news/7216.html

相关文章:

  • 石家庄网站建设多少钱优化推广排名网站教程
  • 淮安住房和城乡建设厅网站原画培训机构哪里好
  • 长沙网站建设 个人百度seo排名规则
  • 网站页面优化方案青岛网站推广系统
  • 郑州 互联网 公司网站免费的自媒体一键发布平台
  • 房产集团网站建设做个网站
  • 网站建设大学seo伪原创工具
  • 网站聚合怎么做互联网营销师含金量
  • 视频网站外链怎么做如何推广一个新的app
  • 加强司法机关网站建设江苏网站seo设计
  • 做房产网站有哪些广告策划公司
  • 软件自学网站哪个合肥seo好
  • 网站建设找星火龙今日头条新闻最全新消息
  • 高端h5手机网站设计案例怎样制作属于自己的网站
  • seo怎么做网站优秀案例建网站哪个平台好
  • html5做测试网站的源代码app拉新推广接单平台
  • 凡科可以做返利网站吗成品短视频app下载有哪些软件
  • 如何用dw做网站首页百度推广登录官网入口
  • 定制专业网站免费优化推广网站的软件
  • 西安做网站收费价格elo机制
  • 常州网站建设价位seo研究中心超逸seo
  • 网站重新安装深圳百度推广公司
  • 如何来做网站外贸建站
  • 建设公司需要网站吗全球搜官网
  • 做警员编号网站网站推广网站
  • 网站注册时间查询酒店网络营销方式有哪些
  • 做违法网站判刑吗排名优化服务
  • java做网站和php做网站6淘宝关键词优化怎么弄
  • 做网站武汉bt鹦鹉磁力
  • 郑州做网站哪个公司好百度广告投放公司