日撸 Java 三百行day37

news2024/11/24 12:41:20

文章目录

  • 说明
  • day37 十字链表
    • 1.思路整理
      • 1.1十字链表的数据结构:
      • 1.2 手动模拟十字链表
    • 2.代码分析
      • 2.1 十字链表的构造
      • 2.2 单元测试

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

day37 十字链表

1.思路整理

1.1十字链表的数据结构:

由弧节点和顶点节点组成。其中每个节点的含义一定要清楚,不然很容易就晕了(如下图)
在这里插入图片描述

1.2 手动模拟十字链表

在知道了数据结构后手动模拟画出十字链表(十字链表我觉得画都很麻烦,所以一定要先弄懂他是怎么画的再去理解代码可能会更好些)其中起点和弧尾是相同表达意思,终点和弧头是相同表达意思
在这里插入图片描述

  • 先画出度
    先将每个顶点的firstOut指向以该顶点为弧尾的第一个节点(如a节点,以a节点为弧尾的有b和c,其中a节点的fisrtOut指向以a为起点b为终点的弧节点),而在指向弧节点的4个域中,第4个域tlink,指的是链接弧尾相同的顶点(以a为弧尾b为弧头的弧节点的第4个域指向以a为弧尾c为弧头的弧节点),所以就有如下图:
    在这里插入图片描述
  • 再画入度
    上面只画出了弧尾的指向,现在画弧头的指向,画法和上面画弧尾指向类似。每个顶点的firstIn指向以该顶点为弧头的第一个节点(如a节点,以a节点为弧头的有c,d, 其中a节点的firstOut指向以c为起点a为终点的弧节点)而在指向弧节点的4个域中,第3个域hlink,指的是链接弧头相同的顶点(以c为弧尾a为弧头的弧节点的第3个域指向以d为弧尾a为弧头的弧节点)
    在这里插入图片描述

2.代码分析

2.1 十字链表的构造

我觉得十字链表的初始化比之前邻接矩阵和邻接表的初始化都更难,相比领接表容易找到出度,逆邻接表容易找到入度。十字链表即能很容易找到入度也很容易找到出度,所以他的数据结构也复杂一些。结合上面的图,可以将十字链表的初始化分为两部分,先初始化他的出度的链接,再初始化他入度的链接。

  • 对于初始化出度的链接,判断出度是否为0,可以借助矩阵paraMatrix[i][j] == 0,i行j列表示i是否指向j(即是否以i顶点为弧尾)

  • 对于初始化入度的链接,是遍历每一个头节点所链接的弧节点,使每个弧节点的第三个域(nextIn)去链接弧头相同的节点,弧节点的第二个域(即代码中的column)代表的是头节点的位置
    tempColumnNodes[tempNode.column].nextIn = tempNode; // 说明他俩的弧头结点相同,
    tempColumnNodes[tempNode.column] = tempNode; // 并更新结点的值
    tempNode = tempNode.nextOut;// 判断下一个链接的结点

链接一个节点后要及时移动位置。感觉这段代码用语言不好描述,一定要图上模拟才更容易理解

package graph;

/**
 * @author: fulisha
 * @description:Orthogonal List for directed graph.
 */
public class OrthogonalList {
    class OrthogonalNode {
        int row;
        int column;
        /**
         * The next out node.
         */
        OrthogonalNode nextOut;

        /**
         * The next in node.
         */
        OrthogonalNode nextIn;

        /**
         * the first constructor
         * @param paraRow
         * @param paraColumn
         */
        public OrthogonalNode(int paraRow, int paraColumn) {
            row = paraRow;
            column = paraColumn;
            nextOut = null;
            nextIn = null;
        }
    }

    /**
     * The number of nodes. This member variable may be redundant since it is always  equal to headers.length
     */
    int numNodes;

    /**
     * The headers for each row.
     */
    OrthogonalNode[] headers;

    public OrthogonalList(int[][] paraMatrix) {
        numNodes = paraMatrix.length;

        // Step 1. Initialize. The data in the headers are not meaningful.
        OrthogonalNode tempPreviousNode, tempNode;
        headers = new OrthogonalNode[numNodes];

        // Step 2. Link to its out nodes.
        for (int i = 0; i < numNodes; i++) {
            headers[i] = new OrthogonalNode(i, -1);
            tempPreviousNode = headers[i];
            for (int j = 0; j < numNodes; j++) {
                if (paraMatrix[i][j] == 0) {
                    continue;
                }
                tempNode = new OrthogonalNode(i, j);

                tempPreviousNode.nextOut = tempNode;
                tempPreviousNode = tempNode;
            }
        }

        //Step3 Link to its in nodes. This step is harder
        OrthogonalNode[] tempColumnNodes = new OrthogonalNode[numNodes];
        for (int i = 0; i < numNodes; i++) {
            tempColumnNodes[i] = headers[i];
        }
        for (int i = 0; i < numNodes; i++) {
            tempNode = headers[i].nextOut;
            while (tempNode != null) {
                tempColumnNodes[tempNode.column].nextIn = tempNode;
                tempColumnNodes[tempNode.column] = tempNode;

                tempNode = tempNode.nextOut;
            }
        }
    }

