Skip to content

Instantly share code, notes, and snippets.

@ts-3156
Created June 15, 2013 22:41
Show Gist options
  • Save ts-3156/5789851 to your computer and use it in GitHub Desktop.
Save ts-3156/5789851 to your computer and use it in GitHub Desktop.
Aグループには含まれているが、Bグループには含まれていないユーザー一覧を取得するためのメソッド。 単純な二重ループにすると時間がかかりすぎるためhashを用いて比較回数を減らしている。 inverse_hashあたりはもっと最適化の余地があるが、そこそこ最適化できれば充分なのでこのような実装にした。 Aグループ、Bグループともに約1,000ユーザーで実行時間を計測した時、単純な二重ループだと約60~70秒、 この実装だと1秒未満、になった。
# pre_usersには存在するが、cur_usersには存在しないユーザーの配列を返す
# 単純な総当たりにすると比較回数が多くなり時間がかかりすぎるので
# hashを利用して比較回数を減らしている。
def diff_users(pre_users, cur_users)
return [] if (!pre_users || !cur_users)
target_users = []
pre_users_hash = {}
pre_users.each_with_index{|pre_user, i|
pre_users_hash.store(pre_user.id_str, i)
}
cur_users.each{|cur_user|
pre_users_hash.delete(cur_user.id_str)
}
inverse_hash = {}
pre_users_hash.each{|user_id, array_index|
inverse_hash.store(array_index, user_id)
}
inverse_hash.keys.sort.each{|index|
target_users.push(pre_users[index])
}
return target_users
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment