[英]Given an array of permutation of n numbers calculate the no. of tuples (i,j,k,l,m) such that i<j<k<l<m and a[i]<a[k]<a[j]<a[m]<a[l]
對於軟件開發人員面試的硬算法回合,我最近被問到這個問題。 我能夠使用蠻力/遞歸來做到這一點,不確定預期的方法,對此有什么幫助嗎?
給定
n
數字的排列數組,計算元組數(i,j,k,l,m)
使得i<j<k<l<m
和a[i]<a[k]<a[j]<a[m]<a[l]
。
我的方法-> 使用遞歸從給定數組中嘗試 (i,j,k,l,m) 的所有元組,並僅考慮滿足條件的元組,例如 N 選擇 5,因為這具有指數時間復雜性,我想讓它成為三次方或二次方
我會大量使用Quadtrees 之類的東西。 四叉樹允許您將一堆點放在 2d 中,然后有效地搜索區域。 要么找到點,要么只計算它們。 (存儲每個節點中的點數,然后計數會變得更快,因為當您的正方形完全位於所需區域時,您可以停止。)
一個有用的四叉樹是將排列視為一系列 n 點(i, a[i])
。 我們可以使用它來查找i
在一個范圍內而a[i]
在另一個范圍內的所有情況。 叫那棵樹perm
。
第二個有用的四叉樹是 map 所有反轉i < j
和a[j] < a[i]
到點(i, a[j])
。 調用那棵樹invert
。
現在您的搜索看起來像這樣:
search invert to find all inversions (j, k):
x = count i < j with a[i] < a[k] (search perm)
y = count inversions (l, m) with k < l and a[j] < a[m] (search invert)
add x*y to total
我相信填充perm
將花費時間O(n log(n))
,填充invert
將花費O(n^2 log(n))
,並且每次搜索以獲取計數應該類似於O((log(n))^2)
。 (不確定那個。)由於存在O(n^2)
反轉,因此總性能應該類似於O((n log(n))^2)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.