算法与数据结构【C++】:稀疏表

很多情境下,存储数据的最好方式就是表。

 
当数据较为稠密的聚集在某个坐标范围中时,采用数组是最好的选择。
比如,要存储一个班学生的成绩,该班级有30人,编号从1-30,有10门课,编号1-10
那么就可以用一个30x10的数组存储这张成绩表,经济实惠使用方便

但是有的时候数据非常稀疏,比如一个学校一共开设了1000门课,有的学生可以随意选课,现在需要一个数据结构存储每个学生每门课的成绩。
显然一个学生一学期只能上十几门课,所以表内的数据很稀疏,大部分结点都是空结点,没有数据。如果使用数组,那就需要提前分配好空间,不仅成绩表本身很大,也浪费了很多空间。

这个时候,就可以使用稀疏表。


想象现在有一张记录3000名学生在1000门课的成绩。
现在把每个非空的表中元素抽象成一个结点,每一列串起来形成很多列,这些列一起放入一个数组;每一行串起来形成很多行,这些行一起放入一个数组,这样,整个稠密的数组被选出来的结点编织成一张稀疏的网。
维护与存储这张网即可

如下图:

 

稀疏表的属性如下:


    int rowTotalNum;    //总行数
    int colTotalNum;    //总列数
    LinkedList[] row;    //行链表的指针,大小需要与下方一致
    LinkedList[] col;    //列链表的指针,大小需要与下方一致

稀疏表提供的方法如下:


    SparseTable():构造方法,初始化参数
    void insert(int value ,int rowIndex, int colIndex):向稀疏表的某个点(rowIndex,colIndex)插入value值
    void remove(int rowIndex, int colIndex):删除某个坐标(rowIndex,colIndex)的结点
    int getValue(int rowIndex, int colIndex):获取指定坐标(rowIndex,colIndex)的值,如果没有该结点,返回-1;方法内部提供了两种方法,按列查找和按行查找
    void printSelfByRow():通过行链表打印稀疏表
    void printSelfByCol():通过列链表打印稀疏表

    LinkedList getCol(int colIndex):获取某列的列链表
    LinkedList getRow(int rowIndex):获取某行的行链表

 

下方是C++代码:

#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;

//节点类,代表链表的结点
class Node{
	public:
		int row;
		int col;
		int value;	//存储节点的值 
		Node* next;	//存储下一个节点的指针 
		
		Node(int aValue, int aRow, int aCol, Node* aNext = NULL){	//构造函数,必须传入结点的值,下一个节点默认为NULL
			this->value = aValue;
			this->next = aNext;
			this->row = aRow;
			this->col = aCol;
		}	
};

class LinkedList{	//普通单向链表类
	public:
		int length;		//链表长度,该属性不重要,下面的方法中也没有用到,但是维护了该属性
		Node* head;		//链表头节点的指针
		Node* tail;		//链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值