javascript实现数据结构:稀疏矩阵的十字链表存储表示
当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表。例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动。为此,对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当。
在链表中,每个非陵园可用一个含5个域的结点表示,其中i,j和e这3个域分别表示该非零元所在的行,列和非零元的值,向右域right用以链接同一行中下一个非零元,向下域down用以链接同一列中下一个非零元。同一行的非零元通过right域链接成一个线性表,同一列中的非零元通常down域链接成一个线性链表,每一个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表。
可用两个分别存储行链表的头指针和列链表的头指针的一维数组来表示。
代码:
/**
* 十字链表
*
* 当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表。例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动。为此,对这种类型的矩阵,采用链式存储结构表示三元组的线性表更为恰当。
*
* 在链表中,每个非陵园可用一个含5个域的结点表示,其中i,j和e这3个域分别表示该非零元所在的行,列和非零元的值,向右域right用以链接同一行中下一个非零元,向下域down用以链接同一列中下一个非零元。同一行的非零元通过right域链接成一个线性表,同一列中的非零元通常down域链接成一个线性链表,每一个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表。
*
* 可用两个分别存储行链表的头指针和列链表的头指针的一维数组来表示。
*/ // 稀疏矩阵的十字链表存储表示 function OLNode(i, j, e) {
// 该非零元的行和列下标
this.i = i || 0;
this.j = j || 0;
this.e = e;
// 该非零元所在行表和列表的后继链域
this.right = null; // type: OLNode
this.down = null; // type: OLNode
} function CrossList() {
// 行和列链表头指针向量基址由CreateSMatrix分配
this.rhead = [];
this.chead = [];
// 稀疏矩阵的行数,列数
this.mu = 0;
this.nu = 0;
this.tu = 0;
}
/**
* 矩阵初始化
* @param m
* @param n
* @param t
* @param {Array} list 二维数组,每行的元素分别是[i, j, e]
*/
CrossList.prototype.createSMatrix = function (m, n, t, list) {
this.mu = m;
this.nu = n;
this.tu = t; for (var row = 0; row < list.length; row++) {
var p = {};
OLNode.apply(p, list[row]);
var i = list[row][0];
var j = list[row][1];
var q; if (this.rhead[i] == null || this.rhead[i].j > j) {
p.right = this.rhead[i];
this.rhead[i] = p;
} else {
// 查询在行表中的插入位置
for (q = this.rhead[i]; q.right && q.right.j < j; q = q.right);
p.right = q.right;
q.right = p;
} if (this.chead[j] == null || this.chead[j].i > i) {
p.down = this.chead[j];
this.chead[j] = p;
} else {
for (q = this.chead[j]; q.down && q.down.i < i; q = q.down);
p.down = q.down;
q.down = p;
}
}
}; // 矩阵相加
CrossList.prototype.addMatrix = function (crossList) {
var hl = [];
//hl初始化
for (var j = 0; j <= this.nu; j++)
hl[j] = this.chead[j]; for (var i = 0; i <= this.mu; i++) {
//pa和pb指向每一行的第一个非0元结点,直至最后一行
var pa = this.rhead[i];
var pb = crossList.rhead[i];
var pre = null; //处理B的一行,直至本行中无非0元素的结点
while (pb) {
var p, q;
// 新插入一个结点到pa的左侧
if (!pa || pa.j > pb.j) {
p = new OLNode(pb.i, pb.j, pb.e); //行表的指针变化
if (!pre) this.rhead[p.i] = p;
else pre.right = p; p.right = pa;
pre = p; //列表的指针变化
if (hl[p.j]) {
// 从hl[p.j]开始找到新结点在同一列中的前驱结点,并让hl[p.j]指向它
for (q = hl[p.j]; q && q.i < p.i;q = q.down)
hl[p.j] = q;
} //在列表中插入新结点,根据行数判断插入前面还是后面
if (!this.chead[p.j] || this.chead[p.j].i > p.i) {
p.down = this.chead[p.j];
this.chead[p.j] = p;
} else {
p.down = hl[p.j].down;
hl[p.j].down = p;
} hl[p.j] = p;
pb = pb.right;
} else if (pa.j < pb.j) {
pre = pa;
pa = pa.right;
} else {
//当pa.j === pb.j时,将B中当前结点的值加到A中当前结点上
pa.e += pb.e; //当pa.e === 0时,删除该结点
if (pa.e === 0) {
// 若无前驱结点,将第一个非0元结点置为当前结点的后继结点,
// 否则前驱结点的后继结点为当前结点的后继结点
if (!pre) this.rhead[pa.i] = pa.right;
else pre.right = pa.right; p = pa;
pa = pa.right; //列表的指针变化
if (hl[p.j]) {
//从hl[p.j]开始找到新结点在同一列中的前驱结点,并让hl[p.j]指向它
for (q = hl[p.j]; q && q.i < p.i; q = q.down)
hl[p.j] = q;
} if (this.chead[p.j] == p)
this.chead[p.j] = hl[p.j] = p.down;
else
hl[p.j].down = p.down;
} pb = pb.right;
}
}
}
}; var lists = [
[1, 4, 5],
[2, 2, -1],
[1, 1, 3],
[3, 1, 2]
];
var a = new CrossList();
a.createSMatrix(4, 4, 4, lists);
console.log(a); var lists2 = [
[1, 4, -5],
[2, 3, 1],
[1, 1, 3],
[3, 2, 2]
];
var b = new CrossList();
b.createSMatrix(4, 4, 4, lists2);
console.log(b); a.addMatrix(b);
console.log(a);
javascript实现数据结构:稀疏矩阵的十字链表存储表示的更多相关文章
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构之---C++语言实现图的十字链表存储表示
近期一直忙着考研复习,非常久都没有更新博客了.今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstd ...
- 利用十字链表存储树结构(便于同时求出某一点的入度与出度)------C语言实现
#include <stdio.h> #include<conio.h> #include<stdlib.h> /* 利用十字链表存储有向图,可用于同时查找某个顶点 ...
- javascript实现数据结构: 稀疏矩阵之三元组线性表表示
稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义.设矩阵A是一个n*m的矩阵中有s个非零元素,设 δ=s/(n*m),称δ为稀疏因子, 如果某一矩阵的稀疏因子δ满足δ≦ ...
- javascript实现数据结构: 串的块链存储表示
和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...
- javascript实现数据结构:串--堆分配存储表示
堆分配存储表示 这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得. 结构图: 实现: function HString(){ this. ...
- javascript实现数据结构与算法系列
1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子 ...
- 图->存储结构->十字链表
文字描述 十字链表是有向图的另一种链式存储结构. 在十字链表中,对应于有向图中每一条弧有一个结点,对应于每个顶点也有一个结点.这些结点的结构如下所示: 在弧结点中有5个域: 尾域tailvex和头域h ...
- 利用十字链表压缩稀疏矩阵(c++)-- 数据结构
题目: 7-1 稀疏矩阵 (30 分) 如果一个矩阵中,0元素占据了矩阵的大部分,那么这个矩阵称为“稀疏矩阵”.对于稀疏矩阵,传统的二维数组存储方式,会使用大量的内存来存储0,从而浪费大量内存.为 ...
随机推荐
- audiosprite的使用
github地址: https://github.com/tonistiigi/audiosprite 使用方法: http://www.jikexueyuan.com/course/2510_2.h ...
- n阶幻方
前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...
- python学习之路---day25( 网络编程基础和初识socket)
基本网络知识和初识socket一:基本知识 网线:传输电信号 集线器:将所有连接到集线器的网络设备连通起来 交换机: 升级版的集线器 网卡:接受电信号 MAC地址:物理地址: 8C-88-4B-88- ...
- pip 使用代理
pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python 红色部分 代表使用 阿里云 代理 安装 pip
- HDU-2063(二分图匹配模板题)
过山车Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- P1353_[USACO08JAN]跑步Running 我死了。。。
我死了...被绿题虐...看来我的水平有待提高...QWQ 好吧,就是跑步的时候只能从跑步的状态转移过来 休息的时候可以从上一次休息时转移过来,也可以从某次跑步的时转移过来,需要枚举从哪一个状态转移来 ...
- POJ - 3090 gcd水题
大概题意就是求\(1 \le i,j \le n\)的\(gcd(i,j) = 1\)的个数+2(对于0的特判) 正解应该是欧拉函数或者高逼格的莫比乌斯反演 但数据实在太水直接打表算了 /*H E A ...
- ansys14.0 从入门到精通
凌桂龙 李战分 2013.2 清华大学 FLUENT流体计算应用教程 索书号:TB126-39 ZW2.1 单元 结点 和 自由度 载荷 与 边界条件 : 关系 就是约束 , 边界条件是 结构 ...
- 2019.3.26 SQL语句(进阶3)
表的联查 员工表与部门表 员工表:id,姓名,年龄,部门id 部门表:部门id,部门名,部门成立时间,部门领导,部门职责.... 表和表之间的关系 一对一 一对多 多对多 创建联查 创建表 先创建被依 ...
- Macbook使用Gitlab配置SSH Key
git是分布式代码管理工具,远程代码管理是基于ssh的,代码上传大搜gitlab或者github代码仓储时,需要进行ssh配置. 把本地代码上传到服务器时需要加密处理,git中公钥(id_rsa.pu ...