Author: srowen
Date: Mon Jun 27 20:27:43 2011
New Revision: 1140300
URL: http://svn.apache.org/viewvc?rev=1140300&view=rev
Log:
Big speedup to finding intersection of users for an item. Huge for
LogLikelihoodSimilarity
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
Modified:
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
URL:
http://svn.apache.org/viewvc/mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java?rev=1140300&r1=1140299&r2=1140300&view=diff
==============================================================================
---
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
(original)
+++
mahout/trunk/core/src/main/java/org/apache/mahout/cf/taste/impl/model/GenericDataModel.java
Mon Jun 27 20:27:43 2011
@@ -287,23 +287,40 @@ public final class GenericDataModel exte
return prefs1.length();
}
- // itemIDs.length == 2)
+ // itemIDs.length == 2
PreferenceArray prefs2 = preferenceForItems.get(itemIDs[1]);
if (prefs2 == null) {
return 0;
}
- FastIDSet users1 = new FastIDSet(prefs1.length());
+
int size1 = prefs1.length();
- for (int i = 0; i < size1; i++) {
- users1.add(prefs1.getUserID(i));
- }
- FastIDSet users2 = new FastIDSet(prefs2.length());
int size2 = prefs2.length();
- for (int i = 0; i < size2; i++) {
- users2.add(prefs2.getUserID(i));
+ int count = 0;
+ int i = 0;
+ int j = 0;
+ long userID1 = prefs1.getUserID(0);
+ long userID2 = prefs2.getUserID(0);
+ while (true) {
+ if (userID1 < userID2) {
+ if (++i == size1) {
+ break;
+ }
+ userID1 = prefs1.getUserID(i);
+ } else if (userID1 > userID2) {
+ if (++j == size2) {
+ break;
+ }
+ userID2 = prefs2.getUserID(j);
+ } else {
+ count++;
+ if (++i == size1 || ++j == size2) {
+ break;
+ }
+ userID1 = prefs1.getUserID(i);
+ userID2 = prefs2.getUserID(j);
+ }
}
- users1.retainAll(users2);
- return users1.size();
+ return count;
}
@Override