Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Berechnung von gleichzeitigen Zugriffen (https://www.delphipraxis.net/149866-berechnung-von-gleichzeitigen-zugriffen.html)

msickel 1. Apr 2010 12:54

Re: Berechnung von gleichzeitigen Zugriffen
 
Zitat:

Zitat von s.h.a.r.k
Hier mal meine Idee als Algo, nur noch ein wenig optimiert:
Delphi-Quellcode:
type
  TTimePeriod = record
    StartTimestamp : TDateTime;
    EndTimestamp : TDateTime;
  end;

  TTimePeriodArray = array of TTimePeriod;


function GetMaxTimeOverlaps(const ATimePeriods : TTimePeriodArray): Integer;
var
  TimeArray : array [0..1439] of Integer;
  tp : TTimePeriod;
  i : Integer;
  n : Integer;
  IndexStart, IndexEnd : Integer;
  Maximum, Value: Integer;
begin
  // Verteilung der Zeiten auf das Array
  Maximum := 1;
  for i := 0 to Length(ATimePeriods) - 1 do
  begin
    tp := ATimePeriods[i];

    IndexStart := HourOf(tp.StartTimestamp) * 60 + MinuteOf(tp.StartTimestamp);
    IndexEnd := HourOf(tp.EndTimestamp) * 60 + MinuteOf(tp.EndTimestamp);

    for n := IndexStart to IndexEnd do
    begin
      Value := TimeArray[n];
      Inc(Value);
      if (Value > Maximum) then
        Maximum := Value;
      TimeArray[n] := Value;
    end;
  end;
  Result := Maximum - 1;
end;

Das werde ich über Ostern bestimmt mal austesten, danke schon mal

Martin

msickel 5. Apr 2010 20:06

Re: Berechnung von gleichzeitigen Zugriffen
 
Hi hab mal den Code getestet anbei der Testcode

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DateUtils, StdCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type
  TTimePeriod = record
    StartTimestamp : TDateTime;
    EndTimestamp : TDateTime;
  end;

  TTimePeriodArray = array of TTimePeriod;

var
  Form2: TForm2;



implementation

{$R *.dfm}

function GetMaxTimeOverlaps(const ATimePeriods : TTimePeriodArray): Integer;
var
  TimeArray : array [0..1439] of Integer;
  tp : TTimePeriod;
  i : Integer;
  n : Integer;
  IndexStart, IndexEnd : Integer;
  Maximum, Value: Integer;
begin
  // Verteilung der Zeiten auf das Array
  Maximum := 1;
  for i := 1 to Length(ATimePeriods) - 1 do
  begin
    tp := ATimePeriods[i];

    IndexStart := HourOf(tp.StartTimestamp) * 60 + MinuteOf(tp.StartTimestamp);
    IndexEnd := HourOf(tp.EndTimestamp) * 60 + MinuteOf(tp.EndTimestamp);

    for n := IndexStart to IndexEnd do
    begin
      Value := TimeArray[n];
      Inc(Value);
      if (Value > Maximum) then
        Maximum := Value;
      TimeArray[n] := Value;
    end;
  end;
  Result := Maximum - 1;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  TimeTabelle : TTimePeriodArray;
begin

  SetLength(TimeTabelle, 5);

  TimeTabelle[0].StartTimestamp := StrToDateTime('21.03.2010 14:13');
  TimeTabelle[0].EndTimestamp := StrToDateTime('21.03.2010 14:33');
  TimeTabelle[1].StartTimestamp := StrToDateTime('22.03.2010 14:13');
  TimeTabelle[1].EndTimestamp := StrToDateTime('22.03.2010 14:33');
  TimeTabelle[2].StartTimestamp := StrToDateTime('22.03.2010 14:13');
  TimeTabelle[2].EndTimestamp := StrToDateTime('22.03.2010 14:33');
  TimeTabelle[3].StartTimestamp := StrToDateTime('22.03.2010 14:13');
  TimeTabelle[3].EndTimestamp := StrToDateTime('22.03.2010 14:33');
  TimeTabelle[4].StartTimestamp := StrToDateTime('22.03.2010 14:13');
  TimeTabelle[4].EndTimestamp := StrToDateTime('22.03.2010 14:33');
  TimeTabelle[5].StartTimestamp := StrToDateTime('22.03.2010 14:13');
  TimeTabelle[5].EndTimestamp := StrToDateTime('22.03.2010 14:33');


  label1.Caption := IntToStr(GetMaxTimeOverlaps(TimeTabelle));
end;

end.
habe das mal übers Wochenende getestet, eigentlich sollte das Ergebnis 5 sein. Leider ist das aber nicht so, wo liegt der Fehler?

Martin

Klaus01 5. Apr 2010 20:09

Re: Berechnung von gleichzeitigen Zugriffen
 
.. was hast denn Du für ein Ergebnis bekommen? "1"?

Delphi-Quellcode:
for n := IndexStart to IndexEnd do
  begin
    Value := TimeArray[n];
    Inc(Value);
    if (Value > Maximum) then // wenn es hilft > mit >= ersetzen
      Maximum := Value;
    TimeArray[n] := Value;
  end;
Grüße
Klaus

msickel 5. Apr 2010 20:16

Re: Berechnung von gleichzeitigen Zugriffen
 
Das Ergebnis ist 1988236220

Die Änderung bringt keine Änderung am Ergebnis
Gruss Martin

Zitat:

Zitat von Klaus01
.. was hast denn Du für ein Ergebnis bekommen? "1"?

Delphi-Quellcode:
for n := IndexStart to IndexEnd do
  begin
    Value := TimeArray[n];
    Inc(Value);
    if (Value > Maximum) then // wenn es hilft > mit >= ersetzen
      Maximum := Value;
    TimeArray[n] := Value;
  end;
Grüße
Klaus


Blup 6. Apr 2010 09:02

Re: Berechnung von gleichzeitigen Zugriffen
 
Ich würde TimeArray erst einmal mit 0 initialisieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz