Further optimization of co-occurrence matrix construction

Use a vector of unordered maps to represent the matrix. Use single 
instead of double precision for this representation to save memory.
This results in lower memory usage and around a 50% speedup.