StudySmarter: Study help & AI tools
4.5 • +22k Ratings
More than 22 Million Downloads
Free
|
|
Algorithms in Computer Science

Embark on a detailed study of algorithms - the defined sets of instructions crucial to solving problems and executing tasks in computer science. Uncover the synergy between data structures and algorithms, and understand their diverse types and significance. Venture deeper to discover how searching and sorting algorithms operate in unison, their vital functions, and their real-world applications. Designed to equip you with strategies for tackling algorithmic complexities, this comprehensive exploration is a factual guide ideal for students, technology enthusiasts, and professionals.

Mockup Schule Mockup Schule

Explore our app and discover over 50 million learning materials for free.

Algorithms in Computer Science

Want to get better grades?

Nope, I’m not ready yet

Get free, full access to:

  • Flashcards
  • Notes
  • Explanations
  • Study Planner
  • Textbook solutions
Illustration

Lerne mit deinen Freunden und bleibe auf dem richtigen Kurs mit deinen persönlichen Lernstatistiken

Jetzt kostenlos anmelden

Nie wieder prokastinieren mit unseren Lernerinnerungen.

Jetzt kostenlos anmelden
Illustration

Embark on a detailed study of algorithms - the defined sets of instructions crucial to solving problems and executing tasks in computer science. Uncover the synergy between data structures and algorithms, and understand their diverse types and significance. Venture deeper to discover how searching and sorting algorithms operate in unison, their vital functions, and their real-world applications. Designed to equip you with strategies for tackling algorithmic complexities, this comprehensive exploration is a factual guide ideal for students, technology enthusiasts, and professionals.

Algorithms in Computer Science: Definition

Algorithms can be seen as the backbone of computer science as they form the basis for creating efficient and effective software programs. They are a set of well-defined rules or instructions used to solve a specific problem. The study and knowledge of algorithms are crucial to anyone studying or working in the field of computer science.

Algorithm Meaning

In basic terms, an algorithm is a step-by-step method of solving a problem. It's a clear, concise, and effective set of instructions designed to perform a specific task or solve a specific problem.

An algorithm in Computer Science is a well-structured, unambiguous and step-by-step set of instructions used to solve a problem or achieve a certain objective.

Each algorithm is unique in the way it tackles a problem, taking into account factors like the problem size, resources, and efficiency, among others. While algorithms can be written in ordinary human language, in computer science, they are primarily written in programming languages, which computers can interpret and execute.

A fascinating aspect of algorithms is their versatility in solution strategies. They can be extremely simple, such as a recipe to bake a cake, or very complex, like the ones used in machine learning and data analysis.

Role of Algorithms in Computer Science

Algorithms play an indispensable part in computer science. They are the groundwork for any software program or function you use on your computer or smartphone.

  • Algorithms help to reduce the complexity of a problem by breaking it down into smaller, manageable sub-problems.
  • They are essential for data processing and ensuring efficient memory usage.
  • They ensue the security and protection of data, especially in areas like cryptography.
  • Algorithms are vital in data search for large databases, especially through the use of search algorithms.

For instance, when you type a question into a search engine, an algorithm processes your entry and delivers an answer. This algorithm analyses your query, compares it to its database of indexed websites, and then provides the most relevant results. This fast and accurate process would not be possible without efficient algorithms.

Examples of Classic Algorithms

Algorithms are countless and varied, designed to solve different types of problems. Here are some classic examples in the world of computer science.

AlgorithmApplication
Bubble SortUsed for sorting elements in a specific order (ascending or descending).
Binary SearchUsed for searching elements in a sorted list or array.
Dijkstra's AlgorithmUsed for finding the shortest path between nodes in a graph.
Euclidean AlgorithmUsed for finding the greatest common divisor (GCD) of two numbers.

These are just a few examples of how algorithms are an inherent part of computer science and the digital world you interact with daily. By understanding and learning about algorithms, you're equipping yourself with the essential tools to explore and thrive in the rapidly expanding field of computer science.

Introduction to Data Structures and Algorithms

In computer science, data structures and algorithms are critical elements that enable software applications to solve complex problems efficiently and effectively. When you're interacting with an application, whether it's a simple calculator or a complex social media app, data structures and algorithms are at work in the background, powering these applications to function optimally.

Data structures are a way of organising data in a computer so that it can be used efficiently, while an algorithm is a step-by-step procedure designed to perform specific operations. As a pair, data structures and algorithms are a fundamental aspect of computer science, facilitating efficient problem-solving strategies.

Importance of Data Structures in Algorithms

Data structures are crucial in the development and implementation of efficient algorithms. Algorithms utilise data structures to solve computational problems, and choosing the right data structure can mean the difference between a solution and an optimal solution. A well-chosen data structure can improve an algorithm's efficiency dramatically.

A Data Structure in Computer Science is a way of organising and storing data so that operations such as insertions, deletions, and searches can be done efficiently.

Data structures determine how data is collected, the functions to be performed on the data, and the type of resources to be used. The selection of a data structure directly impacts the efficiency of an algorithm, as it can determine its speed and memory usage. Different structures offer various advantages, and it's important to select the right one based on the specific needs of your algorithm.

For instance, an algorithm that needs to retrieve data often may benefit from using a Hash Table data structure, which allows for near-instantaneous data retrieval.

  • Data structures allow for efficient data manipulation.
  • They allow ease of computation, thus improving algorithm efficiency.
  • Appropriate data structures can reduce program complexity.
  • They allow for the handling of large amounts of data efficiently.

Remember that in the real world, data is typically large and complex, requiring an effective data structure to handle it. These complex scenarios make the choice of suitable data structures a critical skill in effectively developing and implementing algorithms.

Different Types of Data Structures and Their Algorithms

Data Structures are broadly classified into two types — Primitive and Non-Primitive. Primitive Data Structures include basic types like integer, float, and char, while Non-Primitive Data Structures include user-defined types like Array, Stack, Queue, List, and Tree.

Examples of Data Structures and Their Algorithms

Let's deep dive into some examples of non-primitive data structures and their associated algorithms which play a pivotal role in problem-solving in computer science.

Data StructureCommon Algorithms
ArraySearch, Sort, Insert, Update, Delete
StackPush, Pop, Peek/Top
QueueEnqueue, Dequeue, Front, Rear
TreePre-order, In-order, Post-order Traversal
GraphBreadth-First Search, Depth-First Search, Dijkstra

Think about managing a physical queue of people. In this case, you would use a Queue data structure. The associated algorithm would be to Enqueue (add) a person to the back of the line and Dequeue (remove) a person from the front of the line.

Each data structure has an associated set of algorithms that can be performed on it. The type of data structure influences the type of algorithm, whether it's inserting or deleting data, searching for a specific data item, or sorting data in a specific way.

This relationship between data structures and algorithms signifies the importance of understanding both components fully. They both play onto each other, and efficient use of them can result in highly optimal and scalable software systems.

Searching and Sorting Algorithms

In the realm of computer science, searching and sorting algorithms represent two essential types of problem-solving techniques. As the names suggest, searching algorithms are designed to find a particular item in a data structure, whereas sorting algorithms arrange elements in a specific order within a data structure. Both are invaluable tools in software applications, enabling efficient operations on data.

Essential Searching Algorithms in Computer Science

Searching algorithms are designed to retrieve information stored within a data structure, such as an array or a graph. The choice of searching algorithm often depends on the structure of your data and the nature of the query.

A Searching Algorithm is a method used to locate a specific item or a set of items in a data structure. This algorithm returns the position if the element is found; otherwise, it returns -1 or NULL.

There are primarily two types of searching algorithms: Sequential Search (or Linear Search) and Interval Search (or Binary Search).

  • Linear Search: A simple approach, this algorithm starts at the beginning of a list and checks every element until it finds the one it's looking for.
  • Binary Search: Only applicable to a sorted list or array, this algorithm divides the list into two halves and determines if the desired value is in the first half or second half. It continues halving until it locates the item.

In terms of complexity, Binary Search outperforms Linear Search as it has a logarithmic time complexity of \(O(\log(n))\) compared to the linear time complexity of \(O(n)\) for Linear Search.

However, Binary Search requires the list to be sorted, while Linear Search does not.

Search AlgorithmBest Case Time ComplexityWorst Case Time Complexity
Linear Search\(O(1)\)\(O(n)\)
Binary Search\(O(1)\)\(O(\log n)\)

