首页 > 其他 > 详细

数据结构与程序架构(六)

时间:2014-04-14 01:07:45      阅读:470      评论:0      收藏:0      [点我收藏+]


我们现在来看看,如何把逻辑调用关系转换成拓扑结构和数据流。下面是一个简单的插入排序算法的处理逻辑:

bubuko.com,布布扣

(图片来源:http://c.chinaitlab.com/special/cpxsf/index.html


这个算法的逻辑大家应该都有所了解,现在让我们来看看它的数据流图:

bubuko.com,布布扣

图2:插入排序器的数据流图

在上图中,"enumerator"从"data array"的第二个元素开始,逐个的枚举元素并输出当前的枚举位置,"comparer"通过将"enumerator"的输出与"data array"中的数据进行比较,从而输出插入位置,最后由"inserter"综合所有输入,将元素插入到正确位置(注意,描述一个处理逻辑的数据流图有可能不止一个,而不同的数据流图,产生的结果可能会有所不同)。

如果将上图与程序代码进行比较,可以发现,"enumerator"的输出就等价于代码中的i和key变量,"comparer"的输出就等价于j变量。请注意我使用了“等价于”这个词,这是因为,对同一个拓扑结构,如果我们修改了它所传递的数据类型,那么它就可以用于其它类型数据的排序。由此就引出了另一个问题,我们如何定义数据流图中传递的数据类型?

在绝大多数高级编程语言中,数据类型都是以树的形式进行描述的,比如以C语言为例,它的数据类型定义的代码如下:

struct type1 {

int     field1;

short   field2[2];

void *  field3;

...

};

struct type2 {

char   field1[200];

type1  field2;

...

};

观察上面的类型定义可以发现,每一个数据类型都由若干个field 组成,而每一个 field有2个显式属性和1个隐式属性,即“类型”、“名称”和“大小”,因此,每一个数据类型都可以用一个 (type, name, size) 三元项的list来描述,例如:

type1的描述:

( int, field1, sizeof(field1) )

( short, field2, sizeof(field2) )

( void *, field3, sizeof(field3) )

...

type2 的描述:

( char, field1, sizeof(field1) )

( type1, field2, sizeof(field2) )

...

同时,每一个数据类型都有自己的名字,而且不难发现,如果一个数据类型(type1)是另一个数据类型(type2)的子类型,则充当子类型的数据类型必须放在前面,所以我们可以用一个 (name, field-list) 二元项的有序 list 来描述任意的数据类型集,例如:

( type1, field-listof(type1) )

( type2, field-listof(type2) )

其中field-listof()是一个借记符,表示field的list

另外,由于每一个field都是有大小的,显然,每一个数据类型也是有大小的,其大小就等于各个field大小的和。



数据结构与程序架构(六),布布扣,bubuko.com

数据结构与程序架构(六)

原文:http://blog.csdn.net/banqingzi/article/details/23606489

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!