沒有足夠的信息。您還需要知道N
向量中的M
值的分佈。如果你有,那麼它直截了當地發現總體複雜性:
std::sort
擁有的O(N·log(N))
比較複雜。
std::vector
使用std::lexicographical_compare(v1, v2)
進行比較,其複雜性爲O(min(v1.size(), v2.size()))
比較。
int
比較具有O(1)
的複雜性。
我們會通知E(M, N)
是對M
的函數,N
,返回意味着數目的最小元素每一對內矢量之間。
- 例如,如果你有一個均勻分佈,這是 平凡等於
M/N
。
- 取產品:
Big Oh = N·log(N)·E(M, N)·1
。
您可以使用Discrete Probability Distribution theory找出E(M, N)
功能是什麼的M
跨N
任何分配。
編輯1:爲了推動如何/爲什麼這重要的一點:考慮分佈總是讓我向量的樣子:
outer[0].size() == 1,
outer[1].size() == 1,
outer[2].size() == 1,
...,
outer[M-1].size() == (M - N + 1)
在這種情況下,E(M, N) = 1
,因爲std::lexicographical_compare
將只有一個一個其他元素與任何元素對進行比較。因此,對於這種特殊的分配,我會總是有一個複雜的O(N·log(N))
。但有了統一的分配,我將有O(M·log(N))
。
編輯2:按照你定義你的發行版的評論,讓我們嘗試並找到E(M, N)
。
首先,請注意總共有T = (N choose 2) = N(N - 1)(1/2)
矢量比較的不同組合。
一個(並且只有一個)的組合將採取X = O((M - N + 2)(1/2))
比較,並且具有概率P(X) = 1/T
發生。
每隔組合將需要的只是1
比較(O(1)
),並與概率P(1) = (T - 1)/T
所以出現這些情況。
查找平均值很簡單:X·P(X) + 1·P(1)
。
鑑於此,WolframAlpha說:E(M, N) = (M + (N - 2) N)/((N - 1) N)
。
乘以該功能通過N log(N)
給我們(M + (N - 2) N) log(N)/(N - 1)
,這可以進一步簡化,以大哦,你要尋找的:O((M/N + N) log(N))
。
爲什麼我們使用每對內部向量的平均比較時間?它不應該是通過C++排序算法進行比較的每一對平均比較時間嗎? – Wakaka
@Wakaka我編輯過,使其更清晰。 –
謝謝,我明白了。我只是想知道這種情況:長度爲(M-N + 2)/ 2的長度爲1,2的向量的N-2向量。顯然這應該花很少時間。但是比較時間可以達到(M-N + 2)/ 2。這是否意味着C++排序需要(M-N + 2)/ 2 * N log N時間?我想我們需要知道排序算法所做的比較究竟是什麼... – Wakaka