[英]Big-O notation and recursion with loops
以下方法中最壞情況的Big-O表示法是什么:
/**
* @best-case O(1)
* @worst-case O(?)
*
* {@link NTree#contains(Comparable)}
*/
public boolean contains(T elem) {
if (this.data.compareTo(elem) == 0)
return true;
for(NTree<T> t : children) {
if(t != null)
return t.contains(elem);
}
return false;
}
這是n元的通用樹,每棵樹都有n個孩子。 最佳情況是當elem
等於root.data
。
但是我不確定在最壞的情況下我們必須經歷樹上的每個孩子。
在最后引用您:
...最壞的情況下,我們必須穿過樹上的每個孩子 。
如果在最壞的情況下經歷每個孩子,那將是O(n)
,其中n
是樹中的節點數。
您可以這樣考慮:如果這是一個簡單的鏈表,並且您必須在最壞的情況下完全搜索它,那么最壞情況下的復雜度是什么? 這里是一樣的。 只是在這種情況下,每個節點可以有多個子節點。
遞歸在改變復雜性方面實際上並不起作用。 這只是循環的手段。 如果您使用標准循環結構進行迭代搜索,那將是相同的。
如果n元樹沒有結構(子項/節點的鍵沒有基於比較的排序),則最壞的情況是O(N)。
如果n元樹不一定是平衡的(意味着在最壞的情況下每個節點可以有一個孩子),那么最壞的情況也將是O(N)。
如果樹是平衡排序的n元樹O(log 2 (n)log n (N))其中:
說明:
在n個孩子中進行二元搜索將在樹的整個深度取O(log 2 (n)),這在平衡n元樹中最大為O(log n (N))。
在最壞的情況下,您將始終必須遍歷所有元素。 您可以想象在現實世界的應用程序中,當N元樹用作文件系統的數據結構時。 每個節點都是文件(目錄或常規文件),並且您想通過樹的右下角的名稱查找文件,因此如果不檢查所有節點就無法存儲所有其他信息以指導您,這是不可行的更快地歸檔(例如,這是Linux下按名稱搜索文件時的find命令)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.