    @Override
    public String toString() {
        String resultString = "Out arcs: ";

        OrthogonalNode tempNode;
        for (int i = 0; i < numNodes; i++) {
            tempNode = headers[i].nextOut;
            while (tempNode != null) {
                resultString += " (" + tempNode.row + ", " + tempNode.column + ")";
                tempNode = tempNode.nextOut;
            }
            resultString += "\r\n";
        }
        resultString += "\r\nIn arcs: ";

        for (int i = 0; i < numNodes; i++) {
            tempNode = headers[i].nextIn;

            while (tempNode != null) {
                resultString += " (" + tempNode.row + ", " + tempNode.column + ")";
                tempNode = tempNode.nextIn;
            }
            resultString += "\r\n";
        }

        return resultString;
    }

    public static void main(String[] args) {
        int[][] tempMatrix = { { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 1, 0, 0, 0 }, { 0, 1, 1, 0 } };
        OrthogonalList tempList = new OrthogonalList(tempMatrix);
        System.out.println("The data are:\r\n" + tempList);
    }

}

2.2 单元测试

在这里插入图片描述
结合图画出的十字链表
在这里插入图片描述
程序运行的结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/460414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ambari的kafka服务开启sasl

添加 sasl 配置⽂件 集群部署 Kafka2.2下载地址 http://archive.apache.org/dist/kafka/2.2.1/kafka_2.11-2.2.1.tgz 解压安装包 tar -zxvf kafka_2.11-2.2.1.tgz 部署略 ambari 数据kafka服务 在kafka的conf目录下创建sasl_conf目录,将kafka_client_jaas.conf/kafka_se…

深入浅出MySQL——CRUD

文章目录 表的增删改查Create单行数据全列插入多行数据指定列插入插入否则更新替换——REPLACE RetrieveSELECT 列WHERE 条件结果排序筛选分页结果 UpdateDelete删除数据截断表 插入查询结果聚合函数group bywhere和having SQL查询中各个关键字的执行先后顺序函数日期函数字符串…

SQL优化(3):order by优化

MySQL的排序&#xff0c;有两种方式&#xff1a; Using filesort : 通过表的索引或全表扫描&#xff0c;读取满足条件的数据行&#xff0c;然后在排序缓冲区sort buffer中完成排序操作&#xff0c;所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index :…

IDEA 使用系列之 Alibaba Cloud Toolkit 一件部署

一、前文 做开发&#xff0c;免不了要往服务器部署前端后端&#xff0c;首先要用xftp把前后端所在文件夹打开&#xff0c;把jar、dist备份再上传&#xff0c;然后再打开xshell把前后端kill掉&#xff0c;然后再敲命令重新启动前后端&#xff0c;少则2、3分钟&#xff0c;多则10…

创新案例|探索 Snyk 的 PLG 团队1.6倍年度 ARR 增长背后的策略

组织架构不匹配、权责分配不清晰以及团队协作无机制是推进PLG业务面临的三大核心挑战&#xff0c;而安全软件公司Snyk以其指数级营收和估值增长的成功实践证明&#xff0c;构建合适且高效团队是助力PLG创新实现高速增长的关键&#xff0c;其经验值得借鉴。本文将通过分析Synk如…

Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换

场景 JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示&#xff1a; JavaGeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示_霸道流氓气质的博客-CSDN博客 在上面实现Java中集成Geotools之后&#xff0c;需求是将WKT数据转换成其他坐标系的W…

计算机网络-如何寻找目标主机

视频参考链接&#xff1a;计算机网络-如何寻找目标计算机&#xff1f;_哔哩哔哩_bilibili 在互联网中如果使计算机A与计算机B如何进行通信&#xff0c;又是如何找到目标的计算机主机呢&#xff1f; 首先最简单的通信就是两台计算机中间加一根网线&#xff0c;那么这两台计算机…

算法基础—哈希表散列表的构建和处理冲突

