public List<DoubleList<Split, Integer>> findConflictingSplitCounts( int threshold, boolean thresholdIsLength) { findGreedySplits(); List<DoubleList<Split, Integer>> results = new Vector<DoubleList<Split, Integer>>(greedySplits.size()); // could be more efficient by storing where the greedy splits appear in the sorted list. for (int i : greedySplitIndex) { String splitStr = sortedSplits.elementAt(i); Split split = splits.get(splitStr); if (!thresholdIsLength && counts.get(splitStr) < threshold) break; // ignore splits with frequency below threshold DoubleList<Split, Integer> splitList = new DoubleList<Split, Integer>(); splitList.add(split, counts.get(splitStr)); // Only check splits after this one in sorted list: ones before this one are guaranteed to be // compatible, else this split would not be in the greedy list. for (int j = i + 1; j < sortedSplits.size(); j++) { String otherSplitString = sortedSplits.elementAt(j); if (!thresholdIsLength && counts.get(otherSplitString) < threshold) break; // ignore conflicting splits with frequency below threshold Split otherSplit = splits.get(otherSplitString); if (!split.compatible(otherSplit)) { splitList.add(otherSplit, counts.get(otherSplitString)); } // if !compatible if (thresholdIsLength && splitList.size() == threshold) break; // have enough secondary splits now } // for otherSplit (j) results.add(splitList); } // for i over sortedSplits return results; }
/* * Does not recalculate if greedySplits are already cached. */ private void findGreedySplits() { if (greedySplits != null) return; sortSplits(); int nGreedySplits = idg.getIdCount() - 3; greedySplits = new Vector<Split>(nGreedySplits); greedySplitIndex = new Vector<Integer>(nGreedySplits); for (int i = 0; i < sortedSplits.size() && greedySplits.size() < nGreedySplits; i++) { String splitStr = sortedSplits.elementAt(i); Split split = splits.get(splitStr); if (split.compatible(greedySplits)) { greedySplits.add(split); greedySplitIndex.add(i); } } }
/* * Will redo the sort-by-frequency even if it has already been done. * Clears greedySplits. */ private void resortSplits() { sortedSplits = new Vector<String>(counts.size()); // to be sorted by frequency for (String splitStr : counts.keySet()) { sortedSplits.add(splitStr); } shuffler.shuffle(sortedSplits); Collections.sort(sortedSplits, frequencyComparator); greedySplits = null; greedySplitIndex = null; }