已知序列X={x1,x2,…,xm},序列Y={y1,y2,…,yn},使用动态规划算法求解序列X和Y的最长公共子序列,其最坏时间复杂度为()。A、O(m*n)B、O(m+n)C、O(m*2n)D、O(n*2m)

题目

已知序列X={x1,x2,…,xm},序列Y={y1,y2,…,yn},使用动态规划算法求解序列X和Y的最长公共子序列,其最坏时间复杂度为()。

  • A、O(m*n)
  • B、O(m+n)
  • C、O(m*2n
  • D、O(n*2m

相似考题
更多“已知序列X={x1,x2,…,xm},序列Y={y1,y2,…,yn},使用动态规划算法求解序列X和Y的最长公共子序列,其最坏时间复杂度为()。A、O(m*n)B、O(m+n)C、O(m*2n)D、O(n*2m)”相关问题
  • 第1题:

    使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为()

    A.O(N)

    B.O(logN)

    C.O(N*N)

    D.O(N*logN)


    正确答案:B

  • 第2题:

    下面程序段的时间复杂度是()。s=0;for(i=0;ifor(j=0;js+=B[i][j];sum=s;

    A、O(m2)

    B、O(n2)

    C、O(m*n)

    D、O(m+n)


    参考答案:B

  • 第3题:

    将长度为n的单链表链接到长度为m的单链表之后的算法的时间复杂度是()。

    A.O(1)

    B.O(n)

    C.O(m)

    D.O(m+n)


    参考答案:C

  • 第4题:

    对长度为n的关键字序列进行堆排序的空间复杂度为 ( )

    A.O(log2n)

    B.O(1)

    C.O(n)

    D.O(n*log2n)


    正确答案:B
    解析:由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排序是就地排序,辅助空间为0(1),但它是不稳定的。

  • 第5题:

    下面算法是实现对n个整数的序列进行选择排序,其中序列的“长度”n为问题的规模。该算法的时间复杂度为(11)。 void select_sort(int a[],int n){ //将a中整数序列重新排列成从小到大有序的整数序列 for(i=0;i<n-1;++i){ j=i; for(k=i+1;k<n;++k)if(a[k]<a[j])j=k; if(j!=i){w=a[j];a[j];a[i];a[i]=w} )//select_sort

    A.O(n2)

    B.O(n3)

    C.O(n4)

    D.O(n)


    正确答案:A
    解析:算法中的控制结构是两重循环,所以基本操作是在内层循环中的“比较”,它的重复执行次数是:对时间复杂度而言,只需要取最高项,并忽略常数系数。

  • 第6题:

    对n个关键字的序列进行快速排序,平均情况下的空间复杂度为_______

    A.O(1)

    B.O(logn)

    C.O(n)

    D.O(nlogn)


    正确答案:D

  • 第7题:

    在二维数组M[0...n,0...m]中,访问某个元素的平均时间复杂度为______。

    A.O(1)

    B.O(nm)

    C.O(m+n)

    D.O(nn)


    正确答案:A
    解析:二维数组可以实现随机访问,因此访问时间复杂度为O(1)。

  • 第8题:

    将长度为n的单链表接在长度为m的单链表之后的算法时间复杂度为()。

    A.O(n)
    B.0(1)
    C.O(m)
    D.O(m+n)

    答案:C
    解析:
    要将长度为n的单链表接在长度为m的单链表之后,必须从单链表的头结点沿链找到长度为m的单链表的最后一个结点,所以时间复杂度为O(m)。

  • 第9题:

    下面程序的时间复杂度为()。 for(i=0;i

    • A、O(m2
    • B、O(n2
    • C、O(m×n)
    • D、O(m+n)

    正确答案:C

  • 第10题:

    下面程序的时间复杂度为()。 for(i=0;i

    • A、O(m×n×t)
    • B、O(m+n+t)
    • C、O(m+n×t)
    • D、O(m×t+n)

    正确答案:A

  • 第11题:

    判断题
    我(wǒ)喜欢(xǐhuān)猫(māo),但是(dànshì)丈夫(zhàngfu)小(xiǎo)喜欢(xǐhuān),所以(suǒyǐ)到(dào)现在(xiànzài)家里(jieli)也(yě)没有(méiyǒu)猫(māo)。我(wǒ)希望(xīwàng)有一天(yǒuyītiān)能(néng)有(yǒu)一(yī)个(gè)小(xiǎo)猫(māo)。★我(wǒ)丈夫(zhàngfu)想(xiǎng)要(yào)一(yī)个(gè)小(xiǎo)猫(māo)。(  )
    A

    B


    正确答案:
    解析: 暂无解析

  • 第12题:

    问答题
    给定一个由n个数组成的序列,要求该序列的最长单调上升子序列,请设计对应的算法并分析其时间复杂度,如果时间复杂度劣于O(nlogn)的,将其优化为O(nlogn)时间复杂度的算法。

    正确答案: 假设当前已求出m[1..i-1],当前保留的状态集合为S,下面计算m[i]。
    1、若存在状态k∈S,使得x[k]=x[i],则状态m[i]必定不需保留,不必计算。因为,不妨设m[i]=m[j]+1,则x[j] 2、否则,m[i]=1+max{m[j],x[j] 3、若2成立,则我们往S中增加了一个状态,为了保持S的性质,我们要对S进行维护,若存在状态k∈S,使得m[i]=m[k],则我们有x[i]x[i],j∈S}。于是状态k应从S中删去。
    从性质D和算法描述可以发现,S实际上是以x值为关键字(也是以m值为关键字)的有序集合。若使用平衡树实现有序集合S,则该算法的时间复杂度为O(n*logn)。(每个状态转移的状态数仅为O(1),而每次状态转移的时间变为O(logn))。
    解析: 暂无解析

  • 第13题:

    下面程序段的时间复杂度是()。for(j=0;jfor(k=0;ka[j][k]=j*k;

    A、O(m2)

    B、O(n2)

    C、O(m*n)

    D、O(m+n)


    参考答案:B

  • 第14题:

    阅读下列函数说明和C代码,填入(n)处。

    [说明]

    以下C语言程序实现了生成从里到外是连续的自然数排列的回旋矩阵,矩阵形式如下:

    7 6 5 16

    8 1 4 15

    9 2 3 14

    10 11 12 13

    程序的变量说明如下:

    x1:矩阵上边界;

    x2:矩阵下边界;

    y1:矩阵左边界;

    y2:矩阵右边界;

    s:数组元素升降标记,s等于1为升,s等于-1为降;

    a[]:存放矩阵元素的数组。

    仔细阅读C语言程序源码,将(n)处的语句补充完整。(注:每处仅一个语句)

    [C程序]

    include<stdio.h>

    void main ( )

    {

    const int N=20;

    int i=0,j=0,a[N][N],n;

    int m,x1,x2,y1,y2,s;

    while (1)

    {

    Printf ("\ninput matrix row N( N>=2): ");

    scanf ("%d",&n);

    printf ("\n");

    if (n>=2)

    break;

    }

    m=n*n;

    x1=0; y1=0; x2=n; y2=n;

    if(n%2==0)

    {j=n-1; y2=n-1; s=1;}

    else

    {i=n-1; y1=1; s=-1; }

    while (1)

    {

    if (s==1)

    {

    for (i; i<x2; i++) a[i][j]=m--;

    i--;

    j--;

    (1)

    for (j;j>=y1;j--) a[i][j]=m--;

    j++;

    i--;

    y1++;

    (2)

    }

    else

    {

    for (i;i>=x1;i--)

    a[i][j]=m--;

    i++;

    j++;

    (3)

    for (j;j<y2;j++)

    (4)

    (5)

    i++;

    (6)

    S=i;

    }

    if (m<1) break;

    }

    for (i=O;i<n; i++)

    {

    for (j=O;j<n;j++)

    printf ("%6d",a[i][j]);

    printf ("\n");

    }

    printf ("\n");

    }


    正确答案:(1)x2--; (2)s=-1; (3)x1++; (4)a[i][j]=m--; (5)j--; (6)y2--;
    (1)x2--; (2)s=-1; (3)x1++; (4)a[i][j]=m--; (5)j--; (6)y2--; 解析:自然数排列的回旋矩阵是一个经典程序设计题目。本题中生成的是一个从里到外是连续的自然数排列的回旋矩阵。仔细阅读代码,能够发现(1)处应该为矩阵下边界递减;(2)处应该为数组元素递减状态,即为降;(3)处应该为矩阵上边界递增;(4)处应该为存放矩阵元素的数组中的数据递减;(5)处应该为数组元素的列序号递减,即j--;(6)矩阵右边界递减。

  • 第15题:

    下面程序段的时间复杂度为 ( ) for(i=0;i<m;i++) for(j=0;j<n;j++) A[i][j]=i*j;

    A.O(m2)

    B.O(n2)

    C.O(m*n)

    D.O(m+n)


    正确答案:C
    解析:此程序的时间复杂度即为程序中循环次数的时间耗费。由程序为嵌套循环,外层循环的时间复杂度T(n1)=m,内层循环的时间复杂度T(n2)=n,则此程序的时间复杂度T(n)=m*n,即为0(m*n)。

  • 第16题:

    用快速排序的方法对包含n个关键字的序列进行排序,最坏情况下执行的时间为

    A.O(n)

    B.O(log2n)

    C.O(nlog2n)

    D.O(n2)


    正确答案:D
    解析:快速排序的平均执行时间为O(nlog2n),优于冒泡排序,直接插入排序方法,但最坏的情况,即记录初始已排好序的情况下,执行时间为O(n2)。

  • 第17题:

    对于求取两个长度为n的字符串的最长公共子序列问题,利用(41)策略可以有效地避免子串最长公共子序列的重复计算,得到时间复杂度为O(n2)的正确算法。

    A.贪心

    B.分治

    C.分支-限界

    D.动态规划


    正确答案:D
    解析:对于求取两个长度为n的字符串的最长公共子序列(LCS)问题,是利用动态规划策略解决的经典问题之一。利用动态规划策略求解该问题时可以通过查表得到已经计算出的子串的最长公共子序列,从而避免重复计算。例如,利用动态规划算法可以得到串1,0,0,1,0,1,0,1>和0,1,0,1,1,0,1,1>的最长公共子序列的长度为6,如“101011”。

  • 第18题:

    对于求取两个长度为n的字符串的最长公共子序列(LCS)问题,利用(24)策略可以有效地避免子串最长公共子序列的重复计算,得到时间复杂度为O(n2)的正确算法。串 <1,0,0,1,O,1,0,1>和<0,1,0,1,1,0,1,1>的最长公共子序列的长度为(25)。

    A.分治

    B.贪心

    C.动态规划

    D.分支—限界


    正确答案:C

  • 第19题:

    求解两个长度为n的序列X和Y的一个最长公共子序列(如序列ABCBDAB和BDCABA的一个最长公共子序列为BCBA)可以采用多种计算方法。如可以采用蛮力法,对X的每一个子序列,判断其是否也是Y的子序列,最后求出最长的即可,该方法的时间复杂度为( )。经分析发现该问题具有最优子结构,可以定义序列长度分别为i和j的两个序列X和Y的最长公共子序列的长度为c[i,j],如下式所示。



    采用自底向上的方法实现该算法,则时间复杂度为(请作答此空)

    A.O(n^2)
    B.O(n^21gn)
    C.O(n^3)
    D.O(n2^n)

    答案:A
    解析:
    蛮力法,对X的每一个子序列,判断是否也是Y的子序列,其中,长度为n的序列X共有2^n个子序列,判断其是否是Y的子序列时间是n,因此是n*2^n;采用动态规划法自底向上实现时,根据递归公式,实际是关于i和j的两重循环,因此时间复杂度是n^2.

  • 第20题:

    将长度为n的单链表连接在长度为m的单链表之后的算法的时间复杂度为()。

    • A、O(1)
    • B、O(n)
    • C、O(m)
    • D、O(m+n)

    正确答案:C

  • 第21题:

    给定一个由n个数组成的序列,要求该序列的最长单调上升子序列,请设计对应的算法并分析其时间复杂度,如果时间复杂度劣于O(nlogn)的,将其优化为O(nlogn)时间复杂度的算法。


    正确答案: 假设当前已求出m[1..i-1],当前保留的状态集合为S,下面计算m[i]。
    1、若存在状态k∈S,使得x[k]=x[i],则状态m[i]必定不需保留,不必计算。因为,不妨设m[i]=m[j]+1,则x[j] 2、否则,m[i]=1+max{m[j]|x[j] 3、若2成立,则我们往S中增加了一个状态,为了保持S的性质,我们要对S进行维护,若存在状态k∈S,使得m[i]=m[k],则我们有x[i]x[i],j∈S}。于是状态k应从S中删去。
    从性质D和算法描述可以发现,S实际上是以x值为关键字(也是以m值为关键字)的有序集合。若使用平衡树实现有序集合S,则该算法的时间复杂度为O(n*logn)。(每个状态转移的状态数仅为O(1),而每次状态转移的时间变为O(logn))。

  • 第22题:

    若序列X={B,C,A,D,B,C,D},Y={A,C,B,A,B,D,C,D},请给出序列X和Y的一个最长公共子序列:()


    正确答案:{B,A,B,C,D}或{C,A,B,C,D}或{C,A,D,C,D}

  • 第23题:

    单选题
    已知序列X={x1,x2,…,xm},序列Y={y1,y2,…,yn},使用动态规划算法求解序列X和Y的最长公共子序列,其最坏时间复杂度为()。
    A

    O(m*n)

    B

    O(m+n)

    C

    O(m*2n

    D

    O(n*2m


    正确答案: A
    解析: 暂无解析