Non-Deterministic Algorithms