If you're searching for a friend's number in a phonebook, instead of going through each name (Linear Search), you would typically start at the middle and decide whether to look in the first half or the second half based on where your friend's name lies alphabetically (Binary Search). This principle guides Binary Search Algorithms.

Other advanced searching algorithms such as Hashing or B-Tree Search come into play with larger and more complex data structures. These algorithms differ in specifics but always aim to optimise the search process, reducing the time it takes to find data elements.

Fundamental Sorting Algorithms You Should Know

In contrast to searching algorithms, sorting algorithms reorganise data in a particular format, often ordering the elements in ascending or descending order. The most suitable sorting algorithm depends on a mixture of elements, the structure of the data, and the system's memory.

A Sorting Algorithm is a method that rearranges elements in a list according to a certain order such as numerical or lexicographic.

Sorting algorithms are categorised as either comparison-based (such as Bubble Sort, Quick Sort, and Merge Sort) or non-comparison based (like Counting Sort or Radix Sort).

  • Bubble Sort: Repeatedly steps through the list, compares adjacent elements, and swaps them if they are in the wrong order.
  • Quick Sort: Divides the list based on a pivot element and sorts two reduced arrays independently.
  • Merge Sort: Divides the list into equal halves, sorts them, and then merges them.
  • Counting Sort: Assumes that the input elements are an integer array within a specific range and counts the occurrence of each number.
  • Radix Sort: Performs digit-by-digit sort starting from least significant digit to most significant digit.

Below is a comparison of the time complexities of these sorting algorithms.

Sorting AlgorithmBest Case Time ComplexityWorst Case Time Complexity
Bubble Sort\(O(n)\)\(O(n^2)\)
Quick Sort\(O(n \log n)\)\(O(n^2)\)
Merge Sort\(O(n \log n)\)\(O(n \log n)\)
Counting Sort\(O(n + k)\)\(O(n + k)\)
Radix Sort\(O(nk)\)\(O(nk)\)

Here, \(n\) is the number of elements to be sorted, \(k\) is the range of input elements in Counting Sort, and \(k\) is the number of digits in the maximum number in Radix Sort.

If you're sorting a pack of cards by their number, you could go through each card, find the smallest one, and place it at the beginning. You then go through the remaining cards, find the next smallest, and place it next to the first one. This process continues until all the cards have been sorted in ascending order. This principle guides the Selection Sort algorithm.

The efficiency and effectiveness of a sorting algorithm often come at a cost. For instance, while Quick Sort has an average time complexity of \(O(n \log n)\), making it one of the fastest sorting algorithms for medium-sized arrays, it degrades to \(O(n^2)\) for sorted arrays, which can be its Achilles' heel.

How Searching and Sorting Algorithms Work Together

As you delve deeper into the world of algorithms, you will come across scenarios where searching and sorting algorithms work in tandem to solve problems. Sorting algorithms can significantly improve the efficiency of searching operations, and understanding this interplay is crucial for solving complex problems in computer science.

A sorted dataset provides an advantage for certain search algorithms. A prime example is the Binary Search algorithm, whose precondition is a sorted data structure. As compared to a Linear Search, Binary Search can locate a desired value in a sorted array with a much faster logarithmic time complexity (compared to the linear time complexity of Linear Search), demonstrating the effectiveness of a combined Sorting and Searching strategy.

One popular algorithm that beautifully brings together searching and sorting is the Hash Sort. It uses a Hash function (a search-optimised function) to distribute elements across an array based on their key values. This method of sorting allows for quickly locating elements during a search due to the uniform distribution of data.

Remember, the selection of sorting and searching algorithms isn't an either/or proposition. They are tools in your computer science toolkit, and the best ones for the job depend on the specific problem at hand, the structure and volume of your data, and the resources available.

A practical application of the relationship between searching and sorting is the auto-complete feature of search engines. The list of predicted words are sorted in the dictionary and a quick search operation helps match the user's input with the closest predictions. This optimal coordination between searching and sorting algorithms provides you with a seamless user experience.

As with sorting algorithms, complexity plays a role in searching algorithms too.

For example, hashing, unlike simple search algorithms, provides constant time search for inserting data, deleting data and retrieving data, all of these operations in \( O(1) \) complexity. Such efficiency can be beneficial in managing large-scale databases.

In summary, sorting and searching algorithms, while impactful on their own, can also work synergistically to optimise problem-solving. Understanding both, their individual workings, and their combined applications can significantly enhance your problem-solving arsenal in computer science.

Practical Application of Algorithms

Algorithms are not only fundamental to software engineering and computer science. They also have extensive applications across various sectors in the real world, enabling us to find solutions to intricate problems and make optimal decisions. From seemingly mundane tasks to technologically advanced systems, algorithms play a significant role in our everyday life.

Real-World Algorithm Examples

Algorithms in day-to-day life often go unnoticed. However, you encounter them regularly — whether it's using a digital map to get from point A to B or looking for a book in a library. Let's examine some real-world examples, demonstrating how algorithms create efficiency in various sectors.

Digital Maps and Route Planning: Almost everyone uses digital maps for navigation nowadays. When you input your location and destination, the software uses algorithms to compute the shortest or fastest route. One of the famous algorithms used in this context is Dijkstra’s algorithm which finds the shortest path between two points on a graph.

Take a road trip for instance. If you're starting at point A and need to reach point B, your digital map utilises routing algorithms to offer several paths, considering factors like traffic, distance, and estimated travel time. The algorithm takes into account all of this real-time data to provide you with the optimal choice.

Search Engines: Search engines like Google use complex algorithms to deliver the most relevant results for your query. These algorithms involve multiple stages - crawling the web to discover pages, indexing those pages, and retrieving and ranking content that matches your query when you search.

PageRank, for example, is an algorithm used by Google Search to rank websites in its search engine results. It works by counting the number and quality of links to a page to estimate the importance of that website. The idea behind PageRank is that important links are likely to receive more links from other websites.

Online Shopping and Recommendations: Ever wondered how e-commerce platforms seem to know precisely what you may be interested in buying? They make use of recommendation algorithms. These algorithms analyse your browsing history, purchase history, and items in your cart or wish list to suggest products that you might want to purchase.

For instance, let's say you are browsing for a new phone on an e-commerce platform. While you're still deciding and checking out various models, the website starts displaying phone cases, screen guards, or even articles on 'top phones to buy'. These suggestions are driven by recommendation algorithms working behind the scenes, improving your shopping experience.

Medical Imaging: In the healthcare industry, image processing algorithms help analyse and interpret medical images like X-rays, MRIs, or CT scans. These advanced algorithms can detect anomalies in medical images that might be otherwise challenging to spot, assisting in accurate diagnosis.

Aside from these, there is a myriad of areas where algorithms are prevalent and actively used, including cryptography, weather prediction, airline reservations, social networking, and so much more. Every time you make a bank transaction, post a tweet, check the weather, or book a flight, know that there's an algorithm working behind the scenes, making these tasks seamless and efficient.

Exercises to Test Your Algorithm Knowledge

Understanding algorithms in theory is one thing, but it's through practice that you can really grasp and develop your algorithm skills. Here are some exercises to help you translate your theoretical understanding into practical knowledge.

  • Exercise 1: Write an algorithm to sort a list of numbers in ascending order. You could try implementing different sorting algorithms like Bubble Sort, Quick Sort, or Merge Sort.
  • Exercise 2: Create an algorithm to search for a specific element in a given list. Test both Linear Search and Binary Search algorithms.
  • Exercise 3: Design an algorithm to find the shortest path from one point to another on a grid or a map. You could employ Dijkstra's algorithm for this exercise.
  • Exercise 4: Come up with a simple recommendation algorithm. For example, given a list of books a user has read, recommend a book that they might like next.
  • Exercise 5: Write an algorithm that checks if a given string is a palindrome (a word, phrase, number, or other sequence of characters that reads the same forward and backwards, ignoring spaces, punctuation, and capitalization).

Working on these challenges will help reinforce your understanding of algorithms. You'll also learn how to approach different types of problems and develop suitable algorithms for them. Through exploring, studying, and practising algorithms, you're not just gaining practical skills but also adopting a problem-solving mindset - an invaluable asset in any field.

Remember, the more complex the problem, the more critical the algorithm. Learning to design effective and efficient algorithms equips you to deal with all kinds of complex problems, not just in computer science, but also in a broad array of other disciplines.

Advanced Study in Algorithms

Stepping into the advanced study of algorithms paves the way for you to solve complex problems with elegance and efficiency. The journey to mastering algorithms is not merely about mastering programming languages — it's also about developing problem-solving abilities, understanding computational complexity, and learning how to choose the right algorithm for the right problem.

