數組與特殊壓縮矩陣

一、數組的基本特性

  • 定義

    int arr[3][3]; // 3x3二維數組
  • 存儲方式

    • 行優先存儲(C語言默認):元素按行連續存儲。

    • 列優先存儲:需手動實現(如科學計算中的Fortran風格)。

  • 訪問元素

arr[i][j] = value; // 直接訪問

二、?特殊矩陣的壓縮存儲

針對特定規律的矩陣(如對稱、稀疏),可通過壓縮存儲減少空間占用。

(1) 對稱矩陣

  • 特點a[i][j] = a[j][i],只需存儲上三角下三角

  • 壓縮存儲

    • 將下三角元素存入一維數組,元素總數:n(n+1)/2

    • 下標轉換公式(行優先):

      • 當?i ≥ j?時,一維數組索引?k = i*(i+1)/2 + j

      • 當?i < j?時,交換?i?和?j

示例代碼

// 壓縮對稱矩陣
int compressSymmetric(int matrix[][N], int n, int compressed[]) {int k = 0;for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) { // 存儲下三角compressed[k++] = matrix[i][j];}}return k; // 返回壓縮后長度
}// 訪問壓縮后的元素
int getElement(int compressed[], int i, int j) {if (i < j) { // 上三角轉下三角int temp = i;i = j;j = temp;}return compressed[i*(i+1)/2 + j];
}

(2) 三角矩陣

  • 上三角矩陣:只存儲主對角線及以上元素。

  • 下三角矩陣:只存儲主對角線及以下元素。

  • 壓縮存儲:類似對稱矩陣,但需額外存儲剩余部分的常量(如0)。

示例代碼(下三角矩陣):

// 壓縮下三角矩陣(包含對角線)
void compressLowerTriangular(int matrix[][N], int n, int compressed[]) {int k = 0;for (int i = 0; i < n; i++) {for (int j = 0; j <= i; j++) {compressed[k++] = matrix[i][j];}}
}

(3) 稀疏矩陣

  • 特點:絕大多數元素為0,通過壓縮存儲非零元素。

  • 存儲方式

    1. 三元組表示法:存儲非零元素的行、列、值。

    2. 十字鏈表:適合頻繁插入/刪除操作(如圖像處理)。

三元組表示法示例

typedef struct {int row, col, value;
} Triple;// 壓縮稀疏矩陣
void compressSparse(int matrix[][M], int rows, int cols, Triple compressed[]) {int k = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (matrix[i][j] != 0) {compressed[k].row = i;compressed[k].col = j;compressed[k].value = matrix[i][j];k++;}}}
}// 訪問稀疏矩陣元素
int getSparseElement(Triple compressed[], int size, int i, int j) {for (int k = 0; k < size; k++) {if (compressed[k].row == i && compressed[k].col == j) {return compressed[k].value;}}return 0; // 未找到則返回0
}

三、對比與選擇

四、操作復雜度

  • 普通數組

    • 訪問:O(1)

    • 插入/刪除:不適用(需重構數組)

  • 壓縮存儲矩陣

    • 訪問:O(1)(對稱/三角)或 O(non_zero)(稀疏矩陣遍歷)

    • 插入/刪除:僅稀疏矩陣支持高效操作(如十字鏈表)

五、實際應用

  • 圖像處理:稀疏矩陣存儲圖像的非零像素。

  • 科學計算:對稱矩陣用于物理模擬中的剛度矩陣。

  • 機器學習:三角矩陣用于LU分解加速計算。

六、總結

在C語言中,數組是基礎數據結構,而特殊矩陣通過壓縮存儲可顯著優化空間和操作效率。根據矩陣特性和應用場景選擇合適的存儲方式:

  • 對稱/三角矩陣:用一維數組壓縮存儲。

  • 稀疏矩陣:用三元組或十字鏈表實現動態操作。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900088.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Word 插入無頁眉頁碼的空白頁(即插入奇數頁)

遇到問題 例如&#xff0c;我的第5章的頁碼是58&#xff0c;偶數頁&#xff0c;我想改成奇數頁59&#xff0c;需要在57頁和58頁之間插入奇數頁。 解決辦法 單擊上一頁&#xff08;57頁&#xff09;&#xff0c;打開“視圖-大綱”&#xff0c;找到要插入奇數頁的位置&#x…

