KNOWLEDGE = {
    "big o": "Big O Notation describes the performance or complexity of an algorithm. O(1) is constant, O(log n) is logarithmic, O(n) is linear, O(n^2) is quadratic.",
    "binary search": "A search algorithm that finds the position of a target value within a sorted array. Complexity: O(log n).",
    "quicksort": "A divide-and-conquer algorithm. It picks an element as a pivot and partitions the given array around the picked pivot. Average Complexity: O(n log n).",
    "mergesort": "A divide-and-conquer algorithm that divides the input array into two halves, calls itself for the two halves, and then merges the two sorted halves. Complexity: O(n log n).",
    "hashing": "The process of mapping keys to values using a hash function, enabling O(1) average time complexity for lookups.",
    "recursion": "A method of solving a problem where the solution depends on solutions to smaller instances of the same problem.",
    "dynamic programming": "An algorithmic technique for solving an optimization problem by breaking it down into simpler subproblems and storing the results of each subproblem.",
    "bfs": "Breadth-First Search. An algorithm for traversing or searching tree or graph data structures. It starts at the tree root and explores all neighbor nodes at the present depth prior to moving on to the nodes at the next depth level.",
    "dfs": "Depth-First Search. An algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node and explores as far as possible along each branch before backtracking."
}