資料結構入門-稀疏矩陣

更新於 發佈於 閱讀時間約 4 分鐘

前導

稀疏矩陣(Sparse Matrix)是指在大多數元素為零的矩陣。由於存儲完整的稀疏矩陣會浪費大量內存,因此通常使用特殊的數據結構來存儲和操作稀疏矩陣。在 C 語言中,可以將稀疏矩陣的非零元素以rowcolumnvalue的方式存放。

如下圖所示:

raw-image

程式碼實作

#include <stdio.h>

#define MAX 100 // 最大非零元素數量

// 三元組結構
typedef struct {
int row, col, value;
} SparseMatrix;

// 輔助函式,列印稀疏矩陣
void displaySparseMatrix(SparseMatrix mat[], int size) {
printf("Row\tCol\tValue\n");
for (int i = 0; i < size; i++) {
printf("%d\t%d\t%d\n", mat[i].row, mat[i].col, mat[i].value);
}
}

int main() {
int rows = 4, cols = 5;
int sparseArray[4][5] = {
{0, 0, 3, 0, 4},
{0, 0, 5, 7, 0},
{0, 0, 0, 0, 0},
{0, 2, 6, 0, 0}
};

SparseMatrix sparse[MAX];
int k = 0;

// 轉換為三元組格式
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (sparseArray[i][j] != 0) {
sparse[k].row = i;
sparse[k].col = j;
sparse[k].value = sparseArray[i][j];
k++;
}
}
}

printf("Sparse Matrix (Triplet Representation):\n");
displaySparseMatrix(sparse, k);

return 0;
}
  • 結構體定義 SparseMatrix
    • 透過 typedef 定義了一個名為 SparseMatrix 的結構體,包含 rowcolvalue 三個欄位,用來儲存稀疏矩陣中每個「非零」元素的位置與數值。
  • 常數 MAX
    • 使用 #define MAX 100 定義最大非零元素數量,代表三元組陣列 SparseMatrix sparse[MAX] 最多能夠儲存 100 個非零元素。
  • 輔助函式 displaySparseMatrix()
    • 接收存有三元組的陣列 mat[] 以及其中非零元素的總數 size
    • 透過 for 迴圈,列印出所有三元組的 (row, col, value),方便檢視稀疏矩陣內容。
  • 主程式 main()
    • 設定 rows = 4, cols = 5,並建立一個 4×5 的二維陣列 sparseArray,其中僅部分元素非零。
    • 宣告 SparseMatrix sparse[MAX] 以及計數器 k = 0
    • 使用雙層 for 迴圈走訪 sparseArray 每一個元素。
      • 若元素不是 0,便將其列索引、行索引與實際值記錄到 sparse[k] 結構體中,並將 k++
    • 最後,呼叫 displaySparseMatrix(sparse, k) 將三元組表示法印出來。

輸出:

