树状结构 - 时间复杂度
樹狀結(jié)構(gòu)的算法題時間復(fù)雜度是相對比較難的
因為有兩種情況,一種是普通遍歷,另一種是分治算法
?
?
而如Leetcode109.?Convert Sorted List to Binary Search Tree
這題的代碼如下
class Solution {public TreeNode sortedListToBST(ListNode head) {if (head == null) return null;if (head.next == null) return new TreeNode(head.val);ListNode preMid = findPreMid(head);ListNode mid = preMid.next;preMid.next = null;TreeNode node = new TreeNode(mid.val);node.left = sortedListToBST(head);node.right = sortedListToBST(mid.next);return node;}public ListNode findPreMid(ListNode head) {ListNode slow = head, fast = head.next, preMid = slow;while (fast != null && fast.next != null) {preMid = slow;slow = slow.next;fast = fast.next.next;}return preMid;} }很明顯就是一個創(chuàng)建BST的題,由于題目明確說明是BST,所以這題可以看作一個類似快速排序的分治算法
這里牽扯到遞歸處理分治算法的概念,遞歸算法的時間復(fù)雜度計算需要畫圖闡述
?
很顯然,如果計算一個類似上圖的遞歸算法,通常就是時間復(fù)雜度就是O(NlogN),同樣的,空間復(fù)雜度會變成O(N)?
(當(dāng)然在面試時,一般來說遞歸操作時由操作系統(tǒng)(call stack)自動完成,所以一般不會問空間復(fù)雜度)
?
快速排序的偽代碼 (參考https://www.geeksforgeeks.org/quick-sort/)(每個子問題利用雙指針,讓相對小的放左邊相對大的放右邊)
// low --> starting index // high --> ending indexquickSort(arr[], low, high) {if (low < high) {/*pi is partitioning index, arr[pi] is now at right place*/pi = partition(arr, low, high)quickSort(arr, low, pi - 1)quickSort(arr, pi + 1, high)}partition(arr[], low, high) {//pivot (Element to be placed at right position)pivot = arr[high];i = low - 1 //index of smaller elementfor (j = low; j <= high - 1; j++) {// If current element is smaller than pivotif (arr[j] < pivot){i++;swap arr[i] and arr[j]}}swap arr[i + 1] and arr[high]return i + 1} }顯然這是一個典型的分治算法,和109問題有異曲同工之妙
?
但是如果看pre-order或dfs遍歷樹的題目,看似也像一個分治算法,實際上只是普通遍歷而已
preorder(root) {if(root) {visit rootpreorder(root.left)preorder(root.right)} }dfs(root) {if(root) {dfs(root.left)visit rootdfs(root.right)} }和分治算法的區(qū)別就是,他們每次調(diào)用preorder的時候時間復(fù)雜度并不是O(n),而是O(1)
所以很明顯,根據(jù)每個節(jié)點都被訪問一次,他們時間復(fù)雜度就是O(n),
但是需要注意的是,空間復(fù)雜度在最壞情況下是O(n)
而在最好情況呢(也就是平衡滿二叉樹)
以dfs為例,訪問時,占用最大空間的時候就是綠色圖示的樣子,也就是搜索到第logN層,之后訪問一次,離開一次,內(nèi)存會被清理。
所以最好情況下,空間復(fù)雜度就是O(logN)
?
?
還需要注意的是,非遍歷算法,且沒用到分治的情況。
?
如在二分查找樹(BST)查找到過程中,時間復(fù)雜度是O(logN),很顯然并沒有用到分治算法,最差情況下就是在樹的枝葉上找到,也就是O(logN)
總結(jié)
以上是生活随笔為你收集整理的树状结构 - 时间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux打开文件夹所有文件名,获取文件
- 下一篇: 17天搞定GRE词汇--留留学论坛