Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:怎么能快些?我写的求逆序数的函数是 n^2 的,总复杂度是 mn^2, 请教简单方法In Reply To:怎么能快些?我写的求逆序数的函数是 n^2 的,总复杂度是 mn^2, 请教简单方法 Posted by:sunmoonstar_love at 2005-08-07 16:03:10 通过使用修改后的归并排序算法,可以使算法复杂度降为nlgn,但是对于此题,最好不要用,我用的后果就是tle,在如此小的规模下,函数调用所花的时间占程序总执行时间的比例太大,得不偿失。 int Merge_Inversion(char * A,int p, int q, int r){ int result; int n1, n2; char L[50]; char R[50]; int i, j, k; result = 0; n1 = q - p + 1; n2 = r - q; for(i = 0; i < n1; i++){ L[i] = A[p + i]; } for(j = 0; j < n2; j++){ R[j] = A[q + j + 1]; } i = 0; j = 0; k = p; while(i < n1 && j < n2){ if((int)R[j] < (int)L[i]){ A[k++] = R[j++]; result = result + n1 - i; } else{ A[k++] = L[i++]; } } for(; i < n1; i++) A[k++] = L[i]; for(; j < n2; j++) A[k++] = R[j]; return result; } int Total_Inversion(char * A,int low,int high){ int mid, a, b, c; if(low == high) return 0; mid = (low + high) / 2; a = Total_Inversion(A, low, mid); b = Total_Inversion(A, mid + 1, high); c = Merge_Inversion(A, low, mid, high); return a + b + c; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator