Algorithms
Undergraduate course, University of Giresun, Department of Computer Engineering, 2024
An algorithm is a set of well-defined instructions for carrying out a particular task. Think of it as a recipe in a cookbook that guides you step by step to make a delicious dish. In the world of computing, algorithms are the backbone that powers programs and applications. They are logical sequences that tell a computer exactly what steps to take to solve a problem or achieve a goal. From simple tasks like sorting a list of numbers to complex operations like image processing or running search engines, algorithms are everywhere.
- Ders Öğretim Planı [pdf]
Announcements:
The resources:
- Visual Algo [website]
- Visual Algo Code [github]
- Algoanim [website]
- Yong Danielli [website]
- USFCA [website]
- Anim IDE [website]
- DSALGO Visualizer [website]
- The Algorithms Github project [website]
Past Exams:
Chapter 1: Introduction to Algorithms
Algorithms are the step-by-step procedures that form the core of computer science, guiding computers through the maze of processing data. They are like the DNA of software, encoding the essence of problem-solving. Complexity, on the other hand, measures how an algorithm’s resource needs (like time and storage) grow as the input size increases. It’s a way to rate the efficiency of an algorithm, ensuring it can handle large amounts of data without breaking a sweat.
- Sunum-Giriş [pdf]
- Sunum-Karmaşıklık [pdf]
Run time analysis [click]
- Lecture Notes [pdf]
- Code Examples [link]
Chapter 2: Sorting Algorithms
Sorting algorithms are the architects of order, meticulously organizing data into a specific sequence, such as ascending or descending. They are fundamental tools in computer science, used to manage and retrieve data with efficiency and precision. There’s a variety of sorting methods, each with its own strategy and performance nuances.
Chapter 3: Searching Algorithms
Searching algorithms are the detectives of the data world, designed to track down information with speed and accuracy. They are used in a wide variety of applications, such as finding a file on a computer, a customer in a database, and a word in a document. They come in various forms, each suited to different scenarios.
Chapter 4: Graph Algorithms
Graphs, composed of nodes and edges, are ubiquitous in various domains, including social networks, transportation systems, and computational biology. Graph algorithms are the masterminds behind the scenes of network analysis, adept at solving puzzles that involve points and connections. They help us navigate through complex networks, from social media graphs to city maps. Graph algorithms enable us to explore, analyze, and manipulate these complex structures efficiently.
- Sunum-Çizge Gezinme [pdf]
- BFS DFS [click]
- Sunum-Çizge En Kısa Yol [pdf]
- Sunum-Çizge Minimum Kapsayan [pdf]
Sunum-Çizge Ağ Akış [pdf]
- Lecture Notes [pdf]
- Code Examples [link]
Chapter 5: String Algorithms
Have you ever wondered how your computer or smartphone handles text so efficiently? String algorithms are the craftsmen of text processing, weaving through characters to perform tasks like searching, sorting, and editing text. They are crucial in fields like computational biology for DNA sequencing, in search engines for matching queries, or even in text editors for find-and-replace functions.
- Sunum-Dizgi Eşleme [pdf]
- Sunum-Dizgi Sıkıştırma [pdf]
- Sunum-Dizgi Sıralama [pdf]
- Sunum-Dizgi Ayrıştırma [pdf]
- Sunum-Dizgi Düzenleme [pdf]
- Sunum-Dizgi Dönüştürme [pdf]
- Lecture Notes [pdf]
- Code Examples [link]
Chapter 6: Dynamic Programming
Dynamic programming is a powerful technique for solving optimization problems by breaking them down into smaller subproblems. At its core, dynamic programming involves breaking down daunting tasks into smaller, more manageable subproblems, allowing us to systematically find optimal solutions.
Chapter 7: Approximation algorithms
Approximation algorithms are a type of algorithm that provides a solution to a problem that is not necessarily optimal, but is guaranteed to be within a certain factor of the optimal solution. Approximation algorithms are often used to solve problems that are NP-hard, which means that there is no known polynomial-time algorithm that can find the optimal solution.
Chapter 8: Randomized algorithms
Randomized algorithms are a type of algorithm that uses randomness to improve its performance. Randomized algorithms are often used to solve problems that are difficult or impossible to solve using deterministic algorithms.
Chapter 9: Online algorithms
Online algorithms are a type of algorithm that makes decisions without knowing the complete input. Online algorithms are often used to solve problems in real time, where the input is not known in advance.
Chapter 10: Parallel algorithms
Parallel algorithms are a type of algorithm that can be executed on multiple processors or cores simultaneously. Parallel algorithms are often used to solve problems that are too large or too complex to be solved on a single processor.
Chapter 11: Divide-and-Conquer paradigm
The divide-and-conquer paradigm is an algorithmic design paradigm that breaks down a problem into smaller subproblems of the same or related type, until these become simple enough to be solved directly. The solutions to the sub-problems are then combined to give a solution to the original problem.
Chapter 12: Greedy algorithms
Greedy algorithms are a type of algorithm that makes decisions at each step based on the current state of the problem. Greedy algorithms are often used to solve problems that can be broken down into a sequence of decisions.
Chapter 13: Backtracking algorithms
Backtracking algorithms are a type of algorithm that solves problems by exploring all possible solutions and backtracking when a solution is found to be invalid. Backtracking algorithms are often used to solve problems that can be broken down into a tree of possible solutions.
Chapter 14: Branch-and-Bound algorithms
Branch and bound algorithms are a type of algorithm that solves optimization problems by breaking them down into smaller subproblems and using a bounding function to eliminate subproblems that cannot contain the optimal solution. It is an algorithm design paradigm for discrete and combinatorial optimization problems, as well as mathematical optimization.