【用java实现贪心算法】1.最小生成树(Prim算法、Kruskal算法) 2.单源最短路径(Dijkstra算法) 3.哈夫曼编码(Huffman Coding)

Prim算法的实现(Java) Prim算法的目标是从给定的连接图中找到一棵包含所有顶点的最小生成树。Prim算法的基本思想是从一个起始顶点开始,逐步选择连接到当前树中的顶点中权重最小的边,直到所有顶点都被包含在生成树中为止。Prim算法的基本思想是从一个起始顶点开始,逐步选择连接到当前树中的顶点中权重最小的边,直到所有顶点都被包含在生成树中为止。接下来,我们在剩余的顶点中选择键值最小的顶点,并将其加入最小生成树中。然后,我们更新其它顶点的键值和父节点。接下来,我们在剩余的顶点中选择键值最小的顶点,并将其加入最小生成树中。 阅读详情

最小生成树算法(Prim算法和Kruskal算法)

Prim算法

Prim算法是一种用于在加权无向图中找到最小生成树的贪心算法。它从任意一个顶点开始,每次迭代中选择与当前生成树中已选择的顶点集合中权重最小的边对应的顶点,并将该顶点及其边添加到生成树中。

import java.util.*;

class Graph {
    int vertices;
    int[][] adjMatrix;

    Graph(int v) {
        vertices = v;
        adjMatrix = new int[v][v];
        for (int i = 0; i < v; i++) {
            for (int j = 0; j < v; j++) {
                adjMatrix[i][j] = Integer.MAX_VALUE; // 默认设置边权值为无穷大
            }
        }
    }

    void addEdge(int src, int dest, int weight) {
        adjMatrix[src][dest] = weight;
        adjMatrix[dest][src] = weight; // 因为是无向图
    }

    // Prim算法
    List<Edge> primMST() {
        boolean[] inMST = new boolean[vertices];
        int[] key = new int[vertices];
        int[] parent = new int[vertices];

        // 初始化
        Arrays.fill(inMST, false);
        Arrays.fill(key, Integer.MAX_VALUE);
        Arrays.fill(parent, -1);
        key[0] = 0; // 假设从第一个顶点开始

        List<Edge> mst = new ArrayList<>();

        for (int count = 0; count < vertices - 1; count++) {
            int u = minKey(key, inMST);
            inMST[u] = true;

            for (int v = 0; v < vertices; v++) {
                if (adjMatrix[u][v] != 0 && !inMST[v] && adjMatrix[u][v] < key[v]) {
                    parent[v] = u;
                    key[v] = adjMatrix[u][v];
                }
            }

            // 将边添加到最小生成树中
            if (parent[v] != -1) {
                mst.add(new Edge(parent[v], v, adjMatrix[parent[v]][v]));
            }
        }

        return mst;
    }

    int minKey(int[] key, boolean[] inMST) {
        int min = Integer.MAX_VALUE, min_index = -1;

        for (int v = 0; v < vertices; v++) {
            if (key[v] < min && !inMST[v]) {
                min = key[v];
                min_index = v;
            }
        }

        return min_index;
    }

    // 辅助类表示边
    static class Edge {
        int src, dest, weight;

        Edge(int src, int dest, int weight) {
            this.src = src;
            this.dest = dest;
            this.weight = weight;
        }

        @Override
        public String toString() {
            return "Edge: " + src + " - " + dest + " == " + weight;
        }
    }

    // 示例用法
    public static void main(String[] args) {
        Graph g = new Graph(4);
        g.addEdge(0, 1, 10);
        g.addEdge(0, 2, 6);
        g.addEdge(0, 3, 5);
        g.addEdge(1, 3, 15);
        g.addEdge(2, 3, 4);

        List<Edge> mst = g.primMST();

        System.out.println("Edges in the constructed MST");
        for (Edge edge : mst) {
            System.out.println(edge);
        }
    }
}

Kruskal算法

Kruskal算法也是用于在加权无向图中找到最小生成树的算法。它的基本思想是从小到大选择边,条件是选择的边不能形成一个环。

import java.util.*;

class Graph {
    int vertices;
    List<Edge> edges;

    Graph(int v) {
        vertices = v;
        edges = new ArrayList<>();
    }

    // 定义Edge类,用于存储图的边
    static class Edge implements Comparable<Edge> {
        int src, dest, weight;

        Edge(int src, int dest, int weight) {
            this.src = src;
            this.dest = dest;
            this.weight = weight;
        }

        // 用于Kruskal算法中边的比较
        @Override
        public int compareTo(Edge other) {
            return this.weight - other.weight;
        }
    }

    // 添加边到图中
    void addEdge(int src, int dest, int weight) {
        Edge edge = new Edge(src, dest, weight);
        edges.add(edge);
    }

    // 查找集合中的元素
    int find(int parent[], int i) {
        if (parent[i] == i)
            return i;
        return find(parent, parent[i]);
    }

    // 合并两个集合
    void union(int parent[], int[] rank, int x, int y) {
        int xroot = find(parent, x);
        int yroot = find(parent, y);

        if (rank[xroot] < rank[yroot])
            parent[xroot] = yroot;
        else if (rank[xroot] > rank[yroot])
            parent[yroot] = xroot;
        else {
            parent[yroot] = xroot;
            rank[xroot]++;
        }
    }

    // Kruskal算法实现
    List<Edge> kruskalMST() {
        // 初始化
        Collections.sort(edges); // 根据边的权重进行排序
        int[] parent = new int[vertices];
        int[] rank = new int[vertices];

        for (int node = 0; node < vertices; ++node)
            parent[node] = node;

        List<Edge> result = new ArrayList<>();

        for (Edge edge : edges) {
            int x = edge.src, y = edge.dest;
            int xroot = find(parent, x);
            int yroot = find(parent, y);

            if (xroot != yroot) {
                result.add(edge);
                union(parent, rank, xroot, yroot);
            }

            // 当边数等于顶点数减一时,最小生成树已经构成
            if (result.size() == vertices - 1)
                break;
        }

        return result;
    }

    // 示例用法
    public static void main(String[] args) {
        Graph g = new Graph(4);
        g.addEdge(0, 1, 10);
        g.addEdge(0, 2, 6);
        g.addEdge(0, 3, 5);
        g.addEdge(1, 3, 15);
        g.addEdge(2, 3, 4);

        List<Edge> mst = g.kruskalMST();

        System.out.println("Edges in the constructed MST");
        for (Edge edge : mst) {
            System.out.println(edge.src + " -- " + edge.dest + " == " + edge.weight);
        }
    }
}

单源最短路径(Dijkstra算法)


import java.util.*;

class Graph {
    private int numVertices; // 顶点数量
    private LinkedList<Integer>[] adjLists; // 邻接表
    private int[] dist; // 存储最短距离的数组
    private boolean[] visited; // 标记顶点是否已访问

    // 构造函数
    Graph(int numVertices) {
        this.numVertices = numVertices;
        adjLists = new LinkedList[numVertices];
        for (int i = 0; i < numVertices; i++) {
            adjLists[i] = new LinkedList<>();
        }
        dist = new int[numVertices];
        visited = new boolean[numVertices];
    }

    // 添加边和权重
    void addEdge(int src, int dest, int weight) {
        adjLists[src].add(dest); // 添加边到邻接表
        // Dijkstra算法通常用于非负权重的图,这里假设权重是非负的
        // 如果图中存在负权重边,应使用其他算法(如Bellman-Ford算法)
    }

    // 使用Dijkstra算法计算从src到所有其他顶点的最短路径
    void dijkstra(int src) {
        // 初始化距离数组和已访问数组
        Arrays.fill(dist, Integer.MAX_VALUE);
        dist[src] = 0;

        // 优先队列(小顶堆)用于存储待处理的顶点
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> dist[a] - dist[b]);
        pq.offer(src); // 将源顶点加入优先队列

        while (!pq.isEmpty()) {
            int u = pq.poll(); // 取出距离最小的顶点

            // 标记该顶点为已访问
            visited[u] = true;

            // 遍历u的所有邻居
            Iterator<Integer> i = adjLists[u].iterator();
            while (i.hasNext()) {
                int v = i.next();

                // 如果邻居v尚未被访问,并且从源顶点到u再到v的路径更短
                if (!visited[v] && dist[u] != Integer.MAX_VALUE && dist[u] + getWeight(u, v) < dist[v]) {
                    dist[v] = dist[u] + getWeight(u, v); // 更新最短距离
                    pq.offer(v); // 将v加入优先队列
                }
            }
        }

        // 打印最短路径结果
        printSolution(src);
    }

    // 假设边的权重为1(简化版,实际中可能需要一个二维数组来存储权重)
    private int getWeight(int u, int v) {
        return 1; // 假设所有边的权重都是1
    }

    // 打印从src到所有其他顶点的最短路径
    private void printSolution(int src) {
        System.out.println("从顶点 " + src + " 到其他顶点的最短路径:");
        for (int i = 0; i < numVertices; ++i) {
            if (dist[i] == Integer.MAX_VALUE)
                System.out.print(src + " 到 " + i + " : 无路径\n");
            else
                System.out.print(src + " 到 " + i + " : 距离 = " + dist[i] + "\n");
        }
    }

    // 示例用法
    public static void main(String args[]) {
        Graph g = new Graph(9);

        g.addEdge(0, 1, 1);
        g.addEdge(0, 7, 1);
        g.addEdge(1, 2, 1);
        g.addEdge(1, 7, 1);
        g.addEdge(2, 3, 1);
        g.addEdge(2, 8, 1);
        g.addEdge(3, 4, 1);
        g.addEdge(3, 5, 1);
        g.addEdge(4, 5, 1);
        g.addEdge(5, 6, 1);
        g.addEdge(6, 7, 1);
        g.addEdge(7, 8, 1);
     g.addEdge(8, 6, 1); // 继续添加边

        // 调用Dijkstra算法计算从顶点0到所有其他顶点的最短路径
        g.dijkstra(0);
    }
}

// 运行上述代码,将会得到从顶点0到所有其他顶点的最短路径距离

在上面的代码中,我添加了边和权重的添加方法,但是为了简化示例,getWeight 方法假设了所有边的权重都是1。在实际应用中,你可能需要一个二维数组或者其他数据结构来存储图中每对顶点之间的权重。

注意,Dijkstra算法不能处理包含负权重的图,因为它基于贪心策略,可能会选择局部最优解而非全局最优解。如果图中存在负权重边,应使用Bellman-Ford算法或者Floyd-Warshall算法等能够处理负权重的算法。

在main方法中,我添加了一些边和它们的权重(在这个例子中,我假设所有边的权重都是1),然后调用了dijkstra方法来计算从顶点0到所有其他顶点的最短路径。最后,printSolution方法将打印出计算结果。

3.哈夫曼编码(Huffman Coding)

哈夫曼编码是一种可变长度编码方式,用于无损数据压缩。它的基本原理是频繁出现的字符使用较短的编码,而不常出现的字符使用较长的编码。下面是一个简单的Java实现哈夫曼编码的示例,包括构建哈夫曼树和生成哈夫曼编码的步骤。

import java.util.*;

// 自定义的哈夫曼树节点类
class HuffmanNode implements Comparable<HuffmanNode> {
    char data; // 节点数据(字符)
    int frequency; // 节点频率(权值)
    HuffmanNode left, right; // 左右子节点

    // 构造函数
    public HuffmanNode(char data, int frequency) {
        this.data = data;
        this.frequency = frequency;
    }

    // 比较节点频率,用于优先队列排序
    @Override
    public int compareTo(HuffmanNode other) {
        return this.frequency - other.frequency;
    }
}

public class HuffmanCoding {
    // 哈夫曼编码
    Map<Character, String> huffmanCodes = new HashMap<>();

    // 从哈夫曼树生成编码
    private void generateCodes(HuffmanNode root, String str, Map<Character, String> codes) {
        if (root.left == null && root.right == null) {
            codes.put(root.data, str);
        } else {
            generateCodes(root.left, str + "0", codes);
            generateCodes(root.right, str + "1", codes);
        }
    }

    // 构建哈夫曼树
    private HuffmanNode buildHuffmanTree(Map<Character, Integer> freqMap) {
        PriorityQueue<HuffmanNode> minHeap = new PriorityQueue<>();

        // 初始化优先队列
        for (Map.Entry<Character, Integer> entry : freqMap.entrySet()) {
            minHeap.offer(new HuffmanNode(entry.getKey(), entry.getValue()));
        }

        // 构建哈夫曼树
        while (minHeap.size() != 1) {
            HuffmanNode left = minHeap.poll();
            HuffmanNode right = minHeap.poll();

            HuffmanNode top = new HuffmanNode('$', left.frequency + right.frequency);
            top.left = left;
            top.right = right;

            minHeap.offer(top);
        }

        return minHeap.poll(); // 返回根节点
    }

    // 主函数:构建哈夫曼编码
    public void createHuffmanCodes(String data) {
        // 字符频率映射
        Map<Character, Integer> freqMap = new HashMap<>();

        // 统计字符频率
        for (char c : data.toCharArray()) {
            freqMap.put(c, freqMap.getOrDefault(c, 0) + 1);
        }

        // 构建哈夫曼树
        HuffmanNode root = buildHuffmanTree(freqMap);

        // 生成哈夫曼编码
        generateCodes(root, "", huffmanCodes);

        // 打印哈夫曼编码
        for (Map.Entry<Character, String> entry : huffmanCodes.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }

    // 示例使用
    public static void main(String[] args) {
        HuffmanCoding huffmanCoding = new HuffmanCoding();
        String data = "this is an example for huffman coding";
        huffmanCoding.createHuffmanCodes(data);
    }
}

在这个实现中,我们定义了一个HuffmanNode类来表示哈夫曼树的节点,每个节点包含一个字符、一个频率以及左右子节点。HuffmanCoding类包含了构建哈夫曼树和生成哈夫曼编码的逻辑。我们使用了一个优先队列(最小堆)来根据频率选择节点来构建哈夫曼树。然后,我们遍历哈夫曼树来生成每个字符的哈夫曼编码,并将它们存储在huffmanCodes映射中。最后,我们在main函数中调用createHuffmanCodes方法来构建并打印哈夫曼编码。

实现高效的Java惰性版本Prim算法 Prim算法的基本思想是从一个起始顶点开始,逐步将该顶点所连接的边中权值最小的边加入生成树中,直到生成树包含所有顶点为止。为了保证生成树的连通性,我们需要维护一个标记数组来记录已经访问过的顶点。在本文中,我们将介绍如何使用Java实现一个高效的惰性版本的Prim算法。通过上述代码,我们可以看到在惰性版本的Prim算法中,我们使用了一个优先队列来存储候选边,并按照权值的大小进行排序。该算法的时间复杂度是O(ElogV),其中E是边的数量,V是顶点的数量。以上就是实现惰性版本的Prim算法的Java代码。 阅读详情

相关推荐

Java:实现Prim算法(附完整源码)

Java:实现Prim算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 623

0302Prim算法-最小生成树-图-数据结构和算法(Java)

0302Prim算法-最小生成树-图-数据结构和算法(Java)

gaogzhen的博客 568

Java贪心算法 最小生成树 单源最短路径 单机调度问题

单源最短路径 最小生成树 单机调度问题 三个Java算法

Prim算法(java)

一、Prim算法介绍   Prim(普利姆)算法是一种构造最小生成树的算法。Prim算法的时间复杂度为O(∣V∣2)O(|V|^2)O(∣V∣2),不依赖于EEE,因此它适用于求解边稠密的图的最小生成树。 二、Prim算法原理   (1)初始时从图中任取一顶点加入最小生成树MinTree顶点集合中。   (2)选择一个与当前MinTree中顶点集合距离最近的顶点,并将该顶点和相应的边加入MinTree中,每次操作后MinTree中的顶点数和边数都增1。   (3)重复(2)步骤,直到所有顶点都加入到MinT

weixin_43698993的博客 4393

基于STM32的简易电压、频率、占空比测量仪

任务详解:我们需要实现三个功能: 第一个是测频率的功能,输入信号为频率为1kHz~10kHz的三种波形(方波、三角波、正弦波),这也是我们最常见的三种波形。幅度是不需要测量的,所以先不关心幅度。 第二个是电压报警功能,当输入信号的幅度超过15V时,我们需要报警(这里我用了一个红色LED当报警器,有条件的还可以加个蜂鸣器)并且把此时的信号幅度显示在OLED屏幕上。 第三个是通信方式的要求,需要有串口通信功能。 第四个是计算占空比的任务,这个任务的输入是幅度为1V~10V、频率为20Hz ~1kHz的方波,需要

weixin_43469377的博客 7251

BUUCTF--[OGeek2019]babyrop

才学习了基本的ROP流程,到处找题练,不过也没做出来几道题,以这道32位的题作为例题吧。 这道题是BUUCTF上pwn练习题里的[OGeek2019]babyrop。 代码审计 老规矩先checksec一下: 没有canary保护,nx保护开启排除shellcode可能性,FULL RELEO为地址随机化。 观察主函数,先设定了一个闹铃,到时间就会强制退出程序,解除闹铃的方法在上一篇博客中提到过了, 这道题中闹铃函数依然对我们解题起不到什么干扰作用。 主函数的思路大概是:生成一个随机数,把这个随机数作为

N1rvana的博客 6007

贪心算法——最小生成树 Prim算法 Java

import java.util.Scanner; public class prim1 { public static void main(String[] args) { int [][] s=new int[100][100]; int i,j; int counter=2,startmin=1000; for( i=0;i<100;i++) { for( j=0;j<100;j++) { if(i==j) { s[i].

m0_45306991的博客 1590

IsaacLab 从入门到精通(一) 环境配置和依赖安装

本系列文章将针对机器人操作任务中的强化学习平台IsaacLab提供较为全面的教程

DejaWu33的博客 1万+

普利姆算法(Java)

1)普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n - 1 )条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图2)普利姆算法如下①设G = (V,E) 是连通图,T = (U,D) 是最小生成树, V、U是顶点集合,E,D是边的集合②若从顶点u开始构成最小生成树,则从集合V中取出顶点u放入集合U中,标记顶点v 的visited[u] = 1。

weixin_48544279的博客 1133

海康摄像头V3.4 升级改造VUE3

摘要:本文介绍了一个基于Vue3的海康威视摄像头组件封装方案。针对官方仅提供HTML版本SDK的问题,作者通过封装实现了Vue3组件化集成,解决了iframe/webview引入方式的弊端。组件核心功能包括实时预览、本地录像、录像下载、截图抓拍等,并优化了SDK初始化逻辑(单例模式)、定位问题修复和错误处理机制。关键技术点包括:1)SDK插件容器定位修复;2)录像下载进度监控;3)多格式图片数据处理;4)多窗口场景下的SDK实例管理。该组件可直接通过npm安装使用,提供了完善的API和事件接口,显著提升了海

