线性结构作为最常用的数据结构,其特点
是数据元素之间存在一对一的线性关系。
线性结构有两种不同的存储结构,即顺序
存储结构(数组)和链式存储结构(链表)。顺
序存储的线性表称为顺序表,顺序表中的
存储元素是连续的链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
线性结构常见的有:数组、队列,链表和
栈。
1、稀疏数组
。因为该二维数组的很多值是默认值0因此
记录了很多没有意义的数据->稀疏数组。
。当一个数组中大部分元素为0,或者为同
一个值的数组时,可以使用稀疏数组来保
存该数组。
稀疏数组的处理方法是:
记录数组一共有几行几列,有多少个不同的值。
把具有不同值的元素的行列及值记录在一
个小规模的数组中,从而缩小程序的规模。
二维数组转稀疏数组的思路
。遍历原始的二维数组,得到有效数据的个数sum。
。根据sum就可以创建稀疏数组sparseArrint[sum+1][3]。
。将二维数组的有效数据数据存入到稀疏数组。
稀疏数组转原始的二维数组的思路
。先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11]。
。在读取稀双向链表是链表的一种,它和单向链表只的区别是双向链表比单向链表每个节点多一个头指针,这个指针指向前一个节点,也就是说,每个节点包含包含头指针、存储元素、尾指针,因此从这个节点可以同时访问到它前面和后面的节点。我们可以想一下,如果是单向链表,要访问一个节点前面的节点,是不是要从头结点开始遍历,直到找个这个节点前面的节点为止,而双向链表直接就可以访问前
一个节点,查询和操作数据就会更加方便。世界上没有完美的东西,有利就有弊,方便了数据操作的同时,牺牲的是所占的空间,因为每个节点要多出一个头指针,必然会多占用一定的内存空间,这也是空间换时间的一种方式。
双向链表的javascript实现
我们还是用类的方式来实现数据结构,跟单向链表所提供的方法类似,双向链表的特殊之处在于插入和移除元素时对于头指针的操将树的定义明确后,需要知道节点、节点的度、叶子节点等基本概念,如下:
(1)节点node:树中的一个数据项及指向分支的指针项
(2)节点的度degree:节点的子树的数目,比如上图中节点4的度为2
(3)树的度degree:树的所有节点中度的最大值,比如上图中节点1的度最大,为3
(4)叶子节点:树中度为0的节点,比如上图中节点3、4
(5)非叶子节点Q:树中度不为0的节点,比如上图中1、2、4
(6)孩子节点和双亲节点:节点子树的根称为该节点的孩子节点,该节点称为孩子节点的父节点(或双亲节点parent),比如上图中节点2为节点5的父节点,结点5为节点2的孩子节点
(7)兄弟节点:对于相同父节点的所有孩子节点来说,互为兄弟节点,比如上图中2、3、4互为兄弟节点,且6、7互为兄弟节点
(8)层次:前面已经提到,树是一种层次结构,节点的层次是按照递归定义的。将树的根节点层次定义为1,除根节点以外所有的节点层次为其父节点层次加1。比如上图中节点4的层次为2,节点6的层次为3
(9)树的深度(depth):树所有节点的层次值的最大值,比如上图中树的层次值最大为3,即树的深度(或称为高度)为3
(10)堂兄弟节点Q:同一“层次”的所有节点称为堂兄弟节点,比如5、6、7节点
(11)层次路径Q:从根节点到某x节点所经过的所有节点,称为节点x的层次路径(有且仅有一条路径,绝不会存在两条不同路径)
(12)祖先:在某x节点的层次路径上的所有节点,称为x节点的祖先(不包括x本身)
(13)子孙节点:当某一节点视为根节点时,其所有子树上的节点,都称为该节点的子孙节点
(14)森林forest:多个互不相交的树构成的集合
作。
疏数组后几行的数据,并赋给原始的二维数组即可。