如何提高我的算法时间复杂度?



我们有"n"个文件,对于每个文件,"m"行,我们想做一些操作,继续所有文件和行,很明显应用以下算法:

int n;    //n is the number of files 
int m;   //m is the number of the lines in the file i.
for(i=0;i<n;i++){
for(j=0;j<m;j++){
.....
}
}

因此,我们有一个O(nxm(共谋。

我的问题是:

是否有可能使它成为O(nlog(n((或其他方法来通过以下方式提高算法的时间复杂度:

1-保留所有文件和行。

2-我们可以忽略其中的一些。

此致敬意

如果你想玩渐近的复杂性,那就要严谨。

初始复杂性Θ(F L)(很可能,但您没有指定处理(,其中F表示文件数,L表示每个文件的平均行数。(不过,由于行长可能会有所不同,因此以平均字符数说话会更安全。

如果您处理的文件与F中的位数一样多(就像您所做的那样(,则复杂性确实会降低到Θ(log(F) L)。但是,如果您处理所有其他文件,甚至是其中的十分之一,则复杂性仍然Θ(F L)


没有神奇的秘诀可以降低问题的复杂性。有时你可以得到改进,因为初始算法效率不高,有时你不能。在手头的情况下,您可能无法(尽管这取决于特定的处理(。

通过对文件进行子采样所做的并不是复杂性的改进:这是减小问题大小的作弊,并且您不再解决初始问题。

  1. 你可以通过跳过 n/log n 个文件来实现 m log(n(

  1. 您可以通过跳过每个文件的m/log m行来实现n log(m(。

最新更新