经典算法题每日演练——第二十题 三元组
2013-03-28 19:02
288 查看
我们知道矩阵是一个非常强大的数据结构,在动态规划以及各种图论算法上都有广泛的应用,当然矩阵有着不足的地方就是空间和时间
复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory。。。那么面
临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组。
一:三元组
有时候我们的矩阵中只有零星的一些非零元素,其余的都是零元素,那么我们称之为稀疏矩阵,当然没有绝对的说有多少个零元素才算稀疏。
View Code
复杂度都维持在N2上,比如1w个数字建立一个矩阵,在内存中会占用1w*1w=1亿的类型空间,这时就会遇到outofmemory。。。那么面
临的一个问题就是如何来压缩矩阵,当然压缩的方式有很多种,这里就介绍一个顺序表的压缩方式:三元组。
一:三元组
有时候我们的矩阵中只有零星的一些非零元素,其余的都是零元素,那么我们称之为稀疏矩阵,当然没有绝对的说有多少个零元素才算稀疏。
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; using System.IO; namespace ConsoleApplication2 { public class Program { public static void Main() { Martix martix = new Martix(); //构建三元组 var node = martix.Build(); foreach (var item in node.nodes) { Console.WriteLine(item.x + "\t" + item.y + "\t" + item.element); } Console.WriteLine("******************************************************"); var mynode = martix.ConvertSpNode(node); foreach (var item in mynode.nodes) { Console.WriteLine(item.x + "\t" + item.y + "\t" + item.element); } Console.Read(); } } public class Martix { /// <summary> /// 三元组 /// </summary> public class Unit { public int x; public int y; public int element; } /// <summary> /// 标识矩阵 /// </summary> public class SPNode { //矩阵总行数 public int rows; //矩阵总列数 public int cols; //非零元素的个数 public int count; //矩阵中非零元素 public List<Unit> nodes = new List<Unit>(); } /// <summary> /// 构建一个三元组 /// </summary> /// <returns></returns> public SPNode Build() { SPNode spNode = new SPNode(); //遵循行优先的原则 spNode.nodes.Add(new Unit() { x = 0, y = 0, element = 8 }); spNode.nodes.Add(new Unit() { x = 1, y = 2, element = 1 }); spNode.nodes.Add(new Unit() { x = 2, y = 3, element = 6 }); spNode.nodes.Add(new Unit() { x = 3, y = 1, element = 4 }); //4阶矩阵 spNode.rows = spNode.cols = 4; //非零元素的个数 spNode.count = spNode.nodes.Count; return spNode; } /// <summary> /// 行转列运算 /// </summary> /// <param name="spNode"></param> /// <returns></returns> public SPNode ConvertSpNode(SPNode spNode) { //矩阵元素的x和y坐标进行交换 SPNode spNodeLast = new SPNode(); //行列互换 spNodeLast.rows = spNode.cols; spNodeLast.cols = spNode.rows; spNodeLast.count = spNode.count; //循环原矩阵的列数 (行列转换) for (int col = 0; col < spNode.cols; col++) { //循环三元组行的个数 for (int sp = 0; sp < spNode.count; sp++) { var single = spNode.nodes[sp]; //找到三元组中存在的相同编号 if (col == single.y) { spNodeLast.nodes.Add(new Unit() { x = single.y, y = single.x, element = single.element }); } } } return spNodeLast; } } }
相关文章推荐
- 经典算法题每日演练——第二十题 三元组
- 经典算法题每日演练——第二十题 三元组
- 经典算法题每日演练——第二十题 三元组
- 经典算法题每日演练——第一题 百钱买百鸡
- 经典算法题每日演练——第十四题 Prim算法
- 经典算法题每日演练——第二题 五家共井
- 经典算法题每日演练——第十七题 Dijkstra算法
- 经典算法题每日演练——第十九题 双端队列
- 经典算法题每日演练——第四题 最长公共子序列
- 经典算法题每日演练——第二题 五家共井
- 经典算法题每日演练——第九题 优先队列
- 经典算法题每日演练——第三题 猴子吃桃
- 经典算法题每日演练——第十八题 外排序
- 经典算法题每日演练——第二十三题 鸡尾酒排序
- 经典算法题每日演练——第五题 字符串相似度
- 经典算法题每日演练——第二十一题 十字链表
- 经典算法题每日演练——第十二题 线段树
- 经典算法题每日演练——第十八题 外排序
- 经典算法题每日演练——第四题 最长公共子序列
- 经典算法题每日演练——第十九题 双端队列