1 哈希表的构建 1. 直接寻址法 取关键字或者关键字的某个线性函数值作为哈希地址,即H(Key)Key或者H(Key)a*Keyb(a,b为整数),这种散列函数也叫做自身函数.如果H(Key)的哈希地址上已经有值了,那么就往下一个位置找,知道找到H(Key)的位置没有值了就把元素放进去. 2. 数字分析法…

idea中导入spring源码;在spring源码中添加注释

标题&#xff1a;idea中导入spring源码;在spring源码中添加注释 我是跟着他操作的&#xff0c;下文是一些补充说明&#xff1a; 这个也可以借鉴 gradle下载链接【使用网盘下载】,不过有的没有&#xff0c; gradel下载链接&#xff1a;这个比较全 1.Spring源码编译环境 spr…

股票期货模拟交易有用吗?股票期货模拟交易心得

股票期货市场为了满足新用户的需求&#xff0c;有专门的股票期货模拟交易平台&#xff0c;大家可以在这个平台上进行股票期货的模拟交易&#xff0c;这样可以通过不断总结&#xff0c;丰富我们的知识。下面整理的股票期货模拟交易实验心得&#xff0c;从股票期货模拟交易与实盘…

远程 PC 访问软件

什么是远程电脑 远程电脑是物理上无法访问的计算机。不同分支机构中的漫游用户和员工的设备将是组织中 IT 管理员的远程计算机。 什么是远程 PC 访问 远程 PC 访问是一种控制物理无法触及的设备的功能。计算机、笔记本电脑、端点&#xff01;它们始终分散在全球各地的 IT 环…

【应用部署】Java项目从开发到部署生产完整流程

文章目录 背景一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…

数据库基础篇 《10.创建和管理表DDL》

目录 1. 基础知识 1.1 一条数据存储的过程 1.2 标识符命名规则 ​1.3 MySQL中的数据类型 ​ 2. 创建和管理数据库 2.1 创建数据库 2.2 使用数据库 2.3 修改数据库 2.4 删除数据库 3. 创建表 3.1 创建方式1 3.2 创建方式2 ​3.3 查看数据表结构 4. 修改表 4.1…

2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解

作者 | 曾响铃 文 | 响铃说 今天&#xff0c;软件行业正呈现出江河入海一般的大汇流趋势。 一方面是技术的汇流&#xff0c;诸如人工智能等前沿技术与软件行业的深度融合&#xff0c;正全面颠覆软件产品的开发模式和服务逻辑。 另一方面则是行业的汇流&#xff0c;数字化浪…

PyEcharts数据可视化(1)——配置项

PyEcharts 学习连接 一、查看pyecharts版本 import pyecharts print(pyecharts.__version__)输出&#xff1a;1.9.0 二、绘制第一个图表 from pyecharts.charts import Bar bar Bar() # 创建柱形图对象 bar.add_xaxis(["衬衫","羊毛衫","雪纺衫…

创建路由React router(使用react-router dom V6版本)

React路由 隔了很长一段时间&#xff0c;重新捡起来React学习。 发现React的路由从原来的 Switch改成了Routes。nice&#xff0c;nice&#xff0c;nice&#xff01;&#xff01;&#xff01;&#xff01; 刚开始接触确实还是有一点生疏的。之前的关于【传参】【js跳转】【跳转模…

管理后台项目-06-用户管理角色管理模块

目录 1-路由信息搭建和api文件信息创建 2-用户管理模块 2.1-列表数据获取以及动态渲染 2.2-添加 | 修改 用户 2.3-删除-批量删除用户 2.4-分配角色 3-角色管理 3.1-修改角色 3.2-分配权限 1-路由信息搭建和api文件信息创建 我们先进行路由菜单的配置&#xff0c;在系统…

【测试开发】测试人的养成记,在这测试内卷乱世中突破测试开发...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 这几年&#xff0…

442. 数组中重复的数据|||41. 缺失的第一个正数|||485. 最大连续 1 的个数

442. 数组中重复的数据 题目 给你一个长度为 n 的整数数组 nums &#xff0c;其中 nums 的所有整数都在范围 [1, n] 内&#xff0c;且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数&#xff0c;并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅…

Python如何连接Mysql及基本操作

1.什么要做python连接mysql&#xff0c;一般是解决什么问题的 做自动化测试时候&#xff0c;注册了一个新用户&#xff0c;产生了多余的数据&#xff0c;下次同一个账号就无法注册了&#xff0c;这种情况怎么办呢&#xff1f;自动化测试都有数据准备和数据清理的操作&#xff…