Top N 怎么办

    技术2022-05-20  54

    海量数据,取出TopN个数据,正常来说,先排一下序比较好,然后取出前N个即可。

     

    可是有时候,N非常小,也就是说,从时间复杂度上来看,N*n < n*logn 了,这个时候,可以遍历一次,每次替换掉结果数组中最小的值,组成的序列就是需要的TopN。

     

    算是一种特殊情况下的效率提升。

     

    //DATASIZE 非常大才好 // int main(int argc, char** argv) { Tuple tuple[TOPN]; memset(tuple, 0, TOPN*sizeof(Tuple)); long long int total = 0; int *data = new int[DATASIZE]; srand(time(NULL)); //造数据 for (int i=0; i<DATASIZE;++i) { data[i] = rand()*rand()%MAX_DATA; //printf("data[i] is %d/n", data[i]); } clock_t start = clock(); for (int i=0; i<DATASIZE; ++i) { int idx = getMinTupleIdx(tuple, TOPN); if (tuple[idx].measure < data[i]) { tuple[idx].id = i; tuple[idx].measure = data[i]; } total += data[i]; } sortTuple(tuple, TOPN); clock_t end = clock(); for (int i=0; i<TOPN; ++i) { printf("id: %d, measure: %d/n", tuple[i].id, tuple[i].measure); } printf("total count is %lld/n", total); printf("finished in %1.2f seconds/n", (float)(end-start)/(float)1000); delete [] data; getchar(); return 0; } 


    最新回复(0)