Created
June 15, 2013 22:41
-
-
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秒未満、になった。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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