| 

.NET C# Java Javascript Exception

3
Hallo,

ich möchte die Elemente eines eindimensionalen kleineren Byte Arrays nach links und auch rechts rotieren. Schleifen sind ja sehr langsam. Gibt es da eine einfache Lösung ohne Schleifen? Vielleicht gibt es da was. nach dem ich googeln kann?
26.11.2013
boga 71 5
2 Antworten
2
Bei dieser Lösung kann ohne Schleifen gearbeitet werden, die darin aufgerufenen Methoden enthalten aber Schleifen (s. Kommentar v. "fordermaier").

/* Array-Linksrotation um n Positionen (n = 1 bis b.Length - 1) */
internal static bool RotL_Arr(ref byte[] b, int n)
{
if(n < 1 || n > b.Length -1)
return false;

Array.Reverse(b, 0, n);
Array.Reverse(b, n, b.Length - n);
Array.Reverse(b);

return true;
}

/* Array-Rechtssrotation um n Positionen (n = 1 bis b.Length - 1) */
internal static bool RotR_Arr(ref byte[] b, int n)
{
if(n < 1 || n > b.Length -1)
return false;

Array.Reverse(b, 0, b.Length - n);
Array.Reverse(b, b.Length - n, n);
Array.Reverse(b);

return true;
}


Unterschreitungen von: "n < 1" oder Überschreitungen bei: "n > b.Length -1" sollten im Vorwege vermieden werden, es wird sonst nur ein false zurückgegeben und d. Array bleibt dann unverändert. Rotation mit n = 0 wird nicht ausgeführt, weil diese keinen Sinn ergibt.

Hilfe und Erklärungen zu "Array.Reverse" findest du hier, falls nötig:

MSDN

Viel Spass damit
26.11.2013
Falkner 795 3 9
Falkner 795 3 9
Array.Reverse war mir bisher unbekannt. Es funktioniert. Danke
boga 27.11.2013
Wenn das f. dich unbekannt war, würde ich mich f, dich freuen, wenn du dir den mitgelieferten MSDN-Link genauer anschauen würdest. Die Methoden anwenden ist eine Sache, sie verstehen - das ist eben eine andere Sache...! Mal so nebenbei, Schleifen sind nicht so übel, wenn man sich einmal da ransetzt, begreift man die auch und wird auch irgendwie eine Art von Dankbarkeit f. diese entwickeln - ohne Schleifen ist da nicht wirklich was. Etwas Nachdenklichkeit wollte ich einbringen. Wenn ich das geschafft habe, ist gut!!!
Falkner 27.11.2013
Die Nachdenklichkeit ist angekommen. Ich lese das.
boga 27.11.2013
1
Nur so am Rande:
Array.Reverse sieht zwar rein äußerlich nicht mehr nach Schleife aus, wenn man sich die Implementierung im Disassembler anschaut, stellt man aber fest, dass dort sehr wohl Schleifen verwendet werden.
ffordermaier 27.11.2013
@fordermaier: Ist mir natürlich klar, war etwas blöd von mir formuliert. Gemeint war: "Keine Schleifen für den Methodennutzer.". Aber vielen Dank für den Zusatz.
Falkner 27.11.2013
@fordermaier: Habe es gerade korrigiert. Danke!
Falkner 27.11.2013
Ich versteh eh nicht, warum @boga der Meinung ist, Schleifen wären per se "sehr langsam". Solange ich keine Performanceanforderung habe, würde ich solche Gedanken unter "premature optimization" zusammenfassen. Wenn ich eine Performanceanforderung habe, würde ich nicht zuerst Schleifen in Frage stellen. Schleifen sind ein grundlegendes alltägliches Mittel der Programmierung. Wenn deren Performance den Ausschlag gibt, muss ich weg von managed Code und in letzter Instanz optimierten Assemblercode für die Zielplattform schreiben (oder etwas ähnlich Abgefahrenes)-ich wär dann raus aus der Nummer :)
ffordermaier 27.11.2013
0
Mit einer eigenen byte-Array Klasse kann man das ganze ohne Schleifen implementieren, indem man den Index-Operator überschreibt. Das könnte dann etwa so aussehen (nicht lauffähig, nur als Ausprägung der Idee)

class RotateableByteArray
{
private int offset = 0;
private byte[] innerList;

public object this[int i]
{
get { return innerList[(i + offset) % innerList.Length]; }
set { IinnerList[(i + offset) % innerList.Length] = value; }
}

public bool RotateLeft(int n)
{
if(n < 1 || n > innerList.Length -1)
return false;
offset = (offset + n) % innerList.Length;
return true;
}

public bool RotateRight(int n)
{
if(n < 1 || n > innerList.Length -1)
return false;
offset = (offset + innerList.Length - n) % innerList.Length;
return true;
}
}


Die Idee ist, das Array als Ring zu betrachten und für das Rotieren nur den Offset anzupassen. Dadurch muss nichts verschoben/kopiert werden und es werden auch keine Schleifen verwendet.

Ob sich der Implementations- und Testaufwand, besonders bei kleinen Arrays, lohnt, ist eine andere Diskussion.
28.11.2013
Roland Bär 335 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH