问答题
某个任务的数据模型可以抽象为给定的K个集合:S1,S2,…,SK。其中Si(1≤i≤k)中的元素个数不定。在处理数据过程中将会涉及元素的查找和新元素的插入两种操作,查找和插入时用一个二元组(i,x)来规定一个元素,i是集合的序号,x是元素值。设计一种恰当的数据结构来存储这k个集合的元素,并能高效地实现所要求的查找和插入操作。(1)借助Pascal的数据类型来构造和描述你所选定的数据结构,并且说明选择的理由;(2)若一组数据模型为S1={10.2,1.7,4.8,16.2),S2={1.7,8.4,0.5},S3={4.8,4.2,3.6,2.7,5.1,3.9),待插入的元素二元组为(2,11.2)和(1,5.3),按你的设计思想画出插入元素前后的数据结构状态。【北京工业大学1995七(20分)】
【正确答案】正确答案:借助于分块查找思想,在建立数据顺序表的同时,建立一索引表。数据表中按尼个集合分块 (元素个数不一定相等),素引表中有两个域,一是各集合最后一个元素在数据表中的位置(一维数组中的下标),二是集合的个数(k)。实现数据运算时,根据给定的二元组(i,x),首先在索引表中找到集合i的位置,然后在数据表中查找x。如查到x,则查找成功,返回x在数据表中的位置,否则查找失败。若要插入,则将数据表中的数据后移,插入x,同时修改索引表。插入算法的核心语句段如下: if(i:=1)first=0; //要求在第i个集合插入数据 else first=id.a[i..1]+1; //first指向第i个集合在数据表的首址 last=id.a[i]; //last是第i个集合在数据表中的末址 for(j=first;J≤last;j++) if(R[j]==x)return (j); //查找成功,返回元素位序 for(j=id.a lid.k];j>id.a[i];j一一) //查找失败,将x插入数据表 R[j+1]=R[j]; //元素后移 R[j+1]=x; //将x插入原第i个集合最后一个元素之后 for(J=i;j≤k;j++)id.a[j]++; //修改索引表中各集合最后一个元素的下标 由于各集合元素个数不等,各块长度不等且块间无序,索引表中用数组表示,数组中元素值是各集合最后一个元素在数据表中的下标。按本算法插入(2,11.2)和(1,5.3),数据表前后状态如下:

【答案解析】