设计一个O(n的平方)时间的算法,找出由n个数组成的序列的最长单调递增子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计一个O(n的平方)时间的算法,找出由n个数组成的序列的最长单调递增子序列相关的知识,希望对你有一定的参考价值。

参考技术A 用冒泡法 时间复杂度=O(n^2)
以 下是c语言版
#include <stdio.h>
main()
int a[10];
int i,c,j;
for(i=0;i<10;i++)
printf("请输入十个数,这是第%d个:",i+1);
scanf("%d",&a[i]);

for(i=0;i<10;i++)

for(j=10;j>i+1;j--)
if(a[j-1]<a[j-2])
c=a[j-1];
a[j-1]=a[j-2];
a[j-2]=c;



printf("从小到大的顺序是:");
for(i=0;i<10;i++)
printf("\n%d",a[i]);

getch();

算法效率的度量









空间换时间的例子:

/*
    问题: 
    在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
    设计一个算法,找出出现次数最多的数字。
*/

#include <iostream>

using namespace std;

void search(int a[], int len)     // O(n)
{
    int sp[1000] = {0};//0-999格子记录出现的次数
    int max = 0;
    
    for(int i=0; i<len; i++)
    {
        sp[a[i] - 1]++;//统计工作
        //为什么要减一呢?自然数1-1000,1000的话会越界,所以减一
        //记录的是数字出现次数
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            cout << i + 1 << endl;//打印出来的就是出现最多的数字了
        }
    }
}

int main(int argc, char* argv[])
{
    int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
    
    search(a, sizeof(a)/sizeof(*a));

    return 0;
}

很巧妙的算法,好好看看


只能说是同一个级别的,不能说相同!!!

小结

以上是关于设计一个O(n的平方)时间的算法,找出由n个数组成的序列的最长单调递增子序列的主要内容,如果未能解决你的问题,请参考以下文章

算法—— 1到n中减少了一个数,顺序被打乱,找出缺失的数

求数组插值——复杂度为O(n)的快速算法

分治与递归-找k个临近中位数的数

寻找单模序列的顶点

算法第3章上机实践报告

完全平方数