2

実際のコード (PHP/JS) ではなく、ロジック/アルゴリズムに関係があるという質問があります。

1 週間以内に多数のイベントが発生するとします。各イベントのメタデータは DB に保存されます。(ワードプレス+イベントエスプレッソ)

つまり、イベント A、月曜日から金曜日の 8 時から 5 時まで。イベント B、火~金 11-4。等。

ユーザーは Web サイトにアクセスして、これらのイベントを購入できます。スケジュールが競合する少なくとも 2 つのイベントを購入できないようにする必要があります。

DBへの旅行はできるだけ避けたいです。チェックアウト時にショッピング カート内の競合するイベント ID を確認し、エラーをスローすることを誰かが提案しました。それは機能しますが、1 週間に約 12 のイベントがある場合はどうなりますか? 私は(12は2を選ぶ、それは66だと思う)ケース、最悪のケースに対処することはできません。

これを解決するための最も迅速で汚い方法は何ですか? というか、これを解決する良い方法は何ですか?

私は時間に追われているので、クライアント側のみのソリューションが今のところ受け入れられるかもしれません。

ありがとうございました!

編集: これはより良い質問かもしれません: 開始日/時刻と終了日/時刻で構成されるイベント メタデータのリストがあるとします。各イベントの競合をどのようにチェックしますか?

私はこの種の時間/スケジュールの競合チェックを行ったことがないので、あなたが心に留めていることが何であれ、発砲してください!

ありがとうございました!

4

1 に答える 1

1

イベントを開始時刻で並べ替える

あなたの問題は非常に単純なアルゴリズムで答えることができます---しかし、私はあなたの DB に慣れていないので、このアルゴリズムを自分でコードに変換する必要があります:

イベントがリスト内のオブジェクトとしてアクセス可能であるとしましょう: event[0], event[1],... メンバー envent[i].start および event[i].end で開始時間と終了時間 (常に event[ と仮定) i].start <= event[i].end)。重複するイベントを確認するには、最初にイベントを開始時刻で並べ替えます。

event[i].start <= event[i+1].start

ここで、重複をチェックするということは、各イベントの終了時刻を次の開始時刻と比較することを意味します。

event[i].end <= event[i+1].start

上記の関係がすべてのインデックス i について成り立つ場合、(明らかに) 互いに重複するイベントはありません。しかし、いくつかのインデックス i についてこの関係が成り立たない場合、重複があります。

event[i].start <= event[i+1].start < event[i].end

等しい時間に関する注意:

前のイベントが停止したときに 1 つのイベントが開始されても問題ないという仮定の下でアルゴリズムを定式化しました。ただし、これをオーバーラップと見なす場合は、条件を変更して確認するだけです。

event[i].end < event[i+1].start    (use < instead of <=)
于 2013-10-02T12:19:09.657 に答える