私はそれを誤解したので、あなたの質問の逆に答えることから始めましょう。それは私にも答えを与えました。
すでに24時間前後に間隔のリストが分散しているとします。あなたは、1日の任意の分に重なる複数の間隔を探したいと思います。これはweight
と呼ばれます。
私は2つのアプローチが考えられます。
# 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のサイズのリストを表示します。ここで、各エントリは、1分の1分間の重量です。
第2に、n
セグメントの時間が同じ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あなたが作るものが正しいとすれば、あなたの質問は何ですか?どのようなアプローチが間違っていますか? –