疏鬆陣列【壓縮演算法】,具體代碼沒有,只是思想

來源:互聯網
上載者:User

/*** 疏鬆陣列的知識,比較重要的是壓縮儲存!* 定義: 假設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都是順序結構,不適合結構的改變.(插入,刪除,移動不方便),所以引出第三種:鏈式儲存】   (做矩陣的加法的時候,這個十字鏈表可以試試)**/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.