空间映射

空间映射

   空间映射在计算机科学中原本是指将某些外部设备的寄存器、端口或者连续的存储器单元映射到某一段地址空间中。在这里,我们将这一概念扩展开来,把所有“实现线性或者非线性、连续或者非连续的逻辑存储结构映射到地址空间的操作”都称为空间映射。在连续的线性空间中映射复杂的链式结构,方式通常为两种。

  (1)消耗额外的空间,构建出同时包含DATA域和指针域(NEXT域只是指针域的一种,一个的节点通常拥有多个名字和功能不同的DATA域及若各干指针域)的节点,如实的根据所需的逻辑关系构建链式结构。我们不妨把这种方式称为“链式构造法”。这种方式相当灵活,缺点也往往来源于这种灵活性,使用链表通常被认为是复杂的,有相当风险的行为。而节点中,占用了存储空间的指针域也往往被看成是一种空间上的浪费。

  (2)运用数学的方法,通过构造一些函数来模拟链式结构的访问顺序。我们不妨把这种方式称为“函数构造法”。采用这种方法时,通常要借用数组--借用数组的隐含约定。使用这种方法的优点在于,借用数学函数和数据的隐含约定省去了指针域,因而空间利用率较高。由于并不需要复杂的指针访问操作,结合数值运算和数值的隐含约定,往往能够高效而随机的访问我们需要的目标节点。灵活性差和大块的连续空间的需求,在拥有较大存储空间的计算机系统中,并不断是一个很突出的优点。

  在不同的应用场合中使用不同的方法,是正确使用数据结构的关键。以8位单片机系统为例,由于此类单片机的存储空间有较小,提高系统空间的利用率就成为系统设计时的基本要求。同时,受到存储器大小的限制,此类系统中存储器的分配和使用往往是显式的,存储器空间的静态分配成为主流。在这种情况下,以动态分配(堆式分配)为主要实现手段的“链式构造法”就显得很不合时宜。

  8位单片机系统往往首先考虑采用“函数构造法”作为空间映射的主要方式。在后面的内容中,如果没有特别说明,我们所有讲解都建立在“8位单片机系统”这个限定条件上。接下来,我们就以环形结构为例,为大家说明如何使用“函数构造法”实现其向线性空间的映射。

  我们假设需要建立一个拥有10个结点的环形结构,使用函数构造法,首先需要建立一个指定的类型(不妨设为int型)、大小为10的数组:

  #define CIRCLE_SIZE 10

  int CircleArray[CIRCLE_AIZE]={0};

  如果我们沿着一个方向单向访问环形结构,那么一个很可能的访问序列为:

0、1、2、3、4、5、6、7、8、9、0、1、...

或者0、9、8、7、6、...、1、0、9、8、....

不难发现,在这两个序列中,所有的数字都不能超过CIRCLE_SIZE也就是10。设定变量n作为访问变量,那么以上序列就是n值得变化序列。通过观察,容易想到,第一个访问序列可以通过构建一个条件判断规定访问的上界来实现:

//通过条件判断获取下一个要访问的数组元素标号,并规定上界

n++;

if(n == CIRCLE_SIZE)

{

      n=0;

}

同理,对于第二个访问序列,我们可以通过构建一个规定下界的条件判断来实现:

//通过条件判断获取下一个要访问的数组元素标号,并规定上界

if(n == 0)

{

      n=CIRCLE_SIZE;

}

n--

 

当n为有符号数时,也可以这样:

//通过条件判断获取下一个要访问的数组元素标号,并规定下界

n--;

if(n <0)

{

   n+=CIRCLE_SIZE;

}

 

条件限定访问界限的方法,对于单纯的访问顺序,具有效率高易理解的特点。但是,如果访问顺序并非单向,而是任意的 

两种顺序同时存在,简单地将两种判断叠加在一起就显得很笨拙了。这种情况下,尝试下面的方法也许能让你耳目一新:

//使用问号表达式和求余操作实现的边界限定,n是否有符号同时适用

//n值可以在此表达式之前任意变动

n= (n>=0)?n%CIRCLE_SIZE:((N%CIRCLE_SIZE)+CIRCLE_SIZE)%CIRCLE;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值