2013-04-02 13 views
6

Devo calcolare gli importi fatturabili totali per i titolari di carte, per l'accesso basato su carta ai parcheggi. La mia struttura dei tassi sembra così. Ogni zona in un parcheggio avrà un elenco prioritario di questi prezzi.Come si calcolano le tariffe di parcheggio per più giorni quando le tariffe sono specificate giornalmente?

public partial class HourlyPrice 
{ 
    public int Id { get; set; } 
    public int DayId { get; set; } 
    public DateTime StartTime { get; set; } 
    public DateTime EndTime { get; set; } 
    public int MinHour { get; set; } 
    public int MaxHour { get; set; } 
    public decimal Price { get; set; } 
} 

DayId consente ad es. "gratuito la domenica dalle 13h00". MinNour e 'MaxHour' consentono da 0 a 2 ore è gratuito, dove da 5 a 6 ore costa R11.00. StartTime e EndTime consentire 'dopo 18h00 costi R7.00, forfettario'.

La mia preoccupazione è dove non è specificato alcun prezzo di più giorni. Quando una macchina entra in una struttura di prezzo in un giorno e esce sotto un'altra in un altro giorno. Questo mi sembra che dovrò visitare sequenzialmente ogni ora parcheggiata dal veicolo e accumulare l'importo dovuto. Questo sembra un modo molto costoso di fare le cose.

Qualsiasi consiglio su tale endevour sarebbe molto apprezzato.

+0

È possibile misurare il tempo totale trascorso in ogni 'HourlyPrice' passando dal "momento corrente" al bordo del corrispondente' HourlyPrice', quindi rendere quel momento di confine il "momento corrente" e ricorsivo (prestare attenzione alla sovrapposizione). –

+2

"Questo sembra un modo molto costoso di fare le cose." Quante migliaia di auto ti aspetti di gestire al secondo? – Corak

+0

Dall'osservazione della serie di requisiti, non vedo alcun modo di rompere ogni periodo di parcheggio in ore e calcolare il costo all'ora utilizzando la serie di regole. Mi piacerebbe vedere altre soluzioni, ma non riesco a pensare a una ... –

risposta

0

è possibile memorizzare la politica dei prezzi di ogni giorno specifico in un albero di intervalli. L'albero dovrebbe conservare tutte le ore del giorno. Oltre ai limiti orari, è necessario tenere diverse informazioni:

  • Un appartamento booleano: il prezzo è classificato come piatto? (ad esempio R7.00 per tutto il periodo dell'intervallo)
  • Un prezzo intero: il costo di un'ora nel periodo. Se flat è impostato su true, questo è il costo dell'intero periodo.

È possibile ottenere record di parcheggio in ingresso. Presumo che siano i timestamp per l'arrivo e per i tempi di partenza dell'auto. Le prime due ore sono gratuite, quindi "aumenti" l'orario di arrivo di due ore. Dai timestamp risultanti, è possibile creare una sequenza di terzine (giorno, ora di inizio, ora di fine). Può essere vuoto (se il proprietario dell'auto parcheggiata meno di due ore), questo caso è banale: costa R0.00

Ora, un algoritmo che elabora la sequenza dovrebbe essere simile a questo:

cost <- 0 
while (NOT is_empty(sequence)) { 
    dayTriplet <- pop(sequence) 
    down <- dayTriplet.StartTime 
    up <- dayTriplet.EndTime 
    pricingTree <- getPriceTree(dayTriplet.dayId) 
    while (down < up) { 
     node <- findNode(pricingTree, down) 
     nbHours <- min(up, node.up) - down 
     if (node.flat) { 
      cost <- cost + node.price 
     } else { 
      cost <- cost + nbHours*node.price 
     } 
     down <- down + nbHours 
    } 
} 

Il l'algoritmo è un po 'errato ma ho sentito che le idee dietro di esso valevano la pena. Ad esempio, se un'auto è parcheggiata dopo 18h00 un giorno fino alle 4:00 del giorno successivo, questo algoritmo analizzerà (d, 18, 24) e (d + 1, 0, 4), e quindi il proprietario dovrebbe essere fatturato due volte tariffa forfettaria del periodo invece di una sola volta. Un sistema simile al carry dovrebbe fare il trucco per questo problema. Semplicemente non l'ho integrato per lasciare un algoritmo relativamente chiaro.

Problemi correlati