AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array
Thema durchsuchen
Ansicht
Themen-Optionen

Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

Ein Thema von Ryu · begonnen am 15. Sep 2014 · letzter Beitrag vom 16. Sep 2014
Antwort Antwort
Ryu

Registriert seit: 15. Sep 2014
2 Beiträge
 
#1

Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 19:58
Hallo,

ich sitze seit mehreren Stunden an einer kurzen und eleganten Lösung um die Summe von aufeinanderfolgenden Zahlen <> 0 in einem Array zu bestimmen.

Beispiel
Ich hab vereinfacht gesagt ein Array vom Typ TValue

Delphi-Quellcode:
TValue = record
         value: integer;
         sum: integer;
end;
Beispielhaft:
Values.val = [0, 5, 4, 9, 0, 0, 1, 0, 0, 3, 4, 0] Daraus sollen die Summen aufeinanderfolgender Zahlen <> 0 ermittelt werden.
Values.sum = [0, 18, 18, 18, 0, 0, 1, 0, 0, 7, 7, 0]
Das mag jetzt für euch relativ einfach klingen, aber ich komm einfach nicht auf eine funktionierende Lösung. Deswegen bitte ich hier um Tipps.

PS: es handelt sich hier nur um Pseudo Code um das Problem einigermaßen anschaulich zu erklären...
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 20:12
Hallo und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns

Zum Thema Wahnsinn gleich vorweg: Ich verstehe deine Beispieldaten nicht. Wenn du die "Summe zweier aufeinanderfolgenden Zahlen ungleich Null" haben willst, wäre bei der Zahlenreihe [a,b,c,d, [...]] die "Summenreihe" doch [a+b, b+c, c+d, ...], oder? Ich finde das in deinen Beispieldaten nicht wieder. Wie kommt man da auf [0, 18, 18, 18, 0, 0, 1, 0, 0, 7, 7, 0] ?

Außerdem würde ich stark davon abraten, deinen Record TValue zu nennen- Das beißt sich mit dem bereits in Delphi existierenden Typen TValue
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 20:19
Ich geb dir mal einen Ansatz, wie ich das mit dem ersten "Bündel" machen würde:

Code:
Beginnend von Index i = 0

Solange Values[i].value = 0:
  Values[i].sum = 0
  i += 1

Anfang a = i;
Summe s = 0;

Solange Values[i].value = 0:
  s += Values[i].value
  i += 1

Für j := a bis i-1:
  Values[j].sum = s
Was fehlt noch:
  • äußere Schleife um das ganze Array zu durchlaufen
  • Abbruch bei Ende des Arrays

Das sollte in etwa so hinkommen
  Mit Zitat antworten Zitat
Ryu

Registriert seit: 15. Sep 2014
2 Beiträge
 
#4

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 20:22
Hallo Günther,

ich habe den Typen nicht TValue genannt in meinem Delphi Code, wie gesagt ist dies nur reiner Pseudocode

Zu der Frage wie ich zu den Zahlen komme:

Die Idee ist, dass ich solange die nächste Zahl addiere bis eine Null kommt. Anschließend setze ich die aus dem vorherigem Schritt resultierende Summe auf die Zahlen die ich eben durchgegangen bin... Schwierig zu erklären, schwierig umzusetzen. Deswegen nochmal etwas anschaulicher:

Delphi-Quellcode:
Values.val = [0, 5, 4, 9, 0, 0, 1, 0, 0, 3, 4, 0]

Values.sum = [0, 18, 18, 18, 0, 0, 1, 0, 0, 7, 7, 0]
Die erste 18 soll sich ergeben aus 5 + 4 + 9.
Die zweite 18 auch aus 5 + 4 + 9, denn es folgt vor der 4 und nach der 4 keine 0.
Die dritte 18 ebenfalls aus 5 + 4 + 9, da zwar danach eine 0 folgt aber vorher alle Zahlen <> 0 sind.

Man könnte fast sagen, ich möchte die Summe der Zahlen haben, welche "innerhalb" von 0en gekapselt ist. Die berechnete Summe soll, auf den in den "0en gekapselten" Zahlen gesetzt werden.

Ich hoffe ich habe es einigermaßen verständlich erklärt, ansonsten bitte nochmal nachhaken. Es fällt mir manchmal schwer solche Sachverhalte einfach und knapp zu erklären

Und jetzt lese ich mir mal die Antwort durch von BUG

Edit:
Danke für deinen Vorschlag Robert, ich bin den mal auf ein Blatt Papier durchgegangen und für's erste Bündel klappts aufjedenfall. Ich werde mal versuchen den zu implementieren. Weitere Vorschläge/Tipps sind gerne willkommen, nichtsdestotrotz danke schonmal.Allerdings habe ich aus der zweiten While-Schleife folgendes gemacht:

