Anzahl von subarrays, wo die Summe der Ziffern ist teilbar durch K
Gegeben ein array, herauszufinden, wie viele solcher untersequenzen (nicht erforderlich zu sein zusammenhängenden) bestehen dort, wo die Summe der Elemente in diesem subarray ist teilbar durch K.
Ich weiß, ein Ansatz mit der Komplexität 2^n, wie unten angegeben. es ist wie die Suche nach alle nCi wobei i=[0,n] und überprüfen, ob die Summe ist teilbar durch K.
Bitte geben Sie Pseudo-Code sowas wie lineare/quadratische oder n^3.
static int numways = 0;
void findNumOfSubArrays(int [] arr,int index, int sum, int K) {
if(index==arr.length) {
if(sum%k==0) numways++;
}
else {
findNumOfSubArrays(arr, index+1, sum, K);
findNumOfSubArrays(arr, index+1, sum+arr[index], K);
}
}
- Dieser Ansatz, die Sie erwähnt sieht mehr als brute-force-als divide-and-conquer, einfach nur sagen
- Reduzieren Sie die original-array auf den Bereich [0 .. (k-1)] von modulo, dann verwenden Sie dynamische Programmierung, um die Anzahl der Kombination (eine dimension ist der modulo, die andere dimension ist die Anzahl der Elemente, die Sie haben summiert).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Input - array A der Länge n und einer natürlichen Zahl k.
Den Algorithmus:
Nun können wir verwenden dynamische Programmierung:
Definieren wir D[i,j] = maximale Anzahl von sub-arrays - B[i..n], dass die Summe Ihrer Elemente modulo k entspricht j.
1 <= i <= n.
0 <= j <= k-1.
D[n,0] = if (b[n] == 0), 2. Ansonsten, 1.
wenn j > 0 :
D[n,j] = if (B[n] modulo k) == j, als 1. Andernfalls 0.
for i < n und 0 <= j <= k-1:
D[i,j] = max{D[i+1,j], 1 + D[i+1, D[i+1,(j-B[i]+k) modulo k)]}.
Konstruieren, D.
Return D[1,0].
Gesamte Laufzeit: O(n*k)
D[i,j] = maximum number of sub-arrays of - B[j..n] that the sum of its elements = j
Einer derj
isti
, ist es nicht?D[i,j] = max{D[i+1,j], 1 + D[i+1, |j-(B[i] modulo k)|]}.
<- Das ist falsch. (Einfach zu überprüfen, nehmenK = 1
sollte die Antwort sein2^n
(oder2^n - 1
wenn Sie nicht zulassen, dass der leeres array).) Die subarrays derB[i..n]
summieren zuj (mod K)
1 sind. diejenigen, die keinenB[i]
und 2. diejenigen, die dies tun. Offensichtlich die sets sind disjunkt, die subarrays derB[(i+1)..k]
summieren zuj
sindD[i+1,j]
an der Zahl, und diejenigen, die verwendenB[i]
sind in 1-1-Korrespondenz mit den subarrays derB[(i+1)..n]
summieren zuj - B[i] (mod K)
. SoD[i,j] = D[i+1,j] + D[i+1,(j-B[i]+K)%K]
. Auch die Initialisierung ist falsch...D[n,0] = 1
(leeres array),D[n,B[n]] = 1
,D[n,j] = 0
ansonsten (wennB[n] = 0
, dannD[n,0] = 2
).Eigentlich, ich glaube nicht, dass dieses problem wahrscheinlich gelöst werden, in O(n^3) oder sogar in polynomialer Zeit, wenn der Bereich von K und die Reihe von zahlen in der Reihe, ist unbekannt. Hier ist, was ich denke:
Betrachten Sie den folgenden Fall an: die N zahlen in arr ist so etwas wie
[1,2,4,8,16,32,...,2^(N-1)]
,
in dieser Art und Weise, die Summen 2^N "subarrays" (nicht erforderlich zu sein zusammenhängenden) von arr, ist genau der integer-zahlen in [0,2^N)
und Fragen, wie viele von Ihnen ist teilbar durch K ist äquivalent zu Fragen, wie viele der zahlen sind teilbar durch K in [0, 2^N).
Ich weiß, die Antwort kann unmittelbar ermittelt werden, wie (2^N-1)/K (oder so) in dem obigen Fall. Aber , wenn wir nur ein paar ( vielleicht 3? 4? - ) Nummern in arr zufällig, zu "Graben einige zufällige Löcher" in der perfekt-zusammenhängenden-integer-Bereich [0,2^N), das macht es sieht unmöglich zu berechnen, die Antwort ohne Umweg über fast jede Zahl in [0,2^N).
ok nur ein paar dumme Gedanken ... könnte Total falsch liegen.
Benutzen ein Hilfs-array
A
1) Während der Einnahme von input, speichern Sie die aktuelle Gesamtsumme der entsprechende index (dieser führt in
O(n)
):2) nun,
Dort gehen Sie:
O(n^2)
...