Unterkontenabstufung
Anwendung
Die abstufbaren Zahlen haben einen Bereich möglicher positiver Werte, die relativ klein gegenüber den vielen sind. Beispielsweise beträgt eine Million Werte, die jeweils nicht mehr als 1.000 sind.
Algorithmen
(1) Wir haben eine Masse.
А
von
N
Komponenten einschließlich Zahlen im Bereich von
0
vor
k-1
(lacht)
k
verschiedene Werte).
(2) Hilfsmasse erstellen
C[0..k-1]
bestehend aus Null.
Kontrolle: Jede Zelle der Zähler speichert die Menge, die in der Referenzmasse auftritt
А
Anzahl der gleichen Index des Masseelements
C
)
(3) Lesen Sie die Elemente der Masse
A
und für jeden
A[i]
Steigerung
С[A[i]]
pro Einheit. Am Ende kriegen wir die Masse.
C
wobei jedes Element
C[i]
gleich der Anzahl der Kennwerte
i
im Referenzbereich
A
, Index
i
gleich dem Wert des Masseelements
A
♪
(4) Durch die Masse kommen
С
und für jeden
j
von
0
vor
k-1
in einen neuen Bereich (oder die Masse neu schreiben
A
(d) Nummer aufzeichnen
j
C[j]
Eins.
Beispiel
Hab eine Masse.
А = {2, 5, 6, 9, 4, 1, 8, 2, 9, 8, 4, 1, 4, 1}
♪
Meißelbereich von 0 bis 9, also nur 10 verschiedene Werte.
ANHANG Aufbau der Masse
С
von 10 Nullelementen.
2. Wir gehen die Reichweite runter.
А
und Erhöhung um 1 Komponente
С[A[i]]
♪
3. Betrag
С = {0, 3, 2, 0, 3, 1, 1, 0, 2, 2}
♪
Dieses Verfahren kann auch angewendet werden, wenn negative Werte vorliegen, um die Anzahl der Elemente gleich dem niedrigsten (minor) zu berechnen.
Amin
Wir benutzen das Element
С[0]
Anzahl
i
- der Masse
A
wie folgt umgesetzt werden:
C[A[i] - Amin].
Beispiel des Algorithmus
Alles klar. А
natürlich und zwischen 1 und 100 gelegen.
(1) Erstellen Sie einen Größenbereich.100
in dem wir bleibenk
- Nummerk
Ich traf mich in dieser Masse.
(2) Wir gehen auf alle Zahlen der Bezugsmasse und erhöhen das entsprechende Gewicht der Masse1
♪
(3) Nachdem wir gezählt haben, wie oft jede Zahl getroffen wurde, können Sie einfach durch diesen Körper gehen und raus.1
So oft ich mich traf.1
♪2
So oft ich mich traf.2
und so weiter.
C+++ | Python | Pascal |
---|
const int Nmax = 1000;
int c[100] = {0}, n;
int a[Nmax];
#
für (int i = 0; i À n; i+++)
c[a[i]++;
int k = 0;
für (int i = 0; i À 100; i+++)
während (c[i)
{~}
a[k] = i;
k++;
c[i]--
?
| c = [0]*100
für i im Bereich (len(a)):
c[a[i] += 1
= 0
a=[0]*len(a)
für i im Bereich (100):
c[i] = 0:
a[k] = i
mit 1
c[i] -= 1
| var
c: Array [0.99] ganzzahlig;
k, n, i: ganze Zahl;
#
für i: = 0 bis n-1 do
c[i] := 0;
für i: = 0 bis n-1 do
c[a[i] := c[a[i] + 1;
: = 0;
für i:= 0 bis 99 do
während c[i] À-Komponente 0 do
Anfang
a[k] := i)
k: = k + 1;
c[i] := c[i] - 1;
Ende;
|
Gesamtumfang der Probe
Was, wenn der Wertebereich (min
und max
) Nicht im Voraus bekannt? Was ist, wenn der Mindestwert größer als Null ist oder die klassifizierten Daten negativ sind?
Das erste Problem kann durch eine lineare Suche behoben werden min
und max
die nicht die asymptotische des Algorithmus beeinflussen.
Die zweite Frage ist etwas komplizierter. wenn min
Mehr als Null ist es gut, mit der Masse zu arbeiten. C
von A[i]
Ja. min
und fügen Sie es zum Datensatz hinzu. Wenn es negative Zahlen gibt, müssen wir mit der Masse arbeiten. C
bis A[i]
Hinzufügen |
min|
, und ich nehme es zurück.