AtCoder ABC151 Problem D Geschwindigkeitsvergleich in C ++ / Python / PyPy

Überblick

Teilnahme an AtCoder ABC151. Lösen Sie Problem D in C ++ / Python3 / PyPy3 mit einer Methode, die für dieses Problem wahrscheinlich nicht optimal ist (Warshall-Floyd-Methode). Ich habe gemessen und verglichen.

Das Ergebnis war, dass C ++ stabiler und 60-70-mal schneller war, wenn die Problemgröße in gewissem Maße zunahm. Wenn Sie Bedenken bezüglich TLE haben, ist es besser, die Übermittlung von ~~ Implement ~~ in Python zu beenden.

Als ich später einen Kommentar erhielt und ihn mit PyPy3 (2.4.0) einreichte, stellte ich fest, dass TLE behoben wurde. Die Ausführungszeit betrug jedoch 1191 ms, was erheblich langsamer war als die von C ++ mit 71 ms.

Wenn Sie sich also Sorgen um TLE machen, ist es besser, 1. die Implementierung in C ++ einzureichen, 2. in Python PyPy zu implementieren.

Hintergrund

Teilnahme am AtCode ABC151. Als ich Problem D sah, dachte ich wie folgt.

"Es kann durch die Methode im Ameisenbuch (Warshall-Floyd-Methode) gelöst werden. Die Knoten (Masse) sind jedoch nur mit oben, unten, links und rechts verbunden, und der Abstand zwischen benachbarten Knoten beträgt immer 1, sodass es eine effizientere Methode gibt. damit.

Aber O (N ^ 3) und N = 400, also 400 ^ 3 = 64.000.000, nicht wahr? Es ist mühsam, an andere Methoden zu denken, und ich weiß, dass dies das Problem lösen wird. Verwenden wir also die Worshall-Floyd-Methode. ""

In Python implementiert, ohne zu viel nachzudenken. Ich habe bis zum Zeitlimit (vor 3 Minuten) debuggt und eingereicht # 9476488 (20-01-12 22:37:01), aber das Ergebnis Ist TLE. Ich war traurig.

Später, als ich es in C ++ implementierte und eingereicht # 9484896, betrug die Ausführungszeit 71 ms, was eine Marge war. Ich möchte in Zukunft darauf verweisen.

1/15 Nachschrift

