时间复杂度

Posted clnchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间复杂度相关的知识,希望对你有一定的参考价值。

时间复杂度

时间限制:1000 ms  |  内存限制:65535 KB
难度:3
描写叙述

ACM里面,计算复杂度是一项很重要的事情,常见的复杂度格式有三种:

  1. O(n)
    O(lg(n))
    O(sqrt(n))

一个算法往往有多种解法,每种解法的复杂度有上述常见的的复杂度组合成。比如排序的两种算法:

  1. 高速排序: 时间复杂度为O(n*lg(n))

  2. 冒泡排序: 时间复杂度为O(n*n)

如今给定你一个nm个算法复杂度,请确定这些复杂度是否会超时。

若复杂度计算结果大于100000000。则为超时(TLE),否则输出计算的复杂度。输出的结果保留两位小数。

( lg(n)表示以2为底数。n为真数的值)

输入
第一行输入n (1≤n≤10000), m(1≤m≤100), 当中n为题目描写叙述的数,m为算法复杂度的个数。
接下来m行,每行为一个串,每一个串都包括O()不论什么括号中面的数据保证仅由n,lg(),sqrt(),*组成而且合法。如sample input所看到的。
输出
对于每一个串。若计算出来的复杂度大于100000000,则输出TLE,否则输出该复杂度的计算次数
例子输入
10000 6
O(n*n)
O(n*n*n)
O(sqrt(n))
O(lg(n))
O(n*lg(n))
O(n*lg(n*lg(n)))
例子输出
100000000.00
TLE
100.00
13.29
132877.12
170197.33
提示
关于lg(n)的C语言代码能够这样写

log(n) / log(2)


代码:

 
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 100000000
char stack[1005];
int k,n;
double eval()
{
	if(k<0)
		return 0;
	if(stack[k]=='n')
	{
		k--;
		return n;
	}
	if(stack[k]=='*')
	{
		k--;
		return eval()*eval();
	}
	if(stack[k]=='g')
	{
		k--;
		return log(eval())/log(2);
	}
	if(stack[k]=='t')
	{
		k--;
		return sqrt(eval());
	}
}
int main()
{
	int m,i,j,top,len,s;
	double result;
	char str[1005],ch[1005];
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=m;i++)
		{
			scanf("%s",str);
			top=-1;
			s=-1;
			len=strlen(str);
			for(j=len-1;j>=1;j--)
			{
				if(str[j]=='n')
				{
					top++;
					stack[top]=str[j];
				}
				if(j<1)
					break;
				if(str[j]==')'||str[j]=='*')
				{
					s++;
					ch[s]=str[j];
				}
				else if(str[j]=='(')
				{
					while(s>=0&&ch[s]!=')')
					{
						top++;
						stack[top]=ch[s];
						s--;
					}
					s--;
				}
				else if(str[j]=='t')
				{
					top++;
					stack[top]=str[j];
					j=j-3;
				}
				else if(str[j]=='g')
				{
					top++;
					stack[top]=str[j];
					j=j-1;
				}
			}
			while(s>=0)
			{
				if(ch[s]!=')')
				{
					top++;
					stack[top]=ch[s];
					s--;
				}
			}
			top++;
			stack[top]='\0';
			k=strlen(stack)-1;
			result=eval();
			if(result>N)
				printf("TLE\n");
			else
				printf("%.2f\n",result);
		}
	}
	return 0;
}
        



以上是关于时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

代码片段使用复杂的 JavaScript 在 UIWebView 中插入 HTML?

基于时间复杂度的这些片段真的很困惑

用于数据加载的 Android 活动/片段职责

PAT 乙级 1049 数列的片段和

PAT1049-----枚举法,找规律题,注意降低时间复杂度