簡體   English   中英

如何在二進制字符串的特定范圍內找到010的數量

[英]How to find number of 010 in a certain range of a binary string

給出二進制字符串。 如何在字符串的某個范圍內找到“010”的出現。
例如,我有字符串“0100110” 如果給定范圍是3 7 (基於1的索引),則輸出將為4 我找不到任何更快的方法來解決它。

在嘗試這個時,我可以用O(N)復雜度來解決它。 方法是 - 首先我指出所有'1'在一定范圍內的位置,並使用這些位置,我將計算出來回的數字'0' 然后將在后面找到的'0'的數字乘以單個'1' ,在第四個中找到'0'的數字。 然后總結某個范圍內每個'1'的相乘結果。

對於給定的示例,范圍內的'1'的位置是{5,6} 現在對於索引5,我來回的數字都是'0'分別是21 所以我們可以使子序列“010”2 同樣對於索引6我們也得到答案是2 總的來說,我們可以使子序列“010”總共為4次。

但是當我們對給定字符串有一些特定范圍的Q查詢時,我的方法很容易達到時間復雜度O(N 2 我嘗試了很多,但未能找到優化它的方法。 任何人都可以幫助我采用低於O(N 2復雜度的方法嗎? 只是提到時間限制應該是1秒 如果您提供偽代碼,這將是一個加號。

〜先謝謝。

預處理:使輔助數組包含給定位置的累加零數(使用aux [0] = 0)

  0 1 0 0 1 1 0  //string
0 1 1 2 3 3 3 4  //aux array A[]

對於給定的L..R范圍掃描1,對於每1 k索引1獲得范圍內的零 - O(1)操作

P[k] = (A[k] - A[L-1]) * (A[R] - A[k])
S = Sum(P[k], k=L..R)

因此,每個查詢的時間為O(RL) O(Q*N) ,Q查詢的最壞情況為O(Q*N)

但徹底看看公式:

P[k] = (A[k] - A[L-1]) * (A[R] - A[k]) = 
       A[k] * (A[R] + A[L-1]) - A[k]^2 - A[R] * A[L-1] = 
       A[k] * LRSum - A[k]^2 - LRProd
S = Sum(A[k] for ones) * LRSum - Sum(A[k]^2) - LRProd * NumOfOnes 

注意, LRSumLRProd是給定查詢的常數,並且我們必須計算A的位置的A [k]和相同位置的平方和的和。 似乎我們可以使用相同的累積數組的想法,並獲得每個查詢O(1)結果。

快速檢查給出(3+3)*5 - (9+9) - 4*2 = 30-18-8 = 4為您的示例。

使用累積數組:

  0 1 0 0 1  1  0  //string
0 1 1 2 3 3  3  4  //aux array A[]
0 0 1 1 1 4  7  7  //aux array B[]
0 0 1 1 1 10 19 19  //aux array C[]

Result = (B[R] - B[L-1]) * (A[R] + A[L-1]) - (C[R] - C[L-1]) - 
                 A[R] * A[L-1] * (R - L - 1 - (A[R] - A[L-1])) = 
         (7-1) * (4 + 1) - (19 - 1) - 4 * 1 * (7 - 2  - 4 + 1) = 4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM