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

目录

  • 一、数组
    • 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;//数组第一个元素的下标为0arr[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;//40cout<<"数组arr中单个元素占用内存空间为:"<<sizeof(arr[0])<<endl;//4cout<<"数组长度为:"<<sizeof(arr)/sizeof(arr[0])<<endl;//10return 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;//与之前相差4cout << "首地址为:" << &arr[0] << endl;cout << "数组地址为:" << &arr << endl;cout << "地址为:" << &arr +1<< endl;//与之前相差了40return 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.mzph.cn/pingmian/46141.shtml

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

相关文章

HyperSD - 会画草图就能玩AI绘画,AI一键手绘,实时同步 本地一键整合包下载

字节跳动的Lightning团队发布的新图像模型蒸馏算法Hyper-SD&#xff0c;是一项在图像处理和机器学习领域的重要进展。这项技术通过创新的方法提升了模型在不同推理步骤下的性能&#xff0c;同时保持了模型大小的精简。 基于这个算法模型&#xff0c;一个很实用的功能出现了&am…

绝区零 双闪 双闪-三轴 工具

绝区零 双闪 双闪-三轴 工具 0. 演示视频 绝区零&#xff1a;≈100%的极致双闪和双闪-三轴 绝区零&#xff1a;手残党也能打双闪-三轴 1. 基本信息 作者: GMCY系列: 工具系列仓库: GitHub | Gitee话题(GitHub): Tools \ ZenlessZoneZero创建时间: 2024/07/14 2. 声明 !!! 使…

【Linux】重定向 | 为什么说”一切皆文件?“

目录 前言 1.文件描述符分配规则 2.dup2 重定向接口 3.重定向 3.1>输出重定向 3.2>>追加重定向 3.3<输入重定向 3.4 shell 模拟实现< > 3.5 理解> 4. 理解“Linux 下一切皆文件” 前言 问&#xff1a;fd 为什么默认从 3 开始&#xff0c;而不是…

LeetCode热题100刷题15:200. 岛屿数量、所有可达路径、118. 杨辉三角、287. 寻找重复数、84. 柱状图中最大的矩形

200. 岛屿数量 借助DFS寻找整个图的连通分量数&#xff0c;DFS将一个连通分量中的节点标记为visited&#xff0c;res记录连通分量数&#xff0c;最后返回res class Solution { public:const int dir[4][2] {1,0,0,1,-1,0,0,-1};void dfs(vector<vector<char>>&a…

代码随想录——不同路径Ⅱ(Leetcode 63)

题目链接 动态规划 class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m obstacleGrid.length;int n obstacleGrid[0].length;int[][] dp new int[m][n];// 遇到障碍则从(0,0)到达for(int i 0; i < m && obstacleGrid[i][0] …

前端挑战:Tkinter布局与设计【三种布局】

前端挑战:Tkinter布局与设计【三种布局】 文章目录 前端挑战:Tkinter布局与设计【三种布局】前言Frame 窗口组件代码效果Tkinter的布局grid 网格布局效果展示:代码讲解pack 布局基本使用左右布局place 布局代码预览前言 作为一个前端开发,习惯性的用HTML去解决客户端的问题…

2024.7.14周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、文献解读 一、Introduction 二、KINN框架 三、主要结果 四、Conclusion 二、KAN 一、KAN与MLP区别 二、KAN网络解析 三、激活函数参数化&#xff08;B-splines&#xff09; 三、网络架构代码 摘要 本周…

Kafka基础入门篇(深度好文)

Kafka简介 Kafka 是一个高吞吐量的分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用与大数据实时处理领域。 1. 以时间复杂度为O(1)的方式提供消息持久化能力。 2. 高吞吐率。&#xff08;Kafka 的吞吐量是MySQL 吞吐量的30…

输入法发展历史

输入法的发展历史&#xff0c;尤其是中文输入法&#xff0c;是一个相当丰富和多元的话题&#xff0c;它反映了技术进步、用户需求变化以及计算机和移动设备界面设计的演进。以下是一个概览&#xff1a; 早期阶段 1970s&#xff1a;朱邦复在1976年发明了仓颉输入法&#xff0c;…

python:绘制一元四次函数的曲线

编写 test_x4_x2_4x.py 如下 # -*- coding: utf-8 -*- """ 绘制函数 y x^4x^24x-3 在 -2<x<2 的曲线 """ import numpy as np from matplotlib import pyplot as plt# 用于正常显示中文标题&#xff0c;负号 plt.rcParams[font.sans-s…

Amazon EC2 部署Ollama + webUI

最近和同事闲聊&#xff0c;我们能不能内网自己部署一个LLM&#xff0c;于是便有了Ollama webUI的尝试 对于Linux&#xff0c;使用一行命令即可 curl -fsSL https://ollama.com/install.sh | shollama --help Large language model runnerUsage:ollam…

网络规划设计师教程(第二版) pdf

网络规划设计师教程在网上找了很多都是第一版&#xff0c;没有第二版。 所以去淘宝买了第二版的pdf&#xff0c;与其自己独享不如共享出来&#xff0c;让大家也能看到。 而且这个pdf我已经用WPS扫描件识别过了&#xff0c;可以直接CtrlF搜索关键词&#xff0c;方便查阅。 链接…

PostgreSQL 中如何解决因频繁的小事务导致的性能下降?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中解决因频繁小事务导致性能下降的方法 PostgreSQL 中解决因频繁小事务导致性能下降的方法…

基于SpringBoot的校园志愿者管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 个人中心 志愿者管理 活动信息…

three-tile开发: 5. 取得地图的地面信息

three-tile 是一个开源的轻量级三维瓦片库&#xff0c;它基于threejs使用typescript开发&#xff0c;提供一个三维地形模型&#xff0c;能轻松给你的应用增加三维瓦片地图。 项目地址&#xff1a;GitHub - sxguojf/three-tile: 3D tile map using threejs 示例地址&#xff1a;…

IT运维也有自己的节日 724向日葵IT运维节,三大版本如何选?

“724运维节”&#xff0c;是2016年由开放运维联盟发起倡议&#xff0c;广大运维人员共同投票产生的属于运维人自己的节日。 对于运维人最大的印象&#xff0c;那就是工作都需要7x24小时待命&#xff0c;是名副其实的“日不落骑士”&#xff0c;这也是大家选择724这一天作为运…

原理图大结局

一、总结哪些地方是5V供电&#xff1f;哪些地方是4V供电&#xff1f;哪些地方是3.3V供电&#xff1f;为什么会这样&#xff1f;根据什么原则来划分供电区域&#xff1f; 二、 5V 供电为什么有的地方要100uF&#xff0b; 0.1uF 滤波&#xff1f;有的地方只要 10uF 滤波&#xff…

RabbitMQ - 延迟消息 - 死信交换机

目录 1、怎么理解延迟消息&#xff1f; 2、如何实现延迟消息&#xff1f; 2.1、方案一&#xff1a;死信交换机 2.1.1、什么是死信&#xff1a; 2.1.2、什么是死信交换机&#xff1f; 2.2、方案二&#xff1a;延迟消息插件 2.2.1、插件安装&#xff1a; 2.2.2、代码实现 …

AndroidStudio2023.3版本avd manager模拟器无法创建

创建到最后一步的时候提示WARN - #com.android.sdklib.internal.avd.AvdManager - com.android.prefs.AndroidLocationsException: Can’t locate Android SDK installation directory for the AVD .ini file. 前提&#xff1a; 1.sdk路径没问题 2.安装了下图内容 那是什么原因…

提高项目透明度:有效的跟踪软件

国内外主流的10款项目进度跟踪软件对比&#xff1a;PingCode、Worktile、Teambition、Tower、Asana、Trello、Jira、ClickUp、Notion、Liquid Planner。 在项目管理中&#xff0c;确保进度跟踪的准确性与效率是每位项目经理面临的主要挑战之一。选用合适的项目进度跟踪软件不仅…