int[] eindeutig durch eine Zahl repräsentieren

Status
Nicht offen für weitere Antworten.
N

Nico(Gast)

Gast
Hallo,

ich muss in meinem Programm int[] der selben Länge und von gleichem Inhalt vergleichen. Dabei kommt es auf die Reihenfolge der Zahlen an. Meine Arrays sind dabei bis zu mehreren tausend Zahlen groß, und müssen ziemlich oft verglichen werden. Daher schließt sich auf Grund der Laufzeit ein "eins zu eins" Vergleich aus.
Meine Frage ist nun, lässt sich eine eindeutige (oder zumindest hinreichend eindeutig) Zahl berechnen, sodass ich auf Grund der Zahl ausschließen kann, dass zwei Arrays genau die selbe Form haben? Es kann dabei durchaus vorkommen, dass die Arrays bis auf wenige Stellen genau gleich sind.

Anwendung:
Ich habe eine Liste von Arrays, die schon einmal betrachtet wurden. Nun wird ein neuer Array erstellt. Dieser soll mit allen Arrays der immer größer werdenden Liste verglichen werden und nur wenn die Zahlen in der vorliegenden Reihenfolge so noch nie betrachtet wurden, soll der Array weiter verarbeitet werden.

Bisher verwende ich die folgende Formel um einen Vergleichswert zu erhalten:

Code:
double value =0;
for (int i = 0; i < array.length; i++) {
	value += Math.sqrt(((i+1)*array[i]))/Math.sqrt(array.length);
}

wobei ich nicht sicher bin ob die so berechnete Zahl durch die Rundung zumindest annähernd eindeutig ist. Die Wurzel und der Bruch sind notwendig um die Zahl nicht zu groß werden zu lassen.

Ich hoffe jemand hat eine Idee, wie man das besser machen kann.

Gruß Nico
 
G

Gast

Gast
wie wird denn das neue array erstellt? wenn da werte nacheinander reinkommen, könnte man ja bei jedem insert, prüfen, ob an der gleichen Stelle in anderem array auch diese zahl steht.
 
S

SlaterB

Gast
zunächst mal ist eine eindeutige Abbildung nicht möglich,
selbst wenn pro Array-Feld nur Zahlen von 0-9 zugelassen sind,
sind 1000-Felder lange Arrays entsprechend 1000stellige Zahlen,
während ein int gerade mal 10stellig ist oder so,

bei gleichverteilten Werten haben also mindestens 100 Arrays den gleichen int-Wert, den gleichen Hash,

das ist aber nicht so schlimm, das sollte bei einer guten Hash-Funktion eh nur passieren, wenn du bereits Millionen und Millarden dieser großen Arrays hast,
abgesehen davon dass so viele gar nicht in den Speicher passen, wäre es dann ja schon recht tröstlich, dass man nur noch 100 Arrays intensiver vergleichen muss statt alle

-----

die Hashfunktion sollte möglichst einfach sein, verwende Bitoperationen wie <<,
adde jeden array-Wert und shifte dann den value (falls er int oder long ist) << 1 (entspricht * 2) oder ähnlich,

die Hashfunktion von String ist so ähnlich, denn ein String ist ja auch nur ein langes Array von chars, praktisch ein langes Array von ints

