Combinatorial And Algebraic Coding Techniques For Flash Memory Storage