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

資訊專欄INFORMATION COLUMN

樹(shù)狀數(shù)組理解

Big_fat_cat / 1059人閱讀

摘要:無(wú)意間看到樹(shù)狀數(shù)組,查了很多資料被各種圖和公式繞暈了,下面記錄一點(diǎn)個(gè)人理解。

無(wú)意間看到樹(shù)狀數(shù)組,查了很多資料被各種圖和公式繞暈了,下面記錄一點(diǎn)個(gè)人理解。

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

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

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

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

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

舉個(gè)例子:10的二進(jìn)制1010,因此k=1;24的二進(jìn)制11000,因此k=3
我們記lowbit(m)=2^k,即有l(wèi)owbit(10)=2,lowbit(24)=8
可以發(fā)現(xiàn)2的二進(jìn)制是10,8的二進(jìn)制是1000,因此lowbit的實(shí)現(xiàn)很簡(jiǎn)單

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

如果這方法無(wú)法理解,建議看下二進(jìn)制補(bǔ)碼

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

我覺(jué)得樹(shù)狀數(shù)組講到這里就可以了,為了便于理解,我舉一個(gè)例子,測(cè)試代碼如下

    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 + "";
    }

打印結(jié)果

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

很容易發(fā)現(xiàn)sum(28)=a[28]+s[28]+s[24]+s[16],代碼實(shí)現(xiàn)如下

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

        return sum;
    }

上面只是我的個(gè)人理解,如有錯(cuò)誤,敬請(qǐng)指正。

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/68550.html

相關(guān)文章

  • 運(yùn)用樹(shù)狀數(shù)組解決動(dòng)態(tài)數(shù)組求和

    摘要:對(duì)于一組一維數(shù)組解決前項(xiàng)和,如果使用的方法需要的時(shí)間來(lái)找到前項(xiàng)數(shù)字的和,但是可以用的時(shí)間來(lái)更新對(duì)應(yīng)數(shù)字的值但是仍然需要的時(shí)間來(lái)更新?tīng)砍兜较鄳?yīng)數(shù)字?jǐn)?shù)組的和,相反可以使用樹(shù)狀數(shù)組來(lái)降低運(yùn)行時(shí)間求數(shù)組內(nèi)一段數(shù)組的和,但同樣我們?cè)黾恿烁聵?shù)狀數(shù)組內(nèi) 對(duì)于一組一維數(shù)組解決前n項(xiàng)和,如果使用linear scan的方法, 需要O(n)的時(shí)間來(lái)找到前n項(xiàng)數(shù)字的和,但是可以用O(1)的時(shí)間來(lái)更新對(duì)應(yīng)數(shù)...

    Barrior 評(píng)論0 收藏0
  • 用100行代碼畫(huà)出DOM樹(shù)狀結(jié)構(gòu)

    摘要:用行代碼畫(huà)出樹(shù)狀結(jié)構(gòu)這兩天寫(xiě)了這樣一個(gè)小玩具,是一個(gè)可以把的樹(shù)狀結(jié)構(gòu)解析,并且畫(huà)出來(lái)的東西,把代碼寫(xiě)到左邊,右邊就會(huì)自動(dòng)生成啦。繪圖部分依賴了百度開(kāi)源的,核心功能的實(shí)現(xiàn)只有行代碼。如果是或者標(biāo)簽,那么進(jìn)入相應(yīng)的狀態(tài) 用100行代碼畫(huà)出DOM樹(shù)狀結(jié)構(gòu) 這兩天寫(xiě)了這樣一個(gè)小玩具,是一個(gè)可以把DOM的樹(shù)狀結(jié)構(gòu)解析,并且畫(huà)出來(lái)的東西,把HTML代碼寫(xiě)到左邊,右邊就會(huì)自動(dòng)生成啦。 點(diǎn)這里看DEM...

    Galence 評(píng)論0 收藏0
  • localStorage實(shí)現(xiàn)本地儲(chǔ)存樹(shù)形菜單

    摘要:因?yàn)槿蝿?wù)需要添加到樹(shù)的結(jié)構(gòu)上,所以要記錄任務(wù)是添加到哪個(gè)結(jié)點(diǎn)上的,需要為每個(gè)樹(shù)結(jié)點(diǎn)添加一個(gè)作為標(biāo)識(shí)以便于在結(jié)點(diǎn)上添加任務(wù),樹(shù)狀結(jié)構(gòu)中每個(gè)結(jié)點(diǎn)的按照樹(shù)的先序遍歷將結(jié)點(diǎn)的依次儲(chǔ)存于數(shù)組中。 localStorage實(shí)現(xiàn)本地儲(chǔ)存樹(shù)形菜單 最近在寫(xiě)一個(gè)Todo-list的頁(yè)面,頁(yè)面布局和操作都寫(xiě)完后,想要用localStorage實(shí)現(xiàn)本地儲(chǔ)存。然而對(duì)儲(chǔ)存數(shù)據(jù)的方法一無(wú)所知,就先去了解了web的...

    William_Sang 評(píng)論0 收藏0
  • 關(guān)于樹(shù)形插件展示中數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換的算法

    摘要:舉例說(shuō)明如下二維數(shù)據(jù)結(jié)構(gòu)總部二級(jí)門(mén)店三級(jí)門(mén)店二級(jí)門(mén)店樹(shù)狀數(shù)據(jù)結(jié)構(gòu)總部二級(jí)門(mén)店三級(jí)門(mén)店二級(jí)門(mén)店但在某些插件中,或在某些特殊場(chǎng)景中,我們有兩種數(shù)據(jù)結(jié)構(gòu)之間相互轉(zhuǎn)換的需求,需要自己寫(xiě)一個(gè)輔助函數(shù)來(lái)完成。 問(wèn)題背景 在一些目錄結(jié)構(gòu)、機(jī)構(gòu)層級(jí)等展示的場(chǎng)景中,我們經(jīng)常會(huì)用到一些成熟的樹(shù)形插件來(lái)進(jìn)行輕松展示,比如ztree等。大多數(shù)插件會(huì)支持對(duì)兩種數(shù)據(jù)源格式的解析,一種是通用的二維數(shù)據(jù)結(jié)構(gòu),一種是樹(shù)...

    王晗 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Big_fat_cat

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<