Algorithm 当时间复杂度根据n为偶数/奇数而变化时,算法S的最佳和最坏情况时间

Algorithm 当时间复杂度根据n为偶数/奇数而变化时,算法S的最佳和最坏情况时间,algorithm,time-complexity,big-o,asymptotic-complexity,Algorithm,Time Complexity,Big O,Asymptotic Complexity,下面是一个家庭作业,所以我宁愿得到一些提示或信息来帮助我解决这个问题,而不是完整的答案 假设S是一个问题的算法解决方案,该问题将一个大小为n的数组作为输入。经分析得出以下结论: 算法S对A中的每个偶数执行O(n)时间计算 算法S对A中的每个奇数执行O(logn)时间计算 算法S的最佳和最坏情况时间是什么 由此我了解到,时间复杂度随着n是偶数还是奇数而变化。换句话说,如果n是偶数,S需要O(n)时间,当n是奇数时,S需要O(logn) 这是否是一个简单的问题,即选择增长率的最佳情况和最坏情

下面是一个家庭作业,所以我宁愿得到一些提示或信息来帮助我解决这个问题,而不是完整的答案

假设S是一个问题的算法解决方案,该问题将一个大小为n的数组作为输入。经分析得出以下结论:

  • 算法S对A中的每个偶数执行O(n)时间计算

  • 算法S对A中的每个奇数执行O(logn)时间计算

算法S的最佳和最坏情况时间是什么

由此我了解到,时间复杂度随着n是偶数还是奇数而变化。换句话说,如果n是偶数,S需要O(n)时间,当n是奇数时,S需要O(logn)

这是否是一个简单的问题,即选择增长率的最佳情况和最坏情况,并选择它们的边界?意思是:

O(n)的最佳情况是O(1),最坏情况是O(n)

O(logn)的最佳情况是O(logn),最坏情况是O(logn)

因此,算法S的最佳情况是O(logn),最坏情况是O(n)

我错过什么了吗?还是我错误地评估了两个大Oh案例的不同最佳/最坏情况


第一次尝试

好的,所以我完全误解了这个问题。多亏了candu,我现在可以更好地理解对我的要求,所以试着更好地计算最好和最坏的情况

似乎算法S根据A中的每个数字改变其运行时间。如果数字是偶数,则运行时间为O(n),如果数字是奇数,则得到O(logn)

最坏的情况是由一个由n个偶数组成的数组组成,对于每个偶数,算法将运行O(n)。换句话说,算法S的最坏运行时应该是n*O(n)

最好的情况是由一个由n个奇数组成的数组组成,对于每个奇数,算法将运行O(logn)。算法S的最佳运行时应该是n*O(logn)

我说得通吗?那么,这是真的吗:

算法S的最佳情况是否(logn),最坏情况是否(n)

如果这是真的,它能被改写吗?例如,作为O(log^n(n))和O(n^n)?或者这是一个算术错误


第二次尝试

在JuanLopes的回答之后,我似乎可以将nO(n)重写为O(n*n)或O(n^2),将nO(logn)重写为O(nlogn)


现在算法S在最佳情况下以O(nlogn)运行,在最坏情况下以O(n^2)运行,这有意义吗?

这里有一点混乱:算法运行时并不取决于
n
是偶数还是奇数,而是取决于
a
中的数字是偶数还是奇数

考虑到这一点,什么样的输入
A
会使算法运行得更快?慢一点

另外:如果说
O(n)
的最佳情况是
O(1)
,这是没有意义的。假设我有一个算法(“算法Q”),它是
O(n)
;我所能说的就是存在一个常数
c
,这样,对于任何大小
n
的输入,算法Q所花费的时间小于
cn
。无法保证我能找到算法Q为
O(1)
的特定输入

举一个具体的例子,无论传递什么输入,这都需要线性时间:

一些想法。 首先,没有提到渐近紧时间。所以一个O(n)算法实际上可以是一个O(logn)算法。想象一下,在这种情况下,这个算法的最佳运行时间。我知道,这有点挑剔。但这是一个家庭作业,我想总是欢迎提及所有的可能性

第二,即使它是渐近紧的,也不一定意味着它对所有元素都是紧的。考虑插入排序。对于要插入的每个新元素,我们需要在先前已排序的子数组中找到正确的位置。时间与子阵中元素的数量成正比,其上限为O(n)。但这并不意味着每个新元素都需要精确的比较才能插入。实际上,子阵列越短,插入速度越快

回到这个问题上来。“对A中的每个奇数执行O(logn)-时间计算。”让我们假设所有奇数。第一个奇数取O(log1),第二个奇数取O(log2。。n取O(logn)。总的来说,这需要O(logn!)。它与“每个奇数的O(logn)”并不矛盾


至于最坏的情况,你可以用大致相同的方法分析它。

Woha,我没有注意到关于数组内容的非常重要的细节。而且,我明白你的例子的意思。因此,仅仅根据运行时的顺序来说明运行时的最佳/最坏情况几乎是不可能的,因为我们对实现一无所知。O(n^n)是另一回事。@JuanLopes那么,如果我没弄错的话,当某个运行时有一个系数,比如nO(n)或nO(logn),它只是插入到括号中,成为内部函数的系数?这就是为什么nO(n)=O(n*n)=O(n^2)和nO(logn)=O(nlogn)?是的,除非系数是常数。如果k是常数,那么k(n)=O(n)。在这个例子中,k不是常数,所以我可以安全地声明我所声明的!。。。是吗?但算法S的运行时间不是每个元素所有运行时间的总和吗?当我试图在我的问题的第二部分中试图做最好和最坏的情况时,我不应该考虑吗?我的意思是,在最好的情况下,需要运行算法n*O(logn),因为这就是“对A中的每个奇数执行O(logn)-时间计算”的意思……你需要对大O符号有更深入的理解。O(logn)表示函数的上界为O(logn)。取常数时间的函数(因此O(1))也属于O(logn);当它深入到个人层面时,它更有意义
def length(A):
  len = 0
  for x in A:
    len += 1
  return len