2013-12-09 221 views
0

我已經意識到樹狀數組,但是當我試圖找到和上段有段錯誤11.分段故障

#include <vector> 
#include <iostream> 
using namespace std; 


class Fenwick{ 
public: 
    Fenwick(); 
    int sum(int l, int r); 
    void update(int pos, int value); 
    void print(int i); 
private: 
    vector<int> fentr; 
    int sum(int i); 
}; 
Fenwick::Fenwick(){ 
} 

void Fenwick::print(int i){ 
    cout<<fentr[i]; 
} 
int Fenwick::sum(int l, int r){ 
    return sum(r)-sum(l-1); 
} 
int Fenwick::sum(int i){ 
    int result=0; 
    // while(i>=0){ 
    // result+=fentr[i]; 
    // i=(i&(i+1))-1; 
    // } 
    for(int j=i; j>=0; j=(i&(i+1))-1){ 
     result+=fentr[j]; 
    } 
    return result; 
} 

void Fenwick::update(int pos, int value){ 
    while (pos<fentr.size()){ 
     fentr[pos]+=value; 
     pos=pos | (pos+1); 
    } 
} 


int main(){ 
    Fenwick a; 
    a.update(0, 1); 
    a.update(1, 2); 
    a.update(2, 3); 
    a.update(3, 4); 
    a.update(4, 5); 
    int j = a.sum(0,2); 
    cout<<j; 


} 

而且,我做了它的權利?我的意思是,我完全理解Fenwick樹的想法,我只是無法找到我們必須做的初始數組?可能我需要作爲Fenwik課的一個參數傳遞,然後和他一起工作?或者只是很多更新?先謝謝你。

+0

那麼,你很可能會超出數組引用的範圍。您不會向我們顯示堆棧跟蹤或哪條線路發生故障。 – OldProgrammer

回答

0

就我所見,您還沒有初始化fentr向量。這在更新時不會失敗,因爲您正在循環到fentr.size(),但它會在撥打sum時發生段錯誤。