Datum: 09.05.2008 15:18
Programmiere gerade einen ATmega8 in c und suche einer schnellstmöglichen Methode, in einem Array aus n Elementen die Duplikate los zu werden, d.h. das array soll letztendlich jeden Wert nur noch einmal enthalten. Kennt da jemand eine vorteilhaftere Methode als ein paar mal eine Schleife durchlaufen zu lassen? Ist bei vorherigem Sortieren der Werte der Gesamtaufwand eventuell kleiner ?
Datum: 09.05.2008 15:21
Wenn die Werte schon sortiert sind, musst Du natürlich nur einmal durchs Array. Wenn Du aber sortierst, kannst Du schon beim Sortieren die Duplikate rauswerfen
Datum: 09.05.2008 15:23
Mit nem schnellen Algorithmus sortieren und dann einmal durchlaufen und die Duplikate entfernen. Geht auch anders ist aber (aus dem Bauch raus) bestimmt langsamer. Ah da faellt mir ein: Modifizier den Algorithmus gleich so dass er keine Duplikate speichert, is noch schneller ;)
Datum: 09.05.2008 15:25
Danke schon einmal für die Antworten. Eine Sortierung ist nicht zwingend notwendig, nur interessant, wenn es Geschwindigkeitsvorteile beim auffinden von Duplikaten bringt.
Datum: 09.05.2008 15:28
>Ah da faellt mir ein: Modifizier den Algorithmus gleich so dass er keine >Duplikate speichert, is noch schneller ;) klatsch Logisch, das wäre eventuell auch eine eine Möglichkeit. Brett vorm Kopf :)
Datum: 09.05.2008 15:35
Falls Du keinen weiteren Speicherplatz zur Verfügung hast:
Zwei Schleifen mit Indices i,j, i!=j:
a(i)==a(j) => mehrfaches Vorkommen
(hat aber O(n*n) Rechenaufwand, ist also nicht rechenoptimal, aber
speicheroptimal!)
sonst:
"erzeuge" zweites Array B mit gleicher Anzahl Elemente wie Dein
Array A, aber speichere in dieses die Indices von 0..n-1
Fasse nun die Elemente von Array A und B zusammen: (a,i), wobei a
aus A, i aus B ist
Definiere Grösser-Operator:
(a1,i1) > (a2,i2) falls (a1 > a2) oder (a1 == a2 und i1 > i2)
Sortiere nun die so zusammengefassten Elemente mittels
Grösser-Operator
Dann musst Du nur noch durch das Array laufen und testen, ob
benachbarte Elemente (a1,i1),(a2,i2) mit a1==a2 existieren
=> mehrfaches Vorkommen!!!
Falls Du die ursprüngliche Reihenfolge wieder herstellen möchtest:
die steht im Array B in Form der Indices
(hat O(n*log(n)) Rechenaufwand, ist also rechenoptimal, aber
diesmal NICHT speicheroptimal!)
Datum: 09.05.2008 18:03
Mehr Input zu den Randbedingungen, bitte! - Welcher Wertebereich der Elemente im Array? - In-Place-Algorithmus? - Größenordnung des Arrays? - Zur Verfügung stehender Arbeitsspeicher während des Algorithmus?
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel