第3章 数据描述
最常见的数据描述方法有:公式化描述、链接描述、间接寻址和模拟指针。
公式化描述借助数学公式来确定元素表中的每个元素分别存储在何处(如存储器地址)。
最简单的情形就是把所有元素依次连续存储在一片连续的存储空间中,这就是通常所说的连续线性表。
在链接描述中,元素表中的每个元素可以存储在存储器的不同区域中,每个元素都包含一个指向下一个元素的指针。同样,在间接寻址方式中,元素表中的每个元素也可以存储在存储器的不同区域中,不同的是,此时必须保存一张表,该表的第 i项指向元素表中的第 i个元素,所以这张表是一个用来存储元素地址的表。
在公式化描述中,元素地址是由数学公式来确定的;在链接描述中,元素地址分布在每一个表元素中;而在间接寻址方式下,元素地址则被收集在一张表中。
模拟指针非常类似于链接描述,区别在于它用整数代替了 C++指针,整数所扮演的角色与指针所扮演的角色完全相同。
1. 公式化描述的评价
这种描述方法的一个缺点是空间的低效利用。考察如下的情形:我们需要维持三个表,而且已经知道在任何时候这三个表所拥有的元素总数都不会超过 5000个。然而,很有可能在某个时刻一个表就需要5000个元素,而在另一时刻另一个表也需要 5000 个元素。若采用类LinearList,这三个表中的每一个表都需要有 5000个元素的容量。因此,即使我们在任何时刻都不会使用5000以上的元素,也必须为此保留总共 15000个元素的空间。
为了避免这种情形,必须把所有的线性表都放在一个数组 list中进行描述,并使用两个附加的数组first和last对这个数组进行索引。图 3-3给出了在一个数组 list中描述的三个线性表。我们采用大家很习惯的约定,即如果有 m个表,则每个表从1到m进行编号,且 first[i]为第i个表中的第一个元素。有关 first[i]的约定使我们更容易地采用公式化描述方式。 last[i]是表i的最后一个元素。注意,根据这些约定,每当第 i个表不为空时,有 last[i]>first[i],而当第i个表为空时,有last[i]=first[i]。所以在图3-3的例子中,表 2是空表。在数组中,各线性表从左至右按表的编号次序1,2,3,...,m进行排列。

 

读书笔记之:数据结构,算法与应用(1)
 

 

读书笔记之:数据结构,算法与应用(1)

公式化描述代码如下:

 <<e.what()<< endl;
    }

}

为了避免第一个表和最后一个表的处理方法与其他的表不同,定义了两个边界表:表 0和表m+1,其中first[0]=last[0]=-1, first[m+1]=last[m+1]=MaxSize-1。为了在第 i 个表的第 k 个元素之后插入一个元素,首先需要为新元素创建空间。如果last[i]=first[i+1],则在第 i 个表和第 i + 1个表之间没有空间,因此不能把第 k + 1至最后一个元素向后移动一个位置。在这种情况下,通过检查关系式 last[i-1]<first[i]是否成立,可以确定是否有可能把第i 个表的1至k-1元素向前移一个位置;如果这个关系式不成立,要么需要把表 1至表i-1的元素向前移一个位置,要么把表 i+1至表m 向后移一个位置,然后为表 i创建需要增长的空间。当表中所有的元素总数少于 MaxSize时,这种移位的方法是可行的。图3-4是一个伪 C++函数,它向表 i 中插入一个新的元素,可以把该函数细化为兼容的 C++代码。

 

读书笔记之:数据结构,算法与应用(1)
 

 

相关文章:

  • 2021-12-26
  • 2021-08-16
  • 2022-12-23
  • 2018-12-24
  • 2021-07-14
  • 2022-12-23
  • 2022-12-23
  • 2021-10-12
猜你喜欢
  • 2021-10-03
  • 2021-10-13
  • 2021-06-19
  • 2021-10-31
  • 2022-01-09
  • 2021-07-02
  • 2021-07-18
相关资源
相似解决方案