1、特殊矩阵和稀疏矩阵哪一种压缩存储后会失去随机存取的功能?为什么?答:后者在采用压缩存储后将会失去随机存储的功能。
因为在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和它所在的行、列号作为一个结点存放在一起,这样的结点组成的线性表中叫三元组表,它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。
2、二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[3][5]的起始地址与M按列存储时元素()的起始地址相同。
A、M[2][4]B、M[3][4]C、M[3][5]D、M[4][4]为第3、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11的地址为()。
一元素,其存储地址为1,每个元素占一个地址空间,则a85A. 13B. 33C. 18D. 404、若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线(i<j)上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij的位置k的关系为( )。
A. i*(i-1)/2+jB. j*(j-1)/2+iC. i*(i+1)/2+jD. j*(j+1)/2+i5、设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序(1≤i,j≤n,且i≤j)存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij在B中的位置为( )。
A. i(i-l)/2+jB. j(j-l)/2+iC. j(j-l)/2+i-1D. i(i-l)/2+j-16、设二维数组A[1.. m,1.. n](即m行n列)按行存储在数组B[1.. m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。
A.(i-1)*n+jB.(i-1)*n+j-1C. i*(j-1)D. j*m+i-17、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。
A. 60B. 66C. 18000D. 338、已知广义表L=((x,y,z),a,(u,t,w)),从L表中取出原子项t的运算是()。
A.head(tail(tail(L)))B.tail(head(head(tail(L))))C.head(tail(head(tail(L))))D.head(tail(head(tail(tail(L)))))9、下面说法不正确的是( )。
A. 广义表的表头总是一个广义表B. 广义表的表尾总是一个广义表C. 广义表难以用顺序存储结构D. 广义表可以是一个多层次的结构10、若采用按行优先顺序存储,试写出三维数组A[3][2][3]所有元素在内存中的存储次序。
答:A[0][0][0],A[0][0][1],A[0][0][2],A[0][1][0],A[0][1][1],A[0][1][2],A[1][0][0],A[1][0][1],A[1][0][2],A[1][1][0],A[1][1][1],A[1][1][2],A[2][0][0],A[2][0][1],A[2][0][2],A[2][1][0],A[2][1][1],A[2][1][2]11、二维数组A[m][n]采用按行存储,每个元素占k个存储单元,第一个元素的存储地址是LOC(A[0][0]),则A[i][j]的存储地址是。
答:LOC(A[0][0])+(n*i+j)*k12、三维数组a[4][5][6](下标从0开始计,a有4*5*6个元素),每个元素的长度是2,则a[2][3][4]的地址是____。
(设a[0][0][0]的地址是1000,数据以行为主方式存储)答:1164公式:LOC(aijk)=LOC(a000)+[v2*v3*(i-c1)+v3*(j-c2)+(k-c3)]*l(l为每个元素所占单元数)13、假设一个15阶的上三角矩阵A按行优先顺序压缩存储在一维数组B中,则非零元素A9,9在B中的存储位置k=_______。
(注:矩阵元素下标从1开始)答:9314、设广义表L=((),()), 则head(L)是(1)___;tail(L)是(2)____;L的长度是(3)___;深度是 (4)__。
答:(1)()(2)(())(3)2 (4)215、广义表A=(((a,b),(c,d,e))),取出A中的原子e的操作是: _______。
答:head(tail(tail(head(tail(head(A))))))16、设对称矩阵A=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡525321(1)下标:试求出A中任一元素的行列下标[i,j](1<=i,j<=4)与S中元素的下标K之间的关系.(2)若将A视为稀疏矩阵时,画出其三元组表形式压缩存储表。
答:(1)k=(2n-j+2)(j-1)/2+i-j+1 (当i≥j时,本题n=4)k=(2n-i+2)(i-1)/2+j-i+1 (当i<j时,本题n=4)(2)稀疏矩阵的三元组表为:s=((4,4,6),(1,1,1),(1,4,2),(2,2,3),(3,4,5),(4,1,2),(4,3,5))。
其中第一个三元组是稀疏矩阵行数、列数和非零元素个数。
其它三元组均为非零元素行值、列值和元素值。
17、设任意n个整数存放于数组A(1:n)中,试编写程序,将所有正数排在所有负数前面(要求算法复杂性为0( n))。
类似本题的另外叙述有:(1)已知数组A[1..n]的元素类型为整型,设计算法调整A,使其左边的所有元素小于零,右边的所有元素大于等于零。
(要求算法的时间复杂度和空间复杂度均为0(n))(2)设计一个算法,把整数数组中所有的偶数放到所有的奇数之前。
要求时间、空间效率尽可能高。
(3)设一系列正整数存放在一个数组中,试设计算法,将所有奇数存放在数组的前半部分,将所有的偶数存放在数组的后半部分。
要求尽可能少用临时存储单元并使时间最少。
请试着分析你实现的算法的时间复杂度和空间复杂度。
(4)设计算法将数组A[1..n]调整为左右两部分,使的左边所有的元素小于右边的所有元素,并给出这一划分的分界位置。
要求算法的时间复度为O(n)。
答:[题目分析]本题属于排序问题,只是排出正负,不排出大小。
可在数组首尾设两个指针i和j,i自小至大搜索到负数停止,j自大至小搜索到正数停止。
然后i和j所指数据交换,继续以上过程,直到 i=j为止。
void Arrange(int A[],int n)//n个整数存于数组A中,本算法将数组中所有正数排在所有负数的前面{int i=0,j=n-1,x; //用类C编写,数组下标从0开始while(i<j){while(i<j && A[i]>0) i++;while(i<j && A[j]<0) j--;if(i<j) {x=A[i]; A[i++]=A[j]; A[j--]=x; }//交换A[i] 与A[j]}}//算法Arrange结束.[算法讨论]对数组中元素各比较一次,比较次数为n。
最佳情况(已排好,正数在前,负数在后)不发生交换,最差情况(负数均在正数前面)发生n/2次交换。
用类c编写,数组界偶是0..n-1。
空间复杂度为O(1).类似本题的其它题的解答::(1)与上题同,因要求空间复杂度也是O(n),可另设一数组C,对A数组从左到右扫描,小于零的数在C中从左(低下标)到右(高下标)存,大于等于零的数在C中从右到左存。
(2)将19题中判定正数(A[i]>0)改为判偶数(A[i]%2==0),将判负数(A[j]<0)改为(A[j]%2!=0)。
(3)同(2),只是要求奇数排在偶数之前。
(4)利用快速排序思想,进行一趟划分。
int Partition(int A[],int n)//将n个元素的数组A调整为左右两部分,且左边所有元素小于右边所有元素,返回分界位置。
{int i=0,j=n-1,rp=A[0]; //设数组元素为整型while(i<j){while(i<j &&A[j]>=rp) j--;while(i<j &&A[i]<=rp) i++;if(i<j) { x=A[i];A[i]=A[j]; A[j]=x; }}A[i]=rp; return(i); //分界元素}// Partition18、在数组 A[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个。
答:[题目分析]本题要求建立有序的循环链表。
从头到尾扫描数组A,取出A[i](0<=i<n),然后到链表中去查找值为A[i]的结点,若查找失败,则插入。
LinkedList creat(ElemType A[],int n)//由含n个数据的数组A生成循环链表,要求链表有序并且无值重复结点{ LinkedList h;h=(LinkedList) malloc(sizeof(LNode));//申请结点h->next=h; //形成空循环链表for(i=0;i<n;i++){ pre=h;p=h->next;while(p!=h && p->data<A[i]){pre=p; p=p->next;} //查找A[i]的插入位置 if(p==h || p->data!=A[i]) //重复数据不再输入 {s=(LinkedList) malloc(sizeof(LNode));s->data=A[i]; pre->next=s; s->next=p;//将结点s链入链表中}}//forreturn(h);}// creat19、编写程序,统计在输入字符串中各个不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。
[问题分析]由于字母共26个,加上数字符号10个共36个,所以设一长36的整型数组,前10个分量存放数字字符出现的次数,余下存放字母出现的次数。
从字符串中读出数字字符时,字符的ASCII代码值减去数字字符‘0’的ASCII 代码值,得出其数值(0..9),字母的ASCII代码值减去字符‘A’的ASCII代码值加上10,存入其数组的对应下标分量中。
遇其它符号不作处理,直至输入字符串结束。
void Count()//统计输入字符串中数字字符和字母字符的个数{int i,num[36];char ch;for(i=0;i<36;i++)num[i]=0;// 初始化while((ch=getchar())!=‘#’) //‘#’表示输入字符串结束if(‘0’<=ch<=‘9’){i=ch-48;num[i]++;} // 数字字符 else if(‘A’<=ch<=‘Z’){i=ch-65+10;num[i]++;}// 字母字符for (i=0;i<10;i++) // 输出数字字符的个数printf (“数字%d 的个数=%d\n ”,i ,num[i]);for (i =10;i<36;i++)// 求出字母字符的个数printf (“字母字符%c 的个数=%d\n ”,i +55,num[i]); }//算法结束7. 假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。