mramine364

Burrows–Wheeler transform

Jun 28th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function bwt_encode(str){
  2.     let o=[], cs=str;
  3.     o.push({w: cs, i: 0});
  4.     for(let i=1; i<str.length; i++){
  5.         cs = cs.substring(1, cs.length)+cs[0];
  6.         o.push({w: cs, i: i});
  7.     }
  8.     let s=o.slice();
  9.     s.sort(function(a, b){  return (a.w<=b.w)?-1:1; });
  10.     let index=0, k, res="";
  11.     while( s[index].i!=1 ){ res+=s[index].w[s[index].w.length-1]; index++; }
  12.     k=index;
  13.     while( k<s.length ){ res+=s[k].w[s[k].w.length-1]; k++; }
  14.     return [res, index];
  15. }
  16.  
  17. function bwt_decode(encoded, index){
  18.     let o=[];
  19.     for(let k=0; k<encoded.length; k++){
  20.         o.push({c: encoded[k], i: k});
  21.     }
  22.     let s=o.slice();
  23.     mergeSort(s, function(a, b){
  24.         return (a.c<=b.c)?-1:1;
  25.     });
  26.     let k=0, res="";
  27.     while(k<encoded.length){
  28.         res+=o[index].c;
  29.         index=s[index].i;
  30.         k++;
  31.     }
  32.     return res;
  33. }
  34.  
  35.  
  36. function mergeSort(t, s, e, compare){
  37.     let st, en, comp;
  38.     if( arguments[2]==undefined ){
  39.         st=0; en=t.length-1;
  40.         comp=(arguments[1]==undefined)?function(a, b){  return a-b; }:s;
  41.     }else{
  42.         st=s; en=e;
  43.         comp=(arguments[3]==undefined)?function(a, b){  return a-b; }:compare;
  44.     }  
  45.     _mergeSort(t, st, en, comp);
  46. }
  47.  
  48. function _mergeSort(t, s, e, compare){
  49.     if( s>=e )
  50.         return;
  51.     var isSorted , k=s;
  52.     while( k<e && compare(t[k], t[k+1])==-1/*t[k]<t[k+1]*/ ) k++;
  53.     isSorted = k==e;
  54.     if( !isSorted ){
  55.         var se = Math.floor((s+e)/2);
  56.         _mergeSort(t, s, se, compare);
  57.         _mergeSort(t, se+1, e, compare);
  58.         var c = [], i=s, j=se+1;
  59.         while( i<=se && j<=e ){
  60.             if( compare(t[i], t[j])==-1 ){ c.push(t[i]); i++;
  61.             }else{ c.push(t[j]); j++; }
  62.         }
  63.         while( i<=se ){ c.push(t[i]); i++; }
  64.         while( j<=e ){ c.push(t[j]); j++; }
  65.         j=0;
  66.         for(i=s;i<=e;i++){ t[i] = c[j]; j++; }
  67.     }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment