c - 我对 n*log(N) Big O 的样子很感兴趣

标签 c time-complexity big-o

我知道简单的线性 Big O 看起来像这样(全部使用 C 语言):

#include <stdio.h>    
int main()
{
    int array[10]={1,2,3,4,5,6,7,8,9,10}; //elements of the array
    int a; //creating the new variables
    for (a=0;a<10;a++){
            printf("%d\n", array[a]); //print elements of the array

    }
}

而且我知道 N^2 Big O 看起来像这样:
#include <stdio.h>   
int main()
{
    int array[10]={1,2,3,4,5,6,7,8,9,10}; //elements of the array
    int a,b; //creating the two variables
    for (a=0;a<10;a++){ //do stuff
        for (b=0;b<10;b++){ //do stuff
            printf("%d = %d\n", array[a],array[b]); //print elements of the array
        }
    }
}

我感兴趣的是 n*log(n) Big O 的样子。

最佳答案

如果是对数基数 2,则除以 n重复减半直到达到 1 是捕获 log(n) 复杂度的最典型方法:

for (int i = n; i > 0; i /= 2);

所以 O(n log(n)) 看起来像:
for (int i = 0; i < n; i++) {
  for (int j = n; j > 0; j /= 2) {
    // O(1) work
  }
}

从概念上讲,这就像对数组 (O(n)) 的每个元素运行二进制搜索 (O(log(n))。

Merge sorttypical O(n log(n)) algorithm -- log(n) 部分将数组拆分为块,而 O(n) 部分将块重新合并在一起。对于每个 O(log(n)) 拆分操作,都会发生 O(n) 合并,因此复杂性相乘,就像在嵌套循环中一样。

关于c - 我对 n*log(N) Big O 的样子很感兴趣,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61193601/

相关文章:

c - 当没有引用时,值会永远存在吗?

C-Fortran 混合编程

arrays - 简单 k 数组合并的复杂性

algorithm - 如何解决这个递归关系: T(n) = T(n-1) * T(n-2)

java - 递归 Pascal 的三角行大 O 成本

c - 使用 sscanf 和 fgets 读取文本

algorithm - 如何用离散来接近优化算法

algorithm - 词典解析

parsing - 确定性上下文无关语法与上下文无关语法?

c - 编译器对只包含一个函数调用的函数做了什么