Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何计算递归函数的空间复杂度_Algorithm_Data Structures - Fatal编程技术网

Algorithm 如何计算递归函数的空间复杂度

Algorithm 如何计算递归函数的空间复杂度,algorithm,data-structures,Algorithm,Data Structures,我知道堆的空间复杂性是O(1)。但是对于一个递归程序来说,在计算空间复杂度时,它的深度(即它进行的递归调用的数量)也很重要。因此,相同代码的迭代和递归方法的空间复杂度不同。那么,当以递归方式进行堆排序时,其空间复杂度是多少?您是对的,只有在迭代执行heapify操作时,它才是O(1) 在类似于本文所述的递归方法的情况下,内存复杂性变为O(logn) 递归函数的内存复杂度是通过递归调用的深度乘以单个调用的内存复杂度来计算的,在我们的例子中,深度是O(logn),单个调用是O(1)你是对的,只有在迭

我知道堆的空间复杂性是O(1)。但是对于一个递归程序来说,在计算空间复杂度时,它的深度(即它进行的递归调用的数量)也很重要。因此,相同代码的迭代和递归方法的空间复杂度不同。那么,当以递归方式进行堆排序时,其空间复杂度是多少?

您是对的,只有在迭代执行heapify操作时,它才是O(1)

在类似于本文所述的递归方法的情况下,内存复杂性变为O(logn)


递归函数的内存复杂度是通过递归调用的深度乘以单个调用的内存复杂度来计算的,在我们的例子中,深度是O(logn),单个调用是O(1)

你是对的,只有在迭代执行heapify操作时,它才是O(1)

在类似于本文所述的递归方法的情况下,内存复杂性变为O(logn)


递归函数的内存复杂度是通过将递归调用的深度乘以单个调用的内存复杂度来计算的,在我们的例子中,深度是O(logn),单个调用是O(1)

当使用递归实现heapify函数时,它看起来类似于以下伪代码:

heapify(arr, n, root): 
    largest = root 
    left = 2*root + 1 
    right = 2*root + 2
    if left < n && arr[left] > arr[largest]: largest = left
    if right < n && arr[right] > arr[largest]: largest = right 
    if largest != root:
        swap(arr[root], arr[largest])
        heapify(arr, n, largest)
heapify(arr,n,root):
最大=根
左=2*根+1
右=2*根+2
如果左arr[maximust]:maximust=left
如果rightarr[maximust]:maximust=right
如果是最大的!=根目录:
交换(arr[根],arr[最大])
heapify(arr,n,最大)
回想一下,
heapify
函数用于首先将数组转换为堆,然后使用减小大小的堆对数组进行排序

重要的是要注意递归模式可以归结为。根据语言功能的不同,这可以在不使用调用堆栈的情况下执行(使用的空间随着每次递归调用而增加)

因此,除非递归算法还定义了递归调用应该如何“在引擎盖下”实现(可能不包括尾部递归机制),否则它仍然可以用O(1)空间实现


但是,如果不使用尾部递归,则应考虑递归深度。该深度最多是(堆)树的深度,即logn。

当使用递归实现heapify函数时,它将类似于以下伪代码:

heapify(arr, n, root): 
    largest = root 
    left = 2*root + 1 
    right = 2*root + 2
    if left < n && arr[left] > arr[largest]: largest = left
    if right < n && arr[right] > arr[largest]: largest = right 
    if largest != root:
        swap(arr[root], arr[largest])
        heapify(arr, n, largest)
heapify(arr,n,root):
最大=根
左=2*根+1
右=2*根+2
如果左arr[maximust]:maximust=left
如果rightarr[maximust]:maximust=right
如果是最大的!=根目录:
交换(arr[根],arr[最大])
heapify(arr,n,最大)
回想一下,
heapify
函数用于首先将数组转换为堆,然后使用减小大小的堆对数组进行排序

重要的是要注意递归模式可以归结为。根据语言功能的不同,这可以在不使用调用堆栈的情况下执行(使用的空间随着每次递归调用而增加)

因此,除非递归算法还定义了递归调用应该如何“在引擎盖下”实现(可能不包括尾部递归机制),否则它仍然可以用O(1)空间实现


但是,如果不使用尾部递归,则应考虑递归深度。该深度最多是(堆)树的深度,即logn。

可能是Yeah发现的重复,但这并不是递归树。对Yeah发现的可能的重复感到好奇,但这并不是递归的。对此很好奇谢谢你给出了这个简洁明了的答案,它正好回答了我的问题。很高兴听到它有用;-)感谢您提供了清晰简洁的答案,它完全符合我的要求。很高兴听到它很有用;-)