被调用函数的大 O 表示法的时间复杂度

Posted

技术标签:

【中文标题】被调用函数的大 O 表示法的时间复杂度【英文标题】:Time complexity with Big O notation for a called function 【发布时间】:2021-12-11 22:14:48 【问题描述】:

我阅读了许多有关计算 time complexity O(n) 的资源。我将我所理解的应用到我的代码中。

下面是我的代码,也是我寻找time complexity的尝试。

我的代码:

    float Euclidean_distance(int array_point_A[20], int  array_point_B[20]) 
    float sum = 0.0;
    float  w[20] =  0.0847282, 0.0408621, 0.105036, 0.0619821, 0.0595455, 0.0416739, 0.0181147, 0.00592921,
     0.040049, 0.0766054, 0.0441091, 0.0376111, 0.0124285, 0.0733558, 0.0587338, 0.0303001, 0.0579207, 0.0449221,
          0.0530462, 0.0530462 ;

    for (int i = 0; i < 20; ++i) 
        float a = array_point_A[i] - array_point_B[i];
        float wieghted_distance = w[i] * (a * a); 
        sum += wieghted_distance;
    
    return sqrt(sum);



int KNN_classifier(int X_train[4344][20], int Y_train[4344], int k, int data_point[20]) 

    // Calculate the distance between data_point and all points.    
    float array_dist[4344];
    int index_arr[4344] 
   for (int i = 0; i *< 4344; ++i) 
        array_dist[i] = Euclidean_distance(X_train[i], data_point);
        index_arr[i] = i;
    

现在:对于函数Euclidean_distance,它有2 operations outside the loop3 operations inside the loop that will iterate 20 times。因此,2+3n 然后我们有O(n)

现在:对于函数KNN_classifier。它有一个循环将迭代4344 次。在循环内部,有2 operations。所以我们有2n,然后是O(n)。 // 我不确定这个解决方案。

array_dist[i] = Euclidean_distance(X_train[i], data_point); 这个操作让我很困惑。 那么,我是否需要在计算中包括Euclidean_distance 时间复杂度。如果是这样,我猜时间复杂度将是O(n^2)。但是这两个循环有不同的界限。

我需要帮助!!!

【问题讨论】:

注意bigO中可以有多个参数,O(N*M)是一个选项。 【参考方案1】:

Big-O 表示法仅对一个或多个参数有意义,但您尚未描述代码中哪些值是变量,哪些是常量。

正如它所写的,函数KNN_classifier实际上是O(1),因为4344是一个固定的常数,而20是一个常数。如果 20 是一个常数,并且 X_trainY_train 的大小会随着某个数字 n 而变化,那么它就是 O(n)。如果 20 常数也变化为m,那么它就是O(n*m)

【讨论】:

感谢您的回答。是的。它们不是恒定的。所以,你的意思是KNN_classifier 的时间复杂度是O(N*M)。不是O(N^2),因为Euclidean_distanceKNN_classifier 内部被调用,并且它有一个包含M dimensionsN is the size of training data 的循环???? 如果 n = 4344 且 m = 20 那么它是 n*m,是的,如何投票 :)? 是的,当然,谢谢您的回答。我刚刚接受了它

以上是关于被调用函数的大 O 表示法的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

2.算法中的大O符号

这个递归斐波那契的大 O 时间复杂度?

for 循环的大 O 表示法简单问题

什么是时间复杂度

O(n)是啥

函数的大 O 是多少 (log n)^k