zation. While Huffman coding is ultimately optimal (overlooking overhead information), it is computationally intensive for large sources. Block codes have been shown in Chapter 9 to offer some simplification advantage by coding symbols into "super-symbol" groups, but with the drawback that the number of codewords rapidly becomes intractable with increasing group sizes, for basic considerations of memory space and read-write times. In the general situation, where the source characteristics are unknown, one must implement what is equivalently referred to as dynamic or adaptive or stream coding, which evokes the time-changing character of the codeword assignment according to the evolving source characteristics. The basic philosophy of dynamic coding is to devise an optimal code "on the fly" for any sequence of incoming symbols, while minimizing the number of operations required at each intermediate step. One does not need to know the distribution of the single symbols forming the sequence, or the length of the sequence to encode, which represents a significant advantage over static coding. The symbol alphabet and the distribution may also radically change from one input sequence to the next, and the code is able to dynamically adapt to this. Arithmetic coding, which is described in this section, represents an intermediate case where the code is dynamically configured from the source, but the resulting codeword dictionary is then kept for extensive use, just as in a static code. Two other approaches, referred to as adaptive Huffman coding, and Lempel-Ziv (LZ) coding, are truly dynamically adaptive coding algorithms. These are described in the following two sections. In arithmetic coding, it is assumed that both encoding and decoding machines have identical programs, which make it possible to compute the source's probability dis- tribution and associated joint probabilities of all orders (see further). A specificity of arithmetic coding is that a specific "end-of-sequence" symbol is always required, as I shall illustr