Parallel and Distributed Computing Algorithms and Principles