{"id":25253209,"url":"https://github.com/anmamun0/dsa-algo-workbook","last_synced_at":"2025-04-05T22:33:06.128Z","repository":{"id":255413966,"uuid":"849539668","full_name":"anmamun0/dsa-algo-workbook","owner":"anmamun0","description":"DSA with C++: A collection of data structures and algorithms in C++ for learning and mastering core DSA concepts.","archived":false,"fork":false,"pushed_at":"2025-03-17T16:52:52.000Z","size":39280,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-17T17:25:07.270Z","etag":null,"topics":["algorithms","c","cpp","dsa"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anmamun0.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-29T19:16:37.000Z","updated_at":"2025-03-17T16:52:56.000Z","dependencies_parsed_at":"2025-02-12T04:40:21.621Z","dependency_job_id":null,"html_url":"https://github.com/anmamun0/dsa-algo-workbook","commit_stats":null,"previous_names":["anmamun0/dsa_with_cpp","anmamun0/dsa-algo-workbook"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anmamun0%2Fdsa-algo-workbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anmamun0%2Fdsa-algo-workbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anmamun0%2Fdsa-algo-workbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anmamun0%2Fdsa-algo-workbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anmamun0","download_url":"https://codeload.github.com/anmamun0/dsa-algo-workbook/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247411265,"owners_count":20934650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithms","c","cpp","dsa"],"created_at":"2025-02-12T04:29:10.327Z","updated_at":"2025-04-05T22:33:06.122Z","avatar_url":"https://github.com/anmamun0.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg height=\"150\" src=\"https://www.tutorialspoint.com/data_structures_algorithms/images/linear_search.gif\"  /\u003e\n\u003c/div\u003e\n\n###\n\n\u003ch1 align=\"center\"\u003eC  C++ DSA  Algorithms\u003c/h1\u003e\n \n###\n\n**Algorithm Complexities - Notes**\n\n## **Algorithm Complexity Table**\n\u003ch6\u003e \n  \n| **Algorithm Type** | **Algorithm**       | **Best Case** | **Average Case** | **Worst Case** | **Space Complexity** |\n|--------------------|---------------------|--------------|----------------|--------------|----------------|\n| **Searching**      | Linear Search       | O(1)         | O(n)           | O(n)         | O(1)           |\n|                    | Binary Search       | O(1)         | O(log n)       | O(log n)     | O(1)           |\n| **Sorting**        | Bubble Sort         | O(n)         | O(n²)          | O(n²)        | O(1)           |\n|                    | Selection Sort      | O(n²)        | O(n²)          | O(n²)        | O(1)           |\n|                    | Insertion Sort      | O(n)         | O(n²)          | O(n²)        | O(1)           |\n|                    | Merge Sort          | O(n log n)   | O(n log n)     | O(n log n)   | O(n)           |\n|                    | Quick Sort          | O(n log n)   | O(n log n)     | O(n²)        | O(log n)       |\n|                    | Heap Sort           | O(n log n)   | O(n log n)     | O(n log n)   | O(1)           |\n|                    | Counting Sort       | O(n + k)     | O(n + k)       | O(n + k)     | O(k)           |\n|                    | Radix Sort          | O(nk)        | O(nk)          | O(nk)        | O(n + k)       |\n|                    | Bucket Sort         | O(n + k)     | O(n + k)       | O(n²)        | O(n)           |\n| **Graph**          | BFS (Adj. List)     | O(V + E)     | O(V + E)       | O(V + E)     | O(V)           |\n|                    | DFS (Adj. List)     | O(V + E)     | O(V + E)       | O(V + E)     | O(V)           |\n|                    | Dijkstra (Heap)     | O((V + E) log V) | O((V + E) log V) | O((V + E) log V) | O(V + E)       |\n|                    | Bellman-Ford        | O(VE)        | O(VE)          | O(VE)        | O(V)           |\n|                    | Floyd-Warshall      | O(n³)        | O(n³)          | O(n³)        | O(n²)          |\n|                    | Kruskal’s Algorithm | O(E log E)   | O(E log E)     | O(E log E)   | O(E + V)       |\n|                    | Prim’s Algorithm    | O((V + E) log V) | O((V + E) log V) | O((V + E) log V) | O(V²) or O(E + V) with heap |\n\n\u003c/h6\u003e\n\n\n---\n\n### **Conclusion**\nUnderstanding time and space complexity is crucial for optimizing algorithms. Always consider the input size and constraints to choose the most efficient algorithm. \n\nLet me know if you need any modifications or explanations! 🚀\n\n\n## Algorithm and Data Structure (DSA) - Study Guide\n\n\u003ch6\u003e \n\n## Content\n1. [অ্যালগরিদম বিশ্লেষণ](#অ্যালগরিদম-বিশ্লেষণ-algorithm-analysis)\n2. [সার্চিং অ্যালগরিদম](#সার্চিং-অ্যালগরিদম-searching-algorithms)\n3. [সর্টিং অ্যালগরিদম](#সর্টিং-অ্যালগরিদম-sorting-algorithms)\n4. [গ্রাফ অ্যালগরিদম](#গ্রাফ-অ্যালগরিদম-graph-algorithms)\n5. [গ্রিডি অ্যালগরিদম](#গ্রিডি-অ্যালগরিদম-greedy-algorithms)\n6. [ডায়নামিক প্রোগ্রামিং](#ডায়নামিক-প্রোগ্রামিং-dynamic-programming)\n7. [ডিভাইড অ্যান্ড কনকোয়ার](#ডিভাইড-অ্যান্ড-কনকোয়ার-divide-and-conquer)\n8. [ব্যাকট্র্যাকিং](#ব্যাকট্র্যাকিং-backtracking)\n9. [বিট ম্যানিপুলেশন](#বিট-ম্যানিপুলেশন-bit-manipulation)\n10. [উন্নত ডাটা স্ট্রাকচার](#উন্নত-ডাটা-স্ট্রাকচার-advanced-data-structures)\n11. [স্ট্রিং অ্যালগরিদম](#স্ট্রিং-অ্যালগরিদম-string-algorithms)\n12. [কম্পিউটেশনাল জিওমেট্রি](#কম্পিউটেশনাল-জিওমেট্রি-computational-geometry)\n\n\u003c/h6\u003e\n---\n\n### অ্যালগরিদম বিশ্লেষণ (Algorithm Analysis)\n\n- **টাইম কমপ্লেক্সিটি**: অ্যালগরিদমের রান টাইম নির্ধারণ করার জন্য ব্যবহৃত হয়। এটি **Big-O**, **Big-Ω**, এবং **Big-Θ** দ্বারা প্রকাশ করা হয়।\n- **স্পেস কমপ্লেক্সিটি**: মেমোরি ব্যবহারের পরিমাণ বোঝায়।\n- **বেস্ট, এভারেজ**, ওয়ার্স্ট কেস: ইনপুট ভেদে অ্যালগরিদমের পারফরমেন্স কেমন হবে তা বিশ্লেষণ করা হয়।\n- **Amortized Analysis**: কিছু অপারেশনের গড় কমপ্লেক্সিটি নির্ধারণ করা।\n\n---\n\n### সার্চিং অ্যালগরিদম (Searching Algorithms)\n\n- **Linear Search**: ***`O(n)`*** – একটি এলিমেন্ট খোঁজার জন্য পুরো লিস্টের প্রতিটি আইটেম পরীক্ষা করা হয়।\n- **Binary Search**: ***`O(log n)`*** – ইনপুট লিস্ট যদি সর্টেড থাকে তবে বাইনারি সার্চ এলিমেন্ট খোঁজার জন্য দ্রুততর পদ্ধতি।\n- **Ternary Search**: ***`O(log n)`*** – তিন ভাগে ভাগ করে অনুসন্ধান করা হয়।\n- **Interpolation Search**: ***`O(log log n)`*** – Binary Search এর উন্নত সংস্করণ।\n- **Exponential Search**: ***`O(log n)`*** – এলিমেন্টের অবস্থান অজানা হলে এটি ব্যবহার হয়।\n\n---\n\n### সর্টিং অ্যালগরিদম (Sorting Algorithms)\n\n- **Bubble Sort**: ***`O(n^2)`*** – একের পর এক সন্নিবেশিত উপাদানগুলো তুলনা করে সর্ট করা হয়।\n- **Selection Sort**: ***`O(n^2)`*** – একটি ছোটতম উপাদানকে নির্বাচন করে সেটি সঠিক স্থানে রাখার পদ্ধতি।\n- **Insertion Sort**: ***`O(n^2)`*** – এলিমেন্টগুলিকে একটি একটি করে ইনসার্ট করে ইনপুট অ্যারে সর্ট করা হয়।\n- **Merge Sort**: ***`O(n log n)`*** – বিভাজন এবং জয়েনিং পদ্ধতি ব্যবহার করে এলিমেন্ট সাজানো হয়।\n- **Quick Sort**: ***`O(n log n)`*** – পিভট এলিমেন্ট ব্যবহার করে দ্রুত সর্টিং পদ্ধতি।\n- **Heap Sort**: ***`O(n log n)`*** – একটি হিপ ডাটা স্ট্রাকচার ব্যবহার করে এলিমেন্ট সর্ট করা হয়।\n\n---\n\n### গ্রাফ অ্যালগরিদম (Graph Algorithms)\n\n- **DFS (Depth First Search)**: একটি গ্রাফের মধ্যে গভীরতার ভিত্তিতে অনুসন্ধান করা হয়।\n- **BFS (Breadth First Search)**: একটি গ্রাফের মধ্যে প্রস্থের ভিত্তিতে অনুসন্ধান করা হয়।\n- **Dijkstra's Algorithm**: সর্বনিম্ন দূরত্বের পথে যাওয়ার জন্য ব্যবহৃত অ্যালগরিদম।\n- **Bellman-Ford Algorithm**: নেতিবাচক ওয়েট সহ সর্বনিম্ন পথ নির্ধারণের জন্য ব্যবহৃত হয়।\n- **Floyd-Warshall Algorithm**: সমস্ত দম্পতি নোডের মধ্যে সর্বনিম্ন পথ খোঁজার জন্য ব্যবহৃত হয়।\n\n---\n\n### গ্রিডি অ্যালগরিদম (Greedy Algorithms)\n\n- **Activity Selection Problem**: নির্বাচিত কর্মকাণ্ডের জন্য সর্বাধিক সময়ে কাজে লাগানোর কৌশল।\n- **Huffman Coding**: ডাটা সংকোচন পদ্ধতি যেখানে হাফম্যান ট্রি ব্যবহার করা হয়।\n- **Fractional Knapsack**: পণ্যের ভর অনুযায়ী সর্বাধিক লাভ অর্জন করতে গ্রিডি পদ্ধতি ব্যবহৃত হয়।\n- **Prim's Algorithm**: মিনিমাম স্প্যানিং ট্রি তৈরি করার জন্য ব্যবহৃত।\n\n---\n\n### ডায়নামিক প্রোগ্রামিং (Dynamic Programming)\n\n- **Fibonacci Sequence**: **O(n)** সময়ের মধ্যে ফিবোনাচ্চি সিরিজ বের করা।\n- **Knapsack Problem**: একটি বস্তু নির্বাচন করার জন্য সর্বাধিক মূল্য নির্ধারণ করতে ব্যবহৃত হয়।\n- **Longest Common Subsequence**: দুটি স্ট্রিংয়ের মধ্যে সবচেয়ে বড় সাধারণ সাবসিকোয়েন্স নির্ধারণ করা।\n- **Longest Increasing Subsequence**: একধাপ বাড়ানো উপাদানগুলোর মধ্যে সবচেয়ে বড় উপসেট বের করা।\n\n---\n\n### ডিভাইড অ্যান্ড কনকোয়ার (Divide and Conquer)\n\n- **Merge Sort**: উপরের মতো, ডিভাইড অ্যান্ড কনকোয়ার পদ্ধতি ব্যবহার করে সর্টিং অ্যালগরিদম।\n- **Quick Sort**: ইনপুট ডাটা ভাগ করে দ্রুত সর্টিং করার জন্য ব্যবহৃত।\n- **Binary Search**: ইনপুট ডাটা ভাগ করে দ্রুত অনুসন্ধান করা হয়।\n\n---\n\n### ব্যাকট্র্যাকিং (Backtracking)\n\n- **N-Queens Problem**: একটি এন-কুয়িন্সের সমস্যা সমাধান করা যেখানে কুইনদের পরস্পরকে আক্রমণ না করে বসানো হয়।\n- **Subset Sum Problem**: একটি সাবসেট খোঁজা যা একটি নির্দিষ্ট সংখ্যা যোগফল তৈরি করে।\n- **Sudoku Solver**: একটি সুদোকু সমস্যা সমাধান করা।\n\n---\n\n### বিট ম্যানিপুলেশন (Bit Manipulation)\n\n- **Bitwise AND, OR, XOR**: বিটওয়াইজ অপারেশন করার পদ্ধতি।\n- **Checking if a number is power of 2**: একটি সংখ্যা ২ এর শক্তি কিনা তা চেক করা।\n- **Counting set bits**: একটি সংখ্যার সেট বিট গণনা করা।\n\n---\n\n### উন্নত ডাটা স্ট্রাকচার (Advanced Data Structures)\n\n- **Trie**: একটি ট্রি ডাটা স্ট্রাকচার যা স্ট্রিং অনুসন্ধানে ব্যবহৃত হয়।\n- **Segment Tree**: একটি অ্যারে পরিসরের জন্য দ্রুত কুইরি এবং আপডেট অপারেশন করার জন্য ব্যবহৃত হয়।\n- **Fenwick Tree (Binary Indexed Tree)**: একটি ডাটা স্ট্রাকচার যা কুইরি ও আপডেট অপারেশন কার্যকরভাবে সম্পাদন করতে ব্যবহৃত হয়।\n- **Disjoint Set (Union-Find)**: একটি ডাটা স্ট্রাকচার যা উপাদানগুলোকে সমিতি বা ক্লাসে ভাগ করতে ব্যবহৃত হয়।\n\n---\n\n### স্ট্রিং অ্যালগরিদম (String Algorithms)\n\n- **Naive Pattern Searching**: একটি স্ট্রিংয়ের মধ্যে প্যাটার্ন খোঁজার সাধারণ পদ্ধতি।\n- **KMP (Knuth-Morris-Pratt)**: দ্রুত প্যাটার্ন অনুসন্ধানের জন্য একটি উন্নত পদ্ধতি।\n- **Rabin-Karp**: হ্যাশিং ব্যবহার করে স্ট্রিং প্যাটার্ন অনুসন্ধান করা।\n- **Z Algorithm**: স্ট্রিং প্যাটার্ন খোঁজার জন্য একটি শক্তিশালী অ্যালগরিদম।\n\n---\n\n### কম্পিউটেশনাল জিওমেট্রি (Computational Geometry)\n\n- **Convex Hull**: একটি সন্নিবেশিত পয়েন্টসের মধ্যে সর্বনিম্ন আকারের বাউন্ডিং হাল্ল তৈরি করা।\n- **Line Intersection**: দুটি লাইন একে অপরকে ছেদ করে কিনা তা যাচাই করা।\n- **Point in Polygon**: একটি পয়েন্ট একটি বহুপদী (polygon) এর মধ্যে অবস্থিত কিনা তা পরীক্ষা করা।\n\n---\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Here's a detailed explanation of the Data Structures and Algorithms (DSA) topics in C++ with examples and explanations in Bangla:\n\n### 1. বেসিক ডাটা স্ট্রাকচার (Basic Data Structures)\n#### Array (এরে):\nArray হল একটি নির্দিষ্ট আকারের ডাটা স্ট্রাকচার যেখানে একসাথে একাধিক ডাটা স্টোর করা যায়।\n\n```cpp\n#include \u003ciostream\u003e\nusing namespace std;\n\nint main() {\n    int arr[] = {1, 2, 3, 4, 5};  // Array Declaration\n    cout \u003c\u003c \"Array Element at index 0: \" \u003c\u003c arr[0] \u003c\u003c endl;\n    return 0;\n}\n\n```\n\n###### ব্যাখ্যা: এখানে, একটি অ্যারে arr[] তৈরি করা হয়েছে যা 5টি ইন্টিজার ধারণ করে।\n\n### Linked List (লিঙ্কড লিস্ট):\n##### Linked List একটি লিনিয়ার ডাটা স্ট্রাকচার, যেখানে প্রতিটি নোডে ডাটা থাকে এবং পরবর্তী নোডের পয়েন্টার থাকে।\nSingly Linked List (সিঙ্গলি লিঙ্কড লিস্ট):\n\n```cpp\n\n#include \u003ciostream\u003e\nusing namespace std;\n\nstruct Node {\n    int data;\n    Node* next;\n};\n\nint main() {\n    Node* head = new Node(); // Create first node\n    head-\u003edata = 1;\n    head-\u003enext = nullptr;\n\n    Node* second = new Node(); // Create second node\n    second-\u003edata = 2;\n    second-\u003enext = nullptr;\n    \n    head-\u003enext = second; // Link the first node to second node\n    \n    cout \u003c\u003c \"First node data: \" \u003c\u003c head-\u003edata \u003c\u003c endl;\n    cout \u003c\u003c \"Second node data: \" \u003c\u003c second-\u003edata \u003c\u003c endl;\n\n    return 0;\n}\n```\n###### ব্যাখ্যা: এখানে একটি সিঙ্গলি লিঙ্কড লিস্ট তৈরি করা হয়েছে যেখানে দুটি নোড সংযুক্ত রয়েছে।\n\n##### Doubly Linked List (ডাবলি লিঙ্কড লিস্ট):\n\n```\n#include \u003ciostream\u003e\nusing namespace std;\n\nstruct Node {\n    int data;\n    Node* prev;\n    Node* next;\n};\n\nint main() {\n    Node* head = new Node(); // Create first node\n    head-\u003edata = 1;\n    head-\u003eprev = nullptr;\n    head-\u003enext = nullptr;\n    \n    Node* second = new Node(); // Create second node\n    second-\u003edata = 2;\n    second-\u003eprev = head;\n    second-\u003enext = nullptr;\n    \n    head-\u003enext = second; // Link the first node to second node\n    \n    cout \u003c\u003c \"First node data: \" \u003c\u003c head-\u003edata \u003c\u003c endl;\n    cout \u003c\u003c \"Second node data: \" \u003c\u003c second-\u003edata \u003c\u003c endl;\n\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে, Doubly Linked List তৈরি করা হয়েছে, যেখানে প্রতিটি নোডে prev এবং next পয়েন্টার রয়েছে।\n\n##### Circular Linked List (সার্কুলার লিঙ্কড লিস্ট):\n```cpp\n \n#include \u003ciostream\u003e\nusing namespace std;\n\nstruct Node {\n    int data;\n    Node* next;\n};\n\nint main() {\n    Node* head = new Node();\n    head-\u003edata = 1;\n    head-\u003enext = head;  // Circular Link\n    \n    cout \u003c\u003c \"Head node data: \" \u003c\u003c head-\u003edata \u003c\u003c endl;\n\n    return 0;\n}\n```\n\nব্যাখ্যা: এখানে Circular Linked List তৈরি করা হয়েছে, যেখানে লাস্ট নোড আবার প্রথম নোডে সংযুক্ত থাকে।\n\n### Stack (স্ট্যাক):\n- Stack হল একটি ডাটা স্ট্রাকচার যা LIFO (Last In First Out) নীতি অনুসরণ করে। এর মধ্যে তিনটি মূল অপারেশন রয়েছে:\n- Push Operation: একটি উপাদান স্ট্যাকে প্রবেশ করা।\n- Pop Operation: সর্বশেষ উপাদানটি স্ট্যাক থেকে বের করা।\n- Peek/Top Operation: স্ট্যাকের শীর্ষ উপাদান দেখা।\n\n```cpp\n \n#include \u003ciostream\u003e\n#include \u003cstack\u003e\nusing namespace std;\n\nint main() {\n    stack\u003cint\u003e s;\n    s.push(10);  // Push 10\n    s.push(20);  // Push 20\n    cout \u003c\u003c \"Top element: \" \u003c\u003c s.top() \u003c\u003c endl; // Top element\n    s.pop();  // Pop 20\n    cout \u003c\u003c \"Top element after pop: \" \u003c\u003c s.top() \u003c\u003c endl; // Top element after pop\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: স্ট্যাকে 10 এবং 20 যোগ করা হয়েছে এবং পরবর্তীতে 20 কে পপ করা হয়েছে।\n\n### Queue (কিউ):\n- Queue হল একটি ডাটা স্ট্রাকচার যা FIFO (First In First Out) নীতি অনুসরণ করে।\nvEnqueue Operation: একটি উপাদান কিউতে প্রবেশ করা।\n- Dequeue Operation: প্রথম উপাদানটি কিউ থেকে বের করা।\n- Front Operation: কিউয়ের প্রথম উপাদান দেখা।\n\n\n```cpp\n \n#include \u003ciostream\u003e\n#include \u003cqueue\u003e\nusing namespace std;\n\nint main() {\n    queue\u003cint\u003e q;\n    q.push(10);  // Enqueue 10\n    q.push(20);  // Enqueue 20\n    cout \u003c\u003c \"Front element: \" \u003c\u003c q.front() \u003c\u003c endl; // Front element\n    q.pop();  // Dequeue 10\n    cout \u003c\u003c \"Front element after pop: \" \u003c\u003c q.front() \u003c\u003c endl; // Front element after pop\n    return 0;\n}\n```\n##### ব্যাখ্যা: কিউতে 10 এবং 20 যোগ করা হয়েছে এবং পরবর্তীতে 10 কে ডিকিউ করা হয়েছে।\n\n### Deque (ডিকু):\n##### Deque হল একটি ডাবল-এন্ডেড কিউ, যেখানে উপাদানগুলো দুই প্রান্ত থেকে প্রবেশ এবং বের হতে পারে।\n\n```cpp\n \n#include \u003ciostream\u003e\n#include \u003cdeque\u003e\nusing namespace std;\n\nint main() {\n    deque\u003cint\u003e dq;\n    dq.push_front(10); // Push 10 at front\n    dq.push_back(20);  // Push 20 at back\n    cout \u003c\u003c \"Front element: \" \u003c\u003c dq.front() \u003c\u003c endl; // Front element\n    cout \u003c\u003c \"Back element: \" \u003c\u003c dq.back() \u003c\u003c endl;   // Back element\n    dq.pop_front(); // Pop 10 from front\n    dq.pop_back();  // Pop 20 from back\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে Deque ব্যবহার করে front এবং back প্রান্ত থেকে উপাদান প্রবেশ এবং বের করা হয়েছে।\n\n### Priority Queue (প্রাইওরিটি কিউ):\n##### Priority Queue হল একটি কিউ যেখানে প্রতিটি উপাদানকে একটি priority দেওয়া হয় এবং সর্বোচ্চ priority এর উপাদান প্রথমে বের হয়।\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cqueue\u003e\nusing namespace std;\n\nint main() {\n    priority_queue\u003cint\u003e pq;\n    pq.push(10);\n    pq.push(20);\n    pq.push(15);\n    cout \u003c\u003c \"Top element (Max-Heap): \" \u003c\u003c pq.top() \u003c\u003c endl; // 20\n    pq.pop();\n    cout \u003c\u003c \"Top element after pop: \" \u003c\u003c pq.top() \u003c\u003c endl; // 15\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: Priority Queue এ সর্বোচ্চ উপাদানটি (20) প্রথমে বের হয়।\n\n### 2. অ্যাডভান্সড ডাটা স্ট্রাকচার (Advanced Data Structures)\n- Binary Tree (বাইনারি ট্রি):\n- একটি Binary Tree হল এমন একটি ট্রি ডাটা স্ট্রাকচার যেখানে প্রতিটি নোডের সর্বাধিক দুটি সন্তান থাকতে পারে।\n  \n```cpp\n \n#include \u003ciostream\u003e\nusing namespace std;\n\nstruct Node {\n    int data;\n    Node* left;\n    Node* right;\n};\n\nint main() {\n    Node* root = new Node();\n    root-\u003edata = 1;\n    root-\u003eleft = new Node();\n    root-\u003eright = new Node();\n    root-\u003eleft-\u003edata = 2;\n    root-\u003eright-\u003edata = 3;\n    \n    cout \u003c\u003c \"Root: \" \u003c\u003c root-\u003edata \u003c\u003c endl;\n    cout \u003c\u003c \"Left Child: \" \u003c\u003c root-\u003eleft-\u003edata \u003c\u003c endl;\n    cout \u003c\u003c \"Right Child: \" \u003c\u003c root-\u003eright-\u003edata \u003c\u003c endl;\n    \n    return 0;\n}\n```\n###### ব্যাখ্যা: এখানে একটি বাইনারি ট্রি তৈরি করা হয়েছে যেখানে Root এবং তার Left ও Right সন্তান নোড রয়েছে।\n\n### Binary Search Tree (BST):\n- Binary Search Tree (BST) হল একটি বাইনারি ট্রি, যেখানে প্রতিটি নোডের left সন্তানের মান তার নিজের মানের চেয়ে ছোট এবং right সন্তানের মান তার নিজের মানের চেয়ে বড় হয়।\n\n```cpp\n \n#include \u003ciostream\u003e\nusing namespace std;\n\nstruct Node {\n    int data;\n    Node* left;\n    Node* right;\n};\n\nNode* insert(Node* root, int value) {\n    if (root == nullptr) {\n        Node* newNode = new Node();\n        newNode-\u003edata = value;\n        newNode-\u003eleft = newNode-\u003eright = nullptr;\n        return newNode;\n    }\n    if (value \u003c root-\u003edata) {\n        root-\u003eleft = insert(root-\u003eleft, value);\n    } else {\n        root-\u003eright = insert(root-\u003eright, value);\n    }\n    return root;\n}\n\nint main() {\n    Node* root = nullptr;\n    root = insert(root, 10);\n    root = insert(root, 20);\n    root = insert(root, 5);\n    \n    cout \u003c\u003c \"Root: \" \u003c\u003c root-\u003edata \u003c\u003c endl;   // 10\n    cout \u003c\u003c \"Left Child: \" \u003c\u003c root-\u003eleft-\u003edata \u003c\u003c endl;  // 5\n    cout \u003c\u003c \"Right Child: \" \u003c\u003c root-\u003eright-\u003edata \u003c\u003c endl; // 20\n    \n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে একটি BST তৈরি করা হয়েছে এবং তিনটি মান (10, 20, 5) ইনসার্ট করা হয়েছে।\n\n### Heap (হিপ):\n- Heap একটি পূর্ণ বাইনারি ট্রি যা হিপ প্রপার্টি অনুসরণ করে। এটি দুটি ধরনের হতে পারে:\n- Max-Heap: যেখানে প্রতিটি নোডের মান তার সন্তানের মানের চেয়ে বড়।\n- Min-Heap: যেখানে প্রতিটি নোডের মান তার সন্তানের মানের চেয়ে ছোট।\n- \n```cpp\n \n#include \u003ciostream\u003e\n#include \u003cqueue\u003e\nusing namespace std;\n\nint main() {\n    priority_queue\u003cint\u003e maxHeap;\n    maxHeap.push(10);\n    maxHeap.push(20);\n    maxHeap.push(15);\n    \n    cout \u003c\u003c \"Max Heap Top: \" \u003c\u003c maxHeap.top() \u003c\u003c endl;  // 20\n    return 0;\n}\n```\n\n######ব্যাখ্যা: এখানে Max-Heap ব্যবহার করা হয়েছে, যেখানে সর্বোচ্চ মান (20) শীর্ষে থাকে।\n\n### 3. হ্যাশিং (Hashing)\n- Hash Table (হ্যাশ টেবিল):\n- Hash Table একটি ডাটা স্ট্রাকচার যা কী-বয়সী মান সংরক্ষণ করে এবং দ্রুত অ্যাক্সেসের জন্য একটি হ্যাশ ফাংশন ব্যবহার করে।\n- \n```cpp\n \n#include \u003ciostream\u003e\n#include \u003cunordered_map\u003e\nusing namespace std;\n\nint main() {\n    unordered_map\u003cstring, int\u003e hashTable;\n    hashTable[\"apple\"] = 5;\n    hashTable[\"banana\"] = 3;\n    \n    cout \u003c\u003c \"Apple count: \" \u003c\u003c hashTable[\"apple\"] \u003c\u003c endl;\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে unordered_map ব্যবহার করা হয়েছে যা একটি হ্যাশ টেবিল তৈরি করে।\n\n4. বিট ম্যানিপুলেশন (Bit Manipulation)\nAND, OR, XOR Operations (এন্ড, অর, এক্সঅর অপারেশন):\n```cpp\n\n#include \u003ciostream\u003e\nusing namespace std;\n\nint main() {\n    int a = 5; // 0101\n    int b = 3; // 0011\n    cout \u003c\u003c \"a \u0026 b: \" \u003c\u003c (a \u0026 b) \u003c\u003c endl;  // AND operation\n    cout \u003c\u003c \"a | b: \" \u003c\u003c (a | b) \u003c\u003c endl;  // OR operation\n    cout \u003c\u003c \"a ^ b: \" \u003c\u003c (a ^ b) \u003c\u003c endl;  // XOR operation\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে AND, OR, এবং XOR অপারেশনগুলি করা হয়েছে।\n\n### 5. Disjoint Set (Union-Find)\n\n- Union by Rank (ইউনিয়ন বাই র্যাংক):\n- Union-Find ডাটা স্ট্রাকচারটি উপাদানগুলির গ্রুপিংয়ের জন্য ব্যবহার করা হয়, যেখানে দুটি সেটের ইউনিয়ন করা এবং তাদের মধ্যে কোনটি বড় তা ট্র্যাক করা হয়।\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cvector\u003e\nusing namespace std;\n\nclass DisjointSet {\npublic:\n    vector\u003cint\u003e parent, rank;\n    \n    DisjointSet(int n) {\n        parent.resize(n);\n        rank.resize(n, 0);\n        for (int i = 0; i \u003c n; ++i) {\n            parent[i] = i;\n        }\n    }\n    \n    int find(int x) {\n        if (parent[x] != x) {\n            parent[x] = find(parent[x]);\n        }\n        return parent[x];\n    }\n    \n    void unite(int x, int y) {\n        int rootX = find(x);\n        int rootY = find(y);\n        \n        if (rootX != rootY) {\n            if (rank[rootX] \u003e rank[rootY]) {\n                parent[rootY] = rootX;\n            } else if (rank[rootX] \u003c rank[rootY]) {\n                parent[rootX] = rootY;\n            } else {\n                parent[rootY] = rootX;\n                ++rank[rootX];\n            }\n        }\n    }\n};\n\nint main() {\n    DisjointSet ds(5);\n    ds.unite(0, 1);\n    ds.unite(1, 2);\n    cout \u003c\u003c \"Find(0): \" \u003c\u003c ds.find(0) \u003c\u003c endl; // 0\n    cout \u003c\u003c \"Find(2): \" \u003c\u003c ds.find(2) \u003c\u003c endl; // 0\n    return 0;\n}\n```\n\n###### ব্যাখ্যা: এখানে Union-Find ডাটা স্ট্রাকচার ব্যবহার করা হয়েছে যাতে দুটি সেট একত্রিত করা হয় এবং তাদের রুট পাওয়া যায়।\n \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanmamun0%2Fdsa-algo-workbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanmamun0%2Fdsa-algo-workbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanmamun0%2Fdsa-algo-workbook/lists"}