繩子的長度;及找陣列的波谷分析

紫鳳發表於2013-07-26

今日面試題:繩子的長度

一根一米長的繩子,隨機斷成三段;求最短的一段的期望長度以及最長的一段的期望長度。

================================

找陣列的波谷分析:

原題

一個陣列A[1...n],滿足A[1]>=A[2], A[n] >= A[n-1]。A[i]被成為波谷,意味著:A[i-1] >= A[i] <= A[i+1]。請給出一個演算法,找到陣列中的一個波谷。O(n)的方法,是很直接,有更快的方法麼?

分析

這個題目遍歷一遍陣列,顯然就可以找到全部的波谷。時間複雜度O(n),空間複雜度是O(1)。但是如果我們只需要找到一個波谷,是否有更快的方法呢?更快的方法O(1)是不可能的,那只有O(logn),自然就想到二分查詢。這個題目如果進行二分呢?我們看下面的陣列A:

0 1 2 3 4 5 6
9 7 7 2 1 3 7
left mid right

A[0]>A[1],A[6]>A[5],滿足題目中要求陣列的條件。滿足這樣的條件,陣列中一定是存在波谷的。假設不存在波谷,則A[0]

上表中的mid=3,A[mid]=2。A[mid-1]

0 1 2 3 4 5 6
9 7 7 2 1 3 7
left mid right

此時,mid滿足波谷的條件,找到波谷。

總結上面的思路,找到陣列的mid元素,mid有幾種情況:

如果A[mid-1]>=A[mid] && A[mid+1]>=A[mid],找到波谷;

如果A[mid-1]<=A[mid]

如果A[mid+1]<=A[mid]

如果A[mid-1]

進一步分析

如果這個題目中,沒有A[1]>=A[2]以及A[n]>=A[n-1]的約束,還能夠以O(logn)的時間複雜度完成麼?關鍵點就在於,中間的元素與其相鄰的元素進行大小比較的時候,還能否選擇一邊繼續進行查詢。當A[mid-1]<=A[mid]時,可能是A[1]

T(n)=2T(n/2)+1

根據主定理,解得,時間複雜度為O(n).此時,是不存在O(logn)的。

本文來自微信:待字閨中,2013-07-23釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章