Code:
    /**
     * Returns a hash code for this string. The hash code for a
     * <code>String</code> object is computed as
     * <blockquote><pre>
     * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
     * </pre></blockquote>
     * using <code>int</code> arithmetic, where <code>s[i]</code> is the
     * [i]i[/i]th character of the string, <code>n</code> is the length of
     * the string, and <code>^</code> indicates exponentiation.
     * (The hash value of the empty string is zero.)
     *
     * @return  a hash code value for this object.
     */
    public int hashCode() {
	int h = hash;
	if (h == 0) {
	    int off = offset;
	    char val[] = value;
	    int len = count;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }

allgemein kannst du dich ja über 'Hashfunktionen' schlau machen

-------

die Wurzel ist in jedem Fall eher schlecht, dauert zu lange,
wenn überhaupt, dann musst du ja zumindest nicht den immer gleichen Wert Math.sqrt(array.length);
in jedem Schleifendurchlauf neu berechnen
 
N

Nico(Gast)

Gast
@Gast
Das wüde ja wieder bedeuten dass ich in allen Arrays alle Stellen anschauen muss...

@SlaterB
ich habe vergessen zu erwähnen, dass jede Zahl im Array 100% nur einmal vorkommt und im Array dann Zahlen im 4- bis 5-stelligen Bereich stehen können.

Habe ich bei deinem Vorschlag dann nicht das Problem, dass die Vergleichszahl viel zu groß werden würde?
 

FArt

Top Contributor
Lange Rede kurzer Sinn: ein Hash (wie von SlaterB vorgeschlagen) ist die Lösung. Nur bei gleichen Hashwerten muss voll verglichen werden, das ist aber nicht tragisch, weil das sehr selten vorkommen wird (bei der Wahl eines geeignetetn Hashalgorithmus, der z.B. auch Zahlendreher berücksichtigt).

Google hilft weiter.
 
S

SlaterB

Gast
> Habe ich bei deinem Vorschlag dann nicht das Problem, dass die Vergleichszahl viel zu groß werden würde?

die Rechnung erfolgt (automatisch) quasi Modulo MAX_VALUE

wenn der MaxWert von int 1000 wäre und du 901*411 = 370.311 rechnest, dann kommt am Ende 311 raus,
ganz so ist es nicht, es werden eher die führenden Bits abgeschnitten so dass auch negative Werte herauskommen können, aber das nur als grobe Vorstellung
 
N

Nico(Gast)

Gast
Noch eine Frage zum Abschluss:
Bei zunehmender Dauer werden sich die Arrays immer ähnlicher, nimmt dann die Wahrscheinlichkeit einen gleichen Hashwert zu bekommen ebenfalls zu, oder ist das unabhängig davon wieviele Stellen verschieden sind?

Ansonsten danke für die schnellen und hilfreichen Antworten. Werde mich dann mal nach einer geeigneten Hashfunktion umschauen.
 
S

SlaterB

Gast
das kommt ganz auf die jeweilige Implementierung der Hashfunktion an,
die genau aufgrund solcher Fragen teilweise individuell angelegt wird,

grundsätzlich kann man aber davon ausgehen, dass ein Standard wie das von Landei vorgeschlagene Arrays.hashCode() (so ähnlichh wie von String oben gepostet)
ausreichend ist und gerade dafür sorgt, dass geringe Ähnlichkeinen sofort zu großen Hashcode-Unterschieden führen,

normalerweise sind die Hashes von Elementen gleich, von denen man es am allerwenigsten erwartet,
ein gewisser Zufall/ Streuung läßt sich bei ganz einfachen und damit schnellen Hashfunktionen aber auch nicht ausschließen,

was rede ich eigentlich die ganze Zeit?
du sollst doch bei google alles nachschlagen ;)
(edit: genau, FArt)
 
T

tuxedo

Gast
Also ich mache ähnliches bei meinem "dirty rectangle detection" für ein selbstgeschriebenes ScreenScraping.

Ich mache einen Screenshot und teile den in Blöcke ein. Der wird zuerst komplett übertragen.
Dann mach ich wieder einen Screenshot und teile den wieder in Blöcke ein. Aber um nicht nichtmal alles komplett zu übertragen, vergleiche ich die einzelnen Blöcke des ersten und zweiten Screenshots.

Da ist das Pixelweise vergleichen der Blöcke bei mir doppelt so schnell wie wenn ich von von beiden Blöcken den HashCode bilde und diesen dann vergleiche.

Allerdings bricht der Pixelvergleich schon dann ab, wenn ein erster Pixelunterschied zwischen den Blöcken gefunden wurde. Im Worst-Case ist das beim lettzten Pixel des Blocks, im BestCase beim ersten Pixel.

Vielleicht ist deshalb bei mir das Pixelweise vergleichen im Endeffekt schneller.

