设计一个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个数组成的序列的最长单调递增子序列的主要内容,如果未能解决你的问题,请参考以下文章