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,从而浪费大量内存.为 ...
随机推荐
- 前端CSS的基本素养
前端开发的三驾马车——html.css.js,先谈谈CSS CSS 前期:解决布局.特效.兼容问题 中级:网站风格的制定.色调.模块.布局方式.交互方式.逻辑设计等 高级:模块命名.类的命名.文件的组 ...
- [HEOI2012]采花 树状数组 BZOJ 2743
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- tomcat更改web文件路径
由于代码太长,记不住!只能自己做个小笔记了!! <Context path="/" docBase="/opt/appl/merch.bak" debug ...
- JUC包下CountDownLatch学习笔记
CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行, 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于 ...
- LDdecay计算和做图
先下载PopLDdecay软件(开源GitHub) https://github.com/BGI-shenzhen/PopLDdecay PopLDdecay的安装 1) INSTALL Method ...
- 119th LeetCode Weekly Contest Subarray Sums Divisible by K
Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...
- 利用touchslide实现tab滑动切换
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 基于docker+redis++urlib/request的分布式爬虫原理
一.整体思路及中心节点的配置 1.首先在虚拟机中运行一个docker,docker中运行的是一个linux系统,里面有我们所有需要的东西,linux系统,python,mysql,redis以及一些p ...
- ajax请求php,在返回信息前面出现了奇怪的红点点
如果你返回的json数据带有小红点,那么前台ajax是不认的,并且老是走ajax的error方法,不走success方法,因为ajax的dataType:“json”,你指定了返回的是json格式,j ...
- rancher 2.X 搭建小型web集群+mysql主从复制
一,环境配置 rancher 2.1.6 二,配置harbor私有仓库 见上文 三,配置私有镜像 01,总文件 dockerfile 为主配置文件,html 为站点文件wordpress.,官网 ...