Komplexes Array Splitting - Bereiche

  • C#
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Mokki.

    Komplexes Array Splitting - Bereiche

    Hallo liebe Community,

    Wieder einmal habe ich ein kleines Problem :D
    Dieser Algorithmus, welcher mir von @ThePlexian optimiert wurde möchte ich erweitern:

    C#-Quellcode

    1. // Split an array into multiple multidemnsional arrays, with different, randomly choosen sizes
    2. public static T[][] RandomSplitBlock<T>(T[] Input)
    3. {
    4. if (Input == null)
    5. throw new ArgumentNullException("Input can't be null.");
    6. Random rnd = new Random(DateTime.Now.Millisecond);
    7. var index = 0;
    8. var arrayBlocks = new List<T[]>();
    9. var size = rnd.Next((int)(Math.Ceiling(Input.Length * 0.1)), (int)(Math.Ceiling(Input.Length * 0.4)));
    10. while (index < Input.Length)
    11. {
    12. var c = rnd.Next((int)(Math.Ceiling(size - (size * 0.5))), (int)(size + (size * 0.5)));
    13. if (index + c > Input.Length)
    14. c = Input.Length - index;
    15. var newArr = new T[c];
    16. Array.Copy(Input, index, newArr, 0, c);
    17. arrayBlocks.Add(newArr);
    18. index += c;
    19. }
    20. return arrayBlocks.ToArray();
    21. }


    Hierbei wird ein Input Arrays in mehrere kleine Arrays gesplittet mit unterscheidlichen größen die sich jedoch ähneln.
    Ich möchte gerne eine Art MergeList einführen, d.h. folgendes:

    Dabei ändert sich der Input von so:

    C#-Quellcode

    1. public static T[][] RandomSplitBlock<T>(T[] Input)


    C#-Quellcode

    1. public static T[][] RandomSplitBlock<T>(T[] Input, int[][] MergeList)


    int[][] MergeList ist ein Array mit kleineren Arrays die jeweils immer zwei items enthalten.
    D.h. int[][] MergeList könnte ca. so aussehen:

    MergeList[0][0] = 2;
    MergeList[0][1] = 17;
    MergeList[1][0] = 20;
    MergeList[1][1] = 78;
    MergeList[2][0] = 80;
    MergeList[2][1] = 83;
    MergeList[3][0] = 90;
    MergeList[3][1] = 170;


    Dabei ist jedes array in MergeList mit zwei werten befüllt, einem StartIndex und einem EndIndex.
    Nun zum schwierigen Teil, bei dem ich keine Ahnung hab wie ich das in Code umsetzen soll... :/

    Wenn das Input array gesplittet wird soll nun zusätlich die MergeList geprüft werden.
    Dabei gibt ja des Array in MergeList einen Bereich an, d.h. immer das item[0] auch kleiner ist als item[1], also eine Art von ... bis...

    Wenn ich durch die einzelnen Array Elemente loope die gesplittet werden müssen muss folgendes beachtet werden:
    Wenn der Index der Items durch die ichh loope in einem Bereich liegt, bzw der StartIndex oder EndIndex eines Bereiches der MergeList ist, dann müssen alle Items in dem Input array von dem
    jeweiligen Bereich in ein einzelnes array kommen.

    Zur Verdeutlichung:

    Wenn ich in der MergeList ein Array hab:

    MergeList[0][0] = 4;
    MergeList[0][1] = 7;


    Dann muss beim splitten beachtet werden das die Inputitems von Index 4 bis index 7 jeweils ins selbe TeilArray gesplittet werde und nicht auf verschiedene.
    Die Bereiche geben also an welche Items auf jedem Fall beim Splitten ins selbe TeilArray kommen müssen.
    Wenn das getan ist kann man ja vom input array jeweils die nächsten items überspringen bis nach dem EndIndex des MergeArrays, also dann wieder ab da weiterloopen.
    Kann mir heirbei jemand helfen, ich hab keinen Plan wie ich das machen soll :/
    Wenn ich irgendetwas unklar erklärt hab, fragt bitte :)
    C# Developer
    Learning C++
    Das heißt also die angegebenen Parts, hier jz 4-7 müssten bei dem splitten eins bleiben, richtig?
    Aber trotzdem sollen die Teilarrays etwa alle gleichgroß bleiben ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Das heißt also die angegebenen Parts, hier jz 4-7 müssten bei dem splitten eins bleiben, richtig?
    Aber trotzdem sollen die Teilarrays etwa alle gleichgroß bleiben ?


    Korrekt.
    Die MergeList gibt quasi Bereiche des Inputarrays an (also die index range) die nicht zerpflückt werden darf, bzw nicht gesplittet werden darf.
    C# Developer
    Learning C++

    Rikudo schrieb:

    int[][] MergeList ist ein Array mit kleineren Arrays die jeweils immer zwei items enthalten.
    Machst Du int[,].
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ist sie trotzdem immer größer wie T oder muss das auch beachtet werden?
    Edit: Sorry ist Blödsinn.
    Eigentlich ist es so:
    untere Grenze = index
    Obere Grenze = index + c
    Wenn also aus der MergeList beide also z.b. [0,0] und [0,1] in dem Bereich liegen ist alles ok. Wenn dies nicht der Fall ist muss die Grenze nach oben ausgeweitet werden.
    Edit2: Natürlich ist hier das Problem, wenn MergeList[0,1] > wie Input.Length oder MergeList[0,1] = 30 der Array Input hat aber nur 31 Werte. Dann hätte man zwei Outputarrays mit einmal der Length 30 und der andere mit der Length 1, also wäre der eine viel größer wie der andere und das willst du ja nicht.
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mokki“ ()

    @Mokki :

    Wenn der Obere Index des Bereichs größer ist als die Anzahl der Elemente des Input-Arrays kann ne Exception geworfen werden.
    Ich gehe davon aus das die InputBereiche stimmen, die werden vorher von mir festgelegt.
    Nur wie splitte ich den jetzt so das die Bereiche des InputArarys nicht auseinandergepflückt werden, welche durch die MergeList verboten werden?
    C# Developer
    Learning C++
    Hab ich doch gesagt:

    Mokki schrieb:


    untere Grenze = index
    Obere Grenze = index + c
    Wenn also aus der MergeList beide also z.b. [0,0] und [0,1] in dem Bereich liegen ist alles ok. Wenn dies nicht der Fall ist muss die Grenze nach oben ausgeweitet werden.

    Also musst du überprüfen ob beide Werte in dem Bereich von index und index + c liegen. Sonst muss c erweitert werden bis beide Werte reinpassen.
    Und noch eine Frage:
    Kann die MergeList auch so aussehen:

    MergeList[0][0] = 1;
    MergeList[0][1] = 17;
    MergeList[1][0] = 13;
    MergeList[1][1] = 20;


    Edit:
    Ich hab mal noch nen Script dazu geschrieben:

    VB.NET-Quellcode

    1. For i = 0 To CInt(MergeList.Length / 2 - 1)
    2. If index + c < MergeList(i, 1) Then
    3. If MergeList(i, 0) >= index And MergeList(i, 0) < index + c Then
    4. c = MergeList(i, 1) - index
    5. End If
    6. End If
    7. Next

    Muss unter:

    C#-Quellcode

    1. c = Input.Length - index;

    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mokki“ ()