財神娛樂首存即享優惠回饋唷~詳情請進👉

【數據布局】線段樹(Segment Tree星城遊戲)

?

假定咱們目前拿到了一個特別很是大的數組,關于這個數組內里的數字要重復賡續地做兩個操作。

一、(query)隨機在這個數組當選一個區間,求出這個區間一切數的以及。

2、(update)賡續地隨機點竄這個數組中的某一個值。

時間龐大度:

羅列:

羅列L~R的每個數并累加。

  • query:O(n)

找到要點竄的數間接點竄。

  • update:O(1)

若是query與update要做許多許多次,query的O(n)會被卡住,以是時間龐大度會特別很是慢。那末有無設施把query的時間龐大度降成O(1)呢?個中一種要領以下:

  • 先確立一個與a數組同樣大的數組。

  • s[1]=a[1];s[2]=a[1]+a[2];s[3]=a[1]+a[2]+a[3];…;s[n]=a[1]+a[2]+a[3]+…+a[n](在s數組中存入a的前綴以及)

  • 此時a[L]+a[L+1]+…+a[R]=s百家樂[R]-s[L-1],query的時間龐大度降為O(1)。
  • 但若要點竄a[k]的值,隨之也需點竄s[k],s[k+1],…,s[n]的值,時間龐大度升為O(n)。

前綴以及:

query:O(1)

update:O(n)

  • 咱們發明,當咱們想絕要領把個中一個操作的時間龐大度改為O(1)后,另一個操作的時間龐大度就會變為O(n)。當query與update的操作分外多時,不管用哪一種要領,總體大樂透中2個號碼多少錢的時間龐大度都不會分外快。
  • 以是,咱們將要接頭一種鳴線段樹的數據布局,它可以把這兩個操作的時間龐大度均勻一下,使得query以捕魚達人電腦版及update的時間龐大度都落在O(n?log?n)上,從而增長整個算法的效率。

線段樹

假定咱們拿到了以下長度為6的數組:

在構建線段樹之前,咱們先論述線段樹的性子:

一、線段樹的每個節點都代表一個區間。

2、線段樹具備獨一的根節點,代表的區間是整個統計規模,如[1,N]。

三、線段樹的每個葉節點都代表一個長度為1的元區間[x,x]。

四、關于每個外部節點[l,r],它的左子結點是[l,mid],右子節點是[mid+1,r],個中mid=(l+r)/2(向下取整)。

遵照這個數組,咱們構建以下線段樹(結點的六合彩規則性子為sum):

若咱們要求[2-5]區間中數的以及:

若咱們要把a[4]改成6:

  • 先一層一層找到方針節點點竄,在依次向上點竄當前節點的父節點。

?

?

接上去的成績是:若何保管這棵線段樹?

  • 用數組存儲。

若咱們要取node結點的左子結點(left)與右子節點(right),要領以下:

  • left=2*node+1
  • right=2*ndoe+2

舉結點5為例(左子結點為節點11,右子節點為節點12):

  • left5=2*5+1=11
  • right5=2*5+2=12

接上去給出建樹的代碼:

【免責聲明】本站內容轉載自互聯網,其相關談吐僅代表作者小我私家概念盡非權勢巨子,不代表本站態度。如您發明內容存在版權成績,請提交相關鏈接至郵箱:,咱們將實時予以處置。

六合彩怎麼算