Maison > Java > javaDidacticiel > Comment implémenter l'algorithme Java BFS, DFS, la programmation dynamique et l'algorithme glouton

Comment implémenter l'algorithme Java BFS, DFS, la programmation dynamique et l'algorithme glouton

WBOY
Libérer: 2023-04-18 20:13:01
avant
983 Les gens l'ont consulté

Recherche en largeur d'abord

L'algorithme de recherche en largeur d'abord est un algorithme qui traverse ou recherche un arbre ou un graphique. Il recherche à partir du nœud racine et s'étend vers le bas couche par couche jusqu'à ce que l'état cible soit trouvé ou que tous les nœuds soient traversés. BFS est généralement implémenté à l'aide d'une file d'attente, qui place le nœud suivant dans la file d'attente à chaque fois jusqu'à ce que tous les nœuds aient été visités.

Voici une implémentation Java :

public void bfs(Node start) {
    Queue<Node> queue = new LinkedList<>();
    Set<Node> visited = new HashSet<>();

    queue.offer(start);
    visited.add(start);

    while (!queue.isEmpty()) {
        Node node = queue.poll();
        System.out.print(node.val + " ");

        for (Node neighbor : node.neighbors) {
            if (!visited.contains(neighbor)) {
                visited.add(neighbor);
                queue.offer(neighbor);
            }
        }
    }
}
Copier après la connexion

Recherche en profondeur d'abord

L'algorithme de recherche en profondeur est un algorithme qui parcourt ou recherche un arbre ou un graphique en parcourant récursivement tous les sous-arbres à partir du nœud racine jusqu'à l'état cible ou tous les nœuds. sont parcourus. DFS est généralement implémenté à l'aide d'une pile, qui pousse le nœud suivant sur la pile à chaque fois jusqu'à ce que tous les nœuds aient été visités.

Ce qui suit est une implémentation Java :

public void dfs(Node node, Set<Node> visited) {
    System.out.print(node.val + " ");
    visited.add(node);

    for (Node neighbor : node.neighbors) {
        if (!visited.contains(neighbor)) {
            dfs(neighbor, visited);
        }
    }
}
Copier après la connexion

Programmation dynamique

L'algorithme de programmation dynamique (DP) est une méthode de résolution de problèmes utilisée pour résoudre des sous-problèmes qui se chevauchent et des problèmes de sous-structure optimale. DP est généralement utilisé pour résoudre des problèmes d'optimisation, tels que le problème du chemin le plus court, le problème du sac à dos, etc.

Ce qui suit est une implémentation Java :

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    int[][] dp = new int[n + 1][capacity + 1];

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= capacity; j++) {
            if (weights[i - 1] <= j) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }

    return dp[n][capacity];
}
Copier après la connexion

Greedy

L'algorithme glouton est une méthode de résolution de problèmes d'optimisation qui choisit toujours la solution optimale actuelle. Contrairement à la programmation dynamique, l’algorithme glouton ne considère pas tous les sous-problèmes, mais examine uniquement la solution optimale actuelle.

Voici une implémentation Java :

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    Item[] items = new Item[n];

    for (int i = 0; i < n; i++) {
        items[i] = new Item(weights[i], values[i]);
    }

    Arrays.sort(items, (a, b) -> b.valuePerWeight - a.valuePerWeight);

    int totalValue = 0;
    int remainingCapacity = capacity;

    for (Item item : items) {
        if (remainingCapacity >= item.weight) {
            totalValue += item.value;
            remainingCapacity -= item.weight;
        } else {
            totalValue += item.valuePerWeight * remainingCapacity;
            break;
        }
    }

    return totalValue;
}

class Item {
    int weight;
    int value;
    int valuePerWeight;

    public Item(int weight, int value) {
        this.weight = weight;
        this.value = value;
        this.valuePerWeight = value / weight;
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal