Skip to main content

Solving Problems Guide

Problem Solving Workflow descriptions

  1. Start with the problem statement:

    • Understand the problem requirements and constraints.
    • Identify the input and output expectations.
    • Brainstorm edge cases.
    • Determine input validation.
    • Consider error handling.
    • Note performance requirements.
    • Note any specific algorithms or techniques required.
    • Identify any external dependencies.
    • Consider scalability and extensibility.
  2. Assess the problem characteristics:

    • Determine if the problem involves sorting, searching, graph traversal, optimization, etc.
    • Consider if the problem involves any specific data structures.
    • Mathematical calculations or formulas.
    • Strings or text manipulation.
    • Arrays or collections of data.
    • Dates, times, or time-related operations.
    • Input/output operations or interacting with external systems.
    • Graphs, trees, or other specialized data structures.
    • Searching or matching patterns within data.
    • Optimizing performance or minimizing resource usage.
    • Modeling real-world scenarios or simulations
  3. Analyze the input size and efficiency requirements:

    • Determine the expected input size (e.g., small, moderate, large).
    • Evaluate the time and space complexity constraints.
    • Acceptable time complexity of the solution
    • Space complexity requirements in terms of memory usage.
    • Trade-offs between time and space complexity.
    • Upper limits of the expected input size.
    • Scalability requirements in terms of input growth over time.
    • response time or execution speed for the given input size
    • available computational resources and memory constraints.
    • requires an optimal or near-optimal solution
    • constraints related to real-time processing or responsiveness.
  4. Consider known algorithmic patterns:

    • Reflect on algorithms commonly used for similar problem domains.
    • Review familiar algorithmic techniques and patterns.
    • Sorting, such as Bubble Sort, Selection Sort, Insertion Sort, Merge Sort, Quick Sort, or Heap Sort.
    • Searching, such as Linear Search, Binary Search, or Hashing.
    • Graph algorithms like Breadth-First Search (BFS) or Depth-First Search (DFS).
    • Graph problems, such as Dijkstra's algorithm or the Floyd-Warshall algorithm.
    • Tree algorithms, including Binary Search Trees (BSTs), AVL Trees, Red-Black Trees, or Trie Trees.
    • Dynamic programming problems, such as the Knapsack problem or Longest Common Subsequence.
    • Pattern matching algorithms like the Rabin-Karp algorithm or the Knuth-Morris-Pratt algorithm.
    • Network flow problems, such as the Ford-Fulkerson algorithm or the Edmonds-Karp algorithm.
    • Optimization problems, such as the Greedy algorithm or the Simulated Annealing algorithm.
    • Greedy algorithms: Consider algorithms like Kruskal's algorithm, Prim's algorithm, or the Coin Change problem.
    • Backtracking algorithms: Look into algorithms like N-Queens, Sudoku Solver, or Subset Sum.
  5. Evaluate algorithm options:

    • Research and study different algorithms applicable to the problem.
    • Examine their time complexity, space complexity, and suitability.
  6. Consider trade-offs:

    • Assess trade-offs between time and space complexity.
    • Evaluate whether the problem prioritizes efficiency or simplicity.
  7. Experiment and benchmark:

    • Implement and test different algorithms on representative input data.
    • Measure their performance (execution time, memory usage).
    • Create sample input data
    • Implement different algorithms
    • Develop a benchmarking framework
    • Varying input sizes
    • Execution time
    • Measure memory usage
    • Repeat experiments multiple times
    • Analyze and compare results
    • Consider trade-offs
    • Validate results with different inputs
    • Document and report findings
  8. Analyze and refine:

    • Evaluate the experimental results and compare algorithm performance.
    • Refine your understanding of the problem and adjust the algorithm selection if necessary.
  9. Iterate and seek feedback:

    • Iterate on your algorithm selection if initial results are unsatisfactory.
    • Seek feedback from peers, mentors, or programming communities.

Functiona name examples

  1. Be descriptive
  2. Use verbs for actions
  3. Follow a consistent style
  4. Avoid unnecessary abbreviations
  5. Be concise but not overly terse
  6. Use domain-specific terminology
  7. Consider function scope and context
  8. Avoid misleading names
  9. Review and iterate
  • calculateTotal
  • validateInput
  • fetchUserData
  • generateReport
  • sortArray
  • filterItems
  • convertToCSV
  • sendEmail
  • loadImage
  • loginUser
  • createAccount
  • updateProfile
  • deleteItem
  • searchDatabase
  • formatString
  • encryptData
  • validateForm
  • initializeApp
  • handleEvent
  • renderChart