OpenCV 從入門到精通(day_05)

1. 模板匹配 1.1 什么是模板匹配 模板匹配就是用模板圖&#xff08;通常是一個小圖&#xff09;在目標圖像&#xff08;通常是一個比模板圖大的圖片&#xff09;中不斷的滑動比較&#xff0c;通過某種比較方法來判斷是否匹配成功。 1.2 匹配方法 rescv2.matchTemplate(image, …

【目標檢測】【深度學習】【Pytorch版本】YOLOV3模型算法詳解

【目標檢測】【深度學習】【Pytorch版本】YOLOV3模型算法詳解 文章目錄 【目標檢測】【深度學習】【Pytorch版本】YOLOV3模型算法詳解前言YOLOV3的模型結構YOLOV3模型的基本執行流程YOLOV3模型的網絡參數 YOLOV3的核心思想前向傳播階段反向傳播階段 總結 前言 YOLOV3是由華盛頓…

LN2220 2A 高效率升壓 DC/DC 電壓調整器

1、產品概述 LN2220 是一款微小型、高效率、升壓型 DC/DC 調整器。 電路由電流模 PWM 控制環路&#xff0c;誤差放大器&#xff0c;斜波補償電路&#xff0c; 比較器和功率開關等模塊組成。該芯片可在較寬負載范圍內 高效穩定的工作&#xff0c;內置一個 4A 的功率開關和…

【大模型基礎_毛玉仁】6.3 知識檢索

目錄 6.3 知識檢索6.3.1 知識庫構建1&#xff09;數據采集及預處理2&#xff09;知識庫增強 6.3.2 查詢增強1&#xff09;查詢語義增強2&#xff09;查詢內容增強 6.3.3 檢索器1&#xff09;判別式檢索器2&#xff09;生成式檢索器 6.3.4 檢索效率增強1&#xff09;相似度索引算…

靜態方法和實例方法

在 Java 中&#xff0c;?靜態方法&#xff08;static method&#xff09;?和?實例方法&#xff08;instance method&#xff09;?是兩種不同類型的方法&#xff0c;它們在調用方式、內存分配和訪問權限上有顯著區別。以下是詳細對比&#xff1a; ?1. 靜態方法&#xff08;…

Lua環境搭建+Lua基本語法

前期準備&#xff1a; 搜索并下載安裝LuaForWindows,例&#xff1a; 安裝完成后開啟cmd窗口&#xff0c;輸入lua 出現版本號證明成功下載安裝 使用Sublime Text編輯器編寫Lua 使用瀏覽器或CSDN搜索Sublime Text下載并安裝&#xff0c;安裝成功后打開編輯器&#xff0c;編輯…

FFmpeg錄制屏幕和音頻

一、FFmpeg命令行實現錄制屏幕和音頻 1、Windows 示例 #include <cstdlib> #include <string> #include <iostream>int main() {// FFmpeg 命令行&#xff08;錄制屏幕 麥克風音頻&#xff09;std::string command "ffmpeg -f gdigrab -framerate 3…

【數據集】多視圖文本數據集

多視圖文本數據集指的是包含多個不同類型或來源的信息的文本數據集。不同視圖可以來源于不同的數據模式&#xff08;如原始文本、元數據、網絡結構等&#xff09;&#xff0c;或者不同的文本表示方法&#xff08;如 TF-IDF、詞嵌入、主題分布等&#xff09;。這些數據集常用于多…

C++ 繼承方式使用場景(極簡版)

1. 公有繼承&#xff08;public&#xff09; 什么時候用&#xff1f; “是一個”&#xff08;is-a&#xff09;關系&#xff1a;派生類 是 基類的一種。 例&#xff1a;class Dog : public Animal&#xff08;狗是動物&#xff09; 最常見&#xff0c;90%的繼承都用它。 2. 保…

Ubuntu 系統 Docker 中搭建 CUDA cuDNN 開發環境

