1

私のプロジェクトでは、データベースからレコードを選択し、特定の時間範囲内の最新のレコードと同時期に発生したレコードでグループ化したいと考えています。

たとえば、時間範囲が 1 時間の場合。ユーザーが午後 4:30 から午後 5:15 の間に 3 つの投稿、午後 1:15 から午後 1:30 の間に 2 つの投稿、および午前 10:00 に 1 つの投稿を作成した場合、次のような構造を作成したいと思います。

user.posts.find(:all).group_by do |post|
  # (posts have a created_at column containing both a date and time)
  # Algorithm here
end

結果:

[
 [Tue March 31 5:15pm, [post6,post5,post4]]
 [Tue March 31 1:30pm, [post3,post2]]
 [Tue March 31 10:00am, [post1]]
]

これを行うのに最適なアルゴリズムについて何か考えはありますか? Ruby を知らなくても、疑似コードでも問題ありません。

編集:ありがとうジョエル。これが私が最終的に使用したコードです(投稿の代わりにフィード):

  def aggregate(feeds, timeLimit)
    return [] if feeds.blank?
    result = []
    bin = []
    feeds = feeds.sort_by { |f| -f.created_at.to_i }
    bin_time = feeds.first.created_at
    feeds.each do |feed|
      if (bin_time - feed.created_at) < timeLimit
        bin << feed
      else
        result << [bin_time, bin]
        bin_time = feed.created_at
        bin = [feed]
      end
    end
    result << [bin_time, bin]
    result
  end
4

2 に答える 2

1

基本的な概念は非常に単純で、投稿をビンに蓄積し、時間が範囲外になったら、新しいビンを開始します。Pythonバージョンは次のとおりです。

投稿=[('post6'、1715)、('post5'、1645)、('post4'、1630)
    、('post3'、1330)、('post2'、1315)、('post1'、1000)
    ]

rslt = []
bin = []
binTime = 1 << 31
postDataの場合、postsのpostTime:
    if(postTime> = binTime-100):
        bin.append(postData)
    そうしないと:
        ビンの場合:
            rslt.append([binTime、bin])
        binTime = postTime
        bin = [postData]

ビンの場合:
    rslt.append([binTime、bin])

rsltを印刷
于 2009-04-01T01:14:41.900 に答える
0
if post.created_at - group_start > limit
    output current group if non-empty
    set group to current post
    set group_start to post.created_at
else
    add post to current group

次に、ループの外側で、空でない場合は現在のグループを出力します。投稿にアクセスする順序に応じて、if条件を調整します。

于 2009-04-01T00:54:22.213 に答える