[Mndiff-dev] [mndiff]: r41 - trunk/mnzip/mnzip.c
michael
subversion at mplayerhq.hu
Thu Jun 21 18:23:06 CEST 2007
Author: michael
Date: Thu Jun 21 18:23:05 2007
New Revision: 41
Log:
get rid of the bentley sedgewick bwt, this thing has a too creepy worst case behavior
even under #if 0 ;)
Modified:
trunk/mnzip/mnzip.c
Modified: trunk/mnzip/mnzip.c
==============================================================================
--- trunk/mnzip/mnzip.c (original)
+++ trunk/mnzip/mnzip.c Thu Jun 21 18:23:05 2007
@@ -268,53 +268,6 @@ static void qsort2(uint8_t **ptr, int *i
#define read(p) ((p)>=end ? (p)[in - end] : *(p))
-static void bssort(const uint8_t **p, int len, int skip, uint8_t *in, uint8_t *end){
- int pivot;
- int i=0;
- int j=0;
- int k=len-1;
-
- assert(len>1);
-
-retry:
- pivot= read(p[len>>1] + skip);
- for(i=0; i<len; i++)
- if(read(p[i]+skip) != pivot)
- break;
- if(i==len){
- skip++;
- goto retry;
- }
-
- i=0;
- while(j<=k){
- uint8_t *pj= p[j];
- int v= read(pj + skip);
- if(v == pivot)
- j++;
- else if(v<pivot){
- p[j]= p[i]; p[i]= pj;
- j++;
- i++;
- }else{
- p[j]= p[k]; p[k]= pj;
- do{
- k--;
- }while(read(p[k] + skip) > pivot);
- }
- }
- assert(i>=0);
- assert(i<=j);
- assert(j<=k+1);
- assert(k<=len-1);
- if(i>1)
- bssort(p , i , skip , in, end);
- if(j-i>1)
- bssort(p+i, j-i , skip+1, in, end);
- if(len-k>2)
- bssort(p+j, len-1-k, skip , in, end);
-}
-
static unsigned int bwt(uint8_t *out, uint8_t *in, unsigned int len){
unsigned int i, j, ret;
uint8_t **ptr = malloc(len*sizeof(uint8_t*));
@@ -361,7 +314,7 @@ static unsigned int bwt(uint8_t *out, ui
ptr[ histogram[ptr2[i][1]]++ ]= ptr2[i];
}
fprintf(stderr, "radix sort done\n");
-#if 1
+
idx2= malloc(len*sizeof(int));
for(i=len-1; (int)i>=0; i--){
if(ptr[last][1] != ptr[i][1] || ptr[last][2] != ptr[i][2] ||
@@ -444,17 +397,6 @@ fprintf(stderr, "idx init done\n");
out[idx[i]]= in[i];
}
ret= idx[0];
-#else
- for(i=1; i<len; i++){
- if(memcmp(ptr[last]+1, ptr[i]+1, RADIX_PASSES)){
- if(i-last>1)
- bssort(ptr + last, i-last, RADIX_PASSES+1, in, in+len);
- last= i;
- }
- }
- if(i-last>1)
- bssort(ptr + last, i-last, RADIX_PASSES+1, in, in+len);
-#endif
free(ptr);
free(ptr2);
More information about the Mndiff-dev
mailing list