Zeitkomplexitätsnachweis für die Segmentbaumimplementierung des Bereichsummenproblems

10

Ich verstehe, dass Segmentbäume verwendet werden können, um die Summe der Unterarrays von . Und dass dies in Zeit gemäß dem Tutorial hier geschehen kann .EINÖ(Logn)

Ich kann jedoch nicht beweisen, dass die Abfragezeit tatsächlich . Dieser Link (und viele andere) besagen, dass wir beweisen können, dass auf jeder Ebene maximal Knoten verarbeitet werden und somit .Ö(Logn)4Ö(4Logn)=Ö(Logn)

Aber wie beweisen wir das, vielleicht durch Widerspruch?

Und wenn ja, wenn wir Segmentbäume für eine entfernte Summe höherdimensionaler Arrays verwenden würden, wie würde der Beweis erweitert werden?

Ich kann mir zum Beispiel vorstellen, eine Submatrixsumme zu finden, indem ich die ursprüngliche Matrix in 4 Quadranten (ähnlich wie Halbierungsintervalle in linearen Arrays) aufteile, um einen Quadranten-Segmentbaum zu erstellen, aber der Beweis entgeht mir.

Arijit Choudhury
quelle
Die Erstellung des Segmentbaums ist O (n), die Abfrage ist O (log n) und die Aktualisierung ist O (log N). Der Vorteil gegenüber dem Summenarray liegt in der Komplexität der Aktualisierung.
Nurlan

Antworten:

11

Die Behauptung ist, dass es höchstens Knoten gibt, die auf jeder Ebene erweitert werden. Wir werden dies durch Widerspruch beweisen.2

Betrachten Sie den unten angegebenen Segmentbaum.

Segmentbaum

Angenommen, in diesem Baum werden Knoten erweitert. Dies bedeutet, dass der Bereich vom am weitesten links liegenden farbigen Knoten bis zum am weitesten rechts liegenden farbigen Knoten reicht. Beachten Sie jedoch, dass der gesamte Bereich des mittleren Knotens abgedeckt ist, wenn sich der Bereich bis zum Knoten ganz rechts erstreckt. Somit gibt dieser Knoten den Wert sofort zurück und wird nicht erweitert. Somit beweisen wir, dass wir auf jeder Ebene höchstens Knoten erweitern. Da es Ebenen gibt, sind die Knoten, die erweitert werden,32Logn2Logn=Θ(Logn)

adijo
quelle