CUDA 是 NVIDIA 推出的并行計算平臺和編程模型&#xff0c;利用 GPU 多核心架構加速計算任務&#xff0c;廣泛應用于深度學習、科學計算等領域。cuDNN 是基于 CUDA 的深度神經網絡加速庫&#xff0c;為深度學習框架提供高效卷積、池化等操作的優化實現&#xff0c;提升模型訓練…

高密度任務下的挑戰與破局:數字樣機助力火箭發射提效提質

2025年4月1日12時&#xff0c;在酒泉衛星發射中心&#xff0c;長征二號丁運載火箭順利升空&#xff0c;成功將一顆衛星互聯網技術試驗衛星送入預定軌道&#xff0c;發射任務圓滿完成。這是長征二號丁火箭的第97次發射&#xff0c;也是長征系列火箭的第567次發射。 執行本次任務…

關于SQL子查詢的使用策略

在 SQL 優化中&#xff0c;一般遵循**“非必要不使用子查詢”**的原則&#xff0c;因為子查詢可能會帶來額外的計算開銷&#xff0c;影響查詢效率。但是&#xff0c;并不是所有子查詢都需要避免&#xff0c;有時子查詢是最優解&#xff0c;具體要根據實際場景選擇合適的優化方式…

JavaEE初階復習(JVM篇)

JVM Java虛擬機 jdk java開發工具包 jre java運行時環境 jvm java虛擬機(解釋執行 java 字節碼) java作為一個半解釋,半編譯的語言,可以做到跨平臺. java 通過javac把.java文件>.class文件(字節碼文件) 字節碼文件, 包含的就是java字節碼, jvm把字節碼進行翻譯轉化為…

2.pycharm保姆級安裝教程

一、pycharm安裝 1.官網上下載好好軟&#xff0c;雙擊打開 2.下一步 3.修改路徑地址 (默認也可以) 4.打勾 5.安裝 不用重啟電腦 二、添加解釋器 1.雙擊軟件&#xff0c;打開 2.projects – new project 3.指定項目名字&#xff0c;項目保存地址&#xff0c;解釋器 4.右擊 – …

zk基礎—4.zk實現分布式功能二

大綱 1.zk實現數據發布訂閱 2.zk實現負載均衡 3.zk實現分布式命名服務 4.zk實現分布式協調(Master-Worker協同) 5.zk實現分布式通信 6.zk實現Master選舉 7.zk實現分布式鎖 8.zk實現分布式隊列和分布式屏障 4.zk實現分布式協調(Master-Worker協同) (1)Master-Worker架構…

Java 實現 字母異位詞分組

在這篇博客中&#xff0c;我們將詳細解析如何使用 Java 代碼來解決 字母異位詞分組這個經典的算法問題。我們會逐步分析代碼邏輯&#xff0c;并探討其時間復雜度及優化思路。 題目描述 給定一個字符串數組 strs&#xff0c;請將字母異位詞組合在一起。字母異位詞是指由相同字…

【Ragflow】10. 助理配置參數詳細解析/模型響應加速方法

概述 Ragflow的助理配置中&#xff0c;有很多參數&#xff0c;盡管官方文檔給出了一定程度的解釋&#xff0c;但不夠詳細。 本文將對各項參數進行更詳細的解釋說明&#xff0c;并進一步挖掘某些參數中隱含的潛在陷阱。 助理設置 空回復 含義&#xff1a;輸入的問題若未能在…

Mac Apple silicon如何指定運行amd64架構的ubuntu Docker?

如何指定運行amd64架構的ubuntu Docker 下面這個docker命令如何指定運行amd64架構的ubuntu Docker&#xff1f; docker run -it -v $(pwd):/workspace ubuntu:20.04 bash這個命令已經非常接近正確運行一個基于 amd64 架構的 Ubuntu 容器了&#xff0c;但如果你想明確指定運行…

ColPali:基于視覺語言模型的高效文檔檢索

摘要 文檔是視覺豐富的結構&#xff0c;不僅通過文本傳遞信息&#xff0c;還包括圖表、頁面布局、表格&#xff0c;甚至字體。然而&#xff0c;由于現代檢索系統主要依賴從文檔頁面中提取的文本信息來索引文檔&#xff08;通常是冗長且脆弱的流程&#xff09;&#xff0c;它們…