确定以下代码的运行时间(内部循环递归)

时间:2019-05-09 10:54:33

标签: algorithm recursion time time-complexity catalan

我有以下代码,需要确定该算法的运行时间。

int res=0; 
if (n <= 1) 
    return 1;
for (int i = 0; i < n; i++) 
    res += Catalan(i) * (Catalan(n - i - 1); 
return res;

由于递归内部存在循环,因此我很难确定运行时间。我知道我需要将其转换为回归公式,然后对其进行分析,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分:0)

要获得第一个想法,请使用不同大小的输入对其进行概要分析。

如果在输入的大小上绘制图形运行时,则很容易了解其O(N)或O(N²)之类的东西。

然后,您便知道要查找的复杂性,仔细查看代码以找到观察结果的格式证明。

答案 1 :(得分:0)

让我们将您的功能简化为:

from __future__ import print_function

from googleapiclient.discovery import build

from httplib2 import Http
from oauth2client import file, client, tools

from googleapiclient.http import MediaFileUpload,MediaIoBaseDownload

import io

# Setup the Drive v3 API

SCOPES = 'https://www.googleapis.com/auth/drive'

store = file.Storage('client_secrets.json')

creds = None

if not creds or creds.invalid:

    flow = client.flow_from_clientsecrets('client_secrets.json', SCOPES)

    creds = tools.run_flow(flow, store)

drive_service = build('drive', 'v3', http=creds.authorize(Http()))


def uploadFile():

    file_metadata = {
    'name': 'new_json.json',
    'mimeType': '*/*'
    }

    media = MediaFileUpload('/home/trigensoft/new_json.json',
                            mimetype='*/*',
                            resumable=True)

    file = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()

    print ('File ID: ' + file.get('id'))

uploadFile()

这种简化不应影响时间复杂度。

让n = 1:

    for (int i=0; i< n; i++) 
        res += Catalan(i)*(Catalan(i-1); 
    return res;

然后我们将调用3个加泰罗尼亚语功能。

如果n = 2,那么对于加泰罗尼亚语(i),我们将:

   1 
   /\
  0  0

和加泰罗尼亚语(i-1)

     2
     /
    1 
   /\ 
  0 0 

所以我们总共有:

   1 
   /\
  0  0

如果i = 3,则:

     2      
     /\    
    1  1   
   /\  /\  
  0 0 0  0 

在我看来, 3 / \ 2 2 /\ /\ 1 1 1 1 /\ /\ /\ /\ 0 0 0 0 0 0 0 0 太复杂了