Warum willst du die Arbeit doppelt machen :=) ???
Schau mal:
Delphi-Quellcode:
Result := 0;
for I := 0 to High(ErstesArray) do
if Count[ErstesArray[I]] > 1 then
Inc(Result);
Beim zusammenzählen der mehrfachen Werte wird doch implizit schon > 1 überprüft.
Es gibt aber auch andere Möglichkeiten dieses Problem sehr effizient (zeitlich, nicht speichermäßig) hinzubekommen. Dabei wird nur Length(ZweitesArray) an Durchläufen nötig. Also angenommen der Zahlenbereich geht von 0 bis 65535. Wir bauen nun einen Binären Datenbaum auf und sortieren einfach linear erstmal die Zahlen aus dem Vergleichsarray dort ein. Jede Zahl wird in diesem Baum als Wert + Anzahl gespeichert. Nun gehen wir Element für Element im zweiten Array durch und suchen wiederum in unserem Binären Baum die entsprechende Zahl. Falls vorhanden erhöhen wir die Anzahl dieser Node. Nun nehmen wir an das maximal 2^16 Zahlen vorkommen, dann benötigen wir im Suchbau maximal 16 Vergleiche um eine Zahl zu finden (Worstcase). Wir haben ein Array[] mit 2^16 Elementen das ergibt 16 * 2^16 Vergleichsoperatonenund eine Schleife mit 2^16 Durchläufen.
Bei meiner Methode benötigte man viel zu viel Speicher, aber man brüchte theoretisch dann 2^16 + x Vergleiche. Bei Deiner Methode 2^16 * x Vergleicheund beim binären Baum 2^16 * 16 maximal. Damit errechnet sich sehr leicht der Breakeven Point zwischen deiner Methode und einem binären Baum > 16 muß die Anzahl des Vergleichsarrays sein. Angenommen im Vergleichsarray sind 256 Zahlen = 2^8, dann benötigt deine methode 2^16 * 2^8 = 16.777.216 Vergleiche, und der binäre Suchbaum 2^16 * 8 = 524.288 Vergleiche.
Der Vorteil des Baumes liegt nun darin das er unabhängig von der Anzhal der Elementeim Vergleichsarray ist. Er speichert nur die Zahlen die gesucht werden sollen. Dazu benötigt man 2 Zeiger auf Linke/Rechte Node + 1 Integer als Zahlenwert + 1 Integer als Anzahl. Der Speicherverbrauch ist also bei weitem geringer als bei meiner Methode.
Diese Methode funktioniert auch einfach mit einer sortierten Liste von Zahlen. Dort nennt man sie binäre Suche. Dabei hätte man das Vergleichsarray[] erstmal aufsteigend sortiert. Dann noch ein AnzahlArray[] parallel zum Vergleichsarray[]. Nun geht man das Datenarray[] sequentiell durch und sucht per binärer Suche im VergleichsArray[]. Nach Ln2(Length(VergleichsArray[])) findet man die passende Zahl im Array[]. Also bei 2^16 Elementen im Array[] findet man nach spätestens 16 Vergleichen die Zahl.
Gruß Hagen