In dem Kommentar: "Ich habe TLE nicht bekommen, als ich es mit PyPy 3 veröffentlicht habe. Ich habe 3 WAs." Als ich es mit PyPy implementierte, verschwand TLE und WA kam aus dem heraus, was nicht TLE war. WA wurde AC, nachdem INF auf 10 ** 3 geändert wurde. (Submission # 9513468) Die Ausführungszeit betrug jedoch 1191 ms, was nicht TLE war, aber es gab einen großen Unterschied zu 71 ms von C ++.

Als Reaktion darauf habe ich die Geschwindigkeit mit Python / PyPy mit INF = 10 ** 3 auf meinem Computer neu gemessen.

Ergebnis des Geschwindigkeitsvergleichs

** Geschwindigkeitsverhältnis **

image.png

(Erweiterte vertikale Achse) image.png

Die obige Abbildung ist

Es ist das Ergebnis von.

C ++: In Python lautet der Python-Code INF = 100. (Wenn Sie diesen Code mit PyPy3 an AtCoder senden, erhalten Sie WA) In C ++: Python (# 2) und C ++: PyPy lautet der Python-Code INF = 1000.

myoden@ubuntu002:~/AtCoder/ABC151/D$ pypy3 -V 
Python 3.6.9 (1608da62bfc7, Dec 23 2019, 10:50:04)
[PyPy 7.3.0 with GCC 7.3.1 20180303 (Red Hat 7.3.1-5)]
myoden@ubuntu002:~/AtCoder/ABC151/D$`

Der verwendete Problemfall wird später beschrieben.

** Verstrichene Ausführungszeit ** Verstrichene Ausführungszeit C ++ image.png

Verstrichene Ausführungszeit Python (INF = 100) image.png

Verstrichene Ausführungszeit PyPy (INF = 1000) image.png

Die Grafik zeigt den Maximalwert (MAX), den Durchschnittswert (AV) und den Minimalwert (MIN) der verstrichenen Zeit, als sie fünfmal durchgeführt wurde.

Beispielfall (Referenz)

Der Beispielfall, in dem die Problemgröße geändert wurde, wurde durch Ändern von H (= W) von 1 auf 20 mit H = W wie folgt erstellt.

sampleSquare-10.in


myoden@ubuntu002:~/AtCoder/ABC151/D$ cat sampleSquare-10.in 
10 10
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........
.#.#.#.#.#
..........

sampleSquare-20.in


myoden@ubuntu002:~/AtCoder/ABC151/D$ cat sampleSquare-20.in 
20 20
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
.#.#.#.#.#.#.#.#.#.#
....................
myoden@ubuntu002:~/AtCoder/ABC151/D$ 

Recommended Posts

AtCoder ABC151 Problem D Geschwindigkeitsvergleich in C ++ / Python / PyPy
ABC166 in Python A ~ C Problem
Fordern Sie AtCoder (ABC) 164 mit Python heraus! A ~ C Problem
Geschwindigkeitsvergleich von Python, Java, C ++
Atcoder ABC164 A-C in Python
Atcoder ABC167 A-D in Python
Löse ABC175 D in Python
Atcoder ABC165 A-D in Python
Atcoder ABC166 A-E in Python
AtCoder ABC 182 Python (A ~ D)
Atcoder ABC169 A-E in Python
AtCoder ABC177 A-D mit Python
Löse den Atcoder ABC176 (A, B, C, E) in Python
AtCoder ABC155 Problem D Pairs Review Note 2 NumPy und Python
Löse den Atcoder ABC169 A-D mit Python
Löse ABC036 A ~ C mit Python
AtCoder ABC 114 C-755 mit Python3 gelöst
Löse ABC037 A ~ C mit Python
AtCoder Anfängerwettbewerb 174 C Problem (Python)
[AtCoder-Kommentar] Gewinnen Sie mit Python das ABC165 C-Problem "Many Requirements"!
Lösen in Ruby, Python und Java AtCoder ABC141 D Priority Queue
Löse ABC175 A, B, C mit Python
ABC 157 D - Lösungsvorschläge für Freunde in Python!
Algorithmus in Python (ABC 146 C Dichotomie
Python-Anfänger Atcoder memo @ Keyence 2020, ABC-Problem
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
AtCoder ABC155 Problem D Pairs Review Note 1
Löse AtCoder ABC168 mit Python (A ~ D)
Löse ABC165 A, B, D mit Python
AtCoder ABC 174 Python
AtCoder ABC 175 Python
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, (C), D-Probleme von ABC165 mit Python!
[AtCoder-Erklärung] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC183 mit Python!
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B-, C- und D-Probleme von ABC181 mit Python!
Täglicher AtCoder # 36 mit Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 53 in Python
Täglicher AtCoder # 33 in Python
Täglicher AtCoder # 7 in Python
Täglicher AtCoder # 37 in Python
AtCoder # 8 jeden Tag mit Python
Täglicher AtCoder # 21 mit Python
Täglicher AtCoder # 38 in Python
Täglicher AtCoder # 11 in Python
Täglicher AtCoder # 15 in Python
Täglicher AtCoder # 47 mit Python
Täglicher AtCoder # 13 in Python
Täglicher AtCoder # 45 mit Python
AtCoder # 30 jeden Tag in Python
Täglicher AtCoder # 10 mit Python
Weiter Python in C-Sprache
Täglicher AtCoder # 28 in Python
Täglicher AtCoder # 20 in Python