1

複数の iCalendar を結合しようとしています。重複するイベントをマージできるようにしたい。たとえば、月曜日の午後 12 時から午後 2 時までのイベントと、午後 1 時から午後 3 時までの別のイベントがある場合、最終的には午後 12 時から午後 3 時までのイベントを実行したいと考えています。

PHPでそれを行うか、アルゴリズム自体を支援する単純なオープンソーススクリプトを探しています。

どんな種類の助けも大歓迎です!

4

2 に答える 2

1

そうです - 残念ながら、私は PHP について何も知らないので、PHP のコーディングをお手伝いすることはできません (これは、私のアルゴリズムのヘルプがうまくいかない可能性があることも意味します)。しかし、私はアルゴリズムの使い方をよく知っているので、できるだけ多くのアルゴリズムを思いつきます。それぞれに賛成と反対の理由を挙げますので、お好きな方を選んでください。

最初に、簡略化します。2 つ以上の ICalendar を一緒にマージする場合、2 つをマージしてから、結果を次のものとマージすることができます。つまり、私たちのアルゴリズムは 2 つをマージするだけで機能します。

それを念頭に置いて、私が集めることができる概念的に最も単純なマージは次のとおりです。

  1. ICalendar A と B が与えられた場合、それらを新しい ICalendar C にマージします。
  2. C を初期化する
  3. A または B から最も古いイベントを選択して削除し、C に追加します。
  4. 同じように、今度は「イベントをマージ」します。
  5. 泡立て、すすぎ、A と B の両方が空になるまで繰り返します。C には A と B の結合が含まれているはずです。

実際には、これは最適なアルゴリズムに近いものです。つまり、 O(n)時間です。ここで、n は ICalendar ごとのイベントの平均数です。つまり、他の方法は今後提供されません...悲しいことに。

于 2012-11-06T02:23:37.287 に答える
0

これは、誰かが興味を持っている場合に私がやったことです。最も効率的ではないかもしれませんが、私がやっていることには十分です。

  1. カレンダーを Event オブジェクトに解析します (各オブジェクトには開始時刻と終了時刻の UNIX タイムスタンプがあります)。Event クラスにはエクスポート用の toString() メソッドも必要です。
  2. すべてのオブジェクトを配列に格納し、開始時間で (昇順で) 並べ替えます
  3. 最終結果の配列を初期化します。これを「final_array」と呼びましょう
  4. 配列の最初のイベントを「A」として取得します
  5. 次のイベントから配列の反復処理を開始します。「B」という名前にしましょう。
    1. A の終了後に B が開始する場合: A を final_array に追加し、B を新しい A にします。
    2. A が終了する前に B が開始する場合:
      1. A が終了する前に B が終了した場合: 何もしない
      2. A の終了後に B が終了する場合: A の終了時刻を B の終了時刻に変更します。
  6. 配列の最後に達していない場合は 5 に戻ります
  7. final_array の各イベントについて、新しいカレンダー ファイルにイベントを書き込みます
于 2012-11-09T00:55:52.440 に答える