Complexities and Challenges with Algorithms

As you delve deeper into the world of algorithms, you will undoubtedly encounter complexities and challenges. Understanding the nature of these challenges and how to navigate them is a central part of advanced algorithm study.

One of the primary complexities with algorithms lies in their time and space complexity. In computer science, algorithm analysis typically estimates the computational resources that an algorithm requires. Time complexity measures the time taken to execute each statement of a code in an algorithm, while space complexity measures the maximum space required by an algorithm for its operation.

In an ideal world, the best algorithm would have both minimal space and time complexity, but, in reality, there is usually a trade-off between them. Optimizing one of these complexities often leads to increased complexity in the other. Achieving the optimal balance is a typical challenge in algorithm design.

TerminologySymbolDescription
Constant Time Complexity\(O(1)\)The time complexity remains constant, irrespective of the input size.
Linear Time Complexity\(O(n)\)The time complexity grows linearly with the input size.
Quadratic Time Complexity\(O(n^2)\)The time complexity grows quadratically with the input size.
Logarithmic Time Complexity\(O(\log n)\)The time complexity grows logarithmically with the input size.

Another significant complexity is the adherence to the specific problem's constraints. Algorithms must operate within the given constraints of a problem statement, such as specified time limits or limited memory space. Understanding and working within these restraints is an integral part of the study of algorithms.

Errors in algorithms, often known as bugs, pose another challenge in the study and application of algorithms. Algorithm errors can cause an algorithm to produce incorrect or unexpected results, often requiring significant time to debug and fix.

Remember, with complexity comes the opportunity for learning and growth. Each challenge faced in algorithm development not only expands your knowledge but also develops your problem-solving abilities, a skill that is highly transferable across various areas and domains.

Ways for You to Improve Your Understanding of Algorithms

Improving your understanding of algorithms involves practical application, consistent practice, and ongoing learning. Here are key strategies to enhance your understanding and competence in algorithms:

  • Practice, Practice, Practice: Solving different problems using algorithms is the best way to improve. Websites like HackerRank, LeetCode, and CodeSignal provide countless problems for you to work on.
  • Understand Time and Space Complexity: Master the Big O notation for time and space complexity estimation. This understanding will allow you to analyse an algorithm's efficiency better.
  • Study Different Types of Algorithms: Explore different categories of algorithms such as search algorithms, sorting algorithms, divide and conquer algorithms, greedy algorithms, and dynamic programming algorithms. Understanding the logic behind each type helps you identify which one to apply in various scenarios.
  • Debugging: Practice debugging code and rectifying errors. Debugging is a great way to understand algorithms' inner workings, and it helps improve your problem-solving skills.
  • Code Reviews: Participate in or observe code reviews. This practice allows you to see different ways to tackle a problem, aids in learning best practices, and exposes you to various coding styles.

A good way to begin might be to take an unsorted list of integers and implement different sorting algorithms to arrange them in ascending order. You can start with simpler algorithms like the Bubble Sort and gradually move towards more complex ones like the Quick Sort or the Merge Sort. As you go along, understand the time and space complexity for each algorithm and why one might be favored over another in different scenarios.

Learning algorithms is a journey with no end destination. It's a field that continually evolves and expands. Thus, continuous learning, updating your knowledge, and regular practice are a must to remain competent and skilled in this area.

Beyond technical skills, improving your understanding of algorithms also enhances your logical thinking and problem-solving skills. It can be a challenging journey, but remember, each step you take to understand algorithms better equips you with invaluable skills, paving your way towards becoming a proficient computer scientist or software developer.

