Einführung in Algorithmen mit Java-kumulativer Summe

Artikelübersicht

Dies ist eine Reihe von Artikeln, die ich in meiner Studie und meinem Memo zusammengestellt habe. Der fünfte. Klicken Sie hier für vorherige Artikel.

# Artikel
4 Einführung in Algorithmen mit Java-Suche (Bit vollständige Suche)
3 Einführung in Algorithmen mit Java-Suche (Suche nach Breitenpriorität)
2 Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
1 Einführung in Algorithmen mit Java-Suche (vollständige Suche, dichotomisierte Suche)

In diesem Artikel

Ich werde darüber lernen. Lassen Sie uns den Erkundungsabschnitt beenden und einen anderen Algorithmus untersuchen (was Sie am wöchentlichen Wettbewerb interessiert hat).

Kumulative Summe

Es scheint eine Berechnungstechnik zu sein. Es scheint zweckmäßig zu sein, die Summe der Abschnitte mit dem Array zu finden.

Referenz: Schreiben Sie die kumulative Summe ohne nachzudenken!

Ich werde es vorerst erklären.

Sequenz a, {1,3,1,4,7,6,1,0,9} Sollen wir das sagen? Angenommen, Sie werden aufgefordert, die Summe aus dem 3. bis 5. dieser Sequenz zu ermitteln.

Normale Methode

a: Addiere einfach den 3. bis 5. von {1,3, ** 1,4,7 **, 6,1,0,9}. Die Antwort lautet 1 + 4 + 7 = 12

Verwenden Sie die kumulative Summe

Erstellen Sie zusätzlich zu a ein Array b, in dem die Summe bis zum i-ten von a gespeichert ist. b:{0,1,4,5,9,16,22,23,23,32} Wenn Sie a_1 wie das erste Element von a schreiben, b_1 = 0 (hier behoben. Indizes werden danach um eins verschoben) b_2 = a_1 = 1 b_3 = a_1 + a_2 = 1 + 3 = 4 b_4 = a_1 + a_2 + a_3 = 1 + 3 + 1 = 5 b_5 = a_1 + ... + a_4 = 1 + ... + 4 = 9 b_6 = a_1 + ... + a_5 = 1 + ... + 7 = 16 ...

Ich fühle mich gesagt. Zu diesem Zeitpunkt wird die Summe des 3. bis 5. von a wie folgt berechnet. b_6 - b_3 = 16 - 4 = 12

Die Einzelheiten sind wie folgt.


  b_6 = a_1 + a_2 + a_3 + a_4 + a_5
-)b_3 = a_1 + a_2
--------------------------------------
      = a_3 + a_4 + a_5

Verstehst du irgendwie Wenn Sie die Summe in der Reihenfolge von vorne speichern, müssen Sie sich nicht die Mühe machen, 3. + 4. + 5. hinzuzufügen!

Worüber freust du dich?

Wenn Sie beispielsweise die Summe von ● bis ▲ mehrmals ermitteln müssen (unter der Annahme eines Problems mit vielen Variationen von ● und ▲), müssen Sie die Schleife auf die übliche Weise immer wieder drehen. Es gibt, aber wenn Sie die kumulative Summe verwenden, können Sie die Gesamtsumme (mit O (1)) in einem Schuss finden.

Schauen wir uns das Problem an.

Beispiel

Beispiel: AtCoder --abc037-c "total"

Klicken Sie hier, um Problemsätze und Eingabebeispiele anzuzeigen.
* Bitte beziehen Sie sich so weit wie möglich auf den Problemlink

(Abschnittsstart) 【Problemstellung】 Bei einer Folge der Länge N {ai} und einer ganzen Zahl K größer oder gleich 1 und kleiner oder gleich N. Diese Zahlenfolge hat N - K + 1 aufeinanderfolgende Unterspalten der Länge K. Suchen Sie die Summe der in jeder dieser Unterspalten enthaltenen Werte.

[Beschränkungen] Alle Eingaben sind ganze Zahlen 1≤K≤N≤10^5 0≤ai≤10^8

【Eingang】 Die Eingabe erfolgt über die Standardeingabe im folgenden Format.

N K
a1 .. aN

