/* $Id: mergeskipplusmerger.h 4887 2009-12-16 22:01:55Z abehm $ Copyright (C) 2010 by The Regents of the University of California Redistribution of this file is permitted under the terms of the BSD license. Author: Jiaheng Lu Date: 01/17/2008 */ #ifndef _mergeskipplusmerger_h_ #define _mergeskipplusmerger_h_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "listmerger.h" #include "utilities.h" #include "heap.h" #include "showutil.h" /* MergeSkipPlus algorithm. Improve MergeSkip by avoid push and pop heap twice for some cases */ template > class MergeSkipPlusMerger : public ListsMerger, InvList> { public: void merge_Impl(const vector &arrays, const unsigned threshold, vector &results); string getName() { return "MergeSkipPlusMerger"; } }; template void MergeSkipPlusMerger:: merge_Impl(const vector &arrays, const unsigned threshold, vector &results) { const unsigned MAXUnsigned = ~0; unsigned numberOfInvertedList = arrays.size(); if (threshold>numberOfInvertedList) return; // no answer unsigned pointersIndex [numberOfInvertedList]; for(unsigned k=0;k 0 ) { vectorIndexContainer[containerSize++] = indexHeap[0]; heapDelete(dataHeap,indexHeap,sizeOfHeaps); }//end while //assert ( containerSize+interContainerSize+sizeOfHeaps == numberOfInvertedList); if (containerSize+interContainerSize >= threshold) // we got the result { results.push_back(minData); //cout<< "We get a result, rule ID is " << minData <<", count is " << containerSize < 0) { skipNodes(arrays,interContainer,interContainerSize, dataHeap[0],pointersIndex ); insertToHeaps(dataHeap,indexHeap, sizeOfHeaps, arrays,pointersIndex, interContainer,interContainerSize); }//end if //move records to new interContainer interContainerSize = 0; if (poppedMax == indexHeap[0]) { //cout<<"Move to inter container"<