LINLINLINShi的博客 113

DSP在线升级方案:TMS320C6678使用网络或者串口输出升级数据进行固件升级

下面这段先引用创龙的说明 IBL 运行后, 将从 NOR FLASH 或 NAND FLASH 的 0x00080000 地址引导 ELF/BBLOB 格式 用户程序。 当引导 ELF 格式用户程序时, IBL 会解析用户程序头部信息,并根据头部信息 拷贝不同的代码段至指定 CPU 内存地址,然后将 PC 指针跳转至_c_int00, 再运行用户程 序。当引导 BBLOB 格式用户程序时,由于无头部信息, IBL 会将用户程序拷贝至 0x9E000000 (该内存地址为 IBL 代码指定),并将 PC..

ToneChip的专栏,一个传统的嵌入式码农,裸机编程 1942

Prim算法模板(Java实现)

本文主要介绍的是Prim算法的模板(Java实现)

gaoqiandr的博客 771

STM32 USB键盘实现指南

在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。通过上述步骤,您可以在STM32上实现一个功能完整的USB键盘。关键点包括:正确配置USB HID设备实现键盘矩阵扫描处理按键事件并生成HID报告优化按键响应和消抖处理添加额外功能如宏键和LED反馈这个实现可以作为基础,进一步扩展为游戏键盘、宏键盘或特殊输入设备。

suny8的专栏 969

贪心法实现Prim最小生成树(java)

class TTreeEdge                                                          //用来存储边信息(起始点,终止点,权值){    float v1,v2;    long weight;}public class Prim {    /**     * @param args the command line arguments     */    public long MinSpanningTree(int[][] g,int n,TT

荷塘月色 798

X书x-mini-sig_x-mini-mua

