zoukankan      html  css  js  c++  java
  • 数据结构与算法参考答案(第二周)

    一、设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

    答:

    分析题目可知,我们需要先查到x需要在顺序表va中插入的位置。假设我们插入在顺序表中的位置为va.elem[i+1]。这里我们需要满足x的值大于等于va.elem[i]且小于va.elem[i+1]。之后我们需要将顺序表的va.length - i - 1个元素后移一位。最后将表长va.length1

    本算法实现的伪代码如下:

    /*

    函数名称:单调顺序表插入算法

    传入参数:需要插入的线性表va, 需要插入的元素x

    返回值:返回OK代表插入成功,返回OVERFLOW代表以及达到最大长度,无法继续插入

    */

    Status InsertOrderList(SqList &va, ElemType x) {

    if(va.length == va.listsize) {

    return OVERFLOW;

    }

    else {

    int i;

    //查找x所处在的位置

    for(i = va.length - 1; i >= 0; --i) {

    if(x >= va.elem[i]) {

    break;

    }

    }

    //实现元素后移

    for(int j = va.length - 1; j >= i + 1; --j) {

    va.elem[j + 1] = va.elem[j];

    }

    va.elem[i + 1] = x; //插入x

    va.length++; //表长+1

    return OK;

    }

    }

    算法分析:本算法的时间复杂度为O(n)。占用的空间依旧是开辟的那个线性表大小的空间。算法执行效率较好,同时引入了对表的最大长度的判定可以避免出现数据溢出的情况。

     

    二、A = (a1,...,am)B = (b1,...,bn)均为顺序表,A`B`分别为AB中除去最大共同前缀后的子表(例如,A = (x, y, y, z, x, z)B = (x, y, y, z, y, x, x, z),则两者中最大的共同前缀为(x, y, y, z),在两表中除去最大共同前缀后的子表分别为A` = (x, z)B` = (y, x, x, z)。若A` = B` = 空表,则A = B;若A` = 空表,而B` ≠ 空表,或者两者均不为空表,且A`的首元小于B`的首元,则A < B;否则A > B。试写一个比较A, B大小的算法(请注意:在算法中,不要破坏原表AB,并且,也不一定先求得A`B`才进行比较)。

    答:

    分析题目,我们可以知道需要对特殊情况进行判定。在有空表存在的情况通过条件判断语句进行判断。如果两个表都是非空。我们通过一个下标按照从头到尾依次进行遍历,当两表相同下标元素遇到出现不等关系时,我们即可根据这两个元素的大小关系判断出两表的大小关系。需要注意的是,我们在遍历的时候取得是两表中最短的length作为遍历的最大长度。在这种情况下,当我们在遍历时每个元素都相等。我们可以认为较长表大于较短表了。

    综上分析,该题的算法实现伪代码如下:

    /*

    函数名称:比较两线性表的算法

    传入参数:需要比较的线性表AB

    返回值:返回BIGGER代表AB大,返回SMALLER代表AB小,返回EQUAL代表A,B大小相等

    */

    Status CompareOrderList(SqList &A, SqList &B) {

    int length = min(A.length, B.length) //length长度为AB中的最小值

    int temp = 0; //设置临时状态判定变量

    //如果A的长度大于Btemp1,小于为-1,相等仍为0

    temp = (A.length > B.length) ? 1 : -1;

    if(A.length != 0 && B.length == 0) { //A不为空B为空 A大于B

    return BIGGER;

    }

    else if(A.length == 0 && B.length != 0){//B不为空A为空 A小于B

    return SMALLER;

    }

    else if(A.length == 0 && B.length == 0{//AB均为空,A = B

    return EQUAL;

    }

    else{

    for(int i = 0; i < length; ++i) {

    if(A.elem[i] > B.elem[i]) {

    //如果出现A的元素大于B的元素直接返回BIGGER

    return BIGGER;

    }

    else if(A.elem[i] < B.elem[i]) {

    //如果出现B的元素大于A的元素直接返回SMALLER;

    return SMALLER;

    }

    }

    //当执行完后肯定是AB在去除相同前缀必定至少有一个字串为0的情况

    if(temp == 0) { //去除后最终都为空表

    return EQUAL;

    }

    else if(temp == 1){ //去除后只剩A

    return BIGGER;

    }

    else { //去除后只剩B

    return SMALLER;

    }

    }

    }

    算法分析:该算法增加许多条件的特判,增强了算法的健壮性。同时,该算法的时间复杂度为O(n)是比较理想的比较算法。空间占用也只是两个线性表的本来的储存空间。总的来说,这个算法是一个解决这种问题比较好的算法。

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    201521123108 《Java程序设计》第八周学习总结
    201521123108 《Java程序设计》第7周学习总结
    201521123108 《Java程序设计》第6周学习总结
    201521123108 《Java程序设计》第5周学习总结
    201521123108 《Java程序设计》第4周学习总结
    201521123108《Java程序设计》第3周学习总结
    201521123107 《Java程序设计》第11周学习总结
    201521123107 《Java程序设计》第10周学习总结
    201521123107 《Java程序设计》第9周学习总结
    201521123107 《Java程序设计》第8周学习总结
  • 原文地址:https://www.cnblogs.com/lightac/p/12831991.html
Copyright © 2011-2022 走看看