1. A method of programming a non-volatile memory device having an array of non-volatile memory cells arranged in rows and columns, the method comprising: evaluating write data to be written to a plurality of the non-volatile memory cells of a row to determine the number of cells that will be programmed to each of a plurality of bit states corresponding to the write data; selecting one of a plurality of sets of bit state assignments based on the evaluation, each of the bit states in the selected set of bit state assignments corresponding to a respective programming level; and programming the plurality of non-volatile memory cells using the selected set of bit state assignments.