Programmation dynamique

Résolu/Fermé
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
Bonjour, j'essaie de me pencher sur de la programmation dynamique en ce moment.

En regardant cette vidéo, j'ai pu voir que le programmeur ajoutait toujours un objet "memo" aux paramètres de sa méthode afin de mémoïser: https://www.youtube.com/watch?v=oBt53YbR9Kk&t=9333s

mais n'étant pas une spécialiste de Js, je me demandais quel devait être le type de l'objet en Java ? (dans le cas présent par exemple, en travaillant avec des String, est-ce que je devrais utiliser un objet de type String pour mémoïser, ou bien une ArrayList de String, ou autre?)

Merci pour votre aide
A voir également:

3 réponses

yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
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?
0
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
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 ?
0
yg_be Messages postés 22717 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 22 avril 2024 1 474
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.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
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
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>
.
0
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
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 ?

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;
    }
}

0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > 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
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 :
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...
0
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
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") ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > 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
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 :

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.
0
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
16 sept. 2021 à 19:58
Merci pour tes explications !!

Et sincèrement désolée de n'y répondre que maintenant... !
0