国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

樹狀數組理解

Big_fat_cat / 1058人閱讀

摘要:無意間看到樹狀數組,查了很多資料被各種圖和公式繞暈了,下面記錄一點個人理解。

無意間看到樹狀數組,查了很多資料被各種圖和公式繞暈了,下面記錄一點個人理解。

假設數組a[0],a[1],a[2],.....,a[n],記0-m元素之和為sum(m) (0=

遍歷累加0-m 時間復雜度O(m),空間復雜度O(1)

增加輔助數組s[0],s[1],s[2],.....,s[n] 時間復雜度O(1),空間復雜度O(n)

當我們頻繁的求s(m)時,第一種方法不適用,當我們頻繁的修改數組a時,第二種方法每次都要修改數組s,修改數組s的時間復雜度為O(n)

而樹狀數組可以很好解決這種場景,它類似方法二
方法二中我們定義s[m] = a[m]+a[m-1]+a[m-2]+....+a[0]
樹狀數組中我們定義s[m]= a[m-1]+a[m-2]+....+a[i-2^k],其中k為m的二進制的第一個1前0的個數
ps:有些資料是m至i-2^k+1,那是數組下標從1開始計數的,這里下標從0開始,因此有所區別

舉個例子:10的二進制1010,因此k=1;24的二進制11000,因此k=3
我們記lowbit(m)=2^k,即有lowbit(10)=2,lowbit(24)=8
可以發現2的二進制是10,8的二進制是1000,因此lowbit的實現很簡單

 static int lowbit (int x){
        return x&(-x);
    }

如果這方法無法理解,建議看下二進制補碼

接下來數組s就有的一個公式
s[m]=a[m-1]+a[s-2]+....+a[i-lowbit(m)]

我覺得樹狀數組講到這里就可以了,為了便于理解,我舉一個例子,測試代碼如下

    public static void main(String[] args) {
        for (int i = 0; i < 30; i++) {
            System.out.println("i = " + intFixedString(i) + " binary i = " + intBinaryString(i) + " lowbit = " + lowbit(i) + " i-2^k = " + (i - lowbit(i)));
        }
    }

    public static String intBinaryString(int i) {
        return Integer.toBinaryString((i & 0xFF) + 0x100).substring(1);
    }

    public static String intFixedString(int i) {
        return i < 10 ? i + " " : i + "";
    }

打印結果

假設求sum(28),我們分析一下 i = 28 binary i = 00011100 lowbit = 4 i-2^k = 24
s[28]=a[27]+a[26]+....+a[24]
其中最后一個數是24,繼續分析 i = 24 binary i = 00011000 lowbit = 8 i-2^k = 16
s[24]=a[23]+a[22]+....+a[16]
最后一個數是16,繼續分析 i = 16 binary i = 00010000 lowbit = 16 i-2^k = 0
s[16]=a[15]+a[14]+....+a[0]

很容易發現sum(28)=a[28]+s[28]+s[24]+s[16],代碼實現如下

    public int sum(int m) {
        int sum = a[m];
        while (m >= 0) {
            sum += s[m];
            m = m - lowbit(m);
        } 

        return sum;
    }

上面只是我的個人理解,如有錯誤,敬請指正。

參考:http://www.cppblog.com/menjit...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68550.html

相關文章

  • 運用樹狀數組解決動態數組求和

    摘要:對于一組一維數組解決前項和,如果使用的方法需要的時間來找到前項數字的和,但是可以用的時間來更新對應數字的值但是仍然需要的時間來更新牽扯到相應數字數組的和,相反可以使用樹狀數組來降低運行時間求數組內一段數組的和,但同樣我們增加了更新樹狀數組內 對于一組一維數組解決前n項和,如果使用linear scan的方法, 需要O(n)的時間來找到前n項數字的和,但是可以用O(1)的時間來更新對應數...

    Barrior 評論0 收藏0
  • 用100行代碼畫出DOM樹狀結構

    摘要:用行代碼畫出樹狀結構這兩天寫了這樣一個小玩具,是一個可以把的樹狀結構解析,并且畫出來的東西,把代碼寫到左邊,右邊就會自動生成啦。繪圖部分依賴了百度開源的,核心功能的實現只有行代碼。如果是或者標簽,那么進入相應的狀態 用100行代碼畫出DOM樹狀結構 這兩天寫了這樣一個小玩具,是一個可以把DOM的樹狀結構解析,并且畫出來的東西,把HTML代碼寫到左邊,右邊就會自動生成啦。 點這里看DEM...

    Galence 評論0 收藏0
  • localStorage實現本地儲存樹形菜單

    摘要:因為任務需要添加到樹的結構上,所以要記錄任務是添加到哪個結點上的,需要為每個樹結點添加一個作為標識以便于在結點上添加任務,樹狀結構中每個結點的按照樹的先序遍歷將結點的依次儲存于數組中。 localStorage實現本地儲存樹形菜單 最近在寫一個Todo-list的頁面,頁面布局和操作都寫完后,想要用localStorage實現本地儲存。然而對儲存數據的方法一無所知,就先去了解了web的...

    William_Sang 評論0 收藏0
  • 關于樹形插件展示中數據結構轉換的算法

    摘要:舉例說明如下二維數據結構總部二級門店三級門店二級門店樹狀數據結構總部二級門店三級門店二級門店但在某些插件中,或在某些特殊場景中,我們有兩種數據結構之間相互轉換的需求,需要自己寫一個輔助函數來完成。 問題背景 在一些目錄結構、機構層級等展示的場景中,我們經常會用到一些成熟的樹形插件來進行輕松展示,比如ztree等。大多數插件會支持對兩種數據源格式的解析,一種是通用的二維數據結構,一種是樹...

    王晗 評論0 收藏0

發表評論

0條評論

Big_fat_cat

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<