Schneller Hash-Algorithmus zum Mapping / Quantisieren einer Sammlung von Schwimmern auf einen kleinen Satz sortierter Floats

cs.stackexchange https://cs.stackexchange.com/questions/128376

  •  29-09-2020
  •  | 
  •  

Frage

Mit meiner Anwendung habe ich

    .
  • collection x: Tausende Floating-Punkt-Nummern mit dem Wertbereich [0, 1], nicht sortiert.
  • Sammlung y: 11 Floats reichen von [0, 1], sortiert.
  • Die Größe von x ist bekannt. Lass es l.

Das Ziel ist es, x zu quantifizieren und auf y zu karten, damit wir ein Hash-Array von Indizes von Y für X erhalten. Irgendwann wird y dann auf 10 diskreten Dinge quantisiert, auf die darauf hingewiesen wird.

ein Beispiel, um es ein bisschen klarer zu machen,

    .
  • Y = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
  • X = [0.678, 0.124, ..., 1.0, ., 0.013, 0.475]

Ich möchte, dass der Algorithmus-Ausgang 0-basierte Indizes wie diese ist:

    .
  • H(Y[0]) = H(0.678) = 6
  • H(Y[1]) = H(0.124) = 1
  • H(Y[n-2]) = H(0.013) = 0
  • H(Y[n-1]) = H(0.475) = 4

Versuche

naiv, habe ich linear und binärsucht, um jedes Element von x in y so zu positionieren, dass das Element zwischen einem benachbarten Paar von Elementen in y findet.

Die Leistung ist jedoch nicht gut genug für meine Anwendung. Diese Quantisierung erfolgt in einem Echtzeitfaden, dass langsame Berechnung unerwünscht ist.

Frage

Was ist der beste Weg dieser Art von Hashing / Quantisierung? X ist nicht sortiert.

danke!

War es hilfreich?

Lösung

Nehmen Sie x, multipliziert mit 10.000, auf die nächstgelegene Ganzzahl abgerundet. In einfach c, z= (int) (x mal 10000.0).

Es gibt 10.000 mögliche Werte von z. Für die meisten Werte von Z können Sie den Index von z ermitteln. Erstellen Sie also einen Tisch mit 10.000 Einträgen. Speichern Sie in der Tabelle einen Index i, wenn Sie beweisen können, dass x, dass X I abgebildet werden sollte, um z zu kennzeichnen, und speichern -1, wenn Sie dies nicht beweisen können.

Infolgedessen erhalten Sie den richtigen Wert wahrscheinlich in 9.980 von 10.000 Werten, und dann verwenden Sie einen langsamen Algorithmus, den Sie für die verbleibenden 1 in 500 Werten haben.

ps. Die gleiche Tabellengröße würde für doppelte Präzisionsnummern verwendet. Was auch immer die Tabellengröße ist, gibt es nur wenige Werte X, die mit dieser Methode, möglicherweise 10 oder 20 nicht korrekt zugeordnet werden können. Wenn Sie einen Tisch von 10.000 annehmen, werden 99,8% oder 99,9% ordnungsgemäß zugeordnet, und 0,1% oder 0,2% brauche einen langsamen Algorithmus. Das genaue Gleiche passiert mit doppeltem. Sie können 1000 Einträge verwenden, dann wären die 10- oder 20-fehlgeschlagenen 1% oder 2%.

und eine nette Sache ist, dass diese Methode funktioniert, jedoch werden die y-Werte verteilt. Nur wenn die Anzahl der y-Werte größer ist, möchten Sie möglicherweise die Tabellengröße erhöhen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top