【数组、特殊矩阵的压缩存储】

news2024/12/26 22:44:02

目录

  • 一、数组
    • 1.1、一维数组
      • 1.1.1 、一维数组的定义方式
      • 1.1.2、一维数组的数组名
    • 1.2、二维数组
      • 1.2.1、二维数组的定义方式
      • 1.2.2、二维数组的数组名
  • 二、对称矩阵的压缩存储
  • 三、三角矩阵的压缩存储
  • 四、三对角矩阵的压缩存储
  • 五、稀疏矩阵的压缩存储

一、数组

概述:数组是一个集合,用于存放相同数据类型的元素

1. 特点一: 数组中的每个数据元素具有相同的数据类型;
2. 特点二: 数据占用一段连续的内存空间

1.1、一维数组

1.1.1 、一维数组的定义方式

  1. 只能用数字,字母和下划线命名,且不能用数字作为开头,注意数组名不要与其他变量名重复;
  2. 数组的下标从0开始。
    一维数组的三种定义方式:
    第一种:
//数据类型 数组名[数组长度];
int main(){
    int arr[10];//定义一个长度为10的数组,数组元素为int型
    //使用数组下标对数组元素进行访问
    arr[0] = 10;//数组第一个元素的下标为0
    arr[2] = 20;
    arr[9] = 20;//数组最后一个元素的下标为9,对于长度为i的数组,最后一位元素的下标即为i-1
}

注意:定义数组时,若未给定数组元素的初始值,则必须指定数组的长度,否则提示错误,因为编译时需要分配空间,数组长度未知的话,无法进行分配。
第二种:

//数据类型 数组名[数组长度] = {值1, 值2,...};
int main(){
    int arr[10] = {1, 2, 3, 4};//未设定初始值的后6位元素默认为0
}

注意: 数组初始化时,若大括号{}内的元素个数小雨定义的数组长度,则剩余的数组元素默认为0。
第三种:

//数据类型 数组名[] = {值1, 值2, ...};
int main(){
    int arr[] = {1,2,3,4,5,6,7,8,9,10};//数组长度为10
}

注意: 定义数组元素时,数组可以不用指定数组长度,数组长度由所定义元素的数量决定。

1.1.2、一维数组的数组名

作用一: 统计数组所占用的内存空间、数组中单个数据元素所占用的内存空间、数组的长度,如下:

#include<iostream>
using namespace std;

int main(){
    int arr[10];
    cout<<"数组arr用内存空间为"<<sizeof(arr)<<endl;//40
    cout<<"数组arr中单个元素占用内存空间为:"<<sizeof(arr[0])<<endl;//4
    cout<<"数组长度为:"<<sizeof(arr)/sizeof(arr[0])<<endl;//10
    return 0;
}

作用二: 获取数组在内存中的地址,如下:

int main(){
    int arr[10];
    cout<<arr<<endl;//获取数组的首地址
    cout<<&arr[0]<<endl;//获取数组的首地址
    cout<<&arr<<endl;//获取整个数组的地址
    return 0;
}

注意: arr/&arr[0]和&arr虽然数值相同,但是含义不同!&数组名表示指针,对程序做出如下变化:

#include<iostream>

using namespace std;

int main() {
	int arr[10];
	cout << "数组长度为:" << sizeof(arr) << endl;
	cout << "" << sizeof(arr[0])<< endl;
	cout << "首地址为:"<<arr<<endl;
	cout << "地址为:" << arr+1<< endl;//与之前相差4
	cout << "首地址为:" << &arr[0] << endl;
	cout << "数组地址为:" << &arr << endl;
	cout << "地址为:" << &arr +1<< endl;//与之前相差了40
	return 0;
}

运行结果为:
在这里插入图片描述
注意:

  1. 数组名是常量,不能进行赋值,否则会报错;

1.2、二维数组

1.2.1、二维数组的定义方式

二维数组有四种定义方式;

  1. 数据类型 数组名[行数][列数];
  2. 数据类型 数组名[行数][列数] = {数据1, 数据2, 数据3};
  3. 数据类型 数组名[行数][列数] = {{数据1, 数据2}, {数据3, 数据4},{数据5, 数据6}};
  4. 数据类型 数组名[][列数] = {数据1, 数据2, 数据3, 数据4};
    第3种定义方式最直观,可以提高代码的可读性;
    第2种和第4种要根据二维数组的列数推断数组元素**(可以省略行数,不能省略列数)**;
    定义二维数组时,若已经初始化数据,可以省略行数。
    示例如下:
#include<iostream>

using namespace std;

int main() {
    int arr[][2] = { {1,2},{4,5} };
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
        for (int j = 0; j < sizeof(arr[i]) / sizeof(arr[i][0]);j++) {
            cout << arr[i][j] << "";
        }
        cout << endl;
    }
    return 0;
}

运行结果为:
在这里插入图片描述
注意cout时的格式!

1.2.2、二维数组的数组名

二维数组名称的作用:

1. 计算二维数组所占内存空间;

    cout << "二维数组所占空间为:" <<sizeof(arr) <<endl;
    cout << "二维数组中第1行所占空间为:" << sizeof(arr[0]) << endl;
    cout << "二维数组中某个元素所占空间为:" << sizeof(arr[0][1]) << endl;

运行结果为:
在这里插入图片描述

2. 计算二维数组的行数和列数

求行数:sizeof(arr)/sizeof(arr[0]);//即数组元素总数/每一行的元素数
求列数:sizeof(arr[0])/sizeof(arr[0][0])

3. 获取二维数组中的相关地址

二维数组首地址:arr[0]或者&arr[0][0]
二维数组第一个元素的地址:arr[0]&arr[0][0]
二维数组第一行的地址:arr或arr[0]或arr+0*(arr+0)
二维数组第i行的地址:arr[i]&arr[0]+i或*(arr+i)
二维数组第i行首元素的地址:arr[i]或arr+i或&arr[0]+i或*(arr+i)
二维数组第i行第j列元素的地址:&arr[i][j]*(arr+i)+j

4. 通过指针解引用访问或操作某元素*(*(arr+i)+j)

二、对称矩阵的压缩存储

对称矩阵的矩阵压缩:
若n阶方阵中任意一个元素在这里插入图片描述都有在这里插入图片描述,则称该矩阵为对称矩阵,对于对称矩阵,只须存储对角线+下三角区。若按照优先原则将各元素存入一维数组中,即在这里插入图片描述存入数组在这里插入图片描述中,那么数组在这里插入图片描述共有在这里插入图片描述个元素。对于k,有:
在这里插入图片描述
在这里插入图片描述

三、三角矩阵的压缩存储

  1. 下三角矩阵:除了主对角线和下三角区,其余的元素都相同;
  2. 上三角矩阵:除了主对角线和上三角区,其余的元素都相同。
  3. 压缩存储策略:按行优先原则将主对角线+下三角区存入一维数组中,并在最后一个位置存储常量,即在这里插入图片描述存入数组在这里插入图片描述中,那么数组在这里插入图片描述共有在这里插入图片描述个元素。对于k,有:
    在这里插入图片描述
    在这里插入图片描述

四、三对角矩阵的压缩存储

三对角矩阵:又称为带状矩阵:当在这里插入图片描述时,有在这里插入图片描述。对于三角矩阵,按行优先原则,只存储带状部分,即在这里插入图片描述存入数组在这里插入图片描述中,那么k=2ij - 3。若一直数组下标k,则i =
在这里插入图片描述

五、稀疏矩阵的压缩存储

稀疏矩阵的非零元素远远少于矩阵元素的个数,压缩存储策略:

  1. 三元数组<行, 列,值>
i(行)j(列)v(值)
134
165
223
249
356
422

注意:此处的行列下标从1开始。

  1. 十字链表
    在这里插入图片描述

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

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

相关文章

香橙派AIpro:体验强劲算力,运行ROS系统

文章目录 前言一、香橙派AIpro开箱及功能介绍1.1香橙派AIpro开箱1.2香橙派AIpro功能介绍 二、香橙派AIpro资料下载及环境搭建2.1资料下载2.2环境搭建2.3使用串口启动进入开发板2.4使用HDMI线接入屏幕启动 三、部署ROS系统四、香橙派AIpro的使用和体验感受 前言 本篇文章将带体…

sip协议栈简介

SIP协议栈简介 SIP协议栈流程 数据链路层&#xff1a;当SIP消息从网络中传输到达TCP/IP协议栈时&#xff0c;首先被接收到的是数据链路层的数据帧。数据链路层会对数据帧进行解封装&#xff0c;得到网络层的IP数据报。 网络层&#xff1a;网络层会对IP数据报进行解析&#xf…

js实现 JSON数据格式化的两种方法

本次方法不使用JS库直接采用原生JS 完整HTML代码如下&#xff0c;您可以复制代码然后&#xff0c;新建一个.html的网页进行保存即可体验 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><b…

Xcode 16 beta3 真机调试找不到 Apple Watch 的尝试解决

很多小伙伴们想用 Xcode 在 Apple Watch 真机上调试运行 App 时却发现&#xff1a;在 Xcode 设备管理器中压根找不到对应的 Apple Watch 设备。 大家是否已将 Apple Watch 和 Mac 都重启一万多遍了&#xff0c;还是束手无策。 Apple Watch not showing in XCodeApple Watch wo…

android13 文件管理器无法安装apk 奔溃问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.我们简单写个apk测试下 3.排查客户apk 4.frameworks源码排查 5.编译验证 6.彩蛋 1.前言 客户提供的文件管理apk不能安装apk文件,一点击就奔溃。 2.我们简单写个apk测试下 private void installApk(File apkFile) {i…

从0开始学习informer

目录 informer特点informer原理attention计算KL散度 backbone网络部分encoder输入输出部分embadding这里就不讲了 和transfomer一样EncoderStack decoder部分接下来就是最关键的结构 关于如何将输入经过注意力得到结果 结束&#xff0c;代码会放到下一篇讲 这里是原理 informer…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

PTX入门教程与实战

PTX入门教程 官方文档的目录结构 1 PTX指令 官方文档链接 1.1 指令形式 指令的操作数个数从0-4不等&#xff0c;其中d代表的是目的操作数&#xff0c;a,b,c是源操作数 p opcode;p opcode a;p opcode d, a;p opcode d, a, b;p opcode d, a, b, c;2 编程模型 2.…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解&#xff0c;包括全连接模型的设计、数学原理介绍&#xff0c;并从手写数字识别到猫狗识…

JVM监控及诊断工具-命令行篇-jstat命令介绍

JVM监控及诊断工具-命令行篇01-jstat&#xff1a;查看JVM统计信息 一 基本情况二 基本语法2.1 option参数1. 类装载相关的&#xff1a;2. 垃圾回收相关的-gc&#xff1a;显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息…

基于51单片机的多路报警器Protues仿真设计

一、设计背景 随着社会的发展和技术的进步&#xff0c;安全问题越来越受到重视。各种工业设施、家庭、商业场所以及公共场所的安全保障成为了重点。报警器作为安全防护系统的重要组成部分&#xff0c;在预防和及时应对各种突发事件中发挥着至关重要的作用。传统的报警器通常在功…

【C++】哈希(散列)表

目录 一、哈希表的基本概念1.哈希的概念2.哈希冲突2.1 哈希函数2.2 哈希冲突的解决办法2.2.1 闭散列2.2.2 开散列 二、哈希表的实现1.闭散列的实现1.1 闭散列的结构1.2 闭散列的插入1.3 闭散列的删除1.4 闭散列的查找 2.开散列的实现2.1 key值不能取模的情况2.2 开散列的结构2.…

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…

STM32智能空气质量监测系统教程

目录 引言环境准备智能空气质量监测系统基础代码实现&#xff1a;实现智能空气质量监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;空气质量监测与优化问题解决方案与优化收尾与总结 1. 引言 智能空…

【练习】分治--归并排序

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 归并排序 代码实现 交易逆序对的总数 题目描述 ​编辑 题解 代码实…

基于Vue和UCharts的前端组件化开发:实现高效、可维护的词云图与进度条组件

基于Vue和UCharts的前端组件化开发&#xff1a;实现高效、可维护的词云图与进度条组件 摘要 随着前端技术的迅速发展和业务场景的日益复杂&#xff0c;传统的整块应用开发方式已无法满足现代开发的需求。组件化开发作为一种有效的解决方案&#xff0c;能够将系统拆分为独立、…

汽车的驱动力,是驱动汽车行驶的力吗?

一、地面对驱动轮的反作用力&#xff1f; 汽车发动机产生的转矩&#xff0c;经传动系传至驱动轮上。此时作用于驱动轮上的转矩Tt产生一个对地面的圆周力F0&#xff0c;地面对驱动轮的反作用力Ft(方向与F0相反)即是驱动汽车的外力&#xff0c;此外力称为汽车的驱动力。 即汽车…

C++中跨平台类的设计方法

目录 1.引言 2.具体实现 2.1.单一继承实现 2.2.桥接方式实现 3.总结 1.引言 进行C代码的跨平台设计&#xff0c;主要目标是确保编写的代码能够在不同的操作系统&#xff08;如Windows、Linux、macOS等&#xff09;和硬件架构&#xff08;如x86、ARM等&#xff09;上无缝运…

leetcode--二叉树中的最大路径和

leetcode地址&#xff1a;二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总…

编译x-Wrt 全过程

参考自;​​​​​​c编译教程 | All about X-Wrt 需要详细了解的小伙伴还请参看原文 ^-^ 概念&#xff1a; x-wrt&#xff08;基于openwrt深度定制的发行版本&#xff09; 编译系统: ubuntu22.04 注意&#xff1a; 特别注意的是&#xff0c;整个编译过程&#xff0c;都是用 …