乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      經(jīng)典算法題每日演練——第二十題 三元組

       昵稱10504424 2014-01-07
       我們知道矩陣是一個非常強大的數(shù)據(jù)結(jié)構(gòu),在動態(tài)規(guī)劃以及各種圖論算法上都有廣泛的應用,當然矩陣有著不足的地方就是空間和時間

      復雜度都維持在N2上,比如1w個數(shù)字建立一個矩陣,在內(nèi)存中會占用1w*1w=1億的類型空間,這時就會遇到outofmemory。。。那么面

      臨的一個問題就是如何來壓縮矩陣,當然壓縮的方式有很多種,這里就介紹一個順序表的壓縮方式:三元組。

      一:三元組

      有時候我們的矩陣中只有零星的一些非零元素,其余的都是零元素,那么我們稱之為稀疏矩陣,當然沒有絕對的說有多少個零元素才算稀疏。

      針對上面的這個無規(guī)律的存放非零元素,三元組提出了一種方法,就是僅僅記錄矩陣中的非零元素以及它的行,列以及值N(x,y,v)構(gòu)成的一個三元

      組,標識一個稀疏矩陣的話,還要記錄該矩陣的階數(shù),這樣我們就將一個二維的變成了一個一維,極大的壓縮的存儲空間,這里要注意的就是,三

      元組的構(gòu)建采用“行“是從上到下,“列”也是從左到右的方式構(gòu)建的順序表。

      復制代碼
       1         /// <summary>
       2         /// 三元組
       3         /// </summary>
       4         public class Unit
       5         {
       6             public int x;
       7             public int y;
       8             public int element;
       9         }
      10 
      11         /// <summary>
      12         /// 標識矩陣
      13         /// </summary>
      14         public class SPNode
      15         {
      16             //矩陣總行數(shù)
      17             public int rows;
      18 
      19             //矩陣總列數(shù)
      20             public int cols;
      21 
      22             //非零元素的個數(shù)
      23             public int count;
      24 
      25             //矩陣中非零元素
      26             public List<Unit> nodes = new List<Unit>();
      27         }
      復制代碼

      其實說到這里也就差不多了,我們只要知道三元組是用來做矩陣壓縮的一個順序存儲方式即可,然后知道怎么用三元組表來做一些常規(guī)的矩陣

      運算,好了,既然說已經(jīng)做成線性存儲了,那就做個“行列置換”玩玩。

      二:行列置換

      做行列置換很容易,也就是交換"非零元素"的(x,y)坐標,要注意的就是,原先我們的三元組采用的是”行優(yōu)先“,所以在做轉(zhuǎn)置的時候需要

      遵循"列優(yōu)先“。

      復制代碼
       1         /// <summary>
       2         /// 行轉(zhuǎn)列運算
       3         /// </summary>
       4         /// <param name="spNode"></param>
       5         /// <returns></returns>
       6         public SPNode ConvertSpNode(SPNode spNode)
       7         {
       8             //矩陣元素的x和y坐標進行交換
       9             SPNode spNodeLast = new SPNode();
      10 
      11             //行列互換
      12             spNodeLast.rows = spNode.cols;
      13             spNodeLast.cols = spNode.rows;
      14             spNodeLast.count = spNode.count;
      15 
      16             //循環(huán)原矩陣的列數(shù) (行列轉(zhuǎn)換)
      17             for (int col = 0; col < spNode.cols; col++)
      18             {
      19                 //循環(huán)三元組行的個數(shù)
      20                 for (int sp = 0; sp < spNode.count; sp++)
      21                 {
      22                     var single = spNode.nodes[sp];
      23 
      24                     //找到三元組中存在的相同編號
      25                     if (col == single.y)
      26                     {
      27                         spNodeLast.nodes.Add(new Unit()
      28                         {
      29                             x = single.y,
      30                             y = single.x,
      31                             element = single.element
      32                         });
      33                     }
      34                 }
      35             }
      36 
      37             return spNodeLast;
      38         }
      復制代碼

      最后是總的代碼:

      復制代碼
        1 using System;
        2 using System.Collections.Generic;
        3 using System.Linq;
        4 using System.Text;
        5 using System.Diagnostics;
        6 using System.Threading;
        7 using System.IO;
        8 
        9 namespace ConsoleApplication2
       10 {
       11     public class Program
       12     {
       13         public static void Main()
       14         {
       15             Martix martix = new Martix();
       16 
       17             //構(gòu)建三元組
       18             var node = martix.Build();
       19 
       20             foreach (var item in node.nodes)
       21             {
       22                 Console.WriteLine(item.x + "\t" + item.y + "\t" + item.element);
       23             }
       24 
       25             Console.WriteLine("******************************************************");
       26 
       27             var mynode = martix.ConvertSpNode(node);
       28 
       29             foreach (var item in mynode.nodes)
       30             {
       31                 Console.WriteLine(item.x + "\t" + item.y + "\t" + item.element);
       32             }
       33 
       34             Console.Read();
       35         }
       36     }
       37 
       38     public class Martix
       39     {
       40         /// <summary>
       41         /// 三元組
       42         /// </summary>
       43         public class Unit
       44         {
       45             public int x;
       46             public int y;
       47             public int element;
       48         }
       49 
       50         /// <summary>
       51         /// 標識矩陣
       52         /// </summary>
       53         public class SPNode
       54         {
       55             //矩陣總行數(shù)
       56             public int rows;
       57 
       58             //矩陣總列數(shù)
       59             public int cols;
       60 
       61             //非零元素的個數(shù)
       62             public int count;
       63 
       64             //矩陣中非零元素
       65             public List<Unit> nodes = new List<Unit>();
       66         }
       67 
       68         /// <summary>
       69         /// 構(gòu)建一個三元組
       70         /// </summary>
       71         /// <returns></returns>
       72         public SPNode Build()
       73         {
       74             SPNode spNode = new SPNode();
       75 
       76             //遵循行優(yōu)先的原則
       77             spNode.nodes.Add(new Unit() { x = 0, y = 0, element = 8 });
       78             spNode.nodes.Add(new Unit() { x = 1, y = 2, element = 1 });
       79             spNode.nodes.Add(new Unit() { x = 2, y = 3, element = 6 });
       80             spNode.nodes.Add(new Unit() { x = 3, y = 1, element = 4 });
       81 
       82             //4階矩陣
       83             spNode.rows = spNode.cols = 4;
       84 
       85             //非零元素的個數(shù)
       86             spNode.count = spNode.nodes.Count;
       87 
       88             return spNode;
       89         }
       90 
       91         /// <summary>
       92         /// 行轉(zhuǎn)列運算
       93         /// </summary>
       94         /// <param name="spNode"></param>
       95         /// <returns></returns>
       96         public SPNode ConvertSpNode(SPNode spNode)
       97         {
       98             //矩陣元素的x和y坐標進行交換
       99             SPNode spNodeLast = new SPNode();
      100 
      101             //行列互換
      102             spNodeLast.rows = spNode.cols;
      103             spNodeLast.cols = spNode.rows;
      104             spNodeLast.count = spNode.count;
      105 
      106             //循環(huán)原矩陣的列數(shù) (行列轉(zhuǎn)換)
      107             for (int col = 0; col < spNode.cols; col++)
      108             {
      109                 //循環(huán)三元組行的個數(shù)
      110                 for (int sp = 0; sp < spNode.count; sp++)
      111                 {
      112                     var single = spNode.nodes[sp];
      113 
      114                     //找到三元組中存在的相同編號
      115                     if (col == single.y)
      116                     {
      117                         spNodeLast.nodes.Add(new Unit()
      118                         {
      119                             x = single.y,
      120                             y = single.x,
      121                             element = single.element
      122                         });
      123                     }
      124                 }
      125             }
      126 
      127             return spNodeLast;
      128         }
      129     }
      130 }
      復制代碼

      經(jīng)典算法題每日演練——第二十題 三元組

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多