在测量算法时间复杂度时,是否总是省略获取输入所需的时间?

时间:2013-10-06 00:35:36

标签: algorithm time big-o time-complexity

由于读取输入必须采用Θ(n),那么某些算法如何更快?例如,二进制搜索是O(log n)但是要读取数组或列表或者正在搜索的任何内容必须采用Θ(n)(它不像您可以跳过读取某些输入)。算法总是在假设输入的情况下进行测量吗我真的没有看到这一点,因为整个时间点的复杂性是找到瓶颈。如果我的问题没有意义,请说出来。

3 个答案:

答案 0 :(得分:2)

算法测量了它们对输入值的作用。读取输入不是算法的一部分。 请注意,算法本身和读取输入并使用此算法的程序是不同的。

例如二进制搜索具有O(logn)复杂度,但是从文件读取数字并应用二进制搜索以找到数字的程序具有O(logn)+ O(n)= O(n)复杂度。

答案 1 :(得分:1)

通常,算法的运行时不包括准备数据进行处理所需的时间。没有根本原因必须采用这种方式,尽管它很好,因为对于采用次线性时间的算法(例如,二进制搜索的O(log n)运行时),我们不想考虑到首先准备和排序数组所需的工作。

这种方法确实有几个优点。想象一下,您想要多次执行某些操作(例如二进制搜索)。如果二进制搜索的复杂性包括准备和排序数组所需的成本,那么我们就不能通过采用二进制搜索的运行时间并乘以k来获得“执行k二进制搜索”的运行时间。我们必须采用二进制搜索的运行时间,减去准备输入所需的工作,将其乘以k,然后加回与设置所有内容相关的一次性成本。

也就是说,运行时分析通常确实包括生成输出所需的时间。例如,如果您有一个生成n个值列表的算法,则必须至少花费Ω(n)时间,因为如果不执行n个工作单元,您实际上不能写出n个值。在首先分析算法时通常会考虑此成本。您有时可以使用此事实来表明具有某些运行时的算法不存在;例如,不可能有一个algortihm在时间上产生小于Ω(n)的前n个幂,因为你不能快速写出那么多数字。

事实上,我们通常会跳过问题的设置时间,其根源在于图灵机,在图灵机甚至开始运行之前,假设输入被记录在磁带上。

希望这有帮助!

答案 2 :(得分:1)

你的问题很有道理。复杂性取决于您如何定义算法的成本。该定义试图将算法添加的值捕获到World。考虑到这一点,您可以选择考虑在二进制搜索中加载(并可能排序)列表所花费的时间,作为算法成本的一部分。这是有道理的,特别是如果您对要分析的整个计算会话中执行的搜索操作的数量有所估计。