Größter gemeinsamer Teiler in R

Gepostet: , Zuletzt aktualisiert:

gcd <- function (a,b) {
  #' Recursive implementation to find the gcd (greatest common divisor) of two integers using the euclidean algorithm.
  #' For more than two numbers, e.g. three, you can box it like this: gcd(a,gcd(b,greatest_common_divisor.c)) etc.
  #' This runs in O(log(n)) where n is the maximum of a and b.
  #' @param a the first integer
  #' @param b the second integer
  #' @return the greatest common divisor (gcd) of the two integers.
  print(sprintf("New *a* is %s, new *b* is %s",a,b))
  if(b == 0){
    print(sprintf("b is 0, stopping recursion, a is the gcd: %s", a))
    return (a)
  }
  print(sprintf("Recursing with new a = b and new b = a %% b..."))
  gcd(b, a %% b)
}

print(gcd(10,20))

Über den Algorithmus und die Programmiersprache in diesem Snippet:

Euklid's größter gemeinsamer Teiler (GGT) Algorithm

Der größte gemeinsame Teiler zweier Zahlen (in diesem Fall a und b) ist die größte Zahl, durch die beide Zahlen ohne Rest geteilt werden können. Dieser größte gemeinsame Divisor (Teiler)-Algorithmus, der als euklidischer Algorithmus bezeichnet wird, bestimmt diese Zahl. Der größte gemeinsame Teiler wird auch oft als gcd abgekürzt.

Beschreibung des Algorithmus

Das Grundprinzip hinter diesem gcd-Algorithmus besteht darin, den gcd von a und b rekursiv zu bestimmen, indem der gcd von b und a%b bestimmt wird Dies hängt von der Tatsache ab, dass der gcd von zwei Zahlen auch ihre Differenz teilt, z. Der größte gemeinsame Teiler von 16 und 24 (das ist 8) ist auch der größte gemeinsame Teiler von 24-16=8. Dies gilt daher auch für 16 und 40 - anstatt die Differenz zu nehmen, kann der Rest auch verwendet werden (ein wiederholtes Wiederkehren der Differenz führt zwangsläufig dazu, dass der Rest “bestanden” wird). Zusammenfassend verwendet der euklidische gcd-Algorithmus diese beiden Schritte:

  1. Wenn a oder b 0 ist, geben Sie den anderen zurück.
  2. Wiederholen Sie dies mit dem neuen a als b und dem neuen b als a%b.

Die Verwendung des Restes hat eine viel schnellere Laufzeit als die Verwendung des Unterschieds.

Beispiel des Algorithmus

Bei der Berechnung der GCD von 1071 und 462 werden die folgenden Schritte ausgeführt:

  1. a ist 1071, neu b ist 462
  2. Rekursiv mit neuem a = b und neuem b = a% b …
  3. Neu a ist 462, neu b ist 147
  4. Rekursiv mit neuem a = b und neuem b = a% b …
  5. Neu a ist 147, neu b ist 21
  6. Rekursiv mit neuem a = b und neuem b = a% b …
  7. Neu a ist 21, neu b ist 0
  8. b ist 0, Stopp der Rekursion, a ist die gcd: 21

Laufzeitkomplexität des Algorithmus

Die Laufzeitkomplexität des euklidischen größten gemeinsamen Divisor-Algorithmus ist O(log (max (a, b))) (der Logarithmus des Maximums der beiden Zahlen). Die Verwendung des Restes anstelle des Unterschieds ist erheblich schneller - wenn der Unterschied verwendet worden wäre, hätte dieser größte gemeinsame Divisor-Algorithmus eine Laufzeit von O(max (a, b)) gehabt

Speicherkomplexität des Algorithmus

Die Speicherkomplexität des größten gemeinsamen Divisor-Algorithmus der Euklidischen Welt entspricht der Laufzeit, da jeder rekursive Aufruf im Stapel gespeichert wird und alles andere konstant ist.

R

The R Logo

R ist eine interpretierte Sprache, die erstmals 1993 veröffentlicht wurde und in den letzten Jahren erheblich an Popularität gewonnen hat. Es wird hauptsächlich für Data Mining und -science sowie für Statistiken verwendet und ist eine beliebte Sprache in Disziplinen außerhalb der Informatik, die von Biologie bis Physik reichen. R ist dynamisch typisiert und verfügt über eine der vielfältigsten Bibliotheken für Statistik, maschinelles Lernen, Data Mining usw.

<! - Ende des Auszugs ->

Anreise zu “Hello World” in R.

