Lassen Sie sich auf ein Array der Größe B[1:K]
eine Operation definieren K
das heißt die Anzahl der Elemente in dem Subarray zählt B[2:K]
welche als B[1]
kleiner sind.Abfrage an all benachbarten Subarray der Größe K
Jetzt habe ich ein Array A[1:N]
der Größe N
und mein Ziel ist es, die obige Operation auf allen zusammenhängenden Subarrays der Größe K
durchzuführen.
Beispiel
A = [4, 3, 6, 2, 1] and K = 3
Es gibt 3
angrenzenden Sub-Array von Größe 3
.
B = [4, 3, 6]
count = 1
[(3 < 4)]
B = [3, 6, 2]
count = 1
[(2 < 3)]
B = [6, 2, 1]
count = 2
[(2 < 6), (1 < 6)]
Zeitkomplexität des Brute-Force-Ansatzes wird O((N-K+1)*K)
sein, da die obige Operation auf einem angrenzenden Sub-Arrays der Größe der Durchführung K
ist O(K)
.
Ich kann es in Nlog(M)
effizient also tun, wenn ich eine Datenstruktur entwerfen , die folgenden Eigenschaften
- Insertion in
log(M)
- Deletion in
log(M)
- Count Anzahl der Elemente kleiner als
X
hat inlog(M)
Ich bin C++
Benutzer und ich glaube nicht, dass es eine Datenstruktur gibt, die alle genannten Anforderungen erfüllt. Gibt es andere Möglichkeiten zur Verbesserung? Bitte helfen Sie.
Die ersten beiden sind 'std :: set', aber die letzte Operation wird' O (M) 'sein, obwohl die obere Grenze 'O (logM)' selbst ist. – StoryTeller
Wenn Ihr Ziel nur zu zählen ist, habe ich einen Algorithmus im Hinterkopf, der in O (nlogn) läuft. – marvel308
@StoryTeller Ja, das weiß ich. – cryptomanic