Quasi-polynomial time algorithms