【Ausgabe】 Geben Sie die Summe der gesamten in der Unterspalte enthaltenen N - K + 1-Werte aus.

(Ende des Abschnitts)


Das ist das Problem. Es ist nur eine Frage der kumulierten Summe. Sie müssen K-Stücke N-K + 1 Mal hinzufügen. Der Berechnungsbetrag beträgt O (K * (N-K + 1)). Wenn Sie eine schlechte Wahl treffen (K = N / 2 usw.), werden Sie feststellen, dass dies O (N ^ 2) kostet. Dies ist nicht rechtzeitig. Deshalb kommt die kumulative Summe ins Spiel. "K-Additionen sind N-K + 1-mal", aber wenn Sie die kumulative Summe verwenden, können "K-Additionen" alle mit O (1) durchgeführt werden, sodass der Berechnungsbetrag ungefähr O (N) beträgt. ..

Die Richtlinie lautet wie folgt.

Das Folgende ist ein Beispiel für die Antwort.

Main.java



import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int k = sc.nextInt();

		long a[] = new long[n]; //Array zum Empfangen von Eingaben
		long b[] = new long[n + 1]; //Kumulative Summe speichern

		for (int i = 0; i < n; i++) {
			//Eingaben empfangen
			a[i] = sc.nextLong();
		}

		for (int i = 1; i <= n; i++) {
			//Kumulative Summenberechnung
			b[i] = b[i - 1] + a[i - 1];
		}

		long ans = 0; //Antwortspeicher
		for (int i = 0; i < n - k + 1; i++) {
			ans += b[i + k] - b[i];
		}

		System.out.println(ans);
	}
}

... Hmm, es war schwierig im Index. .. Insbesondere ist es schwierig, es ganz am Anfang der kumulierten Summe auf 0 zu setzen.

Gibt es nur wenig Übung? Ich bin froh, dass ich das Konzept und die Denkweise selbst kannte. Vorerst werde ich hier enden. Na dann ~.

Recommended Posts

Einführung in Algorithmen mit Java-kumulativer Summe
Einführung in Algorithmen mit Java-Dictionary Reihenfolge / Kombination verschiedener Lebensmittel (Teil1)
Einführung in Algorithmen mit der Java-Shakutori-Methode
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
Einführung in web3j
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in Ratpack (Extra Edition) - Ratpack in Kotlin geschrieben
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Einführung in Algorithmen mit Java-Suche (Vollsuche, Halbierungssuche)
Einführung in JAR-Dateien
Summe von Java_1 bis 100
Einführung in Ratpack (8) -Session
Einführung in die Bitarithmetik
Einführung in Ratpack (6) --Promise
Einführung in Ratpack (9) - Thymeleaf
Verstehen Sie die Eigenschaften von Scala in 5 Minuten (Einführung in Scala)
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Debuggen mit Eclipse
Einführung in Entwurfsmuster (Einführung)
Einführung in die praktische Programmierung
Einführung in den Befehl javadoc
Einführung in den Befehl jar
Einführung in Ratpack (2) -Architektur
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
Einführung in den Befehl javac
[Einführung in MVEL] Mit dem Ziel, der beste MVELer der Welt zu sein
Einführung in Rakefile, die in ca. 10 Minuten durchgeführt werden kann
Eine Einführung in Funktionstypen für objektorientierte Programmierer in Elm
Einführung in die Parallelverarbeitung + neue parallele Ausführungseinheit Ractor in Ruby
Einführung in Entwurfsmuster (Builder)
Einführung in die Android App-Entwicklung
Einführung in Ratpack (5) --Json & Registry
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
Siehe Aufzählung in Thymeleaf
(Punktinstallation) Einführung in Java8_Impression
Einführung in Entwurfsmuster (Composite)
Einführung in Micronaut 2 ~ Unit Test ~
Einführung in JUnit (Studiennotiz)
Einführung in Spring Boot ~ ~ DI ~
Einführung in Designmuster (Fliegengewicht)
[Java] Einführung in den Lambda-Ausdruck
Einführung in Spring Boot ② ~ AOP ~
Einführung in Apache Beam (2) ~ ParDo ~
Einführung in die EHRbase 2-REST-API
Einführung in Entwurfsmuster Prototyp