Vergleich von arrays

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Vergleich von arrays

    ich suche nach einer effektiven Methode arrays zu vergleichen (uint8_t) - und möglichst schnell nur die veränderte werte erhalten - hat jemand einen tip ?

    die while schleife und if ist relativ langsam es geht um eine wiederholden timer und mehere hundert werte im array


    Vielen Dank
  • da du von uint8_t sprichst, gehe ich von c-arrays aus.

    bist du sicher dass wirklich dies der flaschnhals ist? falls ja:

    1. die zwei längen vergleichen
    2. di ekompletten arrays vergleichen (weils ja zwei speicherblöcke sind). zb mit memcmp()
    3. mit jeweils zwei pointern durchlaufen, könnte schneller sein als per [] zuzugreifen (könnte bei heutigen compilern aber aufs gleiche rauskommen)
  • DAs Vergleichen von meheren zigtausend uint8_t braucht sicher nicht mal eine 1ms. Ich denke Du hast da entweder was grundlegendes falsch gemacht, was wir ohne Deinen Code zu sehen nicht beurteilen können, oder Du hast ein konzeptionelles Problem. Wenn du z.B. alle 1/10s ein paar hundert Array-Inhalte abfragen willst um nachzusehen ob sich was geändert hat, sich aber immer nur 2-3 Sachen ändern, dann solltest du überlegen ob es nicht schlauer ist diese zwei Felder zu verfolgen statt dem ganzen Array.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Wenn's wirklich C-Arrays sind mit Integer, sollte das Razzfazz gehen. Blöd wird's wenn die beiden Arrays nicht "sortiert" sind, also nicht sicher ist, das der Wert an Index 7 in Array A auch mit dem Wert an der Stelle 7 im Array B korrespondiert. In dem Fall wird die Laufzeit quadratisch zur Länge des Arrays. Das kann dann u.U. schon dauern.

    ciao

    gandhi
  • Wenn der Wertebereich der einzelnen Array-Elemente nicht zu groß ist (und das ist bei 8-Bit der Fall) bekommt man den Vergleich mit einer Tabelle immer linear hin. Dann hast Du nur noch eine Schleife mit ein bißchen Pointerarithmetik. Das hat man ja vor 20 Jahren auf einem 68000er auch schon fix hinbekommen, geschweige denn heutzutage.

    @macmoonshine: Mit ist nicht ganz klar, was Du mit Bitset meinst, aber ich vermute, dasselbe wie ich mit meiner Tabelle.

    schönen Gruß

    gandhi
  • gandhi schrieb:

    Mit ist nicht ganz klar, was Du mit Bitset meinst


    sowas meint er (kann man sich ja aber relativ einfach selbst basteln - vor allem wenn man zb nur 64 werte hat kann man das ganze in einen uint64_t packen):

    A bitset stores bits (elements with only two possible values: 0 or 1, true or false, ...).

    The class emulates an array of bool elements, but optimized for space allocation: generally, each element occupies only one bit (which, on most systems, is eight times less than the smallest elemental type: char).
  • Was ein Bitset ist, ist mir klar. Wozu er es hier braucht, war die Frage. Ich vermute, so wie ich die Tabelle: Tabelle für den Wertebereich anlegen (also bei 8-Bit-Werten eben 256 Byte), durch beide Arrays iterieren und in der Tabelle jeweils vermerken, wenn ein Element in einer der Arrays enthalten ist. Da nur die Information ob oder ob nicht interessant ist, braucht man in der Tabelle nicht ein Byte/Wert sondern nur 2 Bit/Wert.

    schönen Gruß

    gandhi
  • gandhi schrieb:

    Was ein Bitset ist, ist mir klar. Wozu er es hier braucht, war die Frage. Ich vermute, so wie ich die Tabelle: Tabelle für den Wertebereich anlegen (also bei 8-Bit-Werten eben 256 Byte), durch beide Arrays iterieren und in der Tabelle jeweils vermerken, wenn ein Element in einer der Arrays enthalten ist. Da nur die Information ob oder ob nicht interessant ist, braucht man in der Tabelle nicht ein Byte/Wert sondern nur 2 Bit/Wert.

    schönen Gruß

    gandhi


    bei werten von x bis x + 255 (also 8 bit range) braucht man aber keine tabelle von 256 byte sondern einfach nur zwei bitsets a 32 bytes (also zusammen 64 byte)