讓我從回答你的問題的反面開始,因爲我誤解了它;但它也給了我答案。
假設您已經有24小時內分散的間隔列表。你想找到一些與當天任何給定分鐘重疊的時間間隔;你稱之爲weight
。
我可以想到兩種方法。但是,首先你應該將時間間隔轉換成分鐘,所以在列表中的時間就變成了:
# Note the 19:45-06:03 has been split into two intervals (1185,1440) and (0,363)
st = sorted(list(to_parts(sleep_table))
>>> [(0, 363), (518, 568), (763, 900), (1185, 1440)]
首先,一個簡單的解決方法是將所有的時間間隔轉換成一串1和求和所有時間間隔:
eod = 60*24
weights = reduce(lambda c,x: [l+r for l,r in zip(c, [0]*x[0] + [1]*(x[1]-x[0]) + [0]*(eod-x[1]))] ,st,[0]*eod)
這會給你的尺寸1440,每個條目是在一天的給定分鐘重量的列表。第二,是一個稍微複雜一點的線掃描算法,它會給你段的O(nlogn)
時間相同的值。所有你需要的是隻取區間的開始和結束時間,並進行排序,同時保持的時間是否在開始或結束時間跟蹤:
def start_end(st):
for t in st:
yield (t[0],1)
yield (t[1],-1)
sorted(list(start_end(st)))
#perform a line sweep to find changes in the weights
map(lambda (i,l):(i,sum(map(itemgetter(1),l))),groupby(sorted(list(start_end(st))), itemgetter(0)))
#compute the running sum of weights
#See question 35605014 for this part of the answer
現在,如果你從權重本身開始。您可以輕鬆將其轉換爲開始和結束時間列表,這些列表不會間隔耦合。您只需將帖子中的平滑樣條轉換爲步驟函數即可。每當階梯函數的值增加時,您都會添加一個睡眠開始時間,並且每當它停止時您都會添加一個睡眠停止時間。最後,您執行行掃描以將睡眠開始時間與睡眠結束時間相匹配。這裏有一點擺動的空間;因爲您可以將任何開始時間與任何結束時間相匹配。如果您需要更多的數據點,只要它們處於相同的時間點,就可以引入額外的睡眠開始和結束時間。
我不確定我是否理解這個問題。你真的有寶寶睡眠時間的概率數據,並且你想要產生隨機睡眠時間來匹配嗎?還是你從頭開始做一切?如果是後者,你怎麼可能知道什麼是對的? – Blckknght
我在做一切。 什麼是正確的,我認爲是正確的,當它與真實數據無關時,不是嗎? 什麼是正確的決定是權重表(正如我所看到的),從那裏數據是否正確無關,算法應該嘲笑這種行爲。 – Gluz
@Gluz如果你所做的任何事情都是正確的,那麼你的問題是什麼?你如何採取任何方法是錯誤的? –