Man sollte also wirklich schauen mit was man besser fährt ...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R MAC-Adresse eindeutig für einen PC ? Bezug zu Netzwerk, wieso ? Allgemeine Java-Themen 7
G treepath eindeutig Allgemeine Java-Themen 3
T Objekte eindeutig zerlegen und wieder zusammen bauen? Allgemeine Java-Themen 6
M VM eindeutig identifizieren Allgemeine Java-Themen 4
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
H Dienst durch ssh forwarding absichern? Allgemeine Java-Themen 15
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
M Kein Scanner Fehler durch falsche EIngabe Allgemeine Java-Themen 4
P Karate API Test läuft nicht durch . initializationError Allgemeine Java-Themen 21
Y Wie bekomme ich durch getImage an das Image heran? Allgemeine Java-Themen 1
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
W Java Telegram Bot - Eingabe durch User Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
I Buchstabe durch seinen Nachfolger ersetzen Allgemeine Java-Themen 29
M Jdeps-Error durch multi-release Allgemeine Java-Themen 6
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
C OpenCl Setup und durch JavaCode ansteuern Allgemeine Java-Themen 17
J Erste Schritte Datenspeicherung durch Java Allgemeine Java-Themen 6
M Hässliche Schrift auf Graphics durch deriveFont Allgemeine Java-Themen 0
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Aruetiise Interface Position durch JButton ermitteln Allgemeine Java-Themen 5
K Jar/DLL Abhängigkeiten durch User angeben lassen Allgemeine Java-Themen 6
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
R Rückgabe eines Arrays durch Funktion Allgemeine Java-Themen 9
T AWT AWT-EventQueue-0 Null_Pointer_Exception durch Variable Allgemeine Java-Themen 12
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
C Durch klicken von Button in GUI wird leeres Fenster geöffnet und nicht mein Spiel "Memory" Allgemeine Java-Themen 13
T Quadrieren einer Zahl nur durch Addition Allgemeine Java-Themen 5
L Vererbung If-Else ersetzen durch was? Allgemeine Java-Themen 20
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
I CountDown wird durch JOptionPane unterbrochen Allgemeine Java-Themen 11
F JTable mit Zellen die sich durch andere Eingaben füllen Allgemeine Java-Themen 1
B Counting Sort (Sortieren durch Zählen) Allgemeine Java-Themen 13
Z Durch Bäume iterieren Allgemeine Java-Themen 3
M Unterbrechnung durch Echtzeitbefehle? Allgemeine Java-Themen 4
G Suchweg durch Binärbaum speichern Allgemeine Java-Themen 4
L Label- & Textfelderzeugung durch Button Allgemeine Java-Themen 1
S RandomAccessFile durch bytearrayinputstream ersetzen Allgemeine Java-Themen 4
H Java Leistungssteigerung durch Code Anpassung Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
S JTable: Model durch ein anderes ersetzen Allgemeine Java-Themen 2
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
T Code durch eigenes Frame pausieren (ähnlich JDialog) Allgemeine Java-Themen 4
F Live Ticker durch Screenshots Allgemeine Java-Themen 22
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
N Algorithmus durch Workflow Allgemeine Java-Themen 7
R Windows-Firewall lässt Java nicht durch Allgemeine Java-Themen 17
E Oracle kann durch 0 teilen !?! Allgemeine Java-Themen 7
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
J Java Datei durch Java Datei öffnen Allgemeine Java-Themen 16
M Arraynamen durch Variable festlegen lassen Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
F Slash durch Systembezogenen Fileseparator ersetzen Allgemeine Java-Themen 18
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
D Updaten von Klassen durch jar.exe zerstört diese. Update durch WinRAR gelingt! Allgemeine Java-Themen 2
A SWT Ausgabetext Shellscript durch Java Allgemeine Java-Themen 8
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
K Objekt einer konkreten Implementierung eines Interfaces durch übergebenen String Allgemeine Java-Themen 2
fastjack Hardwareinformationen durch Java auslesen Allgemeine Java-Themen 7
S durch Code steppen Allgemeine Java-Themen 7
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
C Markierung durch Maus lesen Allgemeine Java-Themen 9
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
N Scanner läuft nicht durch Allgemeine Java-Themen 2
F kamera auslösen durch Programm Allgemeine Java-Themen 17
M Maus durch JavaProgramm bewegen Allgemeine Java-Themen 2
Dissi Itext - Anordnung von Elementen durch PDF Writer Allgemeine Java-Themen 2
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
H Performancegewinn durch Mehrfachobjeknutzung Allgemeine Java-Themen 3
N Fehler abfang läuft doppelt durch Allgemeine Java-Themen 2
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
S Testen einer Anwendung durch klicken von Koordinaten Allgemeine Java-Themen 7
GilbertGrape Durch JDK debuggen Allgemeine Java-Themen 2
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Schleife durch Button beenden Allgemeine Java-Themen 6
royale Breitendurchlauf / Dijkstra durch Graph, vereinfacht Allgemeine Java-Themen 3
Hawkes Beschädigte Tarballs durch JavaTar Allgemeine Java-Themen 2
X Status Anzeige-durch Thread? Allgemeine Java-Themen 15
4 ich steige einfach nicht durch Allgemeine Java-Themen 5
P Thread Demonstrationr eist durch die Zeit Allgemeine Java-Themen 4
D erstellung einer seitenlangen xml durch ireport Allgemeine Java-Themen 3
R Jar-File vom Linux Desktop durch ancklicken starten? Allgemeine Java-Themen 5
M Java Programm durch Datei Öffnen Allgemeine Java-Themen 6
J IOException durch BufferedWriter.flush() ? Allgemeine Java-Themen 5
J Name eines Strings durch einen String festlegbar? Allgemeine Java-Themen 2
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
J Zweidimensionales Array durch ZwischenArray ersetzen Allgemeine Java-Themen 3
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
J Chars in einem String durch "nichts" ersetzen Allgemeine Java-Themen 3
C Dateien auf Festplatte speichern durch "Durchsuchen-But Allgemeine Java-Themen 3
B VK_? << durch char rausbekommen Allgemeine Java-Themen 8
K Programm durch Tastendruck beenden Allgemeine Java-Themen 4
H Programmerweiterung durch Datei die Funktionen enthält Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben