数据结构与算法——矩阵

server/2024/9/23 9:35:36/

引言

数据结构算法中,矩阵是一个重要的概念,它既是数据结构的一种,也是算法中经常需要处理的对象。以下是对矩阵的详细介绍:

一、矩阵的定义

矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,它是一个二维的数据结构,由行和列组成,通常用来表示二维的数据集合。在数学中,矩阵最早来自于方程组的系数及常数所构成的方阵,这一概念由19世纪英国数学家凯利首先提出。在数据结构中,矩阵主要讨论如何在节省存储空间的前提下,正确高效地运算矩阵。

二、矩阵的特征

  • 二维数组:矩阵也可以看作是一个二维数组,即“数组的数组”。
  • 元素类型:矩阵的元素可以是数字、字符、布尔值等类型。
  • 非线性结构:虽然矩阵表面上看似不符合线性表的特征(如首结点不唯一、尾结点不唯一、中间结点有两个直接前驱和两个直接后驱),但实质上,我们可以把每行(或每列)数据看成一个整体,作为一个数据元素,那么矩阵就符合线性表的特征,只是每个数据元素的类型又是一个线性表。

三、矩阵的存储方式

  • 按行优先顺序存储:即将数组元素按行排序,第i+1行的第一个元素紧接在第i行的最后一个元素的后面。
  • 按列优先顺序存储:即将数组元素按列排序,第j+1列的第一个元素紧接在第j列的最后一个元素的后面。

四、矩阵的运算

矩阵的运算包括加法、减法、乘法、转置等。

  • 加法与减法:矩阵的加法和减法要求两个矩阵的维数相同,即行数和列数都必须相等,然后对应位置的元素进行加或减运算。
  • 乘法:矩阵的乘法不是简单的对应位置元素相乘,而是按照矩阵乘法规则进行计算,即第一个矩阵的行向量与第二个矩阵的列向量进行点积运算。
  • 转置:矩阵的转置是将矩阵的行和列互换,即原矩阵的第i行第j列元素在转置矩阵中变为第j行第i列元素。

五、矩阵的应用

矩阵在计算机科学中有着广泛的应用,比如在机器学习和人工智能领域中,矩阵被用来表示数据集合和模型参数,进行数据处理和计算。在图形学中,矩阵被用来表示图像的像素值和进行图像处理操作。在网络编程中,矩阵也被用来表示网络拓扑结构和进行数据传输。此外,在物理学、工程学、经济学等多个领域,矩阵也有着重要的应用。

六、特殊矩阵

  • 对称矩阵:在一个n阶方阵中,如果满足aij=aji(1≤i,j≤n),则称该矩阵为对称矩阵。对称矩阵关于主对角线对称,因此可以压缩存储,节省存储空间。
  • 稀疏矩阵:如果矩阵中数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律,则称该矩阵为稀疏矩阵。稀疏矩阵常使用三元组存储法,即存储非零元的同时,存储该元素所对应的行下标和列下标。

经典例题

1. 螺旋矩阵

题目描述
给定一个正整数n,生成一个包含1到n^2所有元素,且元素按顺时针顺序螺旋排列的n x n正方形矩阵。

解题思路

  • 使用四个变量表示当前遍历的上下左右边界。
  • 按照右、下、左、上的顺序遍历矩阵,每次遍历到边界时更新边界值。
  • 当所有元素都被遍历时,结束循环。
#include <vector>  
using namespace std;  vector<vector<int>> generateMatrix(int n) {  vector<vector<int>> matrix(n, vector<int>(n, 0));  int num = 1, left = 0, right = n - 1, top = 0, bottom = n - 1;  while (num <= n * n) {  // Traverse right  for (int i = left; i <= right && num <= n * n; ++i) {  matrix[top][i] = num++;  }  top++;  // Traverse down  for (int i = top; i <= bottom && num <= n * n; ++i) {  matrix[i][right] = num++;  }  right--;  // If not the last element  if (top <= bottom) {  // Traverse left  for (int i = right; i >= left && num <= n * n; --i) {  matrix[bottom][i] = num++;  }  bottom--;  }  if (left <= right) {  // Traverse up  for (int i = bottom; i >= top && num <= n * n; --i) {  matrix[i][left] = num++;  }  left++;  }  }  return matrix;  
}

2. 搜索二维矩阵

题目描述
编写一个高效的算法来搜索m x n矩阵matrix中的一个目标值target。该矩阵具有以下特性:每行的元素从左到右升序排列;每列的元素从上到下升序排列。

解题思路

  • 从矩阵的右上角或左下角开始搜索。
  • 如果当前元素等于目标值,则返回true。
  • 如果当前元素大于目标值,向左移动一列。
  • 如果当前元素小于目标值,向下移动一行。
#include <vector>  
using namespace std;  bool searchMatrix(vector<vector<int>>& matrix, int target) {  if (matrix.empty() || matrix[0].empty()) return false;  int rows = matrix.size(), cols = matrix[0].size();  int row = 0, col = cols - 1;  while (row < rows && col >= 0) {  if (matrix[row][col] == target) return true;  else if (matrix[row][col] < target) row++;  else col--;  }  return false;  
}

3. 旋转图像

题目描述
给定一个n x n的二维矩阵matrix表示一个图像。请你将图像顺时针旋转90度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

解题思路

  • 先沿主对角线翻转矩阵。
  • 再按行翻转矩阵的每一行。
#include <vector>  
using namespace std;  void rotate(vector<vector<int>>& matrix) {  int n = matrix.size();  // Flip along the diagonal  for (int i = 0; i < n; ++i) {  for (int j = i; j < n; ++j) {  swap(matrix[i][j], matrix[j][i]);  }  }  // Flip each row  for (int i = 0; i < n; ++i) {  for (int j = 0; j < n / 2; ++j


http://www.ppmy.cn/server/94132.html

相关文章

关于 AGGLIGATOR(猛禽)网络宽频聚合器

AGGLIGATOR 是一个用于多个链路UDP/IP带宽聚合的工具软件&#xff0c;类似MTCP的作用&#xff0c;不过它是针对UDP/IP宽频聚合的。 举个例子&#xff1a; 中国大陆有三台公网服务器&#xff0c;中国香港有一台大带宽服务器。 那么&#xff1a; AGGLIGATOR 允许中国大陆的客户…

AI大模型探索之路-实战篇14: 集成本地Python代码解释器:强化Agent智能数据分析平台

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…

AttributeError: module ‘jwt‘ has no attribute ‘decode‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

新手小白学习PCB设计,立创EDA专业版

本教程有b站某UP主的视频观后感 视频链接&#xff1a;http://【【教程】零基础入门PCB设计-国一学长带你学立创EDA专业版 全程保姆级教学 中文字幕&#xff08;持续更新中&#xff09;】https://www.bilibili.com/video/BV1At421h7Ui?vd_sourcefedb10d2d09f5750366f83c1e0d4a…

ELK+filebeat

ELKfilebeat 一、filebeat概述 1、filebeat概念&#xff1a; filebeat日志收集工具和logstash相同 filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。…

Vue Router 详解

Vue Router 是 Vue.js 生态系统中的一个核心插件&#xff0c;旨在帮助开发者轻松地在单页面应用程序 (SPA) 中实现路由功能。在这篇博客中&#xff0c;我们将深入探讨 Vue Router 的各个方面&#xff0c;包括其基本概念、配置和高级用法。 1. 什么是 Vue Router&#xff1f; …

路由配置修改(五)

一、默认约定式路由 1、umi 会根据 pages 目录自动生成路由配置。 * name umi 的路由配置* description 只支持 path,component,routes,redirect,wrappers,name,icon 的配置* param path path 只支持两种占位符配置&#xff0c;第一种是动态参数 :id 的形式&#xff0c;第二种…

C#知识|XML文件操作

哈喽,你好啊,我是雷工! 之前有朋友在群里聊XML文件操作的问题,今天正好学习相关内容, 以下为学习笔记。 01 XML介绍 ①:XML是eXtensible Markup Language的缩写,即扩展标记语言。 ②:XML是一种可以用来创建自定义的标记语言,由W3C(万维网协会)创建,用来克服HTML的局…