Wie finde ich die minimale Beschreibung für ein Array?

7

Das folgende Array belegt 10000 Speicherplätze:

a = [0,1,2,3,4,5,6,7,8,9,10,...,10000]

Aber man könnte leicht das gleiche Array darstellen wie:

a = {len:10000, get: λ idx -> idx}

Welches ist viel kompakter. Ebenso gibt es mehrere Arrays, die kompakt dargestellt werden können:

a = {a:1000, get: λ idx -> idx * 2}
Is a description for [0,2,4,6,8,10,...,2000]

a = {a:1000, get λ idx -> idx ^ 2}
Is a description for [0,1,2,4,9,...1000000]

And so on...

Wenn so viele Arrays auf viel kürzere Weise dargestellt werden können als jedes Element im Speicher, frage ich:

  1. Gibt es einen Namen für dieses Phänomen?
  2. Gibt es eine Möglichkeit, die minimale Darstellung für ein bestimmtes Array zu finden?
  3. Dies hängt wahrscheinlich von der Beschreibungssprache ab (in diesem Fall habe ich eine imaginäre Programmiersprache mit Funktionen, Objekten und mathematischen Operatoren verwendet). Gibt es eine bestimmte Sprache, die optimal ist, um eine solche minimale Beschreibung für Objekte zu finden?
Viclib
quelle

Antworten:

9

Das Phänomen, das Sie beschreiben, ist die Komplexität von Kolmogorov . Wenn Sie eine Programmiersprache (oder formeller eine Codierung von Turing-Maschinen) festlegen, ist die Kolmogorov-Komplexität eines Strings  im Wesentlichen  die Länge des kürzesten Programms, das ausgibt,  wenn es ohne Eingabe gestartet wird. Es stellt sich heraus, dass es im Rahmen der Vernunft keine Rolle spielt, welche Programmiersprache Sie verwenden, da die Verwendung einer anderen Sprache höchstens einen konstanten additiven Unterschied zu K(s)ssK(s). Wenn Sie die Kolmogorov-Komplexität in Bezug auf eine Whacko-Sprache definieren möchten, kann ich diese Sprache nur verwenden, um einen Interpreter für eine vernünftige Sprache zu schreiben, sodass die Kolmogorov-Komplexität eines Strings in Bezug auf Ihre Sprache nicht schlechter sein kann als die Komplexität in meiner Sprache plus den festen, konstanten Overhead des Dolmetschers.

Wie alle interessanten Eigenschaften von Turing-Maschinen ist die Kolmogorov-Komplexität einer Saite unentscheidbar. Dies hindert es jedoch nicht daran, ein nützliches Konzept zu sein, und es wurde viel zu diesem Thema geforscht.

David Richerby
quelle
4

Wenn Sie dies von einem praktischen POV aus betrachten, können Sie es Datenkomprimierung nennen. Dies ist im Grunde das, was Datenkomprimierungsalgorithmen tun: Sie definieren eine Sprache und versuchen dann, den angegebenen Datensatz in dieser Sprache darzustellen. Aber selbst für eine sehr einfache Sprache ist es sehr schwierig, die optimale Darstellung in dieser Sprache zu finden. Nehmen wir zum Beispiel Deflate , obwohl es sehr einfach ist, gibt es immer noch aktive Forschung, wie man es optimal anwendet.

Pentadecagon
quelle