ფენვიკის ხე

Содержание

Слайд 2

ფენვიკის ხე (ორობითი ინდექს-ხე): ამოცანის დასმა ვთქვათ, მოცემულია n ცალი რიცხვისაგან

ფენვიკის ხე (ორობითი ინდექს-ხე): ამოცანის დასმა

ვთქვათ, მოცემულია n ცალი რიცხვისაგან შედგენილი

მიმდევრობა
1.) გავზარდოთ i-ური წევრის მნიშვნელობა.
2.) შეკითხვა: დავადგინოთ ელემენტთა ჯამის მნიშვნელობა [k,j] ინტერვალში

ფენვიკის ხის დადებითი მხარე:
- შეკითხვა შესრულებას უარეს შემთხვევაში სჭირდება O(log n) დრო.
- მოკლე კოდი.

Слайд 3

ამოხსნა სტატიკური მონაცემებისათვის რაიმე B მასივში i-ურ ინდექსზე შევინახოთ 1-დან i-მდე

ამოხსნა სტატიკური მონაცემებისათვის

რაიმე B მასივში i-ურ ინდექსზე შევინახოთ 1-დან i-მდე ელემენტების

ჯამი, მაშინ [l,r] ინტერვალში მყოფი ელემენტების ჯამი ტოლი იქნება: B[r]-B[l].
Слайд 4

ფენვიკის ხე: შესავალი ჩვენი მიზანია გამოვთვალოთ ელემენტთა ჯამი [1,i] ინტერვალში. გამოვიყენოთ

ფენვიკის ხე: შესავალი

ჩვენი მიზანია გამოვთვალოთ ელემენტთა ჯამი [1,i] ინტერვალში.
გამოვიყენოთ ის ფაქტი,

რომ ნებისმიერი რიცხვი შეიძლება წარმოვადგინოთ 2-ის ხარისხების ჯამით.
გამოვიყენოთ ეს თვისება [1,i] ინტერვალის წარმოსადგენად.
13 = 8 + 4 + 1
[1, 13] = [1, 8] + [9, 12] + [13, 13]
Слайд 5

ფენვიკის ხე: ინტერვალები ხის წვეროებში ჩვენ ვინახავთ [i -2^r+1, i] ინტერვალში

ფენვიკის ხე: ინტერვალები

ხის წვეროებში ჩვენ ვინახავთ [i -2^r+1, i] ინტერვალში შემავალი

ელემენტების ჯამს, სადაც r არის ბოლო არანულოვანი ციფრის პოზიცია i-ის ორობით ჩანაწერში.
მაგალითი:
1310 = 11012, ბოლო არანულოვანი ციფრი დგას 0 პოზიციაზე.
410 = 1002, ბოლო არანულოვანი ციფრი დგას 2 პოზიციაზე.
Слайд 6

ფენვიკის ხის სტრუქტურა f[i]=i-ური ელემენტის მნიშვნელობა c[i] = f[1] + f[2]

ფენვიკის ხის სტრუქტურა
f[i]=i-ური ელემენტის მნიშვნელობა
c[i] = f[1] + f[2] + …

+ f[i]
tree[i] = [i-2^r +1,i] ინტერვალში მყოფი ელემენტების ჯამი
Слайд 7

ფენვიკის ხის მაგალითი

ფენვიკის ხის მაგალითი

Слайд 8

ფენვიკის ხის სტრუქტურა

ფენვიკის ხის სტრუქტურა

Слайд 9

ფენვიკის ხე: შეკითხვა (Query) int read(int idx) { int sum =

ფენვიკის ხე: შეკითხვა (Query)

int read(int idx)
{
int sum = 0;
while (idx >

0)
{
sum += tree[idx];
idx = idx - (idx & -idx);
}
return sum;
}
Слайд 10

როგორ მუშაობს idx -= (idx & -idx)? idx = 44 =

როგორ მუშაობს idx -= (idx & -idx)?

idx = 44 = 1011002

-idx

= 010011+1=0101002

Sum = tree[44];

1011002 & 0101002 = 0001002 = 4

idx = 44-4 = 40 = 1010002

Sum = tree[44]+tree[40];

-idx = 010111+1=0110002

1010002 & 0110002 = 0010002 = 8

idx = 40-8 = 32 = 1000002

Sum = tree[44]+tree[40]+tree[32];

-idx = 011111+1=1000002

idx = 32–32 = 0

Sum = tree[44]+tree[40]+tree[32];

Слайд 11

ფენვიკის ხე: განახლება (Update) void update(int idx ,int val) { while

ფენვიკის ხე: განახლება (Update)

void update(int idx ,int val)
{
while (idx <= MaxVal)
{
tree[idx]

+= val;
idx += (idx & -idx);
}
}
Слайд 12

როგორ მუშაობს idx += (idx & -idx)? idx = 44 =

როგორ მუშაობს idx += (idx & -idx)?

idx = 44 = 1011002

-idx

= 010011+1=0101002

tree[44]=tree[44]+val;

1011002 & 0101002 = 0001002 = 4

idx = 44+4 = 48 = 1100002

tree[48]=tree[48]+val;

-idx = 001111+1=0100002

1010002 & 0100002 = 0010002 = 16

idx = 48+16 = 64 = 10000002

ასე გაგრძელდება ვიდრე idx <= MaxVal

-idx = 0111111+1=1000002

idx = 64+64 = 128…

tree[64]=tree[64]+val;