Programmation dynamique
Résolu
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
-
Modifié le 14 août 2021 à 11:14
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 16 sept. 2021 à 19:58
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - 16 sept. 2021 à 19:58
A voir également:
- Programmation dynamique
- Tableau croisé dynamique - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Application de programmation - Guide
- Liste déroulante dynamique excel - Guide
- Liste déroulante dynamique en cascade excel - Guide
3 réponses
yg_be
Messages postés
23536
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 mai 2025
Ambassadeur
1 580
14 août 2021 à 11:26
14 août 2021 à 11:26
bonjour,
afin de choisir le type d'objet, tu dois d'abord comprendre ce que tu feras avec l'objet.
qu'en feras-tu?
afin de choisir le type d'objet, tu dois d'abord comprendre ce que tu feras avec l'objet.
qu'en feras-tu?
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
Modifié le 14 août 2021 à 12:02
Modifié le 14 août 2021 à 12:02
Salut,
Pour reprendre l'exemple de la vidéo, je stocke dedans les combinaisons de String déjà explorées et qui n'ont pas ponctionnées, pour m'en servir aux explorations futures. Donc j'ai besoin de stocker des String.
Donc pour l'objet memo, je devrais utiliser une ArrayList de String ? Ou peut-être une hashmap de String ?
Pour reprendre l'exemple de la vidéo, je stocke dedans les combinaisons de String déjà explorées et qui n'ont pas ponctionnées, pour m'en servir aux explorations futures. Donc j'ai besoin de stocker des String.
Donc pour l'objet memo, je devrais utiliser une ArrayList de String ? Ou peut-être une hashmap de String ?
yg_be
Messages postés
23536
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 mai 2025
1 580
14 août 2021 à 12:35
14 août 2021 à 12:35
Il n'y a pas de règle générale pour définir la meilleure structure.
Reprenant l'exemple, quelles sont les actions faites sur la structure?
S'agit-il uniquement de stocker des combinaisons de strings?
Fais peut-être la liste des instructions faites sur la structure.
Reprenant l'exemple, quelles sont les actions faites sur la structure?
S'agit-il uniquement de stocker des combinaisons de strings?
Fais peut-être la liste des instructions faites sur la structure.
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
14 août 2021 à 12:51
14 août 2021 à 12:51
Bonjour,
Clairement ici c'est une Map dont tu as besoin.
La mémoïsation consiste à enregistrer le résultat d'une fonction à partir de ses paramètres.
Les paramètres doivent être la clé de Map, le résultat la fonction la valeur de la Map.
Pour une fonction à un argument genre
Pour une fonction à plusieurs arguments
Clairement ici c'est une Map dont tu as besoin.
La mémoïsation consiste à enregistrer le résultat d'une fonction à partir de ses paramètres.
Les paramètres doivent être la clé de Map, le résultat la fonction la valeur de la Map.
Pour une fonction à un argument genre
R fun(P param)tu devrais avoir une
Map<P, R>.
Pour une fonction à plusieurs arguments
R fun(P1 param1, P2 param2)tu devrais créer une
class Param { P1 param1; P2 param2; }pour revenir au cas d'une fonction à un paramètre avec une
Map<Param, R>.
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
Modifié le 15 août 2021 à 18:30
Modifié le 15 août 2021 à 18:30
Salut et merci pour ta réponse.
J'ai essayé d'ajouter une fonction en paramètre à la Map, mais j'ai une erreur donc j'ai mis deux String à la place.
Est-ce que ça devrait ressembler à ça ?
J'ai essayé d'ajouter une fonction en paramètre à la Map, mais j'ai une erreur donc j'ai mis deux String à la place.
Est-ce que ça devrait ressembler à ça ?
package com.company; import java.util.HashMap; import java.util.Map; public class Main { static String[] listOfWords = {"bo","rd","ate","t","ska","sk","boar"}; public static void main(String[] args) { Map<String, String> res = new HashMap<String, String>(); System.out.println(canConstruct("skateboard",res)); } static boolean canConstruct(String word, Map<String, String> res){ // base cases if (word.isEmpty()) return true; if (res.containsValue(word)) return res.containsValue(word); for (int i = 0; i < listOfWords.length; i++) { // if the substring is contained at the beginning of the string if (word.indexOf(listOfWords[i]) == 0 ){ // update of the word int lengthSubString = listOfWords[i].length(); String exWord = word; word = word.substring(0,lengthSubString); if (canConstruct(word, res) == true){ res.put(exWord,word); return true; } } } return false; } }
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
15 août 2021 à 19:02
15 août 2021 à 19:02
Je ne comprends pas pourquoi les valeurs dans ta Map sont des String alors que tu renvoies un booléen.
En plus tu ne stockes dans la map la valeur que lorsque c'est true, jamais quand c'est false... du coup tu ne tires profit de la Map qu'une fois sur deux alors que tu as déjà fait la calcul aussi quand c'est false...
Dans l'idée il faudrait plutôt avoir une structure comme ceci :
Après c'est le genre de chose qu'on peut généraliser dans une classe dédiée sans avoir à recopier le code pour chaque méthode qui pourrait avoir besoin de ça...
En plus tu ne stockes dans la map la valeur que lorsque c'est true, jamais quand c'est false... du coup tu ne tires profit de la Map qu'une fois sur deux alors que tu as déjà fait la calcul aussi quand c'est false...
Dans l'idée il faudrait plutôt avoir une structure comme ceci :
private static Map<String, Boolean> canConstructCache = new HashMap<>(); public static boolean canConstructWithCache(String word) { if (canConstructCache.containsKey(word)) { return canConstructCache.get(word); } else { boolean result = canConstructComputed(word); canConstructCache.put(word, result); return result; } } private static boolean canConstructComputed(String word) { return ... // calcul du résultat normal }
Après c'est le genre de chose qu'on peut généraliser dans une classe dédiée sans avoir à recopier le code pour chaque méthode qui pourrait avoir besoin de ça...
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
>
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
17 août 2021 à 18:22
17 août 2021 à 18:22
J'ai essayé de reproduire ce que j'avais cru comprendre dans la vidéo. L'auteur de la vidéo s'était organisé de cette manière, enfin je crois.
J'ai fait deux String car je pensais passer par l'un pour avoir l'autre, et ainsi l'utiliser afin d'avoir un boolean.
La méthode canConstructComputed ça correspond aux lignes 28 à 31 de mon code ("update of the word") ?
J'ai fait deux String car je pensais passer par l'un pour avoir l'autre, et ainsi l'utiliser afin d'avoir un boolean.
La méthode canConstructComputed ça correspond aux lignes 28 à 31 de mon code ("update of the word") ?
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
3 020
>
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
18 août 2021 à 07:33
18 août 2021 à 07:33
Bonjour,
"J'ai essayé de reproduire ce que j'avais cru comprendre dans la vidéo. L'auteur de la vidéo s'était organisé de cette manière, enfin je crois."
Si on reprend la vidéo, à 2:36:42 il a son code final :

Ensuite il fait
"La méthode canConstructComputed ça correspond aux lignes 28 à 31 de mon code ("update of the word") ?"
La méthode canConstructComputed devrait correspondre à tout ce qui constituerait ta méthode si tu ne faisais pas de mémoïsation, c'est à dire toute ta boucle for des lignes 23 à 38. C'est tout ça que tu vas court-circuiter en passant par la Map lorsque le résultat a déjà été calculé avec le même paramètre.
"J'ai essayé de reproduire ce que j'avais cru comprendre dans la vidéo. L'auteur de la vidéo s'était organisé de cette manière, enfin je crois."
Si on reprend la vidéo, à 2:36:42 il a son code final :

if (target in memo)correspond à
if (canConstructCache.containsKey(word)) {dans mon code.
return memo[target]correspond à
return canConstructCache.get(word);.
Ensuite il fait
memo[target]=true; return true;et
memo[target]=false ; return false;que j'ai mutualisé avec
canConstructCache.put(word, result); return result;.
"La méthode canConstructComputed ça correspond aux lignes 28 à 31 de mon code ("update of the word") ?"
La méthode canConstructComputed devrait correspondre à tout ce qui constituerait ta méthode si tu ne faisais pas de mémoïsation, c'est à dire toute ta boucle for des lignes 23 à 38. C'est tout ça que tu vas court-circuiter en passant par la Map lorsque le résultat a déjà été calculé avec le même paramètre.
charline159
Messages postés
208
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
22 juin 2022
1
>
KX
Messages postés
16760
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
12 février 2025
16 sept. 2021 à 19:58
16 sept. 2021 à 19:58
Merci pour tes explications !!
Et sincèrement désolée de n'y répondre que maintenant... !
Et sincèrement désolée de n'y répondre que maintenant... !