Heim  >  Artikel  >  Java  >  Anwendungsszenarien von Java-Closures in Datenstrukturen und Algorithmen

Anwendungsszenarien von Java-Closures in Datenstrukturen und Algorithmen

WBOY
WBOYOriginal
2024-05-02 14:51:021099Durchsuche

Abschlüsse werden häufig bei der Umkehrung verknüpfter Listen, beim Durchlaufen von Baumstrukturen und bei der dynamischen Programmierung in Datenstrukturen und Algorithmen verwendet. Durch den Zugriff auf und die Änderung äußerer Bereichsvariablen vermeiden Abschlüsse das Risiko eines rekursiven Stapelüberlaufs beim Umkehren verknüpfter Listen. Beim Durchlaufen von Baumstrukturen werden Abschlüsse als Memo-Parameter an die Rekursion übergeben. Funktion zum Speichern von Zwischenergebnissen.

Java 闭包在数据结构和算法中的应用场景

Anwendungsszenarien von Java-Abschlüssen in Datenstrukturen und Algorithmen

Abschlüsse sind eine wichtige Programmiersprachenfunktion, die es Funktionen ermöglicht, auf im äußeren Bereich definierte Variablen zuzugreifen und diese zu ändern. Dies macht Abschlüsse in Datenstrukturen und Algorithmen leistungsstark.

1. Umkehr verknüpfter Listen

Eine der häufigsten Lösungen zum Umkehren verknüpfter Listen ist die Verwendung von Abschlüssen. Es kann verknüpfte Listenelemente effektiv umkehren und gleichzeitig das Risiko eines Stapelüberlaufs vermeiden, der durch die Verwendung von Rekursion verursacht wird.

public class Node {
    int val;
    Node next;

    public Node(int val) {
        this.val = val;
    }
}

public static Node reverseList(Node head) {
    Node newHead = null;

    // 闭包函数,负责更新新链表指向
    Function<Node, Node> reverse = (prev) -> {
        if (head == null) {
            return prev;
        }

        Node next = head.next;
        head.next = prev;
        head = next;

        return reverse.apply(head);
    };

    return reverse.apply(newHead);
}

2. Baumstruktur-Traversal

Abschlüsse können verwendet werden, um benutzerdefinierte Iteratoren zum Traversieren von Baumstrukturen zu erstellen, z. B. zum Traversal vor der Bestellung, zum Traversal nach der Bestellung und zum Traversal nach der Bestellung.

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode(int val) {
        this.val = val;
    }
}

// 前序遍历
Function<TreeNode, List<Integer>> preOrder = (root) -> {
    if (root == null) {
        return Collections.emptyList();
    }

    List<Integer> result = new ArrayList<>();
    result.add(root.val);
    result.addAll(preOrder.apply(root.left));
    result.addAll(preOrder.apply(root.right));

    return result;
};

3. Dynamische Programmierung

Der Memomodus im dynamischen Programmieralgorithmus kann Zwischenergebnisse effektiv speichern und wiederholte Berechnungen vermeiden. Unter anderem können Abschlüsse verwendet werden, um Memos als Parameter an rekursive Funktionen zu übergeben.

public int fib(int n) {
    if (n <= 1) {
        return 1;
    }

    // 闭包函数,存储中间结果
    Function<Integer, Integer> memo = (x) -> {
        if (x <= 1) {
            return 1;
        } else if (memo.containsKey(x)) {
            return memo.get(x);
        } else {
            int result = fib(x - 1) + fib(x - 2);
            memo.put(x, result);
            return result;
        }
    };

    return memo.apply(n);
}

private Map<Integer, Integer> memo = new HashMap<>();

Das obige ist der detaillierte Inhalt vonAnwendungsszenarien von Java-Closures in Datenstrukturen und Algorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn