design algorithm