日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树状结构 - 时间复杂度

發(fā)布時間:2023/12/29 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树状结构 - 时间复杂度 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

樹狀結(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。