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


Reply via email to