/*** 疏鬆陣列的知識,比較重要的是壓縮儲存!* 定義: 假設m行n列的矩陣中,只有t個非零元素,則成 t/(m*n)為稀疏因子,當稀疏因子<=0.05的時候稱為疏鬆陣列* 產生的問題: 大約95%的元素都是0,佔用的空間很大,計算的時候也和這些0做了很多運算(+,-,*,/),而/法還不能除0,所以特別麻煩* * 壓縮儲存:* (1)特殊矩陣(三角矩陣,對角矩陣)的壓縮儲存比較簡單* (2)隨機疏鬆陣列的壓縮儲存: 1.三元組順序表 元素類型:(行號,列號,元素值) 疏鬆陣列類型:(一個數組,行數,列數,非零元個數) //改進後的類型是裡面還存在一個記錄每一行首非零元出現的位置的 Const MaxSize = 1000; typedef struct {int i;int j;ElemType e; }Triple;//元素類型 typedef union {Triple data[MaxSize + 1];int mu;int nu;int tu; }TSMatrix;//疏鬆陣列類型 求轉置的話:要考慮轉過了之後要放到指定的位置【按行從小到大排,所以要做一點操作】 int FastTransposeSMatrix(TSMatrix M, TSMatrix & T) { T.mu = M.nu;//轉置的行和列 等於 原來的矩陣的 列和行T.nu = M.mu;T.tu = M.tu;//非零元個數是相等的if (T.tu){for (col=1; col<=M.nu; ++col){num[col] = 0;//這個是初始化的for迴圈 -> 要計算轉置後每行的非零元個數}for (t=1; t<=M.tu; ++) //要計算轉置後每行的非零元個數,就是計算原來未轉置前的 列[轉過來之後,原來的列就成了行了] 的非零元個數{++num[M.data[t].j];}//下面為求轉置矩陣每一行第一個非零元在data數組中的位置,也就是求原來的每一列的第一個非零元的位置cpot[1] = 1;//第一行的起始位置是1for (col=2; col<=M.nu; ++col)//求每一行的第一個非零元的位置, 之後轉置在某行插入一個元素之後,對應的行的cpot要+1{cpot[col] = cpot[col-1] + num[col-1]; //第col行的元素的起始位置為 col-1行的起始位置 + col-1行的非零元個數}for (p=1; p<=M.tu; ++p){//轉置矩陣元素, 然後根據cpot放到相應的位置}} } 2.三元組順序儲存改進【和方法1差別在於有儲存每一行非零元的個數】(常用) -- 代碼不詳 3.十字鏈表 【方法1和方法2都是順序結構,不適合結構的改變.(插入,刪除,移動不方便),所以引出第三種:鏈式儲存】 (做矩陣的加法的時候,這個十字鏈表可以試試)**/