Das Wichtigste zuerst - hier erfahren Sie, wie Sie Ihre erste Codezeile in R ausführen können.

  1. Laden Sie die neueste Version von R von r-project.org herunter und installieren Sie sie. Sie können auch eine frühere Version herunterladen, wenn Ihr Anwendungsfall dies erfordert.
  2. Öffnen Sie ein Terminal, stellen Sie sicher, dass der Befehl R funktioniert und dass der Befehl, den Sie verwenden werden, sich auf die Version bezieht, die Sie gerade installiert haben, indem SieR --version ausführen. Wenn der Fehler “Befehl nicht gefunden” (oder ähnlich) angezeigt wird, starten Sie die Befehlszeile und, falls dies nicht hilft, Ihren Computer neu. Wenn das Problem weiterhin besteht, finden Sie hier einige hilfreiche Fragen zu StackOverflow für Windows, Mac und Linux .
  3. Sobald dies funktioniert, können Sie das folgende Snippet ausführen: print (" Hello World "). Sie haben zwei Möglichkeiten, dies auszuführen: 3.1 Führen Sie “R” in der Befehlszeile aus, fügen Sie einfach das Code-Snippet ein und drücken Sie die Eingabetaste (Drücken Sie “STRG + D” und geben Sie “n” gefolgt von der Eingabetaste ein, um das Menü zu verlassen). 3.2 Speichern Sie das Snippet in einer Datei und nennen Sie es etwas, das mit “.R” endet, z. hello_world.R und führen SieRscript hello_world.R aus. Tipp: Verwenden Sie den Befehl ls (dir in Windows), um herauszufinden, welche Dateien sich in dem Ordner befinden, in dem sich Ihre Befehlszeile gerade befindet.

Das ist es! Beachten Sie, dass das Drucken von etwas auf die Konsole nur eine einzige Zeile in R ist - diese niedrige Eintrittsbarriere und das Fehlen des erforderlichen Boilerplate-Codes machen einen großen Teil der Attraktivität von R aus.

Grundlagen in R.

Um in R implementierte Algorithmen und Technologien zu verstehen, muss man zunächst verstehen, wie grundlegende Programmierkonzepte in dieser bestimmten Sprache aussehen.

Variablen und Arithmetik

Variablen in R sind wirklich einfach. Sie müssen weder einen Datentyp deklarieren noch deklarieren, dass Sie eine Variable definieren. R weiß das implizit. R ist auch in der Lage, Objekte und ihre Eigenschaften auf verschiedene Arten einfach zu definieren.

some_value = 10
my_object <- list(my_value = 4)
attr(my_object, 'other_value') <- 3

print((some_value + my_object$my_value + attr(my_object, 'other_value'))) # Prints 17

Arrays

Das Arbeiten mit Arrays ist in R ähnlich einfach:

# Create 2 vectors of length 3
vector1 <- c(1,2,3)
vector2 <- c(4,5,6)

# Create names for rows and columns (optional)
column.names <- c("column_1","column_2","column_3")
row.names <- c("row_1","row_2")

# Concatenate the vectors (as rows) to form an array, providing dimensions and row/column names
result <- array(c(vector1,vector2), dim = c(2,3), dimnames = list(row.names, column.names))

print(result)
# Prints:
#       column_1 column_2 column_3
# row_1        1        3        5
# row_2        2        4        6

Wie diejenigen unter Ihnen, die mit anderen Programmiersprachen wie Java vertraut sind, möglicherweise bereits bemerkt haben, handelt es sich nicht um native Arrays, sondern um Listen, die wie Arrays gekleidet sind. Dies bedeutet, dass Arrays in R erheblich langsamer sind als in Programmiersprachen niedrigerer Ebene. Dies ist ein Kompromiss, den R zugunsten der Einfachheit eingeht. Es gibt jedoch Pakete, die echte Arrays implementieren, die erheblich schneller sind.

Bedingungen

Wie die meisten Programmiersprachen kann R “if-else” -Anweisungen ausführen:

value = 1
if(value==1){
   print("Value is 1")
} else if(value==2){
     print("Value is 2")
} else {
     print("Value is something else")
}

R kann auch switch-Anweisungen ausführen, obwohl sie im Gegensatz zu anderen Sprachen wie Java als Funktion implementiert sind:

x <- switch(
   1,
   "Value is 1",
   "Value is 2",
   "Value is 3"
)

print(x)

Beachten Sie, dass diese Funktion ziemlich nutzlos ist, es jedoch andere Funktionen für komplexere Anwendungsfälle gibt.

Schleifen

R unterstützt sowohl for- als auch while-Schleifen sowie break- und next-Anweisungen (vergleichbar mit continue in anderen Sprachen). Zusätzlich unterstützt R “Wiederholungsschleifen”, die mit “while (true)” - Schleifen in anderen Sprachen vergleichbar sind, aber den Code ein wenig vereinfachen.

value <- 0
repeat {
  value <- value + 1
  if(value > 10) {
    break
  }
}
print(value)

value <- 0
while (value <= 10) {
  value = value + 1
}
print(value)

value <- c("Hello","World","!")
for ( i in value) {
  print(i)
}

for(i in 1:10){
  print(i)
}

Funktionen

Funktionen in R sind einfach zu definieren und erfordern zum Guten oder Schlechten keine Angabe von Rückgabe- oder Argumenttypen. Optional kann ein Standardwert für Argumente angegeben werden:

my_func <- function (
  a = "World"
) {
  print(a)
  return("!")
}

my_func("Hello")
print(my_func())

(Dies druckt “Hallo”, “Welt” und dann ”!“)

Syntax

R erfordert die Verwendung von geschweiften Klammern ({}), um Codeblöcke in Bedingungen, Schleifen, Funktionen usw.; Dies kann zwar zu lästigen Syntaxfehlern führen, bedeutet jedoch auch, dass die Verwendung von Leerzeichen für die bevorzugte Formatierung (z. B. Einrücken von Codeteilen) den Code nicht beeinflusst.

Fortgeschrittenes Wissen in R

Für weitere Informationen hat R einen großartigen Artikel Wikipedia. Die offizielle Website ist r-project.org.