Algorithms - Key takeaways

  • An algorithm is a step-by-step procedure aimed at solving a problem or achieving an objective. In computer science, it's a well-structured, unambiguous set of instructions, written in a programming language that computers can interpret and execute.
  • Examples of algorithms include the Bubble Sort for sorting elements, Binary Search used in searching sorted lists or arrays, Dijkstra's Algorithm for finding the shortest paths in a graph, and the Euclidean Algorithm for finding the greatest common divisor (GCD) of two numbers.
  • Data structures have a critical role in developing efficient algorithms. The choice of data structure can significantly affect the efficiency and speed of an algorithm. Examples include Hash Table data structure for quick data retrieval.
  • Searching and sorting algorithms are essential problem-solving techniques in computer science. While searching algorithms locate a specific item in a data structure, sorting algorithms help arrange elements in a certain order.
  • Real-World Algorithm examples include:
    • Digital Maps and Route Planning: Use of algorithms like Dijkstra’s algorithm for the calculation of shortest or fastest routes.
    • Search Engines: Algorithms like PageRank perform crawling, indexing, retrieving and ranking to deliver relevant search results.
    • Online Shopping and Recommendations: Recommendation algorithms analyse user behaviour to suggest relevant products.
    • Medical Imaging: Image processing algorithms analyse and interpret medical images for accurate diagnosis.

Frequently Asked Questions about Algorithms in Computer Science

An algorithm is a step-by-step set of instructions or rules designed to accomplish a specific task or solve a particular problem. In computing terms, it's a procedure that a computer follows to transform input data into an output result. They play a crucial part in programming, machine learning, and data analysis. Efficiency is key; a good algorithm does the work quickly and with minimal resources.

An algorithm refers to a set of detailed, step-by-step instructions or rules designed to solve a specific problem or achieve a particular outcome. It's a procedure that a computer, or human, can follow to accomplish a task. Algorithms are a fundamental aspect of computer science, being key to processes such as sorting and searching. They are used in many aspects of computing, from data analysis to machine learning.

Two methods of representing algorithms are 'Flowcharts' and 'Pseudocode'. Flowcharts are graphical representations of algorithms that use symbols to denote different types of instructions. On the other hand, pseudocode is a method of writing down an algorithm in a format that resembles the structure of a high-level programming language, but is independent of any specific programming language.

Algorithms are used for performing calculations, data processing and automated reasoning tasks. They provide detailed instructions to complete particular tasks such as sorting data in a specific order, finding information or solving complex mathematical problems. In computer programming, they are used to create efficient and effective programs. Algorithms are also integral to areas such as science, engineering, and economics for modelling and solving problems.

Algorithms work by providing a set of step-by-step instructions or rules to be followed for solving a particular problem or accomplishing a task. They are designed to take in inputs, process them following precisely defined steps, and produce an output or result. These steps are executed in order, with the possibility of loop back or conditional branches depending upon the nature of the problem. The efficiency of an algorithm is often evaluated in terms of its time and space complexity.

Test your knowledge with multiple choice flashcards

What is an algorithm in computer science?

What roles do algorithms play in computer science?

What are some examples of classic algorithms and their applications?

Next

What is an algorithm in computer science?

An algorithm in computer science is a well-structured, unambiguous, and step-by-step set of instructions used to solve a problem or achieve a certain objective.

What roles do algorithms play in computer science?

Algorithms reduce problem complexity, enable efficient data processing and memory usage, ensure data security, and are crucial for data search in large databases.

What are some examples of classic algorithms and their applications?

Bubble Sort is for sorting elements, Binary Search is used in searching elements in a sorted list, Dijkstra's Algorithm finds the shortest path in a graph, and Euclidean Algorithm determines the greatest common divisor of two numbers.

What are data structures and algorithms in computer science?

Data structures are ways of organising and storing data in a computer for efficient use, while algorithms are step-by-step procedures designed to perform specific operations. Together, they are critical elements for problem-solving in computer science.

What is the significance of data structures in the development and implementation of algorithms?

Data structures are crucial in algorithms as they enable efficient data manipulation and computation. The choice of data structure can greatly affect an algorithm's efficiency in terms of speed and memory usage.

What are the broad classifications of data structures and some examples?

Data Structures are broadly classified into Primitive and Non-Primitive. Primitive types include integer, float, and char, while Non-Primitive types include user-defined types like Array, Stack, Queue, List, and Tree.

Join over 22 million students in learning with our StudySmarter App

The first learning app that truly has everything you need to ace your exams in one place

  • Flashcards & Quizzes
  • AI Study Assistant
  • Study Planner
  • Mock-Exams
  • Smart Note-Taking
Join over 22 million students in learning with our StudySmarter App Join over 22 million students in learning with our StudySmarter App

Sign up to highlight and take notes. It’s 100% free.

Start learning with StudySmarter, the only learning app you need.

Sign up now for free
Illustration

Entdecke Lernmaterial in der StudySmarter-App