递归函数的Big-O

时间:2018-10-16 20:35:37

标签: swift algorithm time-complexity big-o

我只是想知道,此功能的主要作用是什么, 假设参数的初始值如下:

numOfCourseIndex = 0
maximumScheduleCount = 1000
schedule = [[Section]]()
result = [[[Section]]]()
orderdGroupOfSections = n

func foo(numOfCourseIndex: Int, orderdGroupOfSections: [[[Section]]], maximumScheduleCount: Int) {


    if (result.count >= maximumScheduleCount) {
        return
    }

    for n in 0..<orderdGroupOfSections[numOfCourseIndex].count {
        for o in 0..<orderdGroupOfSections[numOfCourseIndex][n].count {
            for p in 0..<orderdGroupOfSections[numOfCourseIndex][n][o].sectionTime!.count {
                for q in 0..<orderdGroupOfSections[numOfCourseIndex][n][o].sectionTime![p].day!.count {

                   ///do something

               }
            }
        }

        if (numOfCourseIndex == orderdGroupOfSections.count - 1) {

          result.append(schedule)

        }
        else {
            foo(numOfCourseIndex: numOfCourseIndex + 1, orderdGroupOfSections: orderdGroupOfSections, maximumScheduleCount: maximumScheduleCount)
        }
    }      
}

在最坏的情况下,我是说这是(n!)的Big-O,但我不确定。

1 个答案:

答案 0 :(得分:1)

您可以执行两项简单的操作来帮助您分析函数的复杂性。首先是简化输入并查看函数的行为。与其运行大量课程或日程安排之类的功能,不如仅查看其中一项功能。处理一门课程需要多少步骤?两人几?三?四?制作一个包含结果的表格,然后查看一门和两门课程,两门和三门课程,三门和四门课程之间的差异。您能看到模式吗?

您可以做的第二件事是将功能分解为多个部分并分别进行分析。您可能无法仅仅看到整个事情的复杂性,因为它是复杂。所以简化一下...最内层循环的复杂性是什么?第二个最里面的循环如何,而忽略最里面的一个呢?两者的复杂度如何?冲洗并重复。