1. A computer implemented method for compressing a language model of a continuous speech recognition system, wherein the language model is an N-gram including a plurality of arrays A&lsqb;.&rsqb;, each array A&lsqb;.&rsqb; including ordered positive integer values stored in a memory, the integers representing a vocabulary of the language mode, the compressing for each array A&lsqb;.&rsqb; comprising: defining an inverse array I&lsqb;.&rsqb; of the ordered array A&lsqb;.&rsqb; as I&lsqb;j&rsqb;&equals;inverse(A&lsqb;.&rsqb;)&equals;first(j&plus;k, A&lsqb;.&rsqb;): k&equals;arg min l (j&plus;l&egr;A&lsqb;.&rsqb;), l&gE;0, where a function first(j, A&lsqb;.&rsqb;) returns a location of a first instance of an jth entry in the array A&lsqb;.&rsqb;, and a function min l (j&plus;l&egr;A&lsqb;.&rsqb;) returns a smallest value l such that j&plus;l is an entry in the array A&lsqb;.&rsqb;; defining a kth split inverse I k &lsqb;.&rsqb;&equals;splitinverse k (A&lsqb;.&rsqb;) of the array A&lsqb;.&rsqb; as I k &lsqb;.&rsqb;&equals;inverse(A&lsqb;.&rsqb;>>k), where A&lsqb;.&rsqb;>>k is an array obtained by right-shifting each entry of the array A&lsqb;.&rsqb; by k bits; defining a kth split of the array A&lsqb;.&rsqb; as A k &lsqb;.&rsqb;&equals;A&lsqb;.&rsqb;&Mask&lsqb;k&rsqb;, where Mask 6 [ k ] = &Sum; j = 0 k - 1 &it; 2 k &CenterDot; A &af; [ &CenterDot; ] represents an array obtained by masking all but the last k bits of each of entry of the array A&lsqb;.&rsqb;; defining a null array A 0 &lsqb;.&rsqb; having the same length as the array A&lsqb;.&rsqb;, defining a function Size(A&lsqb;.&rsqb;) for returning a total number of bits required to store the array A&lsqb;.&rsqb; in a compressed form as Size(A&lsqb;.&rsqb;)&equals;length(A&lsqb;.&rsqb;)×width(A&lsqb;.&rsqb;), where width(A&lsqb;.&rsqb;)&equals;ceil(log 2 (max(A&lsqb;.&rsqb;))) is the number of bits required to store a largest integer value in the array A&lsqb;.&rsqb;; defining a function MinSize for determining a minimum number of bits required to store the array A&lsqb;.&rsqb; in terms of the split arrays and split inverse arrays by MinSize(A&lsqb;.&rsqb;)&equals;min k &lcub;Size(I k &lsqb;.&rsqb;)&plus;Size(A k &lsqb;.&rsqb;)&plus;C k &rcub;, where C k is overhead required to store pointers to the split arrays, length of the split arrays, and an indication that the array A&lsqb;.&rsqb; is stored in terms of the split arrays and the split inverse arrays; defining a function OptSize(.) for determining a size of the array A&lsqb;.&rsqb; in terms of the split arrays and the split inverse arrays as OptSize(A&lsqb;.&rsqb;)&equals;min k (OptSize(I k &lsqb;.&rsqb;)&plus;Size(A k &lsqb;.&rsqb;)&plus;C k &rcub;, wherein {circumflex over (k)} is an optimal value of k; determining an optimal size for the array A j &lsqb;.&rsqb; using the function OptSize; storing the array A j &lsqb;.&rsqb; if k j &equals;width(A j &lsqb;.&rsqb;), and otherwise separating the array A j &lsqb;.&rsqb; into the split inverse arrays I k j j and the split arrays A k j j, and storing the split arrays A k j j, and setting the array A j&plus;l &lsqb;.&rsqb; equal to the array I k j j, and repeating, beginning at the determining step, for j&equals;j&plus;1 to generate the arrays A k 0 0 &lsqb;.&rsqb;, A kl l &lsqb;.&rsqb;, A k 2 2 &lsqb;.&rsqb;,..., A kJ-l J-l &lsqb;.&rsqb;, and the array A J &lsqb;.&rsqb;, where J is the value of j upon completion.