ce que je recherche c'est la solution pour avoir un algo o(1)
Il n'est pas possible d'avoir un algorithme en o(1) ou o(xxx) sans table, puisqu'il n'y a pas de formule pour connaître les jours ouvrables. Certains jours fériés sont décidés plus ou moins arbitrairement d'une année sur l'autre, les règles changent, etc. Et puis ce n'est pas transposable à un autre pays, donc on constate que ce n'est pas la bonne solution.
Une solution est d'avoir une table contenant uniquement les jours fériés (hors samedis-dimanches).
Pour effectuer ton calcul, tu calcules d'abord la différence entre tes dates, puis tu supprimes les samedis-dimanches (deux par semaine, puis il faut gérer les extrémités), puis tu supprimes les jours fériés en regardant dans ta table.
On est presque sur du o(1), mais pas tout à fait.
Il reste que la méthode la plus rapide que je connaisse est d'avoir une table qui contient le nombre de jours pré-calculé depuis une date. Par exemple depuis le 1er janvier 2010 jusqu'au 31 décembre 2020. Chaque ligne de la table contient le cumul des jours ouvrés (ou non-ouvrés, comme on veut) depuis le début de la table.
La première ligne contient 1, la seconde contient 2, la troisième aussi car c'est un samedi, idem pour la cinquième, etc. On arrive à la fin de la table avec une valeur du genre 2500.
Ca fait 6 ko. Le nombre de jours ouvrés entre deux dates se calcule par la simple différence entre les deux lignes de la table. C'est du o(1). Ca prend de la place, et ça reporte les bugs ailleurs.
[^] # Re: Date#upto
Posté par Kerro . En réponse au message Algorithmes calculs de date. Évalué à 2.
Il n'est pas possible d'avoir un algorithme en o(1) ou o(xxx) sans table, puisqu'il n'y a pas de formule pour connaître les jours ouvrables. Certains jours fériés sont décidés plus ou moins arbitrairement d'une année sur l'autre, les règles changent, etc. Et puis ce n'est pas transposable à un autre pays, donc on constate que ce n'est pas la bonne solution.
Une solution est d'avoir une table contenant uniquement les jours fériés (hors samedis-dimanches).
Pour effectuer ton calcul, tu calcules d'abord la différence entre tes dates, puis tu supprimes les samedis-dimanches (deux par semaine, puis il faut gérer les extrémités), puis tu supprimes les jours fériés en regardant dans ta table.
On est presque sur du o(1), mais pas tout à fait.
Il reste que la méthode la plus rapide que je connaisse est d'avoir une table qui contient le nombre de jours pré-calculé depuis une date. Par exemple depuis le 1er janvier 2010 jusqu'au 31 décembre 2020. Chaque ligne de la table contient le cumul des jours ouvrés (ou non-ouvrés, comme on veut) depuis le début de la table.
La première ligne contient 1, la seconde contient 2, la troisième aussi car c'est un samedi, idem pour la cinquième, etc. On arrive à la fin de la table avec une valeur du genre 2500.
Ca fait 6 ko. Le nombre de jours ouvrés entre deux dates se calcule par la simple différence entre les deux lignes de la table. C'est du o(1). Ca prend de la place, et ça reporte les bugs ailleurs.