【alg4-无向图】符号图

符号图

在典型应用中,图都是通过文件或者网页定义的,使用的是字符串而非整数来表示和指代顶点。为了适应这样的应用,我们定义了拥有以下性质的输入格式:

  • 用指定的分隔符来隔开顶点名;
  • 每一行都表示一组边的集合,每一条边都连接着这一行的第一个名称表示的顶点和其他名称所表示的顶点;
  • 顶点总数V和边的总数E都是隐式定义的。

如图所示表示的是一个小型运输系统的模型,其中表示每个顶点的是美国机场的代码,连接它们的边则表示顶点之间的航线。
在这里插入图片描述

API

用符号作为顶点名的图的API:

API功能
SymbolGraph(String filename, String delim)根据filename指定的文件构造图,使用delim来分隔顶点名
boolean contains(String key)key是一个顶点吗
int index(String key)key的索引
String name(int v)索引v的顶点名
Graph G()隐藏的Graph对象

实现

SymbolGraph用到了以下三种数据结构:

  • 一个符号表st,键的类型为String(顶点名),值的类型为int(索引);
  • 一个数组keys[],用作反向索引,保存每个顶点索引所对应的顶点名;
  • 一个Graph对象G,它使用索引来引用图中顶点。

在这里插入图片描述

SymbolGraph会遍历两遍数据来构造以上数据结构,这主要是因为构造Graph对象需要顶点总数V。

测试用例

用最少的边找到一种从一个机场到达另一个机场的方法:
其中符号表用到了SequentialSearchST,无向图用到了Graph,广度优先搜索用到了BreadthFirstPaths

package section4_1;

import section3_1.SequentialSearchST;

public class SymbolGraph {

    private SequentialSearchST<String, Integer> st;
    private String[] keys;
    private Graph G;

    public SymbolGraph(String[] data,String sp) {
        //构造索引
        st = new SequentialSearchST<>();
        int idx = 0;
        while (idx < data.length) {
            String[] a = data[idx].split(sp);
            for (int i = 0;i < a.length;i++) {
                if (!st.contains(a[i])) {
                    st.put(a[i],st.size());
                }
            }
            idx++;
        }

        //反向索引
        keys = new String[st.size()];
        for (String name : st.keys()) {
            keys[st.get(name)] = name;
        }

        //构造图
        G = new Graph(st.size());
        idx = 0;
        while (idx < data.length) {
            String[] a = data[idx].split(sp);
            int v = st.get(a[0]);
            for (int i = 1;i < a.length;i++) {
                G.addEdge(v,st.get(a[i]));
            }
            idx++;
        }
    }

    public boolean contains(String s) {
        return st.contains(s);
    }

    public int index(String s) {
        return st.get(s);
    }

    public String name(int v) {
        return keys[v];
    }

    public Graph G() {
        return G;
    }

    public static void main(String[] args) {

        String[] data = {
                "JFK MCO",
                "ORD DEN",
                "ORD HOU",
                "DFW PHX",
                "JFK ATL",
                "ORD DFW",
                "ORD PHX",
                "ATL HOU",
                "DEN PHX",
                "PHX LAX",
                "JFK ORD",
                "DEN LAS",
                "DFW HOU",
                "ORD ATL",
                "LAS LAX",
                "ATL MCO",
                "HOU MCO",
                "LAS PHX"
        };
        SymbolGraph sg = new SymbolGraph(data," ");
        Graph G = sg.G();

        String source = "JFK";
        if (!sg.contains(source)) {
            System.out.println(source + "not in database.");
            return;
        }
        int s = sg.index(source);
        BreadthFirstPaths bfs = new BreadthFirstPaths(G,s);

        String sink = "LAS";
        if (sg.contains(sink)) {
            int t = sg.index(sink);
            if (bfs.hasPathTo(t)) {
                for (int v : bfs.pathTo(t)) {
                    System.out.println(sg.name(v));
                }
            } else {
                System.out.println("not connected");
            }
        } else {
            System.out.println("not in database.");
        }
    }
}

在这里插入图片描述

stk-alg-server 是指"算法服务端"。在计算机科学中,算法是一种解决问题的方法和步骤,而算法服务端则是提供算法计算能力的服务器。 stk-alg-server 提供了各种算法,可以根据客户的需求来执行不同的算法操作。它可以处理各种类型的数据,如数值、文本、像等,以及不同领域的问题,如机器学习、数据挖掘、像识别等。 算法服务端的工作流程一般包括以下几个步骤: 1. 接收请求:算法服务端通过网络接口接收客户端发送的请求。请求可以包括要处理的数据和所需的算法类型。 2. 数据处理:对接收到的数据进行预处理,例如数据清洗、标准化等操作,以确保数据的准确性和一致性。 3. 算法计算:根据客户端请求的算法类型,使用相应的算法对数据进行计算和处理。常见的算法有排序算法、搜索算法、聚类算法等。 4. 结果返回:将算法计算得到的结果返回给客户端。结果可以是计算得到的数值、分析报告、像等形式。 5. 错误处理:在处理请求的过程中,可能会遇到错误或异常情况。算法服务端需要捕获并处理这些错误,以保证系统的稳定性和可靠性。 stk-alg-server 的应用非常广泛。它可以用于科学研究、工程设计、金融分析等各种领域。客户可以通过调用算法服务端的接口,利用其强大的计算能力和丰富的算法库,来解决复杂的问题和提升工作效率。同时,算法服务端还可以进行算法的优化和更新,以满足不断变化的客户需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值