X书的tiny风控代码,成功运行x-mini-sig|x-mini-mua

Codeooo 博客 1万+

Hugging Face快速入门(重点讲解模型(Transformers)和数据集部分(Datasets))

1. Hugging Face是什么,提供了哪些内容 2. Hugging Face模型的使用(Transformer类库) 3. Hugging Face数据集的使用(Datasets类库)

iioSnail的博客 8万+

prim算法(java)附代码

记录prim算法学习

小菜鸟博客 2143

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java实现prim算法

java实现prim算法

QAQseasea的博客 452

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Java数据结构】最小生成树prim算法kruskal算法和并查集

最小生成树prim算法kruskal算法和并查集优化实现

fjf_666的博客 214

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java 语言实现最小生成树算法(如Prim算法、Kruskal算法)

之后,每次将离生成树最近的顶点添加到生成树中,并将所选顶点与其余顶点的边进行比较,选择最小边加入生成树,直至所有顶点都加入生成树。从时间复杂度上来看,当图稠密时,Prim算法的效率更高,而当图稀疏时,Kruskal算法效率更高。本文深入探讨了Prim算法和Kruskal算法的原理和实现,并比较了它们的优缺点。代码中包含了Prim算法和Kruskal算法的实现,并提供了一个简单的图示例进行测试。Prim算法和Kruskal算法的空间复杂度均为O(|V|+|E|),其中|V|表示顶点数,|E|表示边数。

三流程序员,三流的技术,一流的态度和真心,期待和你们交流合作🤝🤝🤝。 1130

【Java数据结构】04-图(Prim,Kruskal,Dijkstra,topo)

讲解最小支撑树(Prim算法、Kruskal算法)、最短路径(Dijkstra算法)、拓扑排序的实现,图的定义、邻接矩阵和邻接表、DFS和BFS(广度优先遍历和深度优先遍历)

m0_73569204的博客 1338

[Java学习] 最小生成树——Prim算法

文章目录最小生成树Prim算法流程应用实例求最小生成树 最小生成树 百度百科上对于最小生成树的定义是这样的:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 通俗的解释最小生成树包括以下两点:(1) 最小;(2) 树。 对于树的概念,必须满足以下两条性质: (1)图中没有任何环; (2)必须连接所有顶点且都是互通的; 故,对于一个有N个顶点的树,他有N-1条边。 接下来是最小。一个图会有若干个生成树,我们把这些生成树边的权值相加称为权值.

Admzy的博客 3297

基础图算法|prim算法的Java实现

prim算法的Java实现

weixin_48118167的博客 366

java实现prim算法,详细注释

用java实现prim算法,详细的注释 import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Prim算法的思想是任取途中一个顶点i作为起始点,并将其加入到S集合中。从V-S(V表示所有顶点)的集合中 * 选取一条到S集合的顶点最短的边。例如S集合中有(1,2)两个顶点,V-S集合中有(4,5,6)三个顶点,那么 * 取(1,4) (1,5) (1,6) (2,4) (2,5) (2,6)这

一切都会过去的博客 1277

Java实现之普利姆(Prim)算法

1)普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图2)普利姆的算法如下:(1)设G=(V,E)是连通网,T=(U,D)是最小生成树,v,u是顶点集合,E,D是边的集合(2)若从顶点u开始构造最小生成树,则从集合v中取出顶点u放入集合u中,标记顶点v的(3若集合u中顶点ui与集合v-u中的顶点vj之间存在边,则寻找这些边中权值最小的边,但不。

qq_64580912的博客 823

【贪心算法的Java实现及其应用】

贪心算法是一种在解决问题时总是做出在当前看来是最好选择的算法。贪心算法的基本思想是通过每一次的局部最优解来达到全局最优解。贪心算法可以应用于许多问题,如求解最大最小问题、最优装载问题、哈夫曼编码等。

我是Java程序员廖志伟,感谢朋友们的支持! 1002
上一篇: 【用JAVA实现动态规划算法】1.背包问题2.最长公共子序列 3.最长上升子序列
下一篇: 【用JAVA实现分治算法】 1.快速排序(Quick Sort) 2.归并排序(Merge Sort) 二分查找(Binary Search),嘿嘿嘿
代码无疆
博客等级 码龄3年 4万+粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值