Ähnlichste Element von array a in array b finden

EmmaL

Grünschnabel
Meine Aufgabe ist von zwei beliebige unsortierte arrays, für jedes element von array a den Index des ähnlichsten Elements in b zu finden und in ein array auszugeben. Mit ähnlichkeit ist kleinste absolute Differenz gemeint.
Das ist der Code für mein Funktion bis jetzt:

C:
Array closest(Array a, Array b) { 
    double smallestDiff = fabs(get(double, a, 0) - get(double, b, 0));
    for (int i = 1; i < a_length(a); i++) {
        for (int j = 1; j < a_length(b); j++) {
            double currentDiff = fabs (get(double, a, i) - get(double, b, j));
            if (currentDiff < smallestDiff) {
                smallestDiff = currentDiff;
            }
        }
    } printiln(i);
}

Ist das richtig und wie erstelle ich die array mit Indizies?
P.s: Funktionen wie get(double, a, 0) sind das gleiche wie a[0]. Die sind in ein Library für Arrays definiert.
Vielen Dank im Voraus.
 
Ist das richtig und wie erstelle ich die array mit Indizies?
Ein Array ist per Definitionem eine Random Access-Datenstruktur, du hast also immer einen Array mit Indizes. Wir müssten deine Library kennen, um zu wissen, wie genau sie funktioniert, aber get() scheint ja schon einen Indexparameter zu haben. Also n-tes Element hat Index n-1 (a[0] ist erstes Element).
Generell gibt es malloc() (oder für arrays einfacher: calloc()), womit du dynamisch Arrays erstellen kannst - aber Aufräumen (free()) nicht vergessen!

Entsprechend solltest du in den Loops wohl bei 0 beginnen (Ausser, deine Library macht das anders).

Zum Finden des ähnlichsten Elements: Wahrscheinlich ist es am einfachsten, wenn du einen Array sortierst und dann durch den anderen durchgehst und mittels binärer Suche o.ä. die passendsten Elemente findest - der naive Algorithmus, der einfach durch alle Werte durchgeht, ist ja viel zu ineffizient.
Bei a Elementen in Array A und b Elementen in Array B bräuchtest du damit O(a^b) Iterationen (für jedes Element in B musst du durch alle in A durch, also schaust du die Elemente der einen Menge mehrfach an). Mit dem vorgeschlagenen Ansatz bräuchtest du noch O(a*log(a) + b*log(a)) = O(log(a)*(a+b)) Iterationen.

Gruss
cwriter
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück