/* $Id: mergeskipplusmerger.cc 2769 2008-02-05 18:06:19Z jiahengl $ Copyright (C) 2007 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); }; 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"<