如何改善方法的运行时复杂性?

时间:2019-09-15 08:12:10

标签: java

我用Java编写了一个函数,用于编辑文件名,并将每个空格字符替换为破折号字符。 当前,我遍历特定目录中的所有文件,遍历每个文件名,创建一个新的文件名,然后替换目录中的文件。 我猜当前的复杂度为user-select: none {O(N*M)N = number of files in directory}。 谁能帮助我改善运行时的复杂性? 谢谢

M = number of chars in each file

1 个答案:

答案 0 :(得分:5)

  

我猜当前的复杂度为O(N * M){N =目录中的文件数,M =每个文件中的字符数}。谁能帮助我改善运行时的复杂性?

没人能。您自己想了想:当您的任务是修改N个具有M个字符的文件名以进行读取(或修改)时,您将得到NxM。没有概念性的方法可以根据N个文件名的当前名称来修改N个文件名,而无需每个文件和其中的每个内容。

但是有可能:仔细查看您的代码,看看是否可以改善实际的实现。

您应该首先更多地依赖库方法。例如,您有String.replace(),可让您通过一次调用将所有空格变为破折号。那不应该影响性能,但是它允许您自己编写代码(减少代码通常是一件好事!)。您可以更进一步,查看流以使用更少的代码,请参阅here

但真正的答案是:您可能正在进行过早的优化。最后,您将讨论JVM需要在OS上进行哪些操作以便在文件系统中进行更改。有数不胜数的方面会影响这种用例的整体,端到端性能。拥有多个线程可能会有所帮助,例如可以并行“处理”来自不同目录的文件名。

另一方面:创建线程是一项昂贵的操作。通常,它仅有助于您加快CPU密集型活动。更糟糕的是,多个线程并行访问文件系统……实际上可能会减慢总体速度。

含义:根据您的整体设置,您也许可以加快文件重命名的速度。或不。

最后,您在这里花费了很多的时间和精力。真正的问题是:真的值得吗?您的代码是否需要500毫秒,1秒或2秒对您是否真的很重要?取决于上下文,它可能会,但可能不会。这是要澄清的第一件事。而且,当您确定确实需要最高性能的解决方案时,则必须投入实时时间来衡量正在发生的事情,并进行实验以找出哪个设置对性能的影响最大。

换句话说:如果您真的在这里关注性能,那么您有很多底层细节需要研究。如果您不太在乎性能,那么我将扔掉Java代码并编写3行python代码,Kotlin或您通常用于脚本编写的任何内容,然后再使用。并不是因为该代码会更快 ,但是它会更易于阅读,编写和维护。因为当性能不是您的首要任务时,这才很重要。