例如,让我们说我正在做字符串处理,需要对两个字符串进行一些分析。我没有给出关于它们的长度可能最终是多少的信息,因此它们来自两个不同的家庭。将算法的复杂度称为或(取决于我们使用的是朴素算法还是优化算法)是否可以接受?
同样,让我们假设我们选择的算法实际上需要两个阶段-第一个字符串的设置阶段,这使我们能够处理任意数量的其他字符串而不会产生初始成本。说它具有构造,再进行任意数量的计算,是否被认为合适?O (m )
因为两个计算都是线性的,所以仅将它们称为是否合适?
例如,让我们说我正在做字符串处理,需要对两个字符串进行一些分析。我没有给出关于它们的长度可能最终是多少的信息,因此它们来自两个不同的家庭。将算法的复杂度称为或(取决于我们使用的是朴素算法还是优化算法)是否可以接受?
同样,让我们假设我们选择的算法实际上需要两个阶段-第一个字符串的设置阶段,这使我们能够处理任意数量的其他字符串而不会产生初始成本。说它具有构造,再进行任意数量的计算,是否被认为合适?O (m )
因为两个计算都是线性的,所以仅将它们称为是否合适?
Answers:
当然是。很好,完全可以接受。看到算法的运行时间取决于两个参数是常见且标准的。
例如,您经常会看到以表示深度优先搜索的运行时间,其中n是图形中的顶点数,m是图形中的边数。这是完全有效的。这样做的意义是存在一个常数C ^和数字Ñ 0,米0,使得算法的运行时间为至多Ç ⋅ (Ñ + 米),对于所有Ñ > Ñ 0,米> 米0。换句话说,如果确切的运行时间为,那么我们说f (n ,m )= O (n + m ),如果存在c ,n 0,m 0使得n > n 0并且米> 米0意味着˚F (ñ ,米)≤ ç ⋅ (ñ + 米)。
是的,可以说第一阶段花费时间,第二阶段花费O (m )时间是完全适当和可以接受的。
重要:请确保定义和m。如果不指定n是什么,就不能说“这是O (n )时间算法” 。如果问题语句中未指定n,则需要指定它。例如,请参见图算法,其中我们通常定义n =#个顶点和m =#个边。
至于是否可以称它们为时间,当然不能-除非您以某种方式知道m = O (n )。当然,如果您知道m = O (n ),则随之得出m + n = O (n ),因此O (m + n )时间算法也是O (n )时间算法。但是如果不能保证m = O (,则不能将其称为 O (n )时间算法。
这是基本的东西。您会在算法教科书中找到所有内容。