我们有"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)
。
没有神奇的秘诀可以降低问题的复杂性。有时你可以得到改进,因为初始算法效率不高,有时你不能。在手头的情况下,您可能无法(尽管这取决于特定的处理(。
通过对文件进行子采样所做的并不是复杂性的改进:这是减小问题大小的作弊,并且您不再解决初始问题。
- 你可以通过跳过 n/log n 个文件来实现 m log(n(
或
- 您可以通过跳过每个文件的m/log m行来实现n log(m(。