稀疏矩阵——三元组(表示,转置)


前言

三元组稀疏矩阵是一种用于表示稀疏数据结构的方法,特别是在图论、网络分析和科学计算等领域。它通常用于存储大规模的矩阵,其中大部分元素都是零,而只有少数非零元素(也称为“三元组”)占据了矩阵的主要部分。这种矩阵的每个元素由三个要素组成:行索引、列索引和对应的值。由于大多数位置是空的,所以相比于传统的二维数组,三元组稀疏矩阵占用的内存更少,提高了空间效率。

在处理像社交网络这样的大型数据集时,三元组稀疏矩阵能够有效地存储边(节点之间的连接),同时减少了不必要的存储需求。例如,Facebook的亿维邻接列表就是一种基于三元组稀疏矩阵的数据结构。


一、三元组是什么?

三元组是指由三个元素组成的有序集合。在计算机科学中,三元组常用于表示关系数据库中的一条记录。每个三元组都由三个字段组成,分别表示记录的不同属性或特征。例如,在一个学生数据库中,一个三元组可以包含学生的姓名、年龄和学号。三元组可以用于描述和表示各种对象、关系或事件。该类定义了一个名为Triple的泛型类,用于存储三个不同类型的数据。具体功能如下:

public static class Triple<T1, T2, T3> {
    private T1 first;
    private T2 second;
    private T3 third;
  

  Triple[] triple = new Triple[12];

这段代码定义了一个名为 triple 的数组,该数组的元素类型为 Triple,并且分配了内存空间来存储12个 Triple 类型的对象。
Triple[] triple;:声明一个 Triple 类型的数组 triple。
triple = new Triple[12];:为 triple 分配空间,能容纳12个 Triple 对象。 


  Triple<Integer, Integer, Integer>[] arr;
    arr = new Triple[12];
    arr[1] = new Triple<>(1, 3, 4);
    arr[2] = new Triple<>(2, 2, 3);
    arr[3] = new Triple<>(3, 4, 5);
    arr[4] = new Triple<>(5, 5, 6);
    arr[5] = new Triple<>(4, 5, 7);
    arr[6] = new Triple<>(6, 7, 8);
    arr[7] = new Triple<>(10, 8, 9);
    arr[8] = new Triple<>(8, 8, 10);
    arr[9] = new Triple<>(9, 10, 11);
    arr[10] = new Triple<>(7, 11, 12);
    arr[11] = new Triple<>(5, 1, 51);

 该代码段初始化了一个名为arr的数组,并为其部分元素赋值,每个元素都是Triple对象。Triple对象通常包含三个值。此处的赋值如下:
arr[1]至arr[11]位置分别被赋予了不同的Triple对象。
每个Triple对象包含三个整型值,例如arr[1]的值为(1, 3, 4)。


int[] num = new int[13];
 for (int i = 1; i < arr.length; i++) {
       num[arr[i].getSecond()]++;
 }

 该Java代码片段初始化一个大小为13的整数数组num,然后遍历数组arr(排除第一个元素)。对于arr中的每个元素,获取其getSecond方法返回的值作为num的索引,并对该位置的计数器加一。简言之,它统计了arr中每个元素的second值出现次数


 int[] pos = new int[12];
    pos[1] = 1;//第一列的起始位置为1,这个很关键
    for (int i = 2; i < pos.length; i++) {
        pos[i] = pos[i - 1] + num[i - 1];
    }

该Java代码初始化一个长度为12的整型数组pos,并设置其第一个非零元素为1。然后通过循环计算数组后续每个元素的值,每个元素等于前一个元素加上对应位置的num数组值。这可能用于计算累计和或位置偏移。具体功能如下:
初始化pos数组;
设置pos[1]为1;
循环计算pos[2]至pos[11]的值。  


 for (int i = 1; i < arr.length; i++) {
        Integer temp;
        triple[pos[arr[i].getSecond()]].setThird(arr[i].getThird());//把元素赋值到triple
        temp = arr[i].getFirst();//临时变量
        triple[pos[arr[i].getSecond()]].setFirst(arr[i].getSecond());//把列元素赋值到triple的行元素
        triple[pos[arr[i].getSecond()]].setSecond(temp);//把行元素赋值到triple的列元素
        pos[pos[arr[i].getSecond()]]++;//更新位置,这个很关键
    }

该Java代码段遍历数组arr(从索引1开始),并将相关信息存储到triple和pos两个数据结构中。具体步骤如下:
将arr[i]的第三个元素值赋给triple的指定位置。
用临时变量temp存储arr[i]的第一个元素值。
将arr[i]的第二个元素值赋给triple的对应行索引。
将temp中的值赋给triple的对应列索引。
更新pos数组中的值。 

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤舟独钓寒江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值