Sparse Matrix (Triplet Representation):
Row Col Value
0 2 3
0 4 4
1 2 5
1 3 7
3 1 2
3 2 6
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!
今天如果要你印出1-100之間的不重複隨機數排列,你該怎麼做? 本章節將從程式碼開始,讓你直接了解解題的思維與觀念。
遞迴就是函式在執行過程中呼叫自身,並通過結束條件和呼叫堆疊來解決問題。 這種方式通常用於解決可以分解為相同問題的子問題的情況。 本章節將以最容易理解的方式解說這個核心概念,並且邁入較艱深的應用範例,提升程式思考邏輯力。
內插搜尋法(Interpolation Search)是一種改進版的 二分搜尋法,但它不是直接取中間值,而是 根據目標值的位置,預測索引的範圍,類似於人類在 查找電話簿 或 字典 時的方式。 本章節將帶你了解此演算法概念,並透過C語言實作。
二分搜尋法(Binary Search)是一種 高效的搜尋演算法,適用於 已排序 的資料結構。 它的核心思想是 每次將搜尋範圍減半,直到找到目標值或範圍縮小到無法繼續搜尋。 本章節將帶領讀者學會這個演算法,並透過C語言實作。
循序搜尋法(Sequential Search)是一種最簡單的搜尋演算法,適用於線性結構。 它的基本概念是 逐一檢查每個元素,直到找到目標值或遍歷完整個結構。 本章節將會帶領讀者熟悉這個知識,並且用C語言實作。
歸併排序法 同樣是一種基於「分治法」(Divide and Conquer)的排序演算法,我們將逐步分析演算法的思維與流程,最後以程式碼實作出來。
今天如果要你印出1-100之間的不重複隨機數排列,你該怎麼做? 本章節將從程式碼開始,讓你直接了解解題的思維與觀念。
遞迴就是函式在執行過程中呼叫自身,並通過結束條件和呼叫堆疊來解決問題。 這種方式通常用於解決可以分解為相同問題的子問題的情況。 本章節將以最容易理解的方式解說這個核心概念,並且邁入較艱深的應用範例,提升程式思考邏輯力。
內插搜尋法(Interpolation Search)是一種改進版的 二分搜尋法,但它不是直接取中間值,而是 根據目標值的位置,預測索引的範圍,類似於人類在 查找電話簿 或 字典 時的方式。 本章節將帶你了解此演算法概念,並透過C語言實作。
二分搜尋法(Binary Search)是一種 高效的搜尋演算法,適用於 已排序 的資料結構。 它的核心思想是 每次將搜尋範圍減半,直到找到目標值或範圍縮小到無法繼續搜尋。 本章節將帶領讀者學會這個演算法,並透過C語言實作。
循序搜尋法(Sequential Search)是一種最簡單的搜尋演算法,適用於線性結構。 它的基本概念是 逐一檢查每個元素,直到找到目標值或遍歷完整個結構。 本章節將會帶領讀者熟悉這個知識,並且用C語言實作。
歸併排序法 同樣是一種基於「分治法」(Divide and Conquer)的排序演算法,我們將逐步分析演算法的思維與流程,最後以程式碼實作出來。
你可能也想看
Google News 追蹤
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
Thumbnail
透明立體方練習,使用AI向量繪圖軟體
Thumbnail
這篇文章,會帶著大家複習以前學過的配對模型與Stack框架, 並且以括弧配對的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 首先,Stack本身具有Last-In First-Out 後進先出的特質。 再根據題目所需要的資訊利用Stack去儲存索引
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。
Thumbnail
全方位分析脫離繼承戰的方法,大膽猜測誰會成為卡丁國下一任國王。
Thumbnail
在資料分析過程中,透過衡量變數之間的線性或非線性關係,能有效探索數據集,篩選出重要特徵,並進行預測建模。本文介紹瞭如何理解數據、使用相關矩陣找出變數關聯性,以及利用互資訊評估變數之間的依賴程度,幫助資料科學家在建模過程中選擇適當的變數,提升模型效果。
Thumbnail
這篇內容,將會講解什麼是資料型態,以及與資料型態相關的知識。包括資料型態的簡介、實數、布林值、 字串、陣列。
前言 在閱讀《強化式學習:打造最強 AlphaZero 通用演算法》時,對一些看似基本,但是重要且會影響到之後實作的項目概念有點疑惑,覺得應該查清楚,所以搞懂後記錄下來,寫下這篇文章(應該說是筆記?)。 正文 下面這段程式碼: model = Sequential() model.add
Thumbnail
透明立體方練習,使用AI向量繪圖軟體
Thumbnail
這篇文章,會帶著大家複習以前學過的配對模型與Stack框架, 並且以括弧配對的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 首先,Stack本身具有Last-In First-Out 後進先出的特質。 再根據題目所需要的資訊利用Stack去儲存索引
Thumbnail
本文介紹了如何使用資料樞紐分析的功能來整理所需的資料,並設定圖表的中文字型,最後提供了繪圖的程式碼範例。
Thumbnail
圖形演算法在資料處理上扮演重要角色。本文介紹圖形的歷史、定義、技術用途,以及為什麼我們要關心圖形演算法。文末還提及圖形演算法在機器學習領域的應用。下次將介紹更詳細的圖形演算法內容。