问题描述
我不确定线性微分方程组的计算复杂度。我正在编写一个解决此类系统的程序。用户指定 t_calc 和 dt,因此我可以轻松计算步数。伪代码如下:
for (i=0,i<steps; i++){
for(j=1; j<number_of_equations; j++){
/// do something
for(k=0; k<2;k++) {some computings}
for(n=0; n<2;n++) {some computings}
}
}
return result
方程的数量只是有时大于 5。 我认为这种算法的复杂度是 O(n) 是错误的吗?
解决方法
根据您想将哪些参数视为常量,调用此线性可能有意义,是的。要问自己的一些问题:
-
步数是常数吗?可能不是,因为您可能是通过将模拟范围除以步长(例如,100 秒除以 1 毫秒 = 100,000 步)来计算步数。
-
方程的个数是常数吗?如果您正在解决一些固定问题,可能是这样,但如果您正在编写一个通用实用程序来解决线性微分方程的通用系统,则方程的数量是一个参数。
-
你展示了几个固定边界上的 for 循环;这些本身不会增加额外的复杂性。但是,这种 for 循环的数量是固定的,还是会根据要解决的问题增加或减少?如果您没有解决固定问题,并且有些问题需要更多或更少的内部 for 循环,则可能会增加复杂性。
让 n = 步骤,m = number_of_equations 和 p = 所需的内部循环数。你可以写复杂度是 O(mnp)。如果这些数字中的任何一个是常数 w.r.t.你正在解决的问题或你正在做的分析,它们可以被删除(因为对于所有常数 c,O(cn) = O(n))。