不,您的代码的时间复杂度为 O(2^|<DeltaTime>|)
,
对于当前时间的正确编码。
请让我先为我的英语道歉。
Big O是什么以及如何在CS中工作
Big O表示法不用于将程序的输入与其运行时间绑定在一起。
大O表示法是表示两种量的渐近比的一种严谨的方法。
在算法分析的情况下,这两个数量不是输入(必须首先具有“测量”功能)和运行时间。
它们是问题1实例的编码长度和关注度量。
常用的指标是
- 在给定的计算模型中完成算法所需的步骤数。
- 计算模型需要的空间(如果存在)。
隐式地将TM假定为模型,以便第一个点转换为转换2函数的应用次数,即“步骤”,第二个点转换为至少写入一次的不同带单元的数目。
是否还经常隐含地假设我们可以使用多项式相关的编码来代替原始编码,例如,从头到尾搜索一个数组的函数很O(n)
复杂,尽管该数组实例的编码长度应为n*b+(n-1)
其中b
,每个元素的符号数(常数)。这是因为它b
被视为计算模型的常数,因此上面的表达式和n
渐近地相同。
这也解释了为什么试算师之类的算法尽管本质上是一个相似的算法,但却是指数for(i=2; i<=sqr(N); i++)
算法3。
看到这个。
这也意味着,大的O表示法可能会使用描述一个问题可能需要使用的尽可能多的参数,是否有一个k对于某些算法参数并不稀奇。
所以这不是关于“输入”或“没有输入”。
现在学习案例
Big O表示法不会质疑您的算法,它只是假设您知道自己在做什么。从本质上讲,它是一种可应用于任何地方的工具,甚至适用于可能故意棘手的算法(例如您的算法)。
为了解决您的问题,您使用了当前日期和将来的日期,因此它们必须以某种方式成为问题的一部分。简而言之:它们是问题实例的一部分。
具体来说,实例是:
<DeltaTime>
凡是<>
指任何非病理性选择编码。
请参阅下面的非常重要的说明。
因此,您的O复杂度大时间为O(2^|<DeltaTime>|)
,因为您进行了许多迭代,具体取决于当前时间的值。放置其他数值常量没有意义,因为渐进符号很有用,因为它消除了常量(例如,使用O(10^|<DeltaTime>|*any_time_unit)
无意义)。
棘手的地方在哪里
上面我们做了一个重要的假设:计算模型可以计算5倍的时间,而我指的是(真实的)物理时间。在标准计算模型中没有这样的概念,TM不知道时间,我们将时间与步数联系起来,因为这就是现实的工作方式4。
在模型中,尽管时间是计算的一部分,但您可以使用功能性人员的术语,是说Main不是纯粹的,而是概念是相同的。
要理解这一点,应该注意,没有什么可以阻止框架使用比物理时间快两倍,五倍,十倍的假时间。这样,您的代码将以“时间”的“一半”,“五分之一”,“十分之一”运行。
这种反射对于选择的编码很重要<DeltaTime>
,这本质上是编写<(CurrentTime,TimeInFuture)>的一种简化方式。由于时间不存在优先顺序,因此CurrentTime的编码很可能是前天的单词Now(或其他选择),可以编码为Yesterday,从而打破了编码长度增加的假设物理时间前进(DeltaTime之一减小)
为了做一些有用的事情,我们必须在计算模型中对时间进行适当的建模。
我们唯一可以做的安全选择是在物理时间向前移动时,对长度不断增加的时间戳进行编码(但仍不使用一元编码)。这是我们需要的时间的唯一真实属性,也是编码需要捕捉的时间。仅通过这种类型的编码,您的算法才可能具有时间复杂度。
你的困惑,如果有的话,从一个事实,即这个词出现的时间在短语“什么是它的时间复杂度?和“多少时间?” 意味着非常不同的事物
the,术语使用相同的词,但是您可以尝试使用“步骤复杂性”来重新询问自己的问题,希望这将帮助您理解答案确实是^ _ ^
1这也解释了渐近方法的必要性,因为每个实例具有不同但并非任意的长度。
2我希望我在这里使用正确的英语术语。
3这也是我们经常log(log(n))
在数学中找到术语的原因。
4至少,步骤必须占据一定的时间间隔,但不能为空,也不能为未连接。
5这意味着计算模式是其中的物理时间知识,即可以用其术语来表示。类比是泛型在.NET框架中的工作方式。
O(N)
复杂性O(1)