我和我的朋友讨论了以下算法问题,
"Describe a recursive algorithm for finding the maximum element in an array A of n
elements. What is your running time and space usage?"
我们得出结论,它有O(n)时间使用。根据这个陈述, F(n)=比较A [n]和F(n-1),在递归的基本情况下,它比较A [0]和A [1],然后返回更大的一个,将与A [2]进行比较。随着递归的进行,最后,它将返回数组中的最大元素。
每n次递归,它只比较一次,所以最后我们猜测它有O(n)时间使用。 我的问题是我们对我们的解决方案不确定,因此我们需要关于此算法和我们的解决方案的任何其他意见。谢谢。
答案 0 :(得分:0)
是。你是对的,它实际上是O(n)
。你怎么做得很简单,
算法的基本操作是比较。并且在递归步骤中,仅进行一次比较。
所以你可以说
m(n) = m(n-1) + 1
m(n-1) = m(n-2) + 1 + 1
m(n-2) = m(n-3) + 2 + 1
概括我们
m(n-i) = m(n-1-i) + i + 1
现在在你的basecase中,你将不做任何比较(basecase没有剩下的元素,所以你返回当前最大的)。你可以把它写成
m(0) = 1
现在用递推方程代替得到基本情况,让i = n-1
我们得到了
m(n) = m(0) + n - 1 + 1
但是m(0) = 0
所以我们得到
m(n) = n
因此,您的算法为O(n)
。还有其他方法可以证明这一点。即使没有数学证明,您也可以逻辑地说您的算法是O(n)
,因为它在每个递归步骤中只执行一个基本操作,并且算法将始终递归n个步骤而不管输入。
答案 1 :(得分:0)
如果数组包含integers
,您可以找到时间复杂度。在数字的情况下,比较两个数字可以被认为是单位操作。在迭代数组时,为了找到最大值,此操作执行n
次。因此O(n)
。
但是如果数组包含复杂的数据类型,比如string
,那么比较两个字符串不能被视为单元操作。要比较字符串,您可能必须迭代字符串的每个字符。在这种情况下,算法的时间复杂度也可能取决于数组中字符串的长度。类似地,对于其他数据类型,比较两个对象可能不是单元操作。但在你的情况下,看起来数组包含数字,所以你很好。