Computer science and software engineering courses generally include a core course on discrete data structures and algorithms to manipulate them. These courses, which are usually found in the second year with optional advanced courses in third and later years, aim to show students efficient ways to solve common problems. The discrete nature of the structures makes the visualization of the algorithms operating on them relatively easy to design: algorithm steps generally add or delete objects or rearrange an existing structure in some way.