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,从而浪费大量内存.为 ...
随机推荐
- sqlserver 临时表,多用户同时访问冲突吗?
当然不会冲突,一个井号的临时表(本地临时表),在数据库中物理表名并非你看到的,而是系统会为你的临时表生成一个唯一的表名,所以其它用户使用和建同样的表不会发生冲突.
- WPF 仿IPhone滑块开关 样式 - CheckBox
原文:WPF 仿IPhone滑块开关 样式 - CheckBox <Style x:Key="CheckRadioFocusVisual"> <Setter Pr ...
- 《Java并发编程实战》第十章 避免活跃性危急 读书笔记
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/love_world_/article/details/27635333 一.死锁 所谓死锁: 是指两 ...
- tomcat添加管理后台的用户名和密码(为jenkins连接tomcat用)
vim ./conf/tomcat-users.xml <role rolename="admin"/> <role rolename="admin- ...
- tornado 11 异步编程
tornado 11 异步编程 一.同步与异步 同步 #含义:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 #现象:有一个共同的时钟,按来的顺序一个一个处理 #直观感受:需要等待,效率 ...
- C++_友元3-其他友元关系
友元和类的关系还可以更复杂. 举个例子,假设出现了交互式遥控器,交互式遥控器能够让您回答电视节目中的问题,如果回答错误,电视将在控制器上产生嗡嗡声. 这个例子的问题,可以使用新的友元关系来解决.我把它 ...
- pscp 命令---windows和linux之间互相拷贝文件的工具
pscp -r d:\cc root@10.0.0.8:/root/test copy d:\cc content recursively into the /root/test, contains ...
- Selenium WebDriver的简单操作说明
[From] http://blog.csdn.net/xiao190128/article/details/49784121 1.打开一个测试浏览器 对浏览器进行操作首先需要打开一个浏览器,接下来才 ...
- Jquery EasyUI Treegrid按需加载子集
项目说明,要一个有权限并且按需加载的树形列表. jeasyui网址 CSS <!--添加树状控件--> <link rel="stylesheet" type=& ...
- Unity 代码控制游戏对象是父物体的第多少个子对象
一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...