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,从而浪费大量内存.为 ...
随机推荐
- rabbitMq使用学习笔记
rabbitmq的工作原理: MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议) ...
- 记一个SpringBoot中属性注入失败的问题Consider defining a bean of type ''' in your configuration
今天遇到的一个问题: 代码检查了好几次,都没有错误,但是启动时就会报错Consider defining a bean of type ''' in your configuration. 启动类在c ...
- JDK原生的HttpURLConnection请求实例
不想说啥,上代码! package com.my.https; import java.io.BufferedReader; import java.io.IOException; import ja ...
- let 和 var 的区别笔记
参考文章:阮一峰 ECMAScript 6 入门 ES6中新增加了 let 声明,它跟 var 的区别如下: 1.作用域不同,let 只在代码块中有效 { var a = '123'; le ...
- POJ - 1845 简单数论
求A^B的约数和模MOD 对A质因子分解P1^k1*P2^k2....P^kn A^B既指数对应部分乘以B 对于每个P都有(1+P^1+P^2+...+P^ki)的选择 连乘每一个P的等比数列之和即可 ...
- JAVA 使用Dom4j 解析XML
[转自] http://blog.csdn.net/yyywyr/article/details/38359049 解析XML的方式有很多,本文介绍使用dom4j解析xml. 1.环境准备 (1)下载 ...
- pyspider的基本操作
一.安装 pip install pyspider 1.修改 pyspider/webui/webdav.py 第209行:否则启动会报错 把: 'domaincontroller': NeedAut ...
- android 无线调试 [无需数据线][无需root]
无线调试首要条件在同一网段,打开开发者模式 1,打开 5555 端口 使用数据线链接手机,在命令窗口执行:adb tcpip 5555 2,adb 链接手机调试 这时无需数据线了,在命令窗口执行:ad ...
- PHP foreach ($arr as &$value)
foreach ($arr as &$value) 看到一个有意思的东西: <?php $arr = ['1', '2', '3', '4']; foreach ($arr as &am ...
- Xtts v4变化&先决条件&已知问题
V4变化的主要有: 1.这个采购使用简化的命令.源的一个命令(--backup)和目标的一个命令(--restore). 2.此过程只需要在源和目标的$ TMPDIR(res.txt)之间复制 ...