• [^] # Re: jour 23 - cracra

    Posté par . En réponse au journal Advent of code 2024. Évalué à 1.

    Ce n'est vraiment pas terrible comme performance :)

    En gros à la lecture, je charge mes map & mes liens.
    Puis, je regroupe mes éléments.
    A la fin, je filtre pour trouver le plus gros groupe.

     public static Map<String, Node> nodesByCode = new HashMap<>();
     public static Map<Node, List<Link>> linksByNodes = new HashMap<>();
     public record Node(String name) implements Comparable<Node> {
     //...
     }
     public record Link(Node left, Node right) {
     // ...
     }
     public record Group(TreeSet<Node> members) {
     // ...
     }
     public void main() {
     //...
     Set<Group> groups = new HashSet<>();
     for (Map.Entry<Node, List<Link>> entry : linksByNodes.entrySet()) {
     Node a = entry.getKey();
     TreeSet<Node> members = new TreeSet<>();
     recurseGroup(members, a);
     if (members.size() > 3) {
     groups.add(new Group(members));
     }
     }
     /* Chercher le plus grand groups */
     }
     private static void recurseGroup(TreeSet<Node> members, Node a) {
     for (Node n : members) {
     if (linksByNodes.get(a).stream().filter(l -> l.match(n)).count() == 0) {
     return;
     }
     }
     members.add(a);
     for (Link link : linksByNodes.get(a)) {
     Node b = link.getOther(a);
     if (members.contains(b)) {
     continue;
     }
     recurseGroup(members, b);
     }
     }

    Je fais 215ms
    et si je répète l'opération plusieurs fois , je descends à 15ms pour le même traitement.