2017-02-16 4 views
0

Ich versuche die am meisten wiederholte Int-Nummer meines Vektors zu finden. Hier ist mein Code ...Wie findet man den am häufigsten wiederholten Wert in einem Array?

for(i=0; i < dim; i++){ 
     temp=vet[i]; 
    for(i=0; i < dim; i++){ 
     if(vet[i]==temp){ 
      count++; 
     } 
    } 
    if(most < count){ 
     most=count; 
     elem=vet[i]; 
    } 
} 
return elem;} 

Es ist nicht richtig .. Ich hoffe, Ihr könnt mir helfen .. Danke!

+0

vielleicht können Sie jedes Element nacheinander besuchen und, wenn Sie ein bestimmtes Element besuchen Sie es zu einem anderen Vektor hinzufügen, und stellen Sie sicher, das nächste Mal, dass Sie die Nummer prüfen, ob Sie besuchen möchten ist nicht bereits in diesem Vektor enthalten, bevor die Ergebnisse hinzugefügt werden. obwohl ich dies nicht für Vektoren, die viele Elemente haben, empfehlen, wie es langsam sein wird. –

+0

Ich weiß was falsch ist. Es kompiliert nicht! –

+0

Für 'C' ist es ein ziemlich kniffliges Problem, Sie brauchen entweder einen guten Algorithmus (zuerst das Array sortieren, dann eine Raupe-Methode verwenden) oder eine gute Datenstruktur (eine Hashtabelle oder ein Wörterbuch wie' Python'). –

Antwort

2

Das offensichtlichste Problem ist, dass Ihr Code i in den inneren und äußeren Schleifen verwendet. Die Variablen most und count sind im obigen Code nicht initialisiert, und count muss zurückgesetzt werden, bevor jedes Mal die innere Schleife gestartet wird.

Die in diesem Code verwendete Methode der Iteration über das gesamte Array für jedes Element zum Zählen von Erscheinungsbildern ist nicht sehr effizient. Die Effizienz könnte verbessert werden, indem die innere Schleife von i + 1 anstatt von 0 gestartet wird. Auf diese Weise ist die erste Häufigkeitszählung für jedes Element korrekt, obwohl die späteren Zählungen niedrig sind, da die früheren Indizes nicht besucht werden. Aber das ist egal, da die erste Zählung die Variable most gesetzt hat, wenn möglich. Die count Variable kann auf 1 gesetzt werden, bevor die innere Schleife beginnt, da das i th-Element der Testwert ist und die innere Schleife diesen Index überspringt. Diese Änderung wird die Anzahl der Array-Zugriffe wesentlich reduzieren.

Beachten Sie, dass diese Funktion den Wert des Elements first im Array zurückgibt, das am häufigsten auftritt.

+0

Könnte die innere Schleife bei 'i + 1' beginnen, wenn Sie' count = 1; 'setzen (weil' temp' den ersten Wert der Menge enthält, die gezählt wird)? Es ist schade, immer wieder alles zu erzählen. –

+0

@ JonathanLeffler-- Antwort aktualisiert. Danke für den Vorschlag. –

0

Sie können immer die Brute-Force-Methode ausprobieren, die Häufigkeit jedes Elements zählen und dann die maximale ermitteln.

Um eine vollständige Version dieser Funktion mit Effizienz zu implementieren, benötigen Sie spezielle Datenstruktur wie hashtable oder dictionary.

Die folgenden Codes funktionieren jedoch gut, wenn Sie nur das erste Element zurückgeben müssen, das diese Bedingung erfüllt.

#include <stdio.h> 

// returns the first matched most frequent item of a list 
// list items of same value must be grouped, for example, a sorted list 
// only returns the first matched item 
int max_frequent_item_of(int vet[], int dim) 
{ 
    int i = 0; 
    // element and its count of current sublist 
    int current = vet[0]; 
    int current_count = 0; 
    // most frequent element and its count of the list so far 
    int most = vet[0]; 
    int most_count = 0; 
    while (i < dim) { 
    // if i-th element still belong to current sublist, run the counter 
    if (vet[i] == current) { 
     current_count += 1; 
     i += 1; 
    } 
    // otherwise, the current sublist just ended 
    else { 
     // update the most frequent element 
     if (current_count > most_count) { 
     most = current; 
     most_count = current_count; 
     } 
     // reset current sublist 
     current = vet[i]; 
     current_count = 1; 
     i += 1; 
    } 
    } 
    printf("most frequent item %d, count %d\n", most, most_count); 
    return most; 
} 

int main(void) 
{ 
    // vet must be in order, sort with `qsort` if necessary 
    int vet[] = {1, 1, 2, 3, 4, 4, 4, 8, 9, 9}; 
    int size = 10; 
    int n; 
    printf("list: "); 
    for (n = 0 ; n < size; n++) 
    { 
     printf("%d ", vet[n]); 
    } 
    printf("\n"); 
    max_frequent_item_of(vet, size); 
    return 0; 
} 

Ausgang

list: 1 1 2 3 4 4 4 8 9 9 
most frequent item 4, count 3 
+0

Mit einer O (N log N) Sortierung und wenn O (N) ist, wenn das Array geordnet werden kann, gibt dies insgesamt O (N log N) und O (N) beim Suchen. Für N ist entweder besser als O (N^2). –

Verwandte Themen