Delphi-Quellcode:
 ... Solange Values[i].value <> 0:
  s += Values[i].value
  i += 1
Edit2:
Wow Robert, dein Code funktioniert! Zumindest fürs erste Bündel läuft das ganze schonmal!!! Ziemlich peinlich wenn man seit 2 Tagen nicht auf die Lösung kommt und im Forum jemand das Problem nach 5 Minuten gelöst hat..........
Mal schauen ob ich es aufs ganze Array übertragen kann welches übrigens eine Länge von 14 hat.

Edit3:

holy fuck es funktioniert!!!!!!!!!!!! woohoo ! 1000-faches dankeschön, ich hätte echt ne wand eingerissen, wenn ich das Problem nicht heute noch gelöst hätte. !!!!

Geändert von Ryu (15. Sep 2014 um 20:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#5

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 20:53
Ich habe da mal schnell was gemacht:
Code:
    static void Main()
    {
        int[] input = new int[] {0, 5, 4, 9, 0, 0, 1, 0, 0, 3, 4, 0};
       
        int runningsum = 0;
        int elems = 0;
       
        fo&#636;(int i = 0; i < input.Length; i++)
        {                       
            if(input[i] == 0)
            {
               // Ausgabe
                for(int j = 0, j < elems, j++)
                    Console.Write("{0} ", runningsum);
                   
                Console.Write("0 ");
                runningsum = 0;
                elems = 0;
            }
            else
            {
                runningsum += input[i];
                elems++;
            }
        }
        for(int j = 0; j < elems; j++)
            Console.Write("{0} ", runningsum);      
    }
Es handelt sich dabei natürlich nur um Pseudo-Code, um die Lösung zu verdeutlichen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 15. Sep 2014, 20:55
1. Variante:

* das Array Wert für Wert durchlaufen (also erstmal der Array-Anfang)
* Wenn 0 dann 0
* wenn keine 0, dann eigener Wert + äußere Werte (zwei innere Schleifen)
* * alle Nicht-Null davor, bis zum Anfang oder zur ersten nächsten 0
* * alle Nicht-Null danach, bis zum Ende oder zur ersten nächsten 0

2. Variante:

* aktuelle Position merken
* nächste 0 suchen
* dabei gleich die Summe bilden (mitzählen)
* bei allem von aktueller Position bis vor der 0 mit der der Summe befüllen
* und nun alles von vorne
* * also Position nach der 0
* * nächste 0 suchen
* * dabei gleich die Summe bilden (mitzählen)
* * bei allem von aktueller Position bis vor der 0 mit der der Summe befüllen
* * und nun alles von vorne
* * * ...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Sep 2014 um 20:57 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 16. Sep 2014, 09:22
Noch eine Variante:
Delphi-Quellcode:
function MyArrayCalc(const AValues: TIntegerDynArray): TIntegerDynArray;
var
  i, sum: Integer;
begin
  SetLength(Result, Length(AValues));

  sum := 0;
  for i := 0 to High(AValues) do
  begin
    if AValues[i] = 0 then
      sum := 0
    else
      sum := sum + AValues[i];
 
    Result[i] := sum;
  end;

  sum := 0;
  for i := High(AValues) downto 0 do
  begin
    if AValues[i] = 0 then
      sum := 0
    else
    begin
      Result[i] := Result[i] + sum;
      sum := sum + AValues[i];
    end;
  end;
end;
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#8

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 16. Sep 2014, 09:41
Diese Funktion liefert die Summe für eine beliebige Position (zumindest soll sie das).
Delphi-Quellcode:
function GetConsecutiveSum(position : Integer) : Integer;
Begin
  if Values[position]=0 then begin
     result := 0
     exit;
  end;
    
  while (position > low(Values)) and (Values[position] <> 0) do
    dec(position);

  result := 0;
  repeat
    inc(result,values[position]);
    Inc(position);
  until (position>High(values)) or (values[position]=0);
end;
Getippt und nicht getestet.

Geändert von Dejan Vu (16. Sep 2014 um 10:42 Uhr) Grund: Siehe Blup
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 16. Sep 2014, 10:36
Funktioniert nicht wenn du auf einer Position stehst die den Wert 0 hat und ein Wert <> 0 folgt.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Verzweifelt: Algorithmus zur Ermittlung aufeinander folgender Zahlen Array

  Alt 16. Sep 2014, 10:42
Jetzt vielleicht?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz