From ef1da5a14b683f404f609788f2c9c5076b78348b Mon Sep 17 00:00:00 2001 From: Ajay-Dhangar Date: Mon, 26 Aug 2024 13:16:26 +0530 Subject: [PATCH 1/6] set up Docs Content in right format and destructure --- docs/CSS/_category_.json | 2 +- docs/Computer Networks/_category_.json | 9 - .../common_network_protocols.md | 97 --- docs/Computer Networks/crc.md | 121 --- .../internet_tcp_ip_model.md | 115 --- docs/Computer Networks/intro_to_cn.md | 61 -- docs/Computer Networks/ip_addressing.md | 82 -- docs/Computer Networks/network_devices.md | 61 -- docs/Computer Networks/network_security.md | 89 --- docs/Computer Networks/network_topologies.md | 157 ---- docs/Computer Networks/osi_model.md | 130 ---- docs/Computer Networks/types-of-networks.md | 85 -- docs/Computer Networks/wireless_networking.md | 87 --- .../Entity-Relational Model/_category.json | 9 - .../dbms-generalization-and-aggregation.md | 101 --- .../er-diagram-representation.md | 181 ----- .../er-model-basics-concepts.md | 81 -- docs/DBMS/Indexing And Hashing/_category.json | 8 - docs/DBMS/Indexing And Hashing/hashing.md | 107 --- docs/DBMS/Indexing And Hashing/indexing.md | 135 ---- .../Relational Database Design/_category.json | 8 - .../Relational Database Design/dbms-joins.md | 123 --- .../dbms-normalization.md | 115 --- docs/DBMS/Relational-Model/_category.json | 9 - docs/DBMS/Relational-Model/codd's-rule.md | 116 --- .../convert-er-model-to-relational-model.md | 96 --- .../Relational-Model/relational-algebra.md | 109 --- .../Relational-Model/relational-data-model.md | 79 -- .../Storage And File Structure/_category.json | 8 - .../dbms-file-structure.md | 95 --- .../dbms-storage-system.md | 114 --- docs/DBMS/Structured Query Language/DDL.md | 56 -- .../Structured Query Language/_category.json | 8 - docs/DBMS/Structured Query Language/dml.md | 78 -- .../sql-aggregate-functions.md | 85 -- .../sql-basic-concepts.md | 71 -- .../sql-clauses-operators.md | 203 ----- .../sql-data-types.md | 55 -- .../sql-sub-queries.md | 107 --- .../_category.json | 8 - .../dbms-concurrency-control.md | 64 -- .../transaction.md | 112 --- docs/DBMS/_category.json | 8 - docs/DBMS/data-independence-dbms.md | 34 - docs/DBMS/data-models.md | 90 --- docs/DBMS/data-schema.md | 34 - docs/DBMS/dbms-architecture.md | 34 - docs/DBMS/dbms-types-of-languages.md | 198 ----- docs/DBMS/home.md | 54 -- docs/DBMS/overview.md | 38 - .../Activation Function.md | 107 --- docs/Deep Learning/Ann.md | 163 ---- docs/Deep Learning/Backpropogation in ANN.md | 120 --- docs/Deep Learning/CNN.md | 164 ---- docs/Deep Learning/Intro.md | 62 -- .../Learning rule in ANN/Learning-Rules.md | 106 --- .../Long Short-Term Memory (LSTM).md | 161 ---- .../Multilayer Perceptron (MLP).md | 129 --- .../Optimizers in Deep Learning/AdaGard.md | 109 --- .../Optimizers in Deep Learning/Adam.md | 116 --- .../Gradient Decent.md | 131 ---- .../Introduction.md | 132 ---- .../Optimizers in Deep Learning/Momentum.md | 109 --- .../Recurrent-Neural-Networks.md | 153 ---- .../images/LSTM.webp | Bin 38522 -> 0 bytes .../images/basic_rnn_arch.webp | Bin 3538 -> 0 bytes .../images/forget gate.webp | Bin 1102 -> 0 bytes .../images/input gate.webp | Bin 3450 -> 0 bytes .../images/types of rnn.webp | Bin 16692 -> 0 bytes docs/Deep Learning/_category.json | 8 - docs/Deep Learning/img.png | Bin 24727 -> 0 bytes docs/Deep Learning/img2.png | Bin 15510 -> 0 bytes docs/Deep Learning/img3.png | Bin 5017 -> 0 bytes docs/Deep Learning/img4.png | Bin 161821 -> 0 bytes docs/Django/AdminInterface.md | 97 --- docs/Django/Forms.md | 114 --- docs/Django/Introduction.md | 30 - docs/Django/Middleware.md | 74 -- docs/Django/Models.md | 65 -- docs/Django/SessionsAndAuthentication.md | 128 --- docs/Django/Settings.md | 175 ----- docs/Django/StaticFiles.md | 130 ---- docs/Django/Template.md | 131 ---- docs/Django/UrlDispatcher.md | 116 --- docs/Django/Views.md | 118 --- docs/Django/_category_.json | 8 - docs/Flask/01-Introduction.md | 23 - docs/Flask/02-Installing.md | 29 - docs/Flask/03-SettingUp-newProject.md | 43 - docs/Flask/04-Routing.md | 50 -- docs/Flask/05-Templates.md | 50 -- docs/Flask/06-HandlingForms.md | 76 -- docs/Flask/07-Database.md | 70 -- docs/Flask/08-Blueprints.md | 52 -- docs/Flask/09-Error-and-Debugging.md | 66 -- docs/Flask/10.Deployment.md | 103 --- docs/Flask/11-Flask app on Heroku.md | 50 -- docs/Flask/_category_.json | 8 - docs/Flutter/_category_.json | 8 - docs/Flutter/flutter-architecture.md | 43 - docs/Flutter/flutter-installation.md | 71 -- docs/Flutter/flutter-introduction.md | 62 -- docs/Flutter/image.png | Bin 43675 -> 0 bytes docs/Flutter/intro-to-dart.md | 142 ---- docs/Git-Github/Branched-in-git.md | 81 -- .../Git-Github/Getting-started-with-Github.md | 180 ----- docs/Git-Github/Terminology.md | 87 --- docs/Git-Github/_category_.json | 8 - docs/Git-Github/git-github-basic.md | 27 - docs/Go/Concurrency.md | 89 --- docs/Go/ErrorHandling.md | 94 --- docs/Go/FunctionsAsFirst-ClassCitizens.md | 131 ---- docs/Go/GarbageCollection.md | 47 -- docs/Go/Introduction.md | 55 -- docs/Go/PackagesAndImports.md | 61 -- docs/Go/StructsAndMethods.md | 111 --- docs/Go/Tooling.md | 59 -- docs/Go/TypesandInterfaces.md | 103 --- docs/Go/_category_.json | 8 - docs/Jekyll/01-Introduction.md | 25 - docs/Jekyll/02-Installation.md | 30 - docs/Jekyll/03-Setting-Up.md | 28 - docs/Jekyll/04-Configuration.md | 33 - docs/Jekyll/05-Pages-and-Post.md | 62 -- docs/Jekyll/06-Themes.md | 34 - docs/Jekyll/07-Layouts-and-Includes.md | 66 -- docs/Jekyll/08-Plugins.md | 37 - docs/Jekyll/09-Deployments.md | 37 - docs/Jekyll/10-Troubleshooting.md | 32 - docs/Jekyll/_category_.json | 8 - docs/Julia/Basicop.md | 198 ----- docs/Julia/Intro.md | 40 - docs/Julia/_category_.json | 8 - docs/Julia/dicti.md | 163 ---- docs/Julia/functi.md | 166 ---- docs/Julia/int.md | 199 ----- docs/Julia/loop.md | 118 --- docs/Julia/math.md | 96 --- docs/Julia/rational.md | 219 ------ docs/Julia/set.md | 190 ----- docs/Julia/str.md | 138 ---- docs/Julia/tuple.md | 96 --- docs/Julia/vari.md | 126 --- docs/MATLAB/Advance MATLAB/Poly.md | 233 ------ docs/MATLAB/Advance MATLAB/_category_.json | 8 - docs/MATLAB/Advance MATLAB/alg.md | 155 ---- docs/MATLAB/Command.md | 104 --- docs/MATLAB/Introduction.md | 35 - docs/MATLAB/Syntax.md | 77 -- docs/MATLAB/Variable.md | 97 --- docs/MATLAB/_category_.json | 8 - docs/MATLAB/array.md | 129 --- docs/MATLAB/datatype.md | 130 ---- docs/MATLAB/loop.md | 84 -- docs/MATLAB/matrix.md | 149 ---- docs/MATLAB/operator.md | 131 ---- docs/MATLAB/string.md | 121 --- docs/MATLAB/vector.md | 205 ----- docs/Machine Learning/AdaBoost model.md | 157 ---- docs/Machine Learning/AlexNet.md | 228 ------ .../An-Introduction -to-Machine-Learning.md | 71 -- docs/Machine Learning/Autoencoders.md | 180 ----- .../Machine Learning/Bayesian Optimization.md | 154 ---- docs/Machine Learning/CatBoost.md | 155 ---- docs/Machine Learning/Decision-Trees.md | 87 --- .../Dimensionality Reduction Techniques.md | 79 -- docs/Machine Learning/Ensemble Learning.md | 170 ---- .../Extreme Gradient Boosting.md | 162 ---- .../Gaussian-Discriminant-Analysis.md | 165 ---- .../Generative Adversarial Networks.md | 215 ----- ...radient Boosted Regression Trees (GBRT).md | 160 ---- .../Gradient-Boosting-Machines.md | 162 ---- .../Hierarchical Clustering.md | 173 ---- docs/Machine Learning/K-Means Algorithm.md | 169 ---- .../Light Gradient Boosting Machine.md | 164 ---- .../Linear Discriminant Analysis.md | 156 ---- docs/Machine Learning/Logistic-Regression.md | 100 --- .../Weight and bias in Multiple Regression.md | 69 -- .../Images/equation.webp | Bin 15916 -> 0 bytes .../Images/thomas bayes.webp | Bin 7042 -> 0 bytes .../Naive Bayes classifier/Naive-Bayes.md | 93 --- .../Principal Component Analysis.md | 168 ---- docs/Machine Learning/Random-Forest.md | 162 ---- .../Reinforcement Learning.md | 139 ---- docs/Machine Learning/SVM Algorithm.md | 159 ---- docs/Machine Learning/Scikit-Learn.md | 229 ------ .../Stochastic Gradient Descent model.md | 145 ---- .../Support Vector Regression.md | 157 ---- docs/Machine Learning/Transfer Learning.md | 169 ---- docs/Machine Learning/linear_regression.md | 128 --- ...stributed Stochastic Neighbor Embedding.md | 141 ---- docs/Operating System/_category_.json | 8 - docs/Operating System/device_management.md | 92 --- docs/Operating System/distributed_systems.md | 94 --- docs/Operating System/file_systems.md | 109 --- docs/Operating System/function_of_OS.md | 184 ----- docs/Operating System/image-1.png | Bin 72655 -> 0 bytes docs/Operating System/image-10.png | Bin 8201 -> 0 bytes docs/Operating System/image-11.png | Bin 98580 -> 0 bytes docs/Operating System/image-12.png | Bin 115215 -> 0 bytes docs/Operating System/image-2.png | Bin 34738 -> 0 bytes docs/Operating System/image-3.png | Bin 57761 -> 0 bytes docs/Operating System/image-4.png | Bin 28823 -> 0 bytes docs/Operating System/image-5.png | Bin 181463 -> 0 bytes docs/Operating System/image-6.png | Bin 92603 -> 0 bytes docs/Operating System/image-7.png | Bin 92902 -> 0 bytes docs/Operating System/image-8.png | Bin 83546 -> 0 bytes docs/Operating System/image-9.png | Bin 75653 -> 0 bytes docs/Operating System/image.png | Bin 48521 -> 0 bytes docs/Operating System/intro_to_OS.md | 116 --- docs/Operating System/memory_management.md | 88 --- docs/Operating System/os_development.md | 96 --- docs/Operating System/process_management.md | 76 -- docs/Operating System/real_time_systems.md | 85 -- .../security_and_protection.md | 85 -- docs/Operating System/system_calls.md | 114 --- docs/Operating System/types_of_OS.md | 227 ------ docs/Operating System/virtualization.md | 91 --- docs/Pandas/Pandas-gettingstarted.md | 53 -- docs/Pandas/Read-files.md | 255 ------ docs/Pandas/_category_.json | 8 - docs/Pandas/image-1.png | Bin 21889 -> 0 bytes docs/Pandas/image-2.png | Bin 41555 -> 0 bytes docs/Pandas/image.png | Bin 67450 -> 0 bytes docs/Pandas/pandas-dataframe.md | 141 ---- docs/Pandas/pandas-introduction.md | 36 - docs/Pandas/pandas-series.md | 119 --- docs/Ruby/BlocksAndProcs.md | 67 -- docs/Ruby/CommunityAndRails.md | 39 - docs/Ruby/DynamicTyping.md | 57 -- docs/Ruby/GarbageCollection.md | 61 -- docs/Ruby/Introduction.md | 31 - docs/Ruby/LibrariesAndGems.md | 53 -- docs/Ruby/Metaprogramming.md | 47 -- docs/Ruby/MixinsAndINheritance.md | 86 -- docs/Ruby/ObjectOriented.md | 139 ---- docs/Ruby/_category_.json | 8 - docs/SQL/01-intro-to-dbms-sql.md | 215 ----- docs/SQL/02-crud-operations.md | 389 --------- docs/SQL/03-crud2.md | 352 --------- docs/SQL/04-joins-2.md | 354 --------- docs/SQL/05-aggregate-subqueries.md | 185 ----- docs/SQL/06-indexing.md | 170 ---- docs/SQL/07-transactions.md | 205 ----- docs/SQL/08-schema-design1.md | 257 ------ docs/SQL/10-views-and-window-function.md | 358 --------- docs/SQL/SQL-Aggregrate-Function.md | 90 --- docs/SQL/SQL-Between-Operator.md | 81 -- docs/SQL/SQL-Delete-Statement.md | 77 -- docs/SQL/SQL-Inner-Join.md | 88 --- docs/SQL/SQL-Insert-Into.md | 96 --- docs/SQL/SQL-Joins.md | 62 -- docs/SQL/SQL-Left-Join.md | 68 -- docs/SQL/SQL-Not-Operator.md | 101 --- docs/SQL/SQL-OR-Operator.md | 47 -- docs/SQL/SQL-Right-Join.md | 53 -- docs/SQL/SQL-Update-Statement.md | 100 --- docs/SQL/SQL-Where-Clause.md | 86 -- docs/SQL/_category_.json | 8 - docs/SQL/image-1.png | Bin 141894 -> 0 bytes docs/SQL/index.md | 372 --------- docs/Swift/Concurrency.md | 68 -- docs/Swift/ControlFlow.md | 108 --- docs/Swift/ErrorHandling.md | 126 --- docs/Swift/FunctionsAndClosures.md | 79 -- docs/Swift/Introduction.md | 38 - docs/Swift/MemoryManagement.md | 142 ---- docs/Swift/Object-OrientedProgramming.md | 145 ---- docs/Swift/Optionals.md | 97 --- docs/Swift/VariablesAndConstants.md | 71 -- docs/Swift/_category_.json | 8 - .../01_Conditional_Statements.md | 217 ------ docs/cpp/03_Control_Flow/02_Loops_in_Cpp.md | 160 ---- .../03_Switch_Case_Statements.md | 115 --- docs/cpp/03_Control_Flow/_category_.json | 8 - docs/cpp/04_Functions/01_Function_Basics.md | 143 ---- ...02_Function_Parameters_and_Return_Types.md | 164 ---- .../04_Functions/03_Function_Overloading.md | 70 -- docs/cpp/04_Functions/_category_.json | 8 - .../05_Arrays_and_Strings/01_Array_Basics.md | 123 --- .../02_String_Manipulation.md | 216 ----- .../03_Character_Arrays.md | 194 ----- .../cpp/05_Arrays_and_Strings/_category_.json | 8 - .../01_Pointer_Basics.md | 287 ------- .../02_Pointers_and_Arrays.md | 214 ----- .../03_Pointers_and_Functions.md | 241 ------ .../_category_.json | 8 - .../01_Classes_and_Objects.md | 736 ------------------ .../02_Inheritance.md | 344 -------- .../03_Polymorphism.md | 289 ------- .../_category_.json | 8 - .../01_Exception_Basics.md | 178 ----- .../02_Try_Catch_Block.md | 229 ------ .../03_Throwing_and_Catching_Exceptions.md | 126 --- .../cpp/08_Exception_Handling/_category_.json | 8 - .../01_File_Handling_Basics.md | 15 - .../02_Read_and_Write_to_Files.md | 15 - .../03_Working_with_File_Pointers.md | 16 - docs/cpp/09_File_Input_Output/_category_.json | 8 - .../01_Containers_in_STL.md | 64 -- .../02_Algorithms_in_STL.md | 17 - .../03_Iterators_in_STL.md | 17 - .../_category_.json | 8 - .../01_Dynamic_Memory_Allocation.md | 15 - ...02_Memory_Leak_Detection_and_Prevention.md | 15 - .../11_Memory_Management/03_Smart_Pointers.md | 15 - docs/cpp/11_Memory_Management/_category_.json | 8 - docs/cpp/12_Advanced_Topics/01_Templates.md | 14 - .../02_Multi-threading_in_C++.md | 15 - .../03_STL_Advanced_Topics.md | 15 - docs/cpp/12_Advanced_Topics/_category_.json | 8 - .../01_Debugging_Techniques.md | 14 - .../02_Profiling_and_Optimization.md | 15 - .../03_Code_Quality_Assurance_Tools.md | 15 - .../_category_.json | 8 - ...Writing_Clean_and_Maintainable_C++_Code.md | 15 - .../02_Performance_Optimization_Techniques.md | 15 - .../03_Exception_Handling_Best_Practices.md | 16 - .../cpp/14_Cpp_Best_Practices/_category_.json | 8 - .../01_Further_Learning_Resources.md | 15 - .../02_Advanced_C++_Topics_to_Explore.md | 15 - ...3_Community_Forums_and_Support_Networks.md | 14 - .../_category_.json | 8 - docs/cpp/_category_.json | 8 - .../02_Variables_and_Data_Types.md | 83 -- .../03_Operators_and_Expressions.md | 76 -- .../_category_.json | 8 - .../cpp-syntax-basics.md | 102 --- docs/cpp/home.md | 53 -- docs/cpp/introduction-to-cpp/_category_.json | 8 - .../setting-up-your-cpp-environment.md | 49 -- docs/cpp/introduction-to-cpp/what-is-cpp.md | 47 -- docs/cpp/introduction-to-cpp/why-learn-cpp.md | 34 - docs/dsa/Hash/_category_.json | 8 - docs/dsa/Hash/hash.md | 150 ---- docs/dsa/Hash/image-1.png | Bin 22802 -> 0 bytes docs/dsa/Hash/image.png | Bin 48804 -> 0 bytes docs/dsa/Heaps/_category_.json | 12 - docs/dsa/Heaps/heaps.md | 134 ---- docs/dsa/Heaps/image.png | Bin 149934 -> 0 bytes docs/dsa/Kadanes.md | 104 --- docs/dsa/Matrix/_category_.json | 9 - docs/dsa/Matrix/image.png | Bin 18033 -> 0 bytes docs/dsa/Matrix/matrix.md | 153 ---- docs/dsa/Matrix/problems-matrix.md | 130 ---- docs/dsa/Queue/_category_.json | 8 - docs/dsa/Queue/image.png | Bin 27089 -> 0 bytes docs/dsa/Queue/queue.md | 247 ------ docs/dsa/Trees/Trees.md | 415 ---------- docs/dsa/Trees/_category_.json | 8 - docs/dsa/Trees/image-1.png | Bin 132100 -> 0 bytes docs/dsa/Trees/image.png | Bin 92390 -> 0 bytes docs/dsa/_category_.json | 8 - docs/dsa/algorithms/DivideAndConquer.md | 72 -- docs/dsa/algorithms/DynamicProgramming.md | 155 ---- docs/dsa/algorithms/Greedy.md | 261 ------- docs/dsa/algorithms/_category_.json | 8 - docs/dsa/algorithms/backtracking.md | 223 ------ docs/dsa/algorithms/bitwise.md | 55 -- docs/dsa/algorithms/image-1.png | Bin 101433 -> 0 bytes docs/dsa/algorithms/image-10.png | Bin 29394 -> 0 bytes docs/dsa/algorithms/image-2.png | Bin 49311 -> 0 bytes docs/dsa/algorithms/image-3.png | Bin 75455 -> 0 bytes docs/dsa/algorithms/image-4.png | Bin 94506 -> 0 bytes docs/dsa/algorithms/image-5.png | Bin 322152 -> 0 bytes docs/dsa/algorithms/image-6.png | Bin 100427 -> 0 bytes docs/dsa/algorithms/image-7.png | Bin 35883 -> 0 bytes docs/dsa/algorithms/image-8.png | Bin 20572 -> 0 bytes docs/dsa/algorithms/image-9.png | Bin 61636 -> 0 bytes docs/dsa/algorithms/image.png | Bin 23822 -> 0 bytes docs/dsa/algorithms/mathematical_algorithm.md | 46 -- docs/dsa/algorithms/patternsearchalgorithm.md | 187 ----- docs/dsa/algorithms/searching_algorithm.md | 212 ----- docs/dsa/algorithms/sorting_algorithm.md | 208 ----- docs/dsa/arrays/2d-arrays.md | 201 ----- docs/dsa/arrays/_category_.json | 8 - docs/dsa/arrays/arrays-bubblesort-dsa.md | 194 ----- docs/dsa/arrays/arrays-dsa.md | 584 -------------- docs/dsa/arrays/arrays-insertionsort.md | 168 ---- docs/dsa/arrays/arrays-selectionsort.md | 152 ---- docs/dsa/arrays/bucket-sort.md | 204 ----- docs/dsa/arrays/radix-sort.md | 261 ------- docs/dsa/basic-concepts/_category_.json | 8 - docs/dsa/basic-concepts/image-1.png | Bin 12924 -> 0 bytes docs/dsa/basic-concepts/image.png | Bin 6623 -> 0 bytes docs/dsa/basic-concepts/space-complexity.md | 212 ----- docs/dsa/basic-concepts/time-complexity.md | 306 -------- .../binary_search/Iterative_binary_search.md | 134 ---- docs/dsa/binary_search/_category_.json | 8 - docs/dsa/binary_search/binary-search.md | 62 -- .../binary_search/recursive_binary_search.md | 126 --- docs/dsa/data-structure-types.md | 367 --------- docs/dsa/dsa.md | 127 --- docs/dsa/graphs/_category_.json | 8 - docs/dsa/graphs/graphs.md | 301 ------- docs/dsa/graphs/image.png | Bin 64486 -> 0 bytes docs/dsa/image.png | Bin 8465 -> 0 bytes docs/dsa/linkedlist/LinkedList.md | 695 ----------------- docs/dsa/linkedlist/LinkedListProblems.md | 146 ---- docs/dsa/linkedlist/_category_.json | 8 - docs/dsa/master-theorem.md | 209 ----- docs/dsa/recursion/_category_.json | 8 - docs/dsa/recursion/recursion.md | 249 ------ docs/dsa/recursion/recursionVsIteration.md | 157 ---- .../recursion/recursion_leetcode_questions.md | 75 -- docs/dsa/stack/_category_.json | 8 - docs/dsa/stack/stack-using-array.md | 244 ------ docs/dsa/strings/_category_.json | 8 - .../leetcode_practice_problems_strings.md | 31 - docs/dsa/strings/strings-dsa.md | 352 --------- docs/html/_category_.json | 2 +- .../Spring-and-Spring-Boot/_category_.json | 8 - .../aspect-oriented-programming.md | 253 ------ .../dependency-injection.md | 243 ------ .../introduction-to-spring.md | 121 --- .../object-relational-model.md | 286 ------- .../requestparam-annotation.md | 107 --- .../spring-environment-setup.md | 172 ---- .../java/Spring-and-Spring-Boot/spring-mvc.md | 227 ------ .../Iteration-and-evalution.md | 53 -- docs/java/Thymeleaf-in-java/_category_.json | 8 - .../introduction-to-thymeleaf.md | 161 ---- .../Thymeleaf-in-java/syntax-in-thymleaf.md | 240 ------ docs/java/_category_.json | 8 - .../_category_.json | 8 - .../advanced-java-topics.md | 35 - .../java-best-practices-and-code-standards.md | 60 -- ...ava-performance-tuning-and-optimization.md | 61 -- .../arrays-and-collections/_category_.json | 8 - .../array-lists-and-collections-framework.md | 154 ---- .../arrays-and-collections/arrays-in-java.md | 165 ---- .../sorting-and-searching-arrays.md | 137 ---- .../using-arrays-and-collections.md | 197 ----- .../working-with-arrays-and-collections.md | 156 ---- .../_category_.json | 8 - .../java-syntax-and-structure.md | 62 -- .../operators-and-expressions.md | 64 -- .../variables-and-data-types.md | 65 -- .../_category_.json | 8 - ...guring-and-building-projects-with-maven.md | 97 --- .../introduction-to-maven.md | 45 -- .../managing-dependencies-and-plugins.md | 95 --- docs/java/control-statements/_category_.json | 8 - .../conditional-statements.md | 189 ----- docs/java/control-statements/loops-in-java.md | 152 ---- .../switch-and-ternary-statements.md | 108 --- docs/java/exception-handling/_category_.json | 8 - .../checked-vs-unchecked-exceptions.md | 147 ---- .../exception-basics-and-try-catch.md | 190 ----- .../exception-handling-best-practices.md | 133 ---- .../throwing-and-catching-exceptions.md | 158 ---- .../java/file-handling-and-io/_category_.json | 8 - .../reading-and-writing-files.md | 101 --- .../serialization-and-deserialization.md | 93 --- .../working-with-files-and-directories.md | 59 -- .../working-with-io-channels.md | 118 --- .../working-with-io-readers-and-writers.md | 109 --- .../working-with-io-streams.md | 102 --- docs/java/generics/Generic Classes.md | 49 -- docs/java/generics/Generic methods.md | 41 - .../java/generics/Introduction to Generics.md | 30 - docs/java/generics/Wildcards.md | 74 -- .../_category_.json | 8 - .../creating-gui-components.md | 142 ---- .../event-handling-and-listeners.md | 159 ---- .../introduction-to-swing.md | 69 -- .../working-with-dialogs-and-frames.md | 109 --- .../working-with-layout-managers.md | 161 ---- docs/java/home.md | 66 -- .../java/introduction-to-java/_category_.json | 8 - .../setup-java-development-environment.md | 50 -- .../java/introduction-to-java/what-is-java.md | 48 -- .../introduction-to-java/why-learn-java.md | 34 - docs/java/jdbc-and-databases/_category_.json | 8 - .../connecting-to-a-database.md | 72 -- ...ecuting-sql-statements-and-transactions.md | 87 --- .../introduction-to-jdbc.md | 89 --- .../methods-and-functions/_category_.json | 8 - .../method-declaration-and-syntax.md | 42 - .../method-overloading-and-recursion.md | 143 ---- .../method-parameters-and-return-values.md | 89 --- .../_category_.json | 8 - .../introduction-to-multithreading.md | 114 --- .../multithreading-best-practices.md | 278 ------- .../multithreading-design-patterns.md | 285 ------- ...chronization-and-concurrent-collections.md | 155 ---- .../thread-class-and-runnable-interface.md | 117 --- .../thread-pools-and-executors.md | 188 ----- .../working-with-threads-and-executors.md | 253 ------ docs/java/networking-in-java/_category_.json | 8 - .../client-server-communication.md | 279 ------- .../networking-best-practices.md | 42 - .../socket-programming-and-url-connections.md | 262 ------- .../working-with-http-and-https.md | 200 ----- .../working-with-tcp-and-udp.md | 189 ----- .../working-with-web-sockets.md | 176 ----- .../_category_.json | 8 - .../classes-and-objects.md | 194 ----- .../custom-exceptions-in-java.md | 182 ----- .../design-patterns-in-java.md | 272 ------- .../encapsulation-and-abstraction.md | 163 ---- .../inheritance-and-polymorphism.md | 190 ----- .../interfaces-and-abstract-classes.md | 143 ---- .../object-oriented-design-principles.md | 196 ----- .../stream-apis/How can create streams.md | 66 -- .../Introduction to stream apis.md | 27 - docs/java/stream-apis/Parallel streams.md | 50 -- docs/java/stream-apis/Stream operations.md | 151 ---- .../Using stream with custom objects.md | 77 -- .../unit-testing-with-junit/_category_.json | 8 - .../introduction-to-junit-framework.md | 77 -- .../test-suites-and-assertions.md | 64 -- .../writing-and-running-tests-withjunit.md | 72 -- docs/javascript/_category_.json | 2 +- .../object/creating-objects.md | 2 +- docs/prompt engineering/prompts-basics.md | 64 -- .../prompts-best-practices.md | 56 -- docs/prompt engineering/prompts-examples.md | 36 - docs/prompt engineering/prompts-strategies.md | 63 -- docs/prompt engineering/prompts-tools.md | 42 - docs/prompt engineering/prompts-types.md | 56 -- docusaurus.config.js | 6 +- sidebars.js | 3 - 523 files changed, 5 insertions(+), 49633 deletions(-) delete mode 100644 docs/Computer Networks/_category_.json delete mode 100644 docs/Computer Networks/common_network_protocols.md delete mode 100644 docs/Computer Networks/crc.md delete mode 100644 docs/Computer Networks/internet_tcp_ip_model.md delete mode 100644 docs/Computer Networks/intro_to_cn.md delete mode 100644 docs/Computer Networks/ip_addressing.md delete mode 100644 docs/Computer Networks/network_devices.md delete mode 100644 docs/Computer Networks/network_security.md delete mode 100644 docs/Computer Networks/network_topologies.md delete mode 100644 docs/Computer Networks/osi_model.md delete mode 100644 docs/Computer Networks/types-of-networks.md delete mode 100644 docs/Computer Networks/wireless_networking.md delete mode 100644 docs/DBMS/Entity-Relational Model/_category.json delete mode 100644 docs/DBMS/Entity-Relational Model/dbms-generalization-and-aggregation.md delete mode 100644 docs/DBMS/Entity-Relational Model/er-diagram-representation.md delete mode 100644 docs/DBMS/Entity-Relational Model/er-model-basics-concepts.md delete mode 100644 docs/DBMS/Indexing And Hashing/_category.json delete mode 100644 docs/DBMS/Indexing And Hashing/hashing.md delete mode 100644 docs/DBMS/Indexing And Hashing/indexing.md delete mode 100644 docs/DBMS/Relational Database Design/_category.json delete mode 100644 docs/DBMS/Relational Database Design/dbms-joins.md delete mode 100644 docs/DBMS/Relational Database Design/dbms-normalization.md delete mode 100644 docs/DBMS/Relational-Model/_category.json delete mode 100644 docs/DBMS/Relational-Model/codd's-rule.md delete mode 100644 docs/DBMS/Relational-Model/convert-er-model-to-relational-model.md delete mode 100644 docs/DBMS/Relational-Model/relational-algebra.md delete mode 100644 docs/DBMS/Relational-Model/relational-data-model.md delete mode 100644 docs/DBMS/Storage And File Structure/_category.json delete mode 100644 docs/DBMS/Storage And File Structure/dbms-file-structure.md delete mode 100644 docs/DBMS/Storage And File Structure/dbms-storage-system.md delete mode 100644 docs/DBMS/Structured Query Language/DDL.md delete mode 100644 docs/DBMS/Structured Query Language/_category.json delete mode 100644 docs/DBMS/Structured Query Language/dml.md delete mode 100644 docs/DBMS/Structured Query Language/sql-aggregate-functions.md delete mode 100644 docs/DBMS/Structured Query Language/sql-basic-concepts.md delete mode 100644 docs/DBMS/Structured Query Language/sql-clauses-operators.md delete mode 100644 docs/DBMS/Structured Query Language/sql-data-types.md delete mode 100644 docs/DBMS/Structured Query Language/sql-sub-queries.md delete mode 100644 docs/DBMS/Transaction and Concurrency/_category.json delete mode 100644 docs/DBMS/Transaction and Concurrency/dbms-concurrency-control.md delete mode 100644 docs/DBMS/Transaction and Concurrency/transaction.md delete mode 100644 docs/DBMS/_category.json delete mode 100644 docs/DBMS/data-independence-dbms.md delete mode 100644 docs/DBMS/data-models.md delete mode 100644 docs/DBMS/data-schema.md delete mode 100644 docs/DBMS/dbms-architecture.md delete mode 100644 docs/DBMS/dbms-types-of-languages.md delete mode 100644 docs/DBMS/home.md delete mode 100644 docs/DBMS/overview.md delete mode 100644 docs/Deep Learning/Activation Function/Activation Function.md delete mode 100644 docs/Deep Learning/Ann.md delete mode 100644 docs/Deep Learning/Backpropogation in ANN.md delete mode 100644 docs/Deep Learning/CNN.md delete mode 100644 docs/Deep Learning/Intro.md delete mode 100644 docs/Deep Learning/Learning rule in ANN/Learning-Rules.md delete mode 100644 docs/Deep Learning/Long Short-Term Memory (LSTM).md delete mode 100644 docs/Deep Learning/Multilayer Perceptron (MLP).md delete mode 100644 docs/Deep Learning/Optimizers in Deep Learning/AdaGard.md delete mode 100644 docs/Deep Learning/Optimizers in Deep Learning/Adam.md delete mode 100644 docs/Deep Learning/Optimizers in Deep Learning/Gradient Decent.md delete mode 100644 docs/Deep Learning/Optimizers in Deep Learning/Introduction.md delete mode 100644 docs/Deep Learning/Optimizers in Deep Learning/Momentum.md delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/Recurrent-Neural-Networks.md delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/images/LSTM.webp delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/images/basic_rnn_arch.webp delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/images/forget gate.webp delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/images/input gate.webp delete mode 100644 docs/Deep Learning/Recurrent Neural Networks/images/types of rnn.webp delete mode 100644 docs/Deep Learning/_category.json delete mode 100644 docs/Deep Learning/img.png delete mode 100644 docs/Deep Learning/img2.png delete mode 100644 docs/Deep Learning/img3.png delete mode 100644 docs/Deep Learning/img4.png delete mode 100644 docs/Django/AdminInterface.md delete mode 100644 docs/Django/Forms.md delete mode 100644 docs/Django/Introduction.md delete mode 100644 docs/Django/Middleware.md delete mode 100644 docs/Django/Models.md delete mode 100644 docs/Django/SessionsAndAuthentication.md delete mode 100644 docs/Django/Settings.md delete mode 100644 docs/Django/StaticFiles.md delete mode 100644 docs/Django/Template.md delete mode 100644 docs/Django/UrlDispatcher.md delete mode 100644 docs/Django/Views.md delete mode 100644 docs/Django/_category_.json delete mode 100644 docs/Flask/01-Introduction.md delete mode 100644 docs/Flask/02-Installing.md delete mode 100644 docs/Flask/03-SettingUp-newProject.md delete mode 100644 docs/Flask/04-Routing.md delete mode 100644 docs/Flask/05-Templates.md delete mode 100644 docs/Flask/06-HandlingForms.md delete mode 100644 docs/Flask/07-Database.md delete mode 100644 docs/Flask/08-Blueprints.md delete mode 100644 docs/Flask/09-Error-and-Debugging.md delete mode 100644 docs/Flask/10.Deployment.md delete mode 100644 docs/Flask/11-Flask app on Heroku.md delete mode 100644 docs/Flask/_category_.json delete mode 100644 docs/Flutter/_category_.json delete mode 100644 docs/Flutter/flutter-architecture.md delete mode 100644 docs/Flutter/flutter-installation.md delete mode 100644 docs/Flutter/flutter-introduction.md delete mode 100644 docs/Flutter/image.png delete mode 100644 docs/Flutter/intro-to-dart.md delete mode 100644 docs/Git-Github/Branched-in-git.md delete mode 100644 docs/Git-Github/Getting-started-with-Github.md delete mode 100644 docs/Git-Github/Terminology.md delete mode 100644 docs/Git-Github/_category_.json delete mode 100644 docs/Git-Github/git-github-basic.md delete mode 100644 docs/Go/Concurrency.md delete mode 100644 docs/Go/ErrorHandling.md delete mode 100644 docs/Go/FunctionsAsFirst-ClassCitizens.md delete mode 100644 docs/Go/GarbageCollection.md delete mode 100644 docs/Go/Introduction.md delete mode 100644 docs/Go/PackagesAndImports.md delete mode 100644 docs/Go/StructsAndMethods.md delete mode 100644 docs/Go/Tooling.md delete mode 100644 docs/Go/TypesandInterfaces.md delete mode 100644 docs/Go/_category_.json delete mode 100644 docs/Jekyll/01-Introduction.md delete mode 100644 docs/Jekyll/02-Installation.md delete mode 100644 docs/Jekyll/03-Setting-Up.md delete mode 100644 docs/Jekyll/04-Configuration.md delete mode 100644 docs/Jekyll/05-Pages-and-Post.md delete mode 100644 docs/Jekyll/06-Themes.md delete mode 100644 docs/Jekyll/07-Layouts-and-Includes.md delete mode 100644 docs/Jekyll/08-Plugins.md delete mode 100644 docs/Jekyll/09-Deployments.md delete mode 100644 docs/Jekyll/10-Troubleshooting.md delete mode 100644 docs/Jekyll/_category_.json delete mode 100644 docs/Julia/Basicop.md delete mode 100644 docs/Julia/Intro.md delete mode 100644 docs/Julia/_category_.json delete mode 100644 docs/Julia/dicti.md delete mode 100644 docs/Julia/functi.md delete mode 100644 docs/Julia/int.md delete mode 100644 docs/Julia/loop.md delete mode 100644 docs/Julia/math.md delete mode 100644 docs/Julia/rational.md delete mode 100644 docs/Julia/set.md delete mode 100644 docs/Julia/str.md delete mode 100644 docs/Julia/tuple.md delete mode 100644 docs/Julia/vari.md delete mode 100644 docs/MATLAB/Advance MATLAB/Poly.md delete mode 100644 docs/MATLAB/Advance MATLAB/_category_.json delete mode 100644 docs/MATLAB/Advance MATLAB/alg.md delete mode 100644 docs/MATLAB/Command.md delete mode 100644 docs/MATLAB/Introduction.md delete mode 100644 docs/MATLAB/Syntax.md delete mode 100644 docs/MATLAB/Variable.md delete mode 100644 docs/MATLAB/_category_.json delete mode 100644 docs/MATLAB/array.md delete mode 100644 docs/MATLAB/datatype.md delete mode 100644 docs/MATLAB/loop.md delete mode 100644 docs/MATLAB/matrix.md delete mode 100644 docs/MATLAB/operator.md delete mode 100644 docs/MATLAB/string.md delete mode 100644 docs/MATLAB/vector.md delete mode 100644 docs/Machine Learning/AdaBoost model.md delete mode 100644 docs/Machine Learning/AlexNet.md delete mode 100644 docs/Machine Learning/An-Introduction -to-Machine-Learning.md delete mode 100644 docs/Machine Learning/Autoencoders.md delete mode 100644 docs/Machine Learning/Bayesian Optimization.md delete mode 100644 docs/Machine Learning/CatBoost.md delete mode 100644 docs/Machine Learning/Decision-Trees.md delete mode 100644 docs/Machine Learning/Dimensionality Reduction Techniques.md delete mode 100644 docs/Machine Learning/Ensemble Learning.md delete mode 100644 docs/Machine Learning/Extreme Gradient Boosting.md delete mode 100644 docs/Machine Learning/Gaussian-Discriminant-Analysis.md delete mode 100644 docs/Machine Learning/Generative Adversarial Networks.md delete mode 100644 docs/Machine Learning/Gradient Boosted Regression Trees (GBRT).md delete mode 100644 docs/Machine Learning/Gradient-Boosting-Machines.md delete mode 100644 docs/Machine Learning/Hierarchical Clustering.md delete mode 100644 docs/Machine Learning/K-Means Algorithm.md delete mode 100644 docs/Machine Learning/Light Gradient Boosting Machine.md delete mode 100644 docs/Machine Learning/Linear Discriminant Analysis.md delete mode 100644 docs/Machine Learning/Logistic-Regression.md delete mode 100644 docs/Machine Learning/Multiple Regression Visualized/Weight and bias in Multiple Regression.md delete mode 100644 docs/Machine Learning/Naive Bayes classifier/Images/equation.webp delete mode 100644 docs/Machine Learning/Naive Bayes classifier/Images/thomas bayes.webp delete mode 100644 docs/Machine Learning/Naive Bayes classifier/Naive-Bayes.md delete mode 100644 docs/Machine Learning/Principal Component Analysis.md delete mode 100644 docs/Machine Learning/Random-Forest.md delete mode 100644 docs/Machine Learning/Reinforcement Learning.md delete mode 100644 docs/Machine Learning/SVM Algorithm.md delete mode 100644 docs/Machine Learning/Scikit-Learn.md delete mode 100644 docs/Machine Learning/Stochastic Gradient Descent model.md delete mode 100644 docs/Machine Learning/Support Vector Regression.md delete mode 100644 docs/Machine Learning/Transfer Learning.md delete mode 100644 docs/Machine Learning/linear_regression.md delete mode 100644 docs/Machine Learning/t-Distributed Stochastic Neighbor Embedding.md delete mode 100644 docs/Operating System/_category_.json delete mode 100644 docs/Operating System/device_management.md delete mode 100644 docs/Operating System/distributed_systems.md delete mode 100644 docs/Operating System/file_systems.md delete mode 100644 docs/Operating System/function_of_OS.md delete mode 100644 docs/Operating System/image-1.png delete mode 100644 docs/Operating System/image-10.png delete mode 100644 docs/Operating System/image-11.png delete mode 100644 docs/Operating System/image-12.png delete mode 100644 docs/Operating System/image-2.png delete mode 100644 docs/Operating System/image-3.png delete mode 100644 docs/Operating System/image-4.png delete mode 100644 docs/Operating System/image-5.png delete mode 100644 docs/Operating System/image-6.png delete mode 100644 docs/Operating System/image-7.png delete mode 100644 docs/Operating System/image-8.png delete mode 100644 docs/Operating System/image-9.png delete mode 100644 docs/Operating System/image.png delete mode 100644 docs/Operating System/intro_to_OS.md delete mode 100644 docs/Operating System/memory_management.md delete mode 100644 docs/Operating System/os_development.md delete mode 100644 docs/Operating System/process_management.md delete mode 100644 docs/Operating System/real_time_systems.md delete mode 100644 docs/Operating System/security_and_protection.md delete mode 100644 docs/Operating System/system_calls.md delete mode 100644 docs/Operating System/types_of_OS.md delete mode 100644 docs/Operating System/virtualization.md delete mode 100644 docs/Pandas/Pandas-gettingstarted.md delete mode 100644 docs/Pandas/Read-files.md delete mode 100644 docs/Pandas/_category_.json delete mode 100644 docs/Pandas/image-1.png delete mode 100644 docs/Pandas/image-2.png delete mode 100644 docs/Pandas/image.png delete mode 100644 docs/Pandas/pandas-dataframe.md delete mode 100644 docs/Pandas/pandas-introduction.md delete mode 100644 docs/Pandas/pandas-series.md delete mode 100644 docs/Ruby/BlocksAndProcs.md delete mode 100644 docs/Ruby/CommunityAndRails.md delete mode 100644 docs/Ruby/DynamicTyping.md delete mode 100644 docs/Ruby/GarbageCollection.md delete mode 100644 docs/Ruby/Introduction.md delete mode 100644 docs/Ruby/LibrariesAndGems.md delete mode 100644 docs/Ruby/Metaprogramming.md delete mode 100644 docs/Ruby/MixinsAndINheritance.md delete mode 100644 docs/Ruby/ObjectOriented.md delete mode 100644 docs/Ruby/_category_.json delete mode 100644 docs/SQL/01-intro-to-dbms-sql.md delete mode 100644 docs/SQL/02-crud-operations.md delete mode 100644 docs/SQL/03-crud2.md delete mode 100644 docs/SQL/04-joins-2.md delete mode 100644 docs/SQL/05-aggregate-subqueries.md delete mode 100644 docs/SQL/06-indexing.md delete mode 100644 docs/SQL/07-transactions.md delete mode 100644 docs/SQL/08-schema-design1.md delete mode 100644 docs/SQL/10-views-and-window-function.md delete mode 100644 docs/SQL/SQL-Aggregrate-Function.md delete mode 100644 docs/SQL/SQL-Between-Operator.md delete mode 100644 docs/SQL/SQL-Delete-Statement.md delete mode 100644 docs/SQL/SQL-Inner-Join.md delete mode 100644 docs/SQL/SQL-Insert-Into.md delete mode 100644 docs/SQL/SQL-Joins.md delete mode 100644 docs/SQL/SQL-Left-Join.md delete mode 100644 docs/SQL/SQL-Not-Operator.md delete mode 100644 docs/SQL/SQL-OR-Operator.md delete mode 100644 docs/SQL/SQL-Right-Join.md delete mode 100644 docs/SQL/SQL-Update-Statement.md delete mode 100644 docs/SQL/SQL-Where-Clause.md delete mode 100644 docs/SQL/_category_.json delete mode 100644 docs/SQL/image-1.png delete mode 100644 docs/SQL/index.md delete mode 100644 docs/Swift/Concurrency.md delete mode 100644 docs/Swift/ControlFlow.md delete mode 100644 docs/Swift/ErrorHandling.md delete mode 100644 docs/Swift/FunctionsAndClosures.md delete mode 100644 docs/Swift/Introduction.md delete mode 100644 docs/Swift/MemoryManagement.md delete mode 100644 docs/Swift/Object-OrientedProgramming.md delete mode 100644 docs/Swift/Optionals.md delete mode 100644 docs/Swift/VariablesAndConstants.md delete mode 100644 docs/Swift/_category_.json delete mode 100644 docs/cpp/03_Control_Flow/01_Conditional_Statements.md delete mode 100644 docs/cpp/03_Control_Flow/02_Loops_in_Cpp.md delete mode 100644 docs/cpp/03_Control_Flow/03_Switch_Case_Statements.md delete mode 100644 docs/cpp/03_Control_Flow/_category_.json delete mode 100644 docs/cpp/04_Functions/01_Function_Basics.md delete mode 100644 docs/cpp/04_Functions/02_Function_Parameters_and_Return_Types.md delete mode 100644 docs/cpp/04_Functions/03_Function_Overloading.md delete mode 100644 docs/cpp/04_Functions/_category_.json delete mode 100644 docs/cpp/05_Arrays_and_Strings/01_Array_Basics.md delete mode 100644 docs/cpp/05_Arrays_and_Strings/02_String_Manipulation.md delete mode 100644 docs/cpp/05_Arrays_and_Strings/03_Character_Arrays.md delete mode 100644 docs/cpp/05_Arrays_and_Strings/_category_.json delete mode 100644 docs/cpp/06_Pointers_and_References/01_Pointer_Basics.md delete mode 100644 docs/cpp/06_Pointers_and_References/02_Pointers_and_Arrays.md delete mode 100644 docs/cpp/06_Pointers_and_References/03_Pointers_and_Functions.md delete mode 100644 docs/cpp/06_Pointers_and_References/_category_.json delete mode 100644 docs/cpp/07_Object_Oriented_Programming/01_Classes_and_Objects.md delete mode 100644 docs/cpp/07_Object_Oriented_Programming/02_Inheritance.md delete mode 100644 docs/cpp/07_Object_Oriented_Programming/03_Polymorphism.md delete mode 100644 docs/cpp/07_Object_Oriented_Programming/_category_.json delete mode 100644 docs/cpp/08_Exception_Handling/01_Exception_Basics.md delete mode 100644 docs/cpp/08_Exception_Handling/02_Try_Catch_Block.md delete mode 100644 docs/cpp/08_Exception_Handling/03_Throwing_and_Catching_Exceptions.md delete mode 100644 docs/cpp/08_Exception_Handling/_category_.json delete mode 100644 docs/cpp/09_File_Input_Output/01_File_Handling_Basics.md delete mode 100644 docs/cpp/09_File_Input_Output/02_Read_and_Write_to_Files.md delete mode 100644 docs/cpp/09_File_Input_Output/03_Working_with_File_Pointers.md delete mode 100644 docs/cpp/09_File_Input_Output/_category_.json delete mode 100644 docs/cpp/10_Standard_Template_Library/01_Containers_in_STL.md delete mode 100644 docs/cpp/10_Standard_Template_Library/02_Algorithms_in_STL.md delete mode 100644 docs/cpp/10_Standard_Template_Library/03_Iterators_in_STL.md delete mode 100644 docs/cpp/10_Standard_Template_Library/_category_.json delete mode 100644 docs/cpp/11_Memory_Management/01_Dynamic_Memory_Allocation.md delete mode 100644 docs/cpp/11_Memory_Management/02_Memory_Leak_Detection_and_Prevention.md delete mode 100644 docs/cpp/11_Memory_Management/03_Smart_Pointers.md delete mode 100644 docs/cpp/11_Memory_Management/_category_.json delete mode 100644 docs/cpp/12_Advanced_Topics/01_Templates.md delete mode 100644 docs/cpp/12_Advanced_Topics/02_Multi-threading_in_C++.md delete mode 100644 docs/cpp/12_Advanced_Topics/03_STL_Advanced_Topics.md delete mode 100644 docs/cpp/12_Advanced_Topics/_category_.json delete mode 100644 docs/cpp/13_Debugging_and_Optimization/01_Debugging_Techniques.md delete mode 100644 docs/cpp/13_Debugging_and_Optimization/02_Profiling_and_Optimization.md delete mode 100644 docs/cpp/13_Debugging_and_Optimization/03_Code_Quality_Assurance_Tools.md delete mode 100644 docs/cpp/13_Debugging_and_Optimization/_category_.json delete mode 100644 docs/cpp/14_Cpp_Best_Practices/01_Writing_Clean_and_Maintainable_C++_Code.md delete mode 100644 docs/cpp/14_Cpp_Best_Practices/02_Performance_Optimization_Techniques.md delete mode 100644 docs/cpp/14_Cpp_Best_Practices/03_Exception_Handling_Best_Practices.md delete mode 100644 docs/cpp/14_Cpp_Best_Practices/_category_.json delete mode 100644 docs/cpp/15_Next_Steps_and_Resources/01_Further_Learning_Resources.md delete mode 100644 docs/cpp/15_Next_Steps_and_Resources/02_Advanced_C++_Topics_to_Explore.md delete mode 100644 docs/cpp/15_Next_Steps_and_Resources/03_Community_Forums_and_Support_Networks.md delete mode 100644 docs/cpp/15_Next_Steps_and_Resources/_category_.json delete mode 100644 docs/cpp/_category_.json delete mode 100644 docs/cpp/basic-syntax-and-structure/02_Variables_and_Data_Types.md delete mode 100644 docs/cpp/basic-syntax-and-structure/03_Operators_and_Expressions.md delete mode 100644 docs/cpp/basic-syntax-and-structure/_category_.json delete mode 100644 docs/cpp/basic-syntax-and-structure/cpp-syntax-basics.md delete mode 100644 docs/cpp/home.md delete mode 100644 docs/cpp/introduction-to-cpp/_category_.json delete mode 100644 docs/cpp/introduction-to-cpp/setting-up-your-cpp-environment.md delete mode 100644 docs/cpp/introduction-to-cpp/what-is-cpp.md delete mode 100644 docs/cpp/introduction-to-cpp/why-learn-cpp.md delete mode 100644 docs/dsa/Hash/_category_.json delete mode 100644 docs/dsa/Hash/hash.md delete mode 100644 docs/dsa/Hash/image-1.png delete mode 100644 docs/dsa/Hash/image.png delete mode 100644 docs/dsa/Heaps/_category_.json delete mode 100644 docs/dsa/Heaps/heaps.md delete mode 100644 docs/dsa/Heaps/image.png delete mode 100644 docs/dsa/Kadanes.md delete mode 100644 docs/dsa/Matrix/_category_.json delete mode 100644 docs/dsa/Matrix/image.png delete mode 100644 docs/dsa/Matrix/matrix.md delete mode 100644 docs/dsa/Matrix/problems-matrix.md delete mode 100644 docs/dsa/Queue/_category_.json delete mode 100644 docs/dsa/Queue/image.png delete mode 100644 docs/dsa/Queue/queue.md delete mode 100644 docs/dsa/Trees/Trees.md delete mode 100644 docs/dsa/Trees/_category_.json delete mode 100644 docs/dsa/Trees/image-1.png delete mode 100644 docs/dsa/Trees/image.png delete mode 100644 docs/dsa/_category_.json delete mode 100644 docs/dsa/algorithms/DivideAndConquer.md delete mode 100644 docs/dsa/algorithms/DynamicProgramming.md delete mode 100644 docs/dsa/algorithms/Greedy.md delete mode 100644 docs/dsa/algorithms/_category_.json delete mode 100644 docs/dsa/algorithms/backtracking.md delete mode 100644 docs/dsa/algorithms/bitwise.md delete mode 100644 docs/dsa/algorithms/image-1.png delete mode 100644 docs/dsa/algorithms/image-10.png delete mode 100644 docs/dsa/algorithms/image-2.png delete mode 100644 docs/dsa/algorithms/image-3.png delete mode 100644 docs/dsa/algorithms/image-4.png delete mode 100644 docs/dsa/algorithms/image-5.png delete mode 100644 docs/dsa/algorithms/image-6.png delete mode 100644 docs/dsa/algorithms/image-7.png delete mode 100644 docs/dsa/algorithms/image-8.png delete mode 100644 docs/dsa/algorithms/image-9.png delete mode 100644 docs/dsa/algorithms/image.png delete mode 100644 docs/dsa/algorithms/mathematical_algorithm.md delete mode 100644 docs/dsa/algorithms/patternsearchalgorithm.md delete mode 100644 docs/dsa/algorithms/searching_algorithm.md delete mode 100644 docs/dsa/algorithms/sorting_algorithm.md delete mode 100644 docs/dsa/arrays/2d-arrays.md delete mode 100644 docs/dsa/arrays/_category_.json delete mode 100644 docs/dsa/arrays/arrays-bubblesort-dsa.md delete mode 100644 docs/dsa/arrays/arrays-dsa.md delete mode 100644 docs/dsa/arrays/arrays-insertionsort.md delete mode 100644 docs/dsa/arrays/arrays-selectionsort.md delete mode 100644 docs/dsa/arrays/bucket-sort.md delete mode 100644 docs/dsa/arrays/radix-sort.md delete mode 100644 docs/dsa/basic-concepts/_category_.json delete mode 100644 docs/dsa/basic-concepts/image-1.png delete mode 100644 docs/dsa/basic-concepts/image.png delete mode 100644 docs/dsa/basic-concepts/space-complexity.md delete mode 100644 docs/dsa/basic-concepts/time-complexity.md delete mode 100644 docs/dsa/binary_search/Iterative_binary_search.md delete mode 100644 docs/dsa/binary_search/_category_.json delete mode 100644 docs/dsa/binary_search/binary-search.md delete mode 100644 docs/dsa/binary_search/recursive_binary_search.md delete mode 100644 docs/dsa/data-structure-types.md delete mode 100644 docs/dsa/dsa.md delete mode 100644 docs/dsa/graphs/_category_.json delete mode 100644 docs/dsa/graphs/graphs.md delete mode 100644 docs/dsa/graphs/image.png delete mode 100644 docs/dsa/image.png delete mode 100644 docs/dsa/linkedlist/LinkedList.md delete mode 100644 docs/dsa/linkedlist/LinkedListProblems.md delete mode 100644 docs/dsa/linkedlist/_category_.json delete mode 100644 docs/dsa/master-theorem.md delete mode 100644 docs/dsa/recursion/_category_.json delete mode 100644 docs/dsa/recursion/recursion.md delete mode 100644 docs/dsa/recursion/recursionVsIteration.md delete mode 100644 docs/dsa/recursion/recursion_leetcode_questions.md delete mode 100644 docs/dsa/stack/_category_.json delete mode 100644 docs/dsa/stack/stack-using-array.md delete mode 100644 docs/dsa/strings/_category_.json delete mode 100644 docs/dsa/strings/leetcode_practice_problems_strings.md delete mode 100644 docs/dsa/strings/strings-dsa.md delete mode 100644 docs/java/Spring-and-Spring-Boot/_category_.json delete mode 100644 docs/java/Spring-and-Spring-Boot/aspect-oriented-programming.md delete mode 100644 docs/java/Spring-and-Spring-Boot/dependency-injection.md delete mode 100644 docs/java/Spring-and-Spring-Boot/introduction-to-spring.md delete mode 100644 docs/java/Spring-and-Spring-Boot/object-relational-model.md delete mode 100644 docs/java/Spring-and-Spring-Boot/requestparam-annotation.md delete mode 100644 docs/java/Spring-and-Spring-Boot/spring-environment-setup.md delete mode 100644 docs/java/Spring-and-Spring-Boot/spring-mvc.md delete mode 100644 docs/java/Thymeleaf-in-java/Iteration-and-evalution.md delete mode 100644 docs/java/Thymeleaf-in-java/_category_.json delete mode 100644 docs/java/Thymeleaf-in-java/introduction-to-thymeleaf.md delete mode 100644 docs/java/Thymeleaf-in-java/syntax-in-thymleaf.md delete mode 100644 docs/java/_category_.json delete mode 100644 docs/java/advanced-topics-and-best-practices/_category_.json delete mode 100644 docs/java/advanced-topics-and-best-practices/advanced-java-topics.md delete mode 100644 docs/java/advanced-topics-and-best-practices/java-best-practices-and-code-standards.md delete mode 100644 docs/java/advanced-topics-and-best-practices/java-performance-tuning-and-optimization.md delete mode 100644 docs/java/arrays-and-collections/_category_.json delete mode 100644 docs/java/arrays-and-collections/array-lists-and-collections-framework.md delete mode 100644 docs/java/arrays-and-collections/arrays-in-java.md delete mode 100644 docs/java/arrays-and-collections/sorting-and-searching-arrays.md delete mode 100644 docs/java/arrays-and-collections/using-arrays-and-collections.md delete mode 100644 docs/java/arrays-and-collections/working-with-arrays-and-collections.md delete mode 100644 docs/java/basic-syntax-and-data-types/_category_.json delete mode 100644 docs/java/basic-syntax-and-data-types/java-syntax-and-structure.md delete mode 100644 docs/java/basic-syntax-and-data-types/operators-and-expressions.md delete mode 100644 docs/java/basic-syntax-and-data-types/variables-and-data-types.md delete mode 100644 docs/java/build-automation-with-maven/_category_.json delete mode 100644 docs/java/build-automation-with-maven/configuring-and-building-projects-with-maven.md delete mode 100644 docs/java/build-automation-with-maven/introduction-to-maven.md delete mode 100644 docs/java/build-automation-with-maven/managing-dependencies-and-plugins.md delete mode 100644 docs/java/control-statements/_category_.json delete mode 100644 docs/java/control-statements/conditional-statements.md delete mode 100644 docs/java/control-statements/loops-in-java.md delete mode 100644 docs/java/control-statements/switch-and-ternary-statements.md delete mode 100644 docs/java/exception-handling/_category_.json delete mode 100644 docs/java/exception-handling/checked-vs-unchecked-exceptions.md delete mode 100644 docs/java/exception-handling/exception-basics-and-try-catch.md delete mode 100644 docs/java/exception-handling/exception-handling-best-practices.md delete mode 100644 docs/java/exception-handling/throwing-and-catching-exceptions.md delete mode 100644 docs/java/file-handling-and-io/_category_.json delete mode 100644 docs/java/file-handling-and-io/reading-and-writing-files.md delete mode 100644 docs/java/file-handling-and-io/serialization-and-deserialization.md delete mode 100644 docs/java/file-handling-and-io/working-with-files-and-directories.md delete mode 100644 docs/java/file-handling-and-io/working-with-io-channels.md delete mode 100644 docs/java/file-handling-and-io/working-with-io-readers-and-writers.md delete mode 100644 docs/java/file-handling-and-io/working-with-io-streams.md delete mode 100644 docs/java/generics/Generic Classes.md delete mode 100644 docs/java/generics/Generic methods.md delete mode 100644 docs/java/generics/Introduction to Generics.md delete mode 100644 docs/java/generics/Wildcards.md delete mode 100644 docs/java/gui-programming-with-swing/_category_.json delete mode 100644 docs/java/gui-programming-with-swing/creating-gui-components.md delete mode 100644 docs/java/gui-programming-with-swing/event-handling-and-listeners.md delete mode 100644 docs/java/gui-programming-with-swing/introduction-to-swing.md delete mode 100644 docs/java/gui-programming-with-swing/working-with-dialogs-and-frames.md delete mode 100644 docs/java/gui-programming-with-swing/working-with-layout-managers.md delete mode 100644 docs/java/home.md delete mode 100644 docs/java/introduction-to-java/_category_.json delete mode 100644 docs/java/introduction-to-java/setup-java-development-environment.md delete mode 100644 docs/java/introduction-to-java/what-is-java.md delete mode 100644 docs/java/introduction-to-java/why-learn-java.md delete mode 100644 docs/java/jdbc-and-databases/_category_.json delete mode 100644 docs/java/jdbc-and-databases/connecting-to-a-database.md delete mode 100644 docs/java/jdbc-and-databases/executing-sql-statements-and-transactions.md delete mode 100644 docs/java/jdbc-and-databases/introduction-to-jdbc.md delete mode 100644 docs/java/methods-and-functions/_category_.json delete mode 100644 docs/java/methods-and-functions/method-declaration-and-syntax.md delete mode 100644 docs/java/methods-and-functions/method-overloading-and-recursion.md delete mode 100644 docs/java/methods-and-functions/method-parameters-and-return-values.md delete mode 100644 docs/java/multithreading-and-concurrency/_category_.json delete mode 100644 docs/java/multithreading-and-concurrency/introduction-to-multithreading.md delete mode 100644 docs/java/multithreading-and-concurrency/multithreading-best-practices.md delete mode 100644 docs/java/multithreading-and-concurrency/multithreading-design-patterns.md delete mode 100644 docs/java/multithreading-and-concurrency/synchronization-and-concurrent-collections.md delete mode 100644 docs/java/multithreading-and-concurrency/thread-class-and-runnable-interface.md delete mode 100644 docs/java/multithreading-and-concurrency/thread-pools-and-executors.md delete mode 100644 docs/java/multithreading-and-concurrency/working-with-threads-and-executors.md delete mode 100644 docs/java/networking-in-java/_category_.json delete mode 100644 docs/java/networking-in-java/client-server-communication.md delete mode 100644 docs/java/networking-in-java/networking-best-practices.md delete mode 100644 docs/java/networking-in-java/socket-programming-and-url-connections.md delete mode 100644 docs/java/networking-in-java/working-with-http-and-https.md delete mode 100644 docs/java/networking-in-java/working-with-tcp-and-udp.md delete mode 100644 docs/java/networking-in-java/working-with-web-sockets.md delete mode 100644 docs/java/object-oriented-programming/_category_.json delete mode 100644 docs/java/object-oriented-programming/classes-and-objects.md delete mode 100644 docs/java/object-oriented-programming/custom-exceptions-in-java.md delete mode 100644 docs/java/object-oriented-programming/design-patterns-in-java.md delete mode 100644 docs/java/object-oriented-programming/encapsulation-and-abstraction.md delete mode 100644 docs/java/object-oriented-programming/inheritance-and-polymorphism.md delete mode 100644 docs/java/object-oriented-programming/interfaces-and-abstract-classes.md delete mode 100644 docs/java/object-oriented-programming/object-oriented-design-principles.md delete mode 100644 docs/java/stream-apis/How can create streams.md delete mode 100644 docs/java/stream-apis/Introduction to stream apis.md delete mode 100644 docs/java/stream-apis/Parallel streams.md delete mode 100644 docs/java/stream-apis/Stream operations.md delete mode 100644 docs/java/stream-apis/Using stream with custom objects.md delete mode 100644 docs/java/unit-testing-with-junit/_category_.json delete mode 100644 docs/java/unit-testing-with-junit/introduction-to-junit-framework.md delete mode 100644 docs/java/unit-testing-with-junit/test-suites-and-assertions.md delete mode 100644 docs/java/unit-testing-with-junit/writing-and-running-tests-withjunit.md delete mode 100644 docs/prompt engineering/prompts-basics.md delete mode 100644 docs/prompt engineering/prompts-best-practices.md delete mode 100644 docs/prompt engineering/prompts-examples.md delete mode 100644 docs/prompt engineering/prompts-strategies.md delete mode 100644 docs/prompt engineering/prompts-tools.md delete mode 100644 docs/prompt engineering/prompts-types.md diff --git a/docs/CSS/_category_.json b/docs/CSS/_category_.json index 553c5ddbb..6da1ba5e6 100644 --- a/docs/CSS/_category_.json +++ b/docs/CSS/_category_.json @@ -1,6 +1,6 @@ { "label": "CSS", - "position": 20, + "position": 3, "link": { "type": "generated-index", "description": "In this section, you will learn about the CSS." diff --git a/docs/Computer Networks/_category_.json b/docs/Computer Networks/_category_.json deleted file mode 100644 index aeb009c52..000000000 --- a/docs/Computer Networks/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Computer Networks", - "position":3 , - "link": { - "type": "generated-index", - "description": "Computer Networks is the practice of connecting computers and other devices to share resources and information. This section covers fundamental concepts, protocols, and technologies that form the backbone of network communication." - } - } - \ No newline at end of file diff --git a/docs/Computer Networks/common_network_protocols.md b/docs/Computer Networks/common_network_protocols.md deleted file mode 100644 index 295f05f78..000000000 --- a/docs/Computer Networks/common_network_protocols.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -id: common_network_protocols -title: Common Network Protocols -sidebar_label: Common Network Protocols -sidebar_position: 13 -tags: [computer_networks, networks, communication] -description: Network protocols are the rules and conventions for communication between network devices. They ensure that data is transmitted accurately and efficiently across networks. This document covers some of the most common network protocols are HTTP/HTTPS, FTP, DNS, DHCP, and SMTP. ---- -# Common Network Protocols - -## Introduction -Network protocols are the rules and conventions for communication between network devices. They ensure that data is transmitted accurately and efficiently across networks. This document covers some of the most common network protocols: HTTP/HTTPS, FTP, DNS, DHCP, and SMTP. - -## HTTP/HTTPS (HyperText Transfer Protocol / HyperText Transfer Protocol Secure) -### HTTP -HTTP is the protocol used for transferring web pages on the internet. It operates at the application layer of the OSI model. - -#### Functions of HTTP -- **Request-Response Protocol**: HTTP works on a request-response model where a client (e.g., a web browser) sends a request to a server, which then responds with the requested resource (e.g., a web page). -- **Stateless Protocol**: Each HTTP request is independent, meaning the server does not retain information about previous requests. - -#### Components of HTTP -- **URL (Uniform Resource Locator)**: The address of a resource on the internet. -- **Methods**: Common HTTP methods include GET (retrieve data), POST (send data), PUT (update data), DELETE (remove data). -- **Status Codes**: HTTP responses include status codes indicating the result of the request (e.g., 200 OK, 404 Not Found). - -### HTTPS -HTTPS is the secure version of HTTP. It uses SSL/TLS to encrypt data transmitted between the client and server, ensuring privacy and integrity. - -#### Functions of HTTPS -- **Encryption**: HTTPS encrypts data to protect it from interception and tampering. -- **Authentication**: HTTPS verifies the identity of the server to prevent man-in-the-middle attacks. - -## FTP (File Transfer Protocol) -FTP is a standard protocol for transferring files between computers over a TCP/IP network. It operates at the application layer of the OSI model. - -### Functions of FTP -- **File Transfer**: FTP allows users to upload and download files to and from a server. -- **File Management**: FTP supports basic file management operations such as creating directories, deleting files, and renaming files. - -### Components of FTP -- **FTP Client**: The software used to connect to an FTP server (e.g., FileZilla). -- **FTP Server**: The server that hosts the files and handles client requests. -- **Commands**: FTP uses commands like USER (username), PASS (password), STOR (upload file), and RETR (download file). - -### FTP Modes -- **Active Mode**: The client opens a port and waits for the server to connect to it. -- **Passive Mode**: The server opens a port and waits for the client to connect to it, improving compatibility with firewalls. - -## DNS (Domain Name System) -DNS is the system that translates human-readable domain names (e.g., www.example.com) into IP addresses (e.g., 192.168.1.1). It operates at the application layer of the OSI model. - -### Functions of DNS -- **Name Resolution**: DNS converts domain names into IP addresses, allowing users to access websites using easy-to-remember names. -- **Distributed Database**: DNS is a distributed database, with multiple servers worldwide handling domain name resolutions. - -### Components of DNS -- **DNS Resolver**: The client-side component that initiates DNS queries. -- **DNS Server**: The server that responds to DNS queries. There are several types, including root servers, top-level domain (TLD) servers, and authoritative name servers. -- **DNS Records**: Entries in a DNS database, such as A (address) records, MX (mail exchange) records, and CNAME (canonical name) records. - -## DHCP (Dynamic Host Configuration Protocol) -DHCP is a network management protocol used to automatically assign IP addresses and other network configuration parameters to devices on a network. It operates at the application layer of the OSI model. - -### Functions of DHCP -- **IP Address Assignment**: DHCP dynamically assigns IP addresses to devices, reducing the need for manual configuration. -- **Configuration Distribution**: DHCP can also provide other configuration information, such as the subnet mask, default gateway, and DNS server addresses. - -### Components of DHCP -- **DHCP Server**: The server that assigns IP addresses and configuration information. -- **DHCP Client**: The device that requests an IP address and configuration information. -- **DHCP Lease**: The period during which an IP address is assigned to a device. - -### DHCP Process -1. **Discover**: The client broadcasts a DHCPDISCOVER message to locate a DHCP server. -2. **Offer**: The server responds with a DHCPOFFER message, offering an IP address. -3. **Request**: The client replies with a DHCPREQUEST message, requesting the offered address. -4. **Acknowledge**: The server sends a DHCPACK message, confirming the IP address assignment. - -## SMTP (Simple Mail Transfer Protocol) -SMTP is the protocol used for sending and receiving email. It operates at the application layer of the OSI model. - -### Functions of SMTP -- **Email Transmission**: SMTP transfers email from the sender's mail server to the recipient's mail server. -- **Email Relaying**: SMTP can relay email through multiple servers before it reaches the final destination. - -### Components of SMTP -- **SMTP Client**: The component that sends email (e.g., an email client or mail server). -- **SMTP Server**: The server that receives and forwards email. - -### SMTP Process -1. **Mail Submission**: The email client submits the email to the SMTP server. -2. **Mail Relay**: The SMTP server may relay the email to other SMTP servers. -3. **Mail Delivery**: The final SMTP server delivers the email to the recipient's mail server. - -## Summary -Understanding common network protocols like HTTP/HTTPS, FTP, DNS, DHCP, and SMTP is essential for anyone working with networks. These protocols facilitate communication, file transfer, domain name resolution, IP address assignment, and email transmission, forming the backbone of modern networking. \ No newline at end of file diff --git a/docs/Computer Networks/crc.md b/docs/Computer Networks/crc.md deleted file mode 100644 index df03f1df4..000000000 --- a/docs/Computer Networks/crc.md +++ /dev/null @@ -1,121 +0,0 @@ -# Cyclic Redundancy Check - -CRC or Cyclic Redundancy Check is a method of detecting accidental changes/errors in the communication channel. - -```java - -import java.util.Arrays; -class Program { - - - static String Xor(String a, String b) - { - - - String result = ""; - int n = b.length(); - - for (int i = 1; i < n; i++) { - if (a.charAt(i) == b.charAt(i)) - result += "0"; - else - result += "1"; - } - return result; - } - static String Mod2Div(String dividend, String divisor) - { - - int pick = divisor.length(); - - - String tmp = dividend.substring(0, pick); - - int n = dividend.length(); - - while (pick < n) { - if (tmp.charAt(0) == '1') - - tmp = Xor(divisor, tmp) - + dividend.charAt(pick); - else - - - tmp = Xor(new String(new char[pick]) - .replace("\0", "0"), - tmp) - + dividend.charAt(pick); - - - pick += 1; - } - - - if (tmp.charAt(0) == '1') - tmp = Xor(divisor, tmp); - else - tmp = Xor(new String(new char[pick]) - .replace("\0", "0"), - tmp); - - return tmp; - } - - - static void EncodeData(String data, String key) - { - int l_key = key.length(); - - String appended_data - = (data - + new String(new char[l_key - 1]) - .replace("\0", "0")); - - String remainder = Mod2Div(appended_data, key); - - - String codeword = data + remainder; - System.out.println("Remainder : " + remainder); - System.out.println( - "Encoded Data (Data + Remainder) :" + codeword - + "\n"); - } - static void Receiver(String data, String key) - { - String currxor - = Mod2Div(data.substring(0, key.length()), key); - int curr = key.length(); - while (curr != data.length()) { - if (currxor.length() != key.length()) { - currxor += data.charAt(curr++); - } - else { - currxor = Mod2Div(currxor, key); - } - } - if (currxor.length() == key.length()) { - currxor = Mod2Div(currxor, key); - } - if (currxor.contains("1")) { - System.out.println( - "there is some error in data"); - } - else { - System.out.println("correct message received"); - } - } - - public static void main(String[] args) - { - String data = "100100"; - String key = "1101"; - System.out.println("\nSender side..."); - EncodeData(data, key); - - System.out.println("Receiver side..."); - Receiver(data+Mod2Div(data+new String(new char[key.length() - 1]) - .replace("\0", "0"),key),key); - } -} - -``` diff --git a/docs/Computer Networks/internet_tcp_ip_model.md b/docs/Computer Networks/internet_tcp_ip_model.md deleted file mode 100644 index 51d77cf07..000000000 --- a/docs/Computer Networks/internet_tcp_ip_model.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -id: internet_tcp_ip_model -title: The Internet and TCP/IP Model -sidebar_label: The Internet and TCP/IP Model -sidebar_position: 10 -tags: [computer_networks, networks, communication] -description: The Internet is a global network of interconnected computers and other devices that communicate with each other using standardized protocols.The TCP/IP model (Transmission Control Protocol/Internet Protocol) is a conceptual framework used to understand and implement networking protocols in four layers. ---- -# The Internet and TCP/IP Model - -## What is the Internet? - -The **Internet** is a global network of interconnected computers and other devices that communicate with each other using standardized protocols. It enables the exchange of data and access to information, services, and resources from anywhere in the world. - -### Key Components of the Internet - -1. **Clients and Servers**: Clients are devices that request information or services, while servers provide these services or information. -2. **Routers and Switches**: Routers direct data packets between networks, and switches connect multiple devices within the same network. -3. **Protocols**: Rules and standards that define how data is transmitted and received over the Internet. - -### Services Provided by the Internet - -1. **World Wide Web (WWW)**: A system of interlinked hypertext documents accessed through web browsers. -2. **Email**: Electronic mail services for communication. -3. **File Transfer Protocol (FTP)**: Used for transferring files between devices. -4. **Voice over IP (VoIP)**: Enables voice communication over the Internet. -5. **Streaming Media**: Services like video and audio streaming. - -## The TCP/IP Model - -The **TCP/IP model** (Transmission Control Protocol/Internet Protocol) is a conceptual framework used to understand and implement networking protocols in four layers. It is the foundation of the Internet and most modern networks. The TCP/IP model predates and inspired the OSI model. - -### Layers of the TCP/IP Model - -1. **Network Interface Layer** -2. **Internet Layer** -3. **Transport Layer** -4. **Application Layer** - -#### 1. Network Interface Layer - -The **Network Interface Layer** (also known as the Link Layer) corresponds to the OSI model's Physical and Data Link layers. It handles the physical transmission of data over a network medium. - -- **Functions**: - - Defines how data is physically sent through the network. - - Manages physical addressing and access to the network medium. - - Ensures error-free delivery of data between devices on the same network. - -- **Examples**: - - Ethernet, Wi-Fi, and other LAN technologies. - - Network Interface Cards (NICs) and device drivers. - -#### 2. Internet Layer - -The **Internet Layer** is responsible for logical addressing, routing, and packet forwarding. It corresponds to the OSI model's Network layer. - -- **Functions**: - - Logical addressing using IP addresses. - - Routing of data packets between different networks. - - Fragmentation and reassembly of packets. - -- **Examples**: - - IP (Internet Protocol) - IPv4 and IPv6. - - ICMP (Internet Control Message Protocol) for error and diagnostic messages. - - ARP (Address Resolution Protocol) for mapping IP addresses to MAC addresses. - -#### 3. Transport Layer - -The **Transport Layer** provides end-to-end communication services for applications. It corresponds to the OSI model's Transport layer. - -- **Functions**: - - Reliable data transfer with error detection and correction. - - Flow control and data segmentation. - - Multiplexing and demultiplexing of data streams. - -- **Examples**: - - TCP (Transmission Control Protocol): Provides reliable, connection-oriented communication. - - UDP (User Datagram Protocol): Provides unreliable, connectionless communication. - -#### 4. Application Layer - -The **Application Layer** provides network services directly to user applications. It corresponds to the OSI model's Application, Presentation, and Session layers. - -- **Functions**: - - Provides protocols and services for various applications. - - Facilitates communication between software applications and lower-layer network services. - -- **Examples**: - - HTTP (Hypertext Transfer Protocol) for web communication. - - FTP (File Transfer Protocol) for file transfers. - - SMTP (Simple Mail Transfer Protocol) for email. - - DNS (Domain Name System) for resolving domain names to IP addresses. - -## Comparison Between OSI and TCP/IP Models - -| Feature | OSI Model | TCP/IP Model | -|-----------------------------|--------------------------------|--------------------------| -| Layers | 7 | 4 | -| Development | Developed by ISO | Developed by DARPA | -| Layer Names | Physical, Data Link, Network, Transport, Session, Presentation, Application | Network Interface, Internet, Transport, Application | -| Protocol Specification | Protocol-independent | Protocol-specific (TCP/IP)| -| Usage | Primarily theoretical and educational | Widely used and practical | - -## Importance of the TCP/IP Model - -The TCP/IP model is crucial for the functioning of the Internet and modern networking due to its: - -1. **Standardization**: Provides a standardized set of protocols for data transmission, ensuring interoperability between different devices and networks. -2. **Scalability**: Designed to accommodate growth, allowing the Internet to expand and support a vast number of devices and users. -3. **Flexibility**: Adapts to various types of networks and devices, making it suitable for a wide range of applications. -4. **Robustness**: Ensures reliable data transfer and communication even in the presence of network failures or congestion. - -## Conclusion - -The Internet and the TCP/IP model are foundational elements of modern networking. The TCP/IP model, with its four layers, provides a practical and efficient framework for data communication, enabling the vast and diverse services of the Internet. Understanding the TCP/IP model is essential for networking professionals and anyone involved in the design, implementation, and maintenance of networked systems. \ No newline at end of file diff --git a/docs/Computer Networks/intro_to_cn.md b/docs/Computer Networks/intro_to_cn.md deleted file mode 100644 index 83f7c01c3..000000000 --- a/docs/Computer Networks/intro_to_cn.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: computer_networks -title: Computer Networks -sidebar_label: Computer Networks -sidebar_position: 6 -tags: [computer_networks, networks, communication] -description: Computer Networks is the practice of connecting computers and other devices to share resources and information. This section covers fundamental concepts, protocols, and technologies that form the backbone of network communication. ---- -# Introduction to Computer Networks - -## What Are Computer Networks? - -A **computer network** is a collection of interconnected devices that communicate with each other to share resources and information. These devices can include computers, servers, smartphones, and networking hardware like routers and switches. - -### Key Components of a Network - -1. **Nodes**: These are the devices connected to the network, such as computers, smartphones, printers, and servers. -2. **Links**: These are the communication pathways that connect nodes. They can be physical (cables) or wireless (radio waves). -3. **Switches**: Devices that connect multiple devices within a LAN and use MAC addresses to forward data to the correct destination. -4. **Routers**: Devices that connect different networks together and use IP addresses to route data between networks. -5. **Protocols**: Sets of rules and conventions that determine how data is transmitted and received across the network (e.g., TCP/IP, HTTP). - -### Types of Networks - -1. **Local Area Network (LAN)**: Covers a small geographic area, like a home, office, or building. -2. **Wide Area Network (WAN)**: Spans a large geographic area, such as a city, country, or even globally. -3. **Metropolitan Area Network (MAN)**: Covers a larger geographic area than a LAN but smaller than a WAN, such as a city. -4. **Personal Area Network (PAN)**: Involves a network for personal devices, typically within a range of a few meters, like a Bluetooth connection. -5. **Wireless Networks (WLAN, WWAN)**: Utilizes wireless connections, such as Wi-Fi or cellular networks, to connect devices. - -## Why Are Computer Networks Important? - -Computer networks are vital in today's digital age for several reasons: - -### 1. **Resource Sharing** - -Networks allow for the sharing of resources such as files, applications, and hardware (e.g., printers, scanners). This improves efficiency and reduces costs by enabling multiple users to access shared resources. - -### 2. **Communication and Collaboration** - -Networks facilitate communication through email, instant messaging, video conferencing, and social media platforms. They enable collaboration among users regardless of their physical location, enhancing productivity and innovation. - -### 3. **Data Management and Access** - -Networks enable centralized data storage and management, making it easier to backup, secure, and access data. This ensures data integrity and availability, crucial for business operations and decision-making. - -### 4. **Scalability and Flexibility** - -Networks can be scaled up or down based on the organization's needs. This flexibility allows businesses to adapt to changing demands without significant infrastructure changes. - -### 5. **Enhanced Security** - -Networks provide mechanisms for implementing security measures such as firewalls, encryption, and access controls. These measures protect sensitive data from unauthorized access and cyber threats. - -### 6. **Cost Efficiency** - -By enabling resource sharing and efficient communication, networks reduce operational costs. They eliminate the need for redundant hardware and streamline processes, leading to cost savings. - -## Conclusion - -Computer networks are the backbone of modern communication and information sharing. They are essential for businesses, educational institutions, governments, and individuals to function efficiently and effectively in a connected world. \ No newline at end of file diff --git a/docs/Computer Networks/ip_addressing.md b/docs/Computer Networks/ip_addressing.md deleted file mode 100644 index f0c13b9ca..000000000 --- a/docs/Computer Networks/ip_addressing.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -id: ip_addressing -title: IP Addressing -sidebar_label: IP Addressing -sidebar_position: 11 -tags: [computer_networks, networks, communication] -description: An IP (Internet Protocol) address is a unique identifier assigned to each device connected to a network. It allows devices to locate and communicate with each other on the network. ---- -# IP Addressing - -## What is an IP Address? -An IP (Internet Protocol) address is a unique identifier assigned to each device connected to a network. It allows devices to locate and communicate with each other on the network. There are two main versions of IP addresses in use today: IPv4 and IPv6. - -## IPv4 Addresses -IPv4 addresses are 32-bit numbers, typically represented in decimal format as four octets separated by dots, e.g., `192.168.1.1`. - -### IPv4 Address Structure -- **Network Part**: Identifies the specific network. -- **Host Part**: Identifies the specific device within the network. - -### Classes of IPv4 Addresses -IPv4 addresses are divided into five classes (A, B, C, D, E) based on the leading bits. Classes A, B, and C are used for unicast addresses, while classes D and E are reserved for multicast and experimental purposes, respectively. - -| Class | Starting Address | Ending Address | Default Subnet Mask | -|-------|-------------------|----------------|----------------------| -| A | 0.0.0.0 | 127.255.255.255| 255.0.0.0 | -| B | 128.0.0.0 | 191.255.255.255| 255.255.0.0 | -| C | 192.0.0.0 | 223.255.255.255| 255.255.255.0 | -| D | 224.0.0.0 | 239.255.255.255| N/A | -| E | 240.0.0.0 | 255.255.255.255| N/A | - -### Private IPv4 Addresses -Certain address ranges are reserved for private networks and cannot be routed on the public Internet. These ranges include: -- Class A: `10.0.0.0` to `10.255.255.255` -- Class B: `172.16.0.0` to `172.31.255.255` -- Class C: `192.168.0.0` to `192.168.255.255` - -### IPv4 Subnetting -Subnetting divides a network into smaller subnetworks, allowing for better management and utilization of IP addresses. - -#### Calculating Subnets -To calculate subnets, extend the network part by borrowing bits from the host part. For example, using a Class C address `192.168.1.0/24`, borrowing 2 bits for subnetting would result in `192.168.1.0/26`, creating 4 subnets. - -### Subnet Mask -A subnet mask is a 32-bit number that masks an IP address, dividing it into network and host parts. For example, the subnet mask `255.255.255.0` is equivalent to `/24`. - -## IPv6 Addresses -IPv6 addresses are 128-bit numbers, represented in hexadecimal format as eight groups of four hex digits, separated by colons, e.g., `2001:0db8:85a3:0000:0000:8a2e:0370:7334`. - -### IPv6 Address Structure -- **Global Routing Prefix**: Identifies the network. -- **Subnet ID**: Identifies the subnet within the network. -- **Interface ID**: Identifies the specific device. - -### Types of IPv6 Addresses -- **Unicast**: A single unique address identifying a specific device. -- **Multicast**: An address representing a group of devices, where data sent to this address is received by all group members. -- **Anycast**: An address assigned to multiple devices, where data is routed to the nearest device with that address. - -### IPv6 Address Notation -- **Full Notation**: `2001:0db8:85a3:0000:0000:8a2e:0370:7334` -- **Compressed Notation**: `2001:db8:85a3::8a2e:370:7334` (zeros are omitted) - -## Subnetting in IPv6 -IPv6 subnetting works similarly to IPv4 but is more flexible due to the larger address space. The standard subnet prefix length is `/64`, leaving 64 bits for device addresses within the subnet. - -## CIDR (Classless Inter-Domain Routing) -CIDR is a method for allocating IP addresses and routing that replaces the old system of class-based networks. It allows for more efficient use of IP address space. - -### CIDR Notation -CIDR notation specifies an IP address and its associated network prefix. For example, `192.168.1.0/24` indicates that the first 24 bits are the network part, and the remaining 8 bits are the host part. - -## NAT (Network Address Translation) -NAT is a technique used to remap one IP address space into another. It modifies the IP address information in packet headers while in transit, enabling multiple devices on a local network to share a single public IP address. - -### Types of NAT -- **Static NAT**: Maps a private IP address to a public IP address on a one-to-one basis. -- **Dynamic NAT**: Maps a private IP address to a public IP address from a pool of available addresses. -- **PAT (Port Address Translation)**: Also known as NAT overload, it maps multiple private IP addresses to a single public IP address using different ports. - -## Summary -IP addressing is fundamental for network communication. Understanding IPv4 and IPv6 addresses, subnetting, CIDR, and NAT helps in designing and managing networks efficiently. This knowledge is essential for anyone working in networking and IT fields. \ No newline at end of file diff --git a/docs/Computer Networks/network_devices.md b/docs/Computer Networks/network_devices.md deleted file mode 100644 index 352ddb24e..000000000 --- a/docs/Computer Networks/network_devices.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: basic_network_devices -title: Basic Network Devices -sidebar_label: Basic Network Devices -sidebar_position: 12 -tags: [computer_networks, networks, communication] -description: Understanding the functions of basic network devices such as routers, switches, hubs, modems, and access points is essential for designing and managing effective networks. ---- -# Basic Network Devices - -## Routers -Routers are devices that connect different networks and direct data packets between them. They operate at the network layer (Layer 3) of the OSI model and use IP addresses to determine the best path for data to travel. - -### Functions of Routers -- **Packet Forwarding**: Routers receive data packets and forward them to their destination based on IP addresses. -- **Routing**: Routers maintain routing tables and use routing protocols (e.g., OSPF, BGP) to determine the best path for data packets. -- **Network Segmentation**: Routers can divide large networks into smaller, more manageable subnets. -- **Network Address Translation (NAT)**: Routers can perform NAT, allowing multiple devices on a local network to share a single public IP address. -- **Firewall**: Many routers have built-in firewalls to filter traffic and enhance security. - -## Switches -Switches are devices that connect devices within a local area network (LAN) and operate at the data link layer (Layer 2) of the OSI model. They use MAC addresses to forward data to the correct destination. - -### Functions of Switches -- **Frame Forwarding**: Switches receive frames and forward them to the appropriate device based on MAC addresses. -- **MAC Address Learning**: Switches maintain a MAC address table to keep track of the devices connected to each port. -- **Segmentation**: Switches create separate collision domains, reducing network congestion and improving performance. -- **VLANs (Virtual LANs)**: Switches can create VLANs to segment network traffic logically, enhancing security and management. - -## Hubs -Hubs are basic network devices that connect multiple Ethernet devices, making them act as a single network segment. They operate at the physical layer (Layer 1) of the OSI model. - -### Functions of Hubs -- **Data Transmission**: Hubs receive data from one device and broadcast it to all other connected devices. -- **Signal Amplification**: Hubs can amplify signals to extend the distance that data can travel. -- **Network Expansion**: Hubs can be used to connect multiple devices in a simple network. - -### Limitations of Hubs -- **No Data Filtering**: Hubs do not filter data or direct it to specific devices, leading to unnecessary network traffic. -- **Single Collision Domain**: All devices connected to a hub share the same collision domain, which can lead to data collisions and network inefficiency. - -## Modems -Modems are devices that modulate and demodulate analog signals for digital data transmission over telephone lines or cable systems. They enable internet connectivity by converting digital data from a computer into analog signals for transmission and vice versa. - -### Functions of Modems -- **Signal Modulation**: Modems convert digital data into analog signals for transmission over telephone or cable lines. -- **Signal Demodulation**: Modems convert incoming analog signals back into digital data for the computer to process. -- **Internet Connectivity**: Modems establish and maintain a connection to the internet service provider (ISP). -- **Error Detection and Correction**: Modems can detect and correct errors that occur during data transmission. - -## Access Points -Access Points (APs) are devices that allow wireless devices to connect to a wired network using Wi-Fi. They extend the range of a wired network and provide wireless connectivity. - -### Functions of Access Points -- **Wireless Connectivity**: APs provide Wi-Fi access to wireless devices, enabling them to connect to a wired network. -- **Network Extension**: APs extend the coverage area of a network, allowing devices to connect from a greater distance. -- **Roaming Support**: APs enable seamless roaming, allowing devices to move between different APs without losing connectivity. -- **Security**: APs can implement wireless security protocols (e.g., WPA2, WPA3) to protect the network from unauthorized access. - -## Summary -Understanding the functions of basic network devices such as routers, switches, hubs, modems, and access points is essential for designing and managing effective networks. Each device plays a specific role in ensuring efficient data transmission, network connectivity, and security. diff --git a/docs/Computer Networks/network_security.md b/docs/Computer Networks/network_security.md deleted file mode 100644 index d8660055e..000000000 --- a/docs/Computer Networks/network_security.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: network_security -title: Network Security -sidebar_label: Network Security -sidebar_position: 15 -tags: [computer_networks, networks, communication] -description: Network security is a critical aspect of information technology that ensures the integrity, confidentiality, and availability of data as it is transmitted and received across networks ---- -# Network Security Basics - -## Introduction -Network security is a critical aspect of information technology that ensures the integrity, confidentiality, and availability of data as it is transmitted and received across networks. Effective network security involves a combination of hardware, software, policies, and procedures designed to defend against threats and unauthorized access. This document covers the importance of network security, firewalls, antivirus software, and best practices in detail. - -## Importance of Network Security -Network security is vital for protecting sensitive data, maintaining privacy, and ensuring the reliability of communications. Key reasons for its importance include: - -- **Protection of Sensitive Data**: Safeguarding personal information, financial data, and intellectual property from unauthorized access and breaches. -- **Prevention of Cyber Attacks**: Defending against malware, phishing, ransomware, and other cyber threats that can disrupt operations and cause financial loss. -- **Compliance with Regulations**: Adhering to legal and regulatory requirements for data protection, such as GDPR, HIPAA, and PCI-DSS. -- **Maintaining Trust**: Ensuring customers and stakeholders have confidence in the security measures in place, which is essential for maintaining a good reputation and business continuity. -- **Ensuring Network Availability**: Preventing network downtime and ensuring continuous access to critical services and resources. - -## Firewalls -Firewalls are network security devices that monitor and control incoming and outgoing network traffic based on predetermined security rules. They act as a barrier between trusted internal networks and untrusted external networks. - -### Types of Firewalls -- **Packet-Filtering Firewalls**: Inspect packets and allow or deny them based on source and destination IP addresses, ports, and protocols. -- **Stateful Inspection Firewalls**: Monitor the state of active connections and make decisions based on the context of traffic, ensuring that only legitimate packets are allowed. -- **Proxy Firewalls**: Act as intermediaries between end-users and the internet, providing additional security by inspecting and filtering content at the application layer. -- **Next-Generation Firewalls (NGFW)**: Combine traditional firewall capabilities with advanced features like intrusion prevention, deep packet inspection, and application awareness. - -### Functions of Firewalls -- **Traffic Filtering**: Allowing or blocking traffic based on security rules. -- **Intrusion Detection and Prevention**: Identifying and stopping malicious activities. -- **Network Segmentation**: Dividing a network into smaller segments to improve security and performance. -- **VPN Support**: Enabling secure remote access to the network through virtual private networks. - -## Antivirus Software -Antivirus software is designed to detect, prevent, and remove malware, including viruses, worms, trojans, and other malicious programs. It plays a crucial role in protecting individual devices and networks from cyber threats. - -### Functions of Antivirus Software -- **Malware Detection**: Scanning files and systems for known malware signatures and behaviors. -- **Real-Time Protection**: Continuously monitoring for malicious activities and blocking threats as they occur. -- **Quarantine and Removal**: Isolating and removing infected files to prevent further spread of malware. -- **System Scanning**: Performing regular and on-demand scans to ensure the system is free of malware. - -### Types of Malware Detected by Antivirus -- **Viruses**: Malicious programs that attach themselves to legitimate files and spread to other files and systems. -- **Worms**: Self-replicating malware that spreads across networks without user intervention. -- **Trojans**: Malicious software disguised as legitimate programs, which can create backdoors for unauthorized access. -- **Spyware**: Software that secretly collects user information and sends it to a remote attacker. -- **Ransomware**: Malware that encrypts files and demands payment for their release. - -## Best Practices for Network Security -Implementing best practices for network security helps to mitigate risks and protect against threats. Key best practices include: - -1. **Regular Software Updates** - - Keep all software, including operating systems and applications, up to date with the latest security patches. - -2. **Strong Password Policies** - - Enforce the use of complex passwords and regular password changes. - - Implement multi-factor authentication (MFA) for additional security. - -3. **Network Segmentation** - - Divide the network into segments to limit the spread of attacks and improve performance. - -4. **Data Encryption** - - Use encryption to protect sensitive data both in transit and at rest. - -5. **Security Awareness Training** - - Educate employees on security best practices and how to recognize phishing and other social engineering attacks. - -6. **Regular Security Audits** - - Conduct regular security assessments and vulnerability scans to identify and address weaknesses. - -7. **Access Control** - - Implement strict access controls to ensure that only authorized users have access to sensitive information and systems. - -8. **Backup and Recovery** - - Regularly back up data and have a disaster recovery plan in place to quickly restore operations in the event of an attack. - -9. **Intrusion Detection and Prevention Systems (IDPS)** - - Use IDPS to monitor network traffic for suspicious activities and take action to prevent potential threats. - -10. **Secure Configuration** - - Ensure that all network devices and systems are securely configured according to best practices and industry standards. - -## Summary -Network security is essential for protecting data, maintaining privacy, and ensuring the reliability of communications. Firewalls and antivirus software play critical roles in defending against cyber threats. By implementing best practices, organizations can significantly enhance their network security posture and mitigate risks. \ No newline at end of file diff --git a/docs/Computer Networks/network_topologies.md b/docs/Computer Networks/network_topologies.md deleted file mode 100644 index df8552287..000000000 --- a/docs/Computer Networks/network_topologies.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -id: network_topologies -title: Network Topologies -sidebar_label: Network Topologies -sidebar_position: 8 -tags: [computer_networks, networks, communication] -description: A network topology is the arrangement of different elements (links, nodes, etc.) in a computer network. ---- -# Network Topologies - -## What is a Network Topology? - -A **network topology** is the arrangement of different elements (links, nodes, etc.) in a computer network. It is the structure or layout of a network and how different nodes in a network are connected and communicate with each other. The choice of topology affects the network's performance and scalability. - -### Types of Network Topologies - -1. **Bus Topology** -2. **Star Topology** -3. **Ring Topology** -4. **Mesh Topology** -5. **Tree Topology** -6. **Hybrid Topology** - -#### 1. Bus Topology - -In a **bus topology**, all the devices are connected to a single central cable, known as the bus or backbone. Data sent from a node is broadcast to all devices on the network, but only the intended recipient accepts and processes the data. - -- **Characteristics**: - - Simple and easy to install. - - Uses a single cable for data transmission. - - Suitable for small networks. - -- **Advantages**: - - Cost-effective due to minimal cabling. - - Easy to add new devices to the network. - - Requires less cable than some other topologies. - -- **Disadvantages**: - - Limited cable length and number of devices. - - If the main cable (bus) fails, the entire network goes down. - - Performance degrades as more devices are added. - -- **Examples**: - - Early Ethernet networks. - - Small office or home networks where cost is a primary concern. - -#### 2. Star Topology - -In a **star topology**, all devices are connected to a central hub or switch. The hub acts as a repeater for data flow. - -- **Characteristics**: - - Each device has a dedicated connection to the central hub. - - The hub manages and controls all functions of the network. - -- **Advantages**: - - Easy to install and manage. - - Failure of one device does not affect the others. - - Simple to add new devices without disrupting the network. - -- **Disadvantages**: - - If the central hub fails, the entire network goes down. - - Requires more cable than bus topology. - - Hub can become a bottleneck if too many devices are connected. - -- **Examples**: - - Modern Ethernet networks. - - Office environments with a centralized management hub. - -#### 3. Ring Topology - -In a **ring topology**, each device is connected to two other devices, forming a circular data path. Data travels in one direction (or in some cases, both directions) around the ring until it reaches its destination. - -- **Characteristics**: - - Each device has exactly two neighbors for communication. - - Data travels in a circular fashion. - -- **Advantages**: - - Data packets travel at high speed. - - Easy to install and reconfigure. - - Better performance than bus topology under heavy load. - -- **Disadvantages**: - - Failure of a single device can disrupt the entire network. - - Troubleshooting can be difficult. - - Adding or removing devices can disrupt the network. - -- **Examples**: - - Token Ring networks. - - Some metropolitan area networks (MANs). - -#### 4. Mesh Topology - -In a **mesh topology**, every device is connected to every other device in the network. This provides high redundancy and reliability. - -- **Characteristics**: - - Full mesh: Every device is connected to every other device. - - Partial mesh: Some devices are connected to multiple devices, but not all. - -- **Advantages**: - - Provides high redundancy and reliability. - - Failure of one link does not affect the entire network. - - Excellent for large networks where reliability is crucial. - -- **Disadvantages**: - - Expensive due to the large amount of cabling and network interfaces required. - - Complex to install and manage. - -- **Examples**: - - Military networks. - - High-reliability networks in financial institutions. - -#### 5. Tree Topology - -A **tree topology** is a combination of star and bus topologies. It consists of groups of star-configured networks connected to a linear bus backbone. - -- **Characteristics**: - - Hierarchical structure with root nodes and leaf nodes. - - Combines characteristics of both bus and star topologies. - -- **Advantages**: - - Scalable and easy to add new devices. - - Fault isolation is easier. - - Supports future expansion of network segments. - -- **Disadvantages**: - - If the backbone line fails, the entire segment goes down. - - Requires more cable than bus topology. - -- **Examples**: - - Corporate networks with departmental segmentation. - - School campus networks. - -#### 6. Hybrid Topology - -A **hybrid topology** is a combination of two or more different types of topologies. It aims to leverage the advantages of each of the component topologies. - -- **Characteristics**: - - Combines features of multiple topologies. - - Can be tailored to meet specific needs. - -- **Advantages**: - - Flexible and scalable. - - Optimized performance based on specific requirements. - - Fault tolerance can be enhanced by combining robust topologies. - -- **Disadvantages**: - - Can be complex and expensive to design and implement. - - Managing and maintaining the network can be challenging. - -- **Examples**: - - Large enterprise networks with multiple departmental networks using different topologies. - - Campus networks with a combination of star and mesh configurations. - -## Conclusion - -Understanding network topologies is essential for designing efficient and reliable networks. Each topology has its own set of advantages and disadvantages, making them suitable for different scenarios and requirements. Selecting the appropriate topology can significantly impact the performance, scalability, and resilience of the network. - diff --git a/docs/Computer Networks/osi_model.md b/docs/Computer Networks/osi_model.md deleted file mode 100644 index 24ba8057d..000000000 --- a/docs/Computer Networks/osi_model.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -id: osi-model -title: The OSI Model -sidebar_label: The OSI Model -sidebar_position: 9 -tags: [computer_networks, networks, communication] -description: The Open Systems Interconnection (OSI) model is a conceptual framework used to understand and implement network protocols in seven layers. ---- - -# The OSI Model - -## What is the OSI Model? - -The **Open Systems Interconnection (OSI) model** is a conceptual framework used to understand and implement network protocols in seven layers. It was developed by the International Organization for Standardization (ISO) to standardize networking protocols and ensure different systems can communicate with each other. Each layer serves a specific function and communicates with the layers directly above and below it. - -### The Seven Layers of the OSI Model - -1. **Physical Layer (Layer 1)** -2. **Data Link Layer (Layer 2)** -3. **Network Layer (Layer 3)** -4. **Transport Layer (Layer 4)** -5. **Session Layer (Layer 5)** -6. **Presentation Layer (Layer 6)** -7. **Application Layer (Layer 7)** - -#### 1. Physical Layer (Layer 1) - -The **Physical Layer** is responsible for the physical connection between devices. It deals with the transmission and reception of raw bitstreams over a physical medium. - -- **Functions**: - - Defines the hardware elements involved in the network, including cables, switches, and NICs (Network Interface Cards). - - Specifies the electrical, mechanical, and procedural interface to the transmission medium. - - Converts data into signals appropriate for the transmission medium. - -- **Examples**: - - Ethernet cables, fiber optics, and wireless radio frequencies. - - Standards like RS-232, RJ45, and IEEE 802.11. - -#### 2. Data Link Layer (Layer 2) - -The **Data Link Layer** provides node-to-node data transfer and handles error detection and correction from the Physical Layer. It is divided into two sublayers: Logical Link Control (LLC) and Media Access Control (MAC). - -- **Functions**: - - Establishes and terminates a logical link between nodes. - - Frame traffic control and flow control. - - Error detection and correction. - - Physical addressing (MAC addresses). - -- **Examples**: - - Ethernet, Wi-Fi (IEEE 802.11), and PPP (Point-to-Point Protocol). - - Switches and bridges operating at this layer. - -#### 3. Network Layer (Layer 3) - -The **Network Layer** is responsible for packet forwarding, including routing through intermediate routers. - -- **Functions**: - - Logical addressing (IP addresses). - - Routing and forwarding of data packets. - - Fragmentation and reassembly of packets. - - Handling of packet switching and congestion control. - -- **Examples**: - - IP (Internet Protocol), ICMP (Internet Control Message Protocol), and OSPF (Open Shortest Path First). - - Routers operate at this layer. - -#### 4. Transport Layer (Layer 4) - -The **Transport Layer** ensures complete data transfer. It provides reliable data transfer services to the upper layers. - -- **Functions**: - - Establishment, maintenance, and termination of a connection. - - Error detection and recovery. - - Flow control and data segmentation. - - Multiplexing of multiple communication streams. - -- **Examples**: - - TCP (Transmission Control Protocol) and UDP (User Datagram Protocol). - - Port numbers and sockets. - -#### 5. Session Layer (Layer 5) - -The **Session Layer** manages sessions between applications. It establishes, maintains, and terminates connections between applications. - -- **Functions**: - - Session establishment, maintenance, and termination. - - Synchronization of data exchange. - - Dialog control, managing two-way communications. - -- **Examples**: - - RPC (Remote Procedure Call) and NetBIOS. - - Management of connections in client-server applications. - -#### 6. Presentation Layer (Layer 6) - -The **Presentation Layer** translates data between the application layer and the network format. It is responsible for data encoding, compression, and encryption. - -- **Functions**: - - Data translation and encoding. - - Data compression. - - Data encryption and decryption. - -- **Examples**: - - JPEG, GIF, PNG (image formats). - - SSL/TLS (encryption protocols). - -#### 7. Application Layer (Layer 7) - -The **Application Layer** provides network services directly to end-users. It facilitates communication between software applications and lower-layer network services. - -- **Functions**: - - Network process to application. - - Provides protocols and services for email, file transfer, and other network software services. - - End-user services such as web browsers, email clients, and file sharing applications. - -- **Examples**: - - HTTP, FTP, SMTP, and DNS. - - Applications like web browsers (Chrome, Firefox), email clients (Outlook, Gmail), and file sharing tools (Dropbox). - -## Importance of the OSI Model - -The OSI model is crucial for understanding and designing interoperable network systems. It: - -- **Standardizes Networking Protocols**: Provides a universal set of guidelines to ensure different network devices and protocols can work together. -- **Facilitates Troubleshooting**: Helps network administrators diagnose and fix network issues by breaking down the problem into specific layers. -- **Encourages Modular Engineering**: Promotes the design of network systems in modular layers, making it easier to upgrade or replace specific components without affecting the entire system. - -## Conclusion - -The OSI model is a foundational concept in networking that helps us understand how different network protocols and devices interact. By breaking down the complex process of network communication into seven distinct layers, it provides a clear framework for network design, implementation, and troubleshooting. \ No newline at end of file diff --git a/docs/Computer Networks/types-of-networks.md b/docs/Computer Networks/types-of-networks.md deleted file mode 100644 index 25d751b8e..000000000 --- a/docs/Computer Networks/types-of-networks.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -id: types_of_networks -title: Types of Networks -sidebar_label: Types Of Networks -sidebar_position: 7 -tags: [computer_networks, networks, communication] -description: Computer networks can be categorized based on their size, range, and structure. The most common types are listed in this section. - ---- -# Types of Networks -Computer networks can be categorized based on their size, range, and structure. The most common types are: - -#### 1. Local Area Network (LAN) - -A **Local Area Network (LAN)** is a network that covers a small geographic area, typically a single building or a campus. LANs are commonly used to connect computers and devices within an office, school, or home environment. - -- **Characteristics**: - - High data transfer rates (typically from 100 Mbps to 10 Gbps). - - Limited geographic range, usually within a single building or a group of buildings. - - Owned, managed, and maintained by a single organization or individual. - -- **Uses**: - - Sharing files, printers, and other resources among connected devices. - - Enabling communication through email and instant messaging within the network. - - Supporting collaborative work environments with shared applications and data storage. - -- **Examples**: - - A home network connecting a few computers, smartphones, and a printer. - - An office network connecting workstations, servers, and other network devices. - -#### 2. Wide Area Network (WAN) - -A **Wide Area Network (WAN)** spans a large geographic area, such as a city, country, or even the globe. WANs are used to connect multiple LANs that are geographically dispersed. - -- **Characteristics**: - - Lower data transfer rates compared to LANs (ranging from 56 Kbps to several Gbps). - - Covers large geographic areas, often using leased telecommunication lines. - - Can be public (the internet) or private (a company's intranet). - -- **Uses**: - - Connecting remote offices of a business, allowing data sharing and communication across long distances. - - Enabling internet access for users and organizations. - - Supporting global communication and information exchange. - -- **Examples**: - - The internet is the largest WAN, connecting millions of private, public, academic, and government networks. - - A company's intranet connecting its headquarters with branch offices around the world. - -#### 3. Metropolitan Area Network (MAN) - -A **Metropolitan Area Network (MAN)** covers a larger geographic area than a LAN but smaller than a WAN, such as a city or a large campus. MANs are used to connect multiple LANs within a metropolitan area. - -- **Characteristics**: - - Intermediate data transfer rates (typically between 10 Mbps and 1 Gbps). - - Spans a city or a large campus. - - Can be owned and operated by a single organization or a consortium of organizations. - -- **Uses**: - - Connecting multiple LANs within a city, providing high-speed data transfer and communication. - - Enabling efficient resource sharing and data exchange within a metropolitan area. - - Supporting public services such as city-wide Wi-Fi networks and municipal services. - -- **Examples**: - - A city-wide network connecting various government offices, libraries, and public facilities. - - A university campus network connecting different departments and buildings. - -#### 4. Personal Area Network (PAN) - -A **Personal Area Network (PAN)** involves a network for personal devices, typically within a range of a few meters. PANs are used to connect personal electronic devices such as smartphones, tablets, laptops, and wearable devices. - -- **Characteristics**: - - Short-range communication (typically within 10 meters). - - Low data transfer rates compared to LANs and WANs. - - Usually wireless, but can also include wired connections. - -- **Uses**: - - Connecting personal devices for data synchronization and file sharing. - - Enabling communication between wearable devices and smartphones. - - Facilitating the use of personal wireless peripherals such as Bluetooth headphones and keyboards. - -- **Examples**: - - A Bluetooth connection between a smartphone and a wireless headset. - - A Wi-Fi network connecting a laptop and a printer within a home. - -Understanding the different types of networks is crucial for designing and implementing effective networking solutions. Each type of network serves specific purposes and is suited for different scenarios based on geographic scope, data transfer requirements, and user needs. diff --git a/docs/Computer Networks/wireless_networking.md b/docs/Computer Networks/wireless_networking.md deleted file mode 100644 index a4aed9716..000000000 --- a/docs/Computer Networks/wireless_networking.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -id: wireless_networking -title: Wireless Networking -sidebar_label: Wireless Networking -sidebar_position: 14 -tags: [computer_networks, networks, communication] -description: Wireless networking allows devices to connect and communicate without physical cables, using radio frequency signals. ---- -# Wireless Networking - -## Introduction -Wireless networking allows devices to connect and communicate without physical cables, using radio frequency signals. Two common wireless technologies are Wi-Fi and Bluetooth, each serving different purposes and use cases. This document covers the basics of Wi-Fi and Bluetooth, and provides detailed information on Wi-Fi security. - -## Basics of Wi-Fi -Wi-Fi (Wireless Fidelity) is a wireless networking technology that allows devices to connect to a local area network (LAN) and access the internet without physical cables. It operates within the IEEE 802.11 standards. - -### How Wi-Fi Works -- **Access Points (APs)**: Devices, such as routers, that broadcast Wi-Fi signals and connect wireless devices to a wired network. -- **Wi-Fi Adapters**: Hardware in devices (e.g., laptops, smartphones) that receive and send Wi-Fi signals. -- **Frequency Bands**: Wi-Fi typically operates on 2.4 GHz and 5 GHz frequency bands. -- **Channels**: Frequency bands are divided into channels to minimize interference. - -### Wi-Fi Standards -- **802.11a**: Operates at 5 GHz, supports up to 54 Mbps. -- **802.11b**: Operates at 2.4 GHz, supports up to 11 Mbps. -- **802.11g**: Operates at 2.4 GHz, supports up to 54 Mbps. -- **802.11n**: Operates at 2.4 GHz and 5 GHz, supports up to 600 Mbps. -- **802.11ac**: Operates at 5 GHz, supports up to several Gbps. -- **802.11ax (Wi-Fi 6)**: Operates at 2.4 GHz and 5 GHz, supports higher data rates and improved performance in congested environments. - -## Basics of Bluetooth -Bluetooth is a wireless technology for short-range communication between devices. It operates at 2.4 GHz and is widely used for connecting peripherals, such as keyboards, mice, headphones, and smart devices. - -### How Bluetooth Works -- **Pairing**: The process of establishing a connection between two Bluetooth devices. -- **Profiles**: Define specific Bluetooth functions and applications (e.g., A2DP for audio streaming, HID for input devices). -- **Range**: Typically up to 10 meters for most devices, though some classes can reach up to 100 meters. - -### Bluetooth Versions -- **Bluetooth 1.0-1.2**: Basic features with data rates up to 1 Mbps. -- **Bluetooth 2.0-2.1**: Enhanced data rates up to 3 Mbps. -- **Bluetooth 3.0**: High-Speed data transfer using Wi-Fi. -- **Bluetooth 4.0-4.2**: Low Energy (LE) for power-efficient communication. -- **Bluetooth 5.0**: Improved range, speed, and broadcast capacity. - -## Wi-Fi Security -Securing a Wi-Fi network is crucial to protect data and prevent unauthorized access. Various security protocols and practices help achieve this. - -### Wi-Fi Security Protocols -- **WEP (Wired Equivalent Privacy)**: An older security protocol that provides weak protection due to vulnerabilities. -- **WPA (Wi-Fi Protected Access)**: Improved security over WEP with dynamic key encryption. -- **WPA2 (Wi-Fi Protected Access II)**: Uses AES encryption for stronger security and is widely used today. -- **WPA3 (Wi-Fi Protected Access III)**: The latest security protocol offering improved encryption and protection against brute-force attacks. - -### Common Wi-Fi Security Measures -1. **Change Default SSID and Password** - - **SSID (Service Set Identifier)**: The name of your Wi-Fi network. Change the default SSID to a unique name. - - **Password**: Use a strong, unique password for your Wi-Fi network. - -2. **Enable Network Encryption** - - Use WPA3 if supported; otherwise, use WPA2. - -3. **Disable SSID Broadcasting** - - Hides your Wi-Fi network from casual discovery. Devices must know the SSID to connect. - -4. **Enable MAC Address Filtering** - - Restrict network access to devices with specific MAC addresses. - -5. **Use a Guest Network** - - Set up a separate network for guests to keep your primary network secure. - -6. **Regularly Update Router Firmware** - - Keep your router's firmware up to date to protect against security vulnerabilities. - -7. **Implement Network Firewalls** - - Use built-in router firewalls and consider additional software firewalls on connected devices. - -8. **Disable Remote Management** - - Turn off remote management features unless specifically needed. - -### Advanced Wi-Fi Security Practices -- **VPN (Virtual Private Network)**: Use a VPN to encrypt internet traffic and protect data privacy. -- **Network Segmentation**: Create separate networks for different device types (e.g., IoT devices on a separate network). -- **Intrusion Detection Systems (IDS)**: Monitor network traffic for suspicious activity. - -## Summary -Wireless networking, through technologies like Wi-Fi and Bluetooth, enables convenient and flexible connectivity. Understanding the basics of these technologies and implementing robust Wi-Fi security measures is essential for protecting data and ensuring reliable communication in both personal and professional environments. \ No newline at end of file diff --git a/docs/DBMS/Entity-Relational Model/_category.json b/docs/DBMS/Entity-Relational Model/_category.json deleted file mode 100644 index 78b19ec4a..000000000 --- a/docs/DBMS/Entity-Relational Model/_category.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Entity-Relational Model", - "position": 1, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the Entity-Relational Model in DBMS, a fundamental concept for conceptual design of databases. We will cover the basics of entities, relationships, attributes, and constraints, and how they are used to create a structured database schema." - } - } - \ No newline at end of file diff --git a/docs/DBMS/Entity-Relational Model/dbms-generalization-and-aggregation.md b/docs/DBMS/Entity-Relational Model/dbms-generalization-and-aggregation.md deleted file mode 100644 index 1356900f6..000000000 --- a/docs/DBMS/Entity-Relational Model/dbms-generalization-and-aggregation.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -id: dbms-generalization-and-aggregation -title: DBMS - Generalization and Aggregation -sidebar_label: Generalization and Aggregation -sidebar_position: 3 -description: Learn about the concepts of Generalization and Aggregation in DBMS, which allow expressing database entities in a conceptual hierarchical manner. -tags: - - DBMS - - Generalization - - Aggregation - - Database Design ---- - -# DBMS - Generalization and Aggregation - -The ER Model has the power of expressing database entities in a conceptual hierarchical manner. As the hierarchy goes up, it generalizes the view of entities, and as we go deep in the hierarchy, it gives us the detail of every entity included. - -Going up in this structure is called generalization, where entities are clubbed together to represent a more generalized view. For example, a particular student named Mira can be generalized along with all the students. The entity shall be a student, and further, the student is a person. The reverse is called specialization where a person is a student, and that student is Mira. - -## Generalization - -As mentioned above, the process of generalizing entities, where the generalized entities contain the properties of all the generalized entities, is called generalization. In generalization, a number of entities are brought together into one generalized entity based on their similar characteristics. For example, pigeon, house sparrow, crow, and dove can all be generalized as Birds. - -### Example of Generalization - -| Specific Entities | Generalized Entity | -|-------------------|---------------------| -| Pigeon | Bird | -| House Sparrow | Bird | -| Crow | Bird | -| Dove | Bird | - -```mermaid ---- -title: Generalization Example ---- -erDiagram - PIGEON }|..|{ BIRD : generalizes - HOUSE_SPARROW }|..|{ BIRD : generalizes - CROW }|..|{ BIRD : generalizes - DOVE }|..|{ BIRD : generalizes -``` - -## Specialization - -Specialization is the opposite of generalization. In specialization, a group of entities is divided into sub-groups based on their characteristics. Take a group ‘Person’ for example. A person has a name, date of birth, gender, etc. These properties are common in all persons, human beings. But in a company, persons can be identified as employee, employer, customer, or vendor, based on what role they play in the company. - -### Example of Specialization - -| General Entity | Specialized Entities | -|----------------|--------------------------| -| Person | Employee, Employer, Customer, Vendor | - -```mermaid ---- -title: Specialization Example ---- -erDiagram - PERSON ||--o{ EMPLOYEE : specializes - PERSON ||--o{ EMPLOYER : specializes - PERSON ||--o{ CUSTOMER : specializes - PERSON ||--o{ VENDOR : specializes -``` - -Similarly, in a school database, persons can be specialized as teacher, student, or a staff, based on what role they play in school as entities. - -## Inheritance - -We use all the above features of ER-Model in order to create classes of objects in object-oriented programming. The details of entities are generally hidden from the user; this process is known as abstraction. - -Inheritance is an important feature of Generalization and Specialization. It allows lower-level entities to inherit the attributes of higher-level entities. - -### Example of Inheritance - -| Higher-level Entity | Attributes | Lower-level Entities | -|---------------------|-----------------------------|------------------------| -| Person | Name, Age, Gender | Student, Teacher | - -```mermaid ---- -title: Inheritance Example ---- -erDiagram - PERSON { - string name - int age - string gender - } - STUDENT { - string school - string grade - } - TEACHER { - string subject - string department - } - PERSON ||--o{ STUDENT : inherits - PERSON ||--o{ TEACHER : inherits -``` - -For example, the attributes of a Person class such as name, age, and gender can be inherited by lower-level entities such as Student or Teacher. \ No newline at end of file diff --git a/docs/DBMS/Entity-Relational Model/er-diagram-representation.md b/docs/DBMS/Entity-Relational Model/er-diagram-representation.md deleted file mode 100644 index 73b97600f..000000000 --- a/docs/DBMS/Entity-Relational Model/er-diagram-representation.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -id: er-diagram-representation -title: DBMS ER Diagram Representation -sidebar_label: ER Diagram Representation -sidebar_position: 2 -description: Learn how to represent the Entity-Relationship (ER) Model using ER diagrams, including entities, attributes, relationships, and cardinality. -tags: - - DBMS - - ER Diagram - - Database Design ---- - -# DBMS - ER Diagram Representation - -Let us now learn how the ER Model is represented by means of an ER diagram. Any object, for example, entities, attributes of an entity, relationship sets, and attributes of relationship sets, can be represented with the help of an ER diagram. - -## Entity - -Entities are represented by means of rectangles. Rectangles are named with the entity set they represent. - -```mermaid ---- -title: Entity Representation ---- -erDiagram - ENTITY { - string attribute1 - int attribute2 - } -``` - -## Attributes - -### Simple Attributes - -Attributes are the properties of entities. Attributes are represented by means of ellipses. Every ellipse represents one attribute and is directly connected to its entity (rectangle). - -```mermaid ---- -title: Simple Attributes ---- -erDiagram - ENTITY { - string attribute1 - } -``` - -### Composite Attributes - -If the attributes are composite, they are further divided in a tree-like structure. Every node is then connected to its attribute. Composite attributes are represented by ellipses that are connected with an ellipse. - -```mermaid ---- -title: Composite Attributes ---- -erDiagram - ENTITY { - string attribute1 - } - attribute1 { - string sub_attribute1 - string sub_attribute2 - } - ENTITY ||--o{ attribute1 : has -``` - -### Multivalued Attributes - -Multivalued attributes are depicted by double ellipses. - -```mermaid ---- -title: Multivalued Attributes ---- -erDiagram - ENTITY { - string attribute1 - int attribute2 - string[] multivalued_attribute - } - ENTITY ||--o{ multivalued_attribute : has -``` - -### Derived Attributes - -Derived attributes are depicted by dashed ellipses. - -```mermaid ---- -title: Derived Attributes ---- -erDiagram - ENTITY { - string attribute1 - int attribute2 - int derived_attribute - } - ENTITY ||--o{ derived_attribute : derives -``` - -## Relationship - -Relationships are represented by diamond-shaped boxes. The name of the relationship is written inside the diamond-box. All the entities (rectangles) participating in a relationship are connected to it by a line. - -### Binary Relationship and Cardinality - -A relationship where two entities are participating is called a binary relationship. Cardinality is the number of instances of an entity from a relation that can be associated with the relation. - -#### One-to-One - -When only one instance of an entity is associated with the relationship, it is marked as '1:1'. The following image reflects that only one instance of each entity should be associated with the relationship. It depicts one-to-one relationship. - -```mermaid ---- -title: One-to-One Relationship ---- -erDiagram - ENTITY1 ||--|| ENTITY2 : relationship -``` - -#### One-to-Many - -When more than one instance of an entity is associated with a relationship, it is marked as '1:N'. The following image reflects that only one instance of entity on the left and more than one instance of an entity on the right can be associated with the relationship. It depicts one-to-many relationship. - -```mermaid ---- -title: One-to-Many Relationship ---- -erDiagram - ENTITY1 ||--o{ ENTITY2 : relationship -``` - -#### Many-to-One - -When more than one instance of entity is associated with the relationship, it is marked as 'N:1'. The following image reflects that more than one instance of an entity on the left and only one instance of an entity on the right can be associated with the relationship. It depicts many-to-one relationship. - -```mermaid ---- -title: Many-to-One Relationship ---- -erDiagram - ENTITY1 }o--|| ENTITY2 : relationship -``` - -#### Many-to-Many - -The following image reflects that more than one instance of an entity on the left and more than one instance of an entity on the right can be associated with the relationship. It depicts many-to-many relationship. - -```mermaid ---- -title: Many-to-Many Relationship ---- -erDiagram - ENTITY1 }o--o{ ENTITY2 : relationship -``` - -### Participation Constraints - -#### Total Participation - -Each entity is involved in the relationship. Total participation is represented by double lines. - -```mermaid ---- -title: Total Participation ---- -erDiagram - ENTITY1 ||--|| ENTITY2 : relationship -``` - -#### Partial Participation - -Not all entities are involved in the relationship. Partial participation is represented by single lines. - -```mermaid ---- -title: Partial Participation ---- -erDiagram - ENTITY1 }o--|| ENTITY2 : relationship -``` diff --git a/docs/DBMS/Entity-Relational Model/er-model-basics-concepts.md b/docs/DBMS/Entity-Relational Model/er-model-basics-concepts.md deleted file mode 100644 index d36a7cae0..000000000 --- a/docs/DBMS/Entity-Relational Model/er-model-basics-concepts.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -id: er-model-basics-concepts -title: DBMS ER Model Basic Concepts -sidebar_label: ER Model Basic Concepts -sidebar_position: 1 -description: Learn about the Entity-Relationship (ER) model, its basic concepts, entities, attributes, and relationships that form the foundation of database design. -tags: - - DBMS - - ER Model - - Database Design ---- - -# DBMS - ER Model Basic Concepts - -The ER model defines the conceptual view of a database. It works around real-world entities and the associations among them. At view level, the ER model is considered a good option for designing databases. - -## Entity - -An entity can be a real-world object, either animate or inanimate, that can be easily identifiable. For example, in a school database, students, teachers, classes, and courses offered can be considered as entities. All these entities have some attributes or properties that give them their identity. - -An entity set is a collection of similar types of entities. An entity set may contain entities with attribute sharing similar values. For example, a Students set may contain all the students of a school; likewise, a Teachers set may contain all the teachers of a school from all faculties. Entity sets need not be disjoint. - -## Attributes - -Entities are represented by means of their properties, called attributes. All attributes have values. For example, a student entity may have name, class, and age as attributes. - -There exists a domain or range of values that can be assigned to attributes. For example, a student's name cannot be a numeric value. It has to be alphabetic. A student's age cannot be negative, etc. - -### Types of Attributes - -| Type | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | -| Simple attribute | Atomic values, which cannot be divided further. Example: a student's phone number is an atomic value of 10 digits. | -| Composite attribute | Made of more than one simple attribute. Example: a student's complete name may have first_name and last_name. | -| Derived attribute | Attributes that do not exist in the physical database, but their values are derived from other attributes. Example: average_salary in a department. | -| Single-value attribute | Contain a single value. Example: Social_Security_Number. | -| Multi-value attribute | May contain more than one value. Example: a person can have more than one phone number, email_address, etc. | - -These attribute types can come together in a way like − - -- Simple single-valued attributes -- Simple multi-valued attributes -- Composite single-valued attributes -- Composite multi-valued attributes - -## Entity-Set and Keys - -Key is an attribute or collection of attributes that uniquely identifies an entity among an entity set. - -For example, the roll_number of a student makes him/her identifiable among students. - -- **Super Key** − A set of attributes (one or more) that collectively identifies an entity in an entity set. -- **Candidate Key** − A minimal super key is called a candidate key. An entity set may have more than one candidate key. -- **Primary Key** − A primary key is one of the candidate keys chosen by the database designer to uniquely identify the entity set. - -## Relationship - -The association among entities is called a relationship. For example, an employee works_at a department, a student enrolls in a course. Here, Works_at and Enrolls are called relationships. - -### Relationship Set - -A set of relationships of similar type is called a relationship set. Like entities, a relationship too can have attributes. These attributes are called descriptive attributes. - -### Degree of Relationship - -The number of participating entities in a relationship defines the degree of the relationship. - -- Binary = degree 2 -- Ternary = degree 3 -- n-ary = degree n - -### Mapping Cardinalities - -Cardinality defines the number of entities in one entity set, which can be associated with the number of entities of another set via a relationship set. - -| Cardinality | Diagram | Description | -| ------------ | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| One-to-one | ![one to one](https://www.tutorialspoint.com/dbms/images/one_to_one_relation.png) | One entity from entity set A can be associated with at most one entity of entity set B and vice versa. | -| One-to-many | ![one to many](https://www.tutorialspoint.com/dbms/images/one_to_many_relation.png) | One entity from entity set A can be associated with more than one entities of entity set B; however, an entity from entity set B can be associated with at most one entity. | -| Many-to-one | ![many to one](https://www.tutorialspoint.com/dbms/images/many_to_one_relation.png) | More than one entities from entity set A can be associated with at most one entity of entity set B; however, an entity from entity set B can be associated with more than one entity from entity set A. | -| Many-to-many | ![many to many](https://www.tutorialspoint.com/dbms/images/many_to_many_relation.png) | One entity from entity set A can be associated with more than one entity from entity set B and vice versa. | diff --git a/docs/DBMS/Indexing And Hashing/_category.json b/docs/DBMS/Indexing And Hashing/_category.json deleted file mode 100644 index db7e16bb7..000000000 --- a/docs/DBMS/Indexing And Hashing/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Indexing and Hashing", - "position": 5, - "link": { - "type": "generated-index", - "description": "Explore various indexing techniques and hashing methods in DBMS." - } -} \ No newline at end of file diff --git a/docs/DBMS/Indexing And Hashing/hashing.md b/docs/DBMS/Indexing And Hashing/hashing.md deleted file mode 100644 index 68ae87520..000000000 --- a/docs/DBMS/Indexing And Hashing/hashing.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -id: dbms-hashing -title: DBMS - Hashing -sidebar_label: Hashing -sidebar_position: 2 -description: Learn about different types of hashing in database management systems, their structures, and operations. ---- - -DBMS - Hashing -=== - -For a huge database structure, it can be almost next to impossible to search all the index values through all its levels and then reach the destination data block to retrieve the desired data. Hashing is an effective technique to calculate the direct location of a data record on the disk without using an index structure. - -Hashing uses hash functions with search keys as parameters to generate the address of a data record. - -Hash Organization ---- - -- **Bucket:** A hash file stores data in bucket format. A bucket is considered a unit of storage and typically stores one complete disk block, which in turn can store one or more records. -- **Hash Function:** A hash function, h, is a mapping function that maps all the set of search-keys K to the address where actual records are placed. It is a function from search keys to bucket addresses. - -### Static Hashing - -In static hashing, when a search-key value is provided, the hash function always computes the same address. For example, if a mod-4 hash function is used, then it shall generate only 5 values. The output address shall always be the same for that function. The number of buckets provided remains unchanged at all times. - -#### Operation -- **Insertion:** When a record is required to be entered using static hash, the hash function h computes the bucket address for search key K, where the record will be stored. - - Bucket address = h(K) -- **Search:** When a record needs to be retrieved, the same hash function can be used to retrieve the address of the bucket where the data is stored. -- **Delete:** This is simply a search followed by a deletion operation. - -```mermaid -graph TD; - A[Static Hashing] --> B[Insertion] - A --> C[Search] - A --> D[Deletion] - B --> E[Compute Bucket Address] - C --> F[Retrieve Bucket Address] - D --> G[Locate and Delete Record] -``` - -#### Bucket Overflow -The condition of bucket overflow is known as a collision. This is a critical state for any static hash function. In this case, overflow chaining can be used. - -- **Overflow Chaining:** When buckets are full, a new bucket is allocated for the same hash result and is linked after the previous one. This mechanism is called Closed Hashing. -- **Linear Probing:** When a hash function generates an address at which data is already stored, the next free bucket is allocated to it. This mechanism is called Open Hashing. - -```mermaid -graph TD; - A[Bucket Overflow] --> B[Overflow Chaining] - A --> C[Linear Probing] - B --> D[New Bucket Allocation] - C --> E[Next Free Bucket] -``` - -### Dynamic Hashing - -The problem with static hashing is that it does not expand or shrink dynamically as the size of the database grows or shrinks. Dynamic hashing provides a mechanism in which data buckets are added and removed dynamically and on-demand. Dynamic hashing is also known as extended hashing. - -#### Organization -The prefix of an entire hash value is taken as a hash index. Only a portion of the hash value is used for computing bucket addresses. Every hash index has a depth value to signify how many bits are used for computing a hash function. These bits can address $(2^n)$ buckets. When all these bits are consumed, that is, when all the buckets are full, then the depth value is increased linearly and twice the buckets are allocated. - -```mermaid -graph TD; - A[Dynamic Hashing] --> B[Hash Index] - B --> C[Depth Value] - C --> D[Compute Bucket Addresses] - D --> E[Increase Depth and Allocate More Buckets] -``` - -#### Operation -- **Querying:** Look at the depth value of the hash index and use those bits to compute the bucket address. -- **Update:** Perform a query as above and update the data. -- **Deletion:** Perform a query to locate the desired data and delete the same. -- **Insertion:** Compute the address of the bucket. - - If the bucket is already full: - - Add more buckets. - - Add additional bits to the hash value. - - Re-compute the hash function. - - Else: - - Add data to the bucket. - - If all the buckets are full, perform the remedies of static hashing. - -```mermaid -graph TD; - A[Dynamic Hashing Operation] --> B[Querying] - A --> C[Update] - A --> D[Deletion] - A --> E[Insertion] - E --> F[Compute Bucket Address] - F --> G{Bucket Full?} - G --> H[Add More Buckets] - G --> I[Add Data to Bucket] - H --> J[Add Bits to Hash Value] - H --> K[Re-compute Hash Function] -``` - -### Comparison Table - -| Feature | Static Hashing | Dynamic Hashing | -|--------------------|---------------------------|----------------------------| -| Bucket Expansion | Fixed number of buckets | Buckets expand/shrink dynamically | -| Collision Handling | Overflow chaining, linear probing | Overflow chaining, linear probing | -| Performance | Good for small databases | Better for large, dynamic databases | -| Flexibility | Less flexible | Highly flexible | - -Hashing is not favorable when the data is organized in some ordering and the queries require a range of data. When data is discrete and random, hashing performs the best. Hashing algorithms have higher complexity than indexing. All hash operations are done in constant time. diff --git a/docs/DBMS/Indexing And Hashing/indexing.md b/docs/DBMS/Indexing And Hashing/indexing.md deleted file mode 100644 index 64c55a8a2..000000000 --- a/docs/DBMS/Indexing And Hashing/indexing.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -id: dbms-indexing -title: DBMS - Indexing -sidebar_label: Indexing -sidebar_position: 1 -description: Learn about different types of indexing in database management systems, their structures, and operations. ---- - -DBMS - Indexing -=== - -We know that data is stored in the form of records. Every record has a key field, which helps it to be recognized uniquely. - -Indexing is a data structure technique to efficiently retrieve records from the database files based on some attributes on which the indexing has been done. Indexing in database systems is similar to what we see in books. - -Indexing Types ---- - -Indexing is defined based on its indexing attributes. Indexing can be of the following types: - -### Primary Index -- **Description:** Defined on an ordered data file. The data file is ordered on a key field, generally the primary key of the relation. - -### Secondary Index -- **Description:** May be generated from a field which is a candidate key and has a unique value in every record, or a non-key with duplicate values. - -### Clustering Index -- **Description:** Defined on an ordered data file. The data file is ordered on a non-key field. - -Ordered Indexing Types ---- - -Ordered Indexing can be of two types: - -### Dense Index -- **Description:** There is an index record for every search key value in the database. -- **Characteristics:** Faster searching but requires more space to store index records. -- **Structure:** - - Index records contain search key value and a pointer to the actual record on the disk. - -```mermaid -graph TD; - A[Dense Index] --> B[Search Key 1] - A --> C[Search Key 2] - A --> D[Search Key 3] - B --> E[Record Pointer 1] - C --> F[Record Pointer 2] - D --> G[Record Pointer 3] -``` - -### Sparse Index -- **Description:** Index records are not created for every search key. -- **Characteristics:** Contains a search key and an actual pointer to the data on the disk. -- **Structure:** - - To search a record, proceed by index record and reach the actual location of the data. If not found, start sequential search until the desired data is found. - -```mermaid -graph TD; - A[Sparse Index] --> B[Search Key 1] - A --> C[Search Key 2] - A --> D[Search Key 3] - B --> E[Record Pointer 1] - C --> F[Record Pointer 2] - D --> G[Record Pointer 3] -``` - -### Multilevel Index -- **Description:** Index records comprise search-key values and data pointers. Stored on disk along with the actual database files. -- **Characteristics:** As the database size grows, so does the size of the indices. -- **Structure:** - - Break down the index into several smaller indices to make the outermost level so small that it can be saved in a single disk block. - -```mermaid -graph TD; - A[Multilevel Index] --> B[Level 1 Index] - B --> C[Level 2 Index 1] - B --> D[Level 2 Index 2] - C --> E[Data Pointer 1] - C --> F[Data Pointer 2] - D --> G[Data Pointer 3] - D --> H[Data Pointer 4] -``` - -### B+ Tree -- **Description:** A balanced binary search tree that follows a multi-level index format. Leaf nodes denote actual data pointers. -- **Characteristics:** Ensures all leaf nodes remain at the same height, thus balanced. Supports random access and sequential access. - -```mermaid -graph TD; - A[B+ Tree] --> B[Internal Node] - B --> C[Leaf Node 1] - B --> D[Leaf Node 2] - C --> E[Data Pointer 1] - C --> F[Data Pointer 2] - D --> G[Data Pointer 3] - D --> H[Data Pointer 4] - H --> I[Next Leaf Node] -``` - -#### Structure of B+ Tree -- **Internal Nodes:** - - Contain at least $⌈n/2⌉$ pointers, except the root node. - - At most, an internal node can contain n pointers. - -- **Leaf Nodes:** - - Contain at least $⌈n/2⌉$ record pointers and $⌈n/2⌉$ key values. - - At most, a leaf node can contain n record pointers and n key values. - - Every leaf node contains one block pointer P to point to the next leaf node, forming a linked list. - -#### B+ Tree Insertion -1. **Insertion at Leaf Node:** - - If a leaf node overflows, split node into two parts. - - Partition at $i = ⌊(m+1)/2⌋$. - - First i entries are stored in one node. - - Rest of the entries (i+1 onwards) are moved to a new node. - - ith key is duplicated at the parent of the leaf. - -2. **Insertion at Non-leaf Node:** - - Split node into two parts. - - Partition the node at $i = ⌊(m+1)/2⌋$. - - Entries up to i are kept in one node. - - Rest of the entries are moved to a new node. - -#### B+ Tree Deletion -1. **Deletion at Leaf Node:** - - The target entry is searched and deleted. - - If it is an internal node, delete and replace it with the entry from the left position. - - After deletion, check for underflow. - -2. **Handling Underflow:** - - If underflow occurs, distribute the entries from the nodes left to it. - - If distribution is not possible from the left, distribute from the nodes right to it. - - If distribution is not possible from left or right, merge the node with left and right nodes. - -In summary, indexing in DBMS is a crucial technique to enhance the speed and efficiency of data retrieval. Different indexing methods and structures are suited to various data and query types, ensuring optimized performance for diverse database operations. diff --git a/docs/DBMS/Relational Database Design/_category.json b/docs/DBMS/Relational Database Design/_category.json deleted file mode 100644 index ca74a0112..000000000 --- a/docs/DBMS/Relational Database Design/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Relational Database Design", - "position": 3, - "link": { - "type": "generated-index", - "description": "Explore relational database design concepts, including the Relational Model, ER modeling, normalization, and more." - } -} \ No newline at end of file diff --git a/docs/DBMS/Relational Database Design/dbms-joins.md b/docs/DBMS/Relational Database Design/dbms-joins.md deleted file mode 100644 index 565e31ef6..000000000 --- a/docs/DBMS/Relational Database Design/dbms-joins.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -id: dbms-joins -title: DBMS - Joins -sidebar_label: DBMS Joins -sidebar_position: 2 -description: Explore different types of joins in database management systems and their applications. ---- - -DBMS - Joins ---- - -Joins in database management systems allow us to combine data from multiple tables based on specified conditions. Let's explore various types of joins: - -Theta (θ) Join ---- - -Theta join combines tuples from different relations based on a given theta condition denoted by the symbol θ. It can use various comparison operators. - -```mermaid -graph TD; - A[Student] -->|Std| B[Subjects] - B -->|Class| C[Student_Detail] -``` - -Example of Theta Join: -```plaintext -Student -SID Name Std -101 Alex 10 -102 Maria 11 - -Subjects -Class Subject -10 Math -10 English -11 Music -11 Sports - -Student_Detail -SID Name Std Class Subject -101 Alex 10 10 Math -101 Alex 10 10 English -102 Maria 11 11 Music -102 Maria 11 11 Sports -``` - -Equijoin ---- - -Equijoin is a type of theta join where only equality comparison operators are used. It matches tuples based on equal values of attributes. - -Natural Join (⋈) ---- - -Natural join combines tuples from two relations based on common attributes with the same name and domain. It does not use any comparison operator. - -Example of Natural Join: -```mermaid -graph TD; - A[Courses] -->|Dept| B[HoD] -``` - -Result of Natural Join: -```plaintext -Courses ⋈ HoD -Dept CID Course Head -CS CS01 Database Alex -ME ME01 Mechanics Maya -EE EE01 Electronics Mira -``` - -Outer Joins ---- - -Outer joins include all tuples from participating relations, even if there are no matching tuples. - -Left Outer Join (R Left Outer Join S) ---- - -```plaintext -Left -A B -100 Database -101 Mechanics -102 Electronics - -Right -A B -100 Alex -102 Maya -104 Mira - -Courses Left Outer Join HoD -A B C D -100 Database 100 Alex -101 Mechanics --- --- -102 Electronics 102 Maya -``` - -Right Outer Join (R Right Outer Join S) ---- - -```plaintext -Courses Right Outer Join HoD -A B C D -100 Database 100 Alex -102 Electronics 102 Maya ---- --- 104 Mira -``` - -Full Outer Join (R Full Outer Join S) ---- - -```plaintext -Courses Full Outer Join HoD -A B C D -100 Database 100 Alex -101 Mechanics --- --- -102 Electronics 102 Maya ---- --- 104 Mira -``` - -These joins are crucial for combining data effectively from multiple tables in database systems. \ No newline at end of file diff --git a/docs/DBMS/Relational Database Design/dbms-normalization.md b/docs/DBMS/Relational Database Design/dbms-normalization.md deleted file mode 100644 index ace18f8e1..000000000 --- a/docs/DBMS/Relational Database Design/dbms-normalization.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -id: dbms-normalization -title: DBMS - Normalization -sidebar_label: Normalization -sidebar_position: 1 -description: Learn about Functional Dependency, Normalization, and different Normal Forms in Database Management Systems (DBMS). ---- - -# DBMS - Normalization - -## Functional Dependency - -Functional dependency (FD) is a set of constraints between two attributes in a relation. Functional dependency says that if two tuples have the same values for attributes A1, A2,..., An, then those two tuples must have the same values for attributes B1, B2, ..., Bn. - -Functional dependency is represented by an arrow sign (→) that is, $X \rightarrow Y$, where X functionally determines Y. The left-hand side attributes determine the values of attributes on the right-hand side. - -### Armstrong's Axioms - -If F is a set of functional dependencies then the closure of F, denoted as F+, is the set of all functional dependencies logically implied by F. Armstrong's Axioms are a set of rules, that when applied repeatedly, generates a closure of functional dependencies. - -```mermaid -graph TD; - A["alpha"] -->|is_subset_of| B["beta"] - B -->|alpha holds beta| C["alpha holds beta"] - A -->|augmentation rule| D["ay → by also holds"] - C -->|transitivity rule| E["a → c also holds"] -``` - -## Trivial Functional Dependency - -- **Trivial:** If a functional dependency (FD) X → Y holds, where Y is a subset of X, then it is called a trivial FD. Trivial FDs always hold. - -- **Non-trivial:** If an FD X → Y holds, where Y is not a subset of X, then it is called a non-trivial FD. - -- **Completely non-trivial:** If an FD X → Y holds, where x intersect Y = Φ, it is said to be a completely non-trivial FD. - -## Normalization - -If a database design is not perfect, it may contain anomalies, which are like a bad dream for any database administrator. Managing a database with anomalies is next to impossible. - -- **Update anomalies** − If data items are scattered and are not linked to each other properly, then it could lead to strange situations. For example, when we try to update one data item having its copies scattered over several places, a few instances get updated properly while a few others are left with old values. Such instances leave the database in an inconsistent state. - -- **Deletion anomalies** − We tried to delete a record, but parts of it was left undeleted because of unawareness, the data is also saved somewhere else. - -- **Insert anomalies** − We tried to insert data in a record that does not exist at all. - -Normalization is a method to remove all these anomalies and bring the database to a consistent state. - -```mermaid -graph TD; - A[Update anomalies] -->|Inconsistent state| B[Database] - C[Deletion anomalies] -->|Left undeleted parts| B - D[Insert anomalies] -->|Insert data in non-existing record| B -``` - -## First Normal Form (1NF) - -First Normal Form is defined in the definition of relations (tables) itself. This rule defines that all the attributes in a relation must have atomic domains. The values in an atomic domain are indivisible units. - -unorganized relation - -```mermaid -graph TD; - A["Relation"] -->|Unorganized| B["1NF"] -``` - -Each attribute must contain only a single value from its pre-defined domain. - -## Second Normal Form (2NF) - -Before we learn about the second normal form, we need to understand the following − - -- **Prime attribute :** An attribute, which is a part of the candidate-key, is known as a prime attribute. - -- **Non-prime attribute :** An attribute, which is not a part of the prime-key, is said to be a non-prime attribute. - -```mermaid -graph TD; - A["Candidate Key"] -->|Part of| B["Prime Attribute"] - C["Non-Prime Attribute"] -->|Not part of| A - D["X → A holds"] -->|No subset Y → A| E["Second Normal Form"] -``` - -## Third Normal Form (3NF) - -For a relation to be in Third Normal Form, it must be in Second Normal form and the following must satisfy − - -No non-prime attribute is transitively dependent on the prime key attribute. - -```mermaid -graph TD; - A["X → A"] -->|Superkey or A is prime| B["Third Normal Form"] - C["Transitive Dependency"] -->|Stu_ID → Zip → City| D["Relation not in 3NF"] -``` - -## Boyce-Codd Normal Form (BCNF) - -BCNF is an extension of Third Normal Form on strict terms. BCNF states that − - -For any non-trivial functional dependency, X → A, X must be a super-key. - -```mermaid -graph TD; - A["X → A"] -->|X is super-key| B["BCNF"] -``` - -In the above image, Stu_ID is the super-key in the relation Student_Detail and Zip is the super-key in the relation ZipCodes. So, -``` -Stu_ID → Stu_Name, Zip -``` -and -``` -Zip → City -``` -Which confirms that both the relations are in BCNF. \ No newline at end of file diff --git a/docs/DBMS/Relational-Model/_category.json b/docs/DBMS/Relational-Model/_category.json deleted file mode 100644 index 2fa6bd3c9..000000000 --- a/docs/DBMS/Relational-Model/_category.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Relational Model", - "position": 2, - "link": { - "type": "generated-index", - "description": "Explore the Relational Model in DBMS, its concepts, and its applications." - } - } - \ No newline at end of file diff --git a/docs/DBMS/Relational-Model/codd's-rule.md b/docs/DBMS/Relational-Model/codd's-rule.md deleted file mode 100644 index 538c8a801..000000000 --- a/docs/DBMS/Relational-Model/codd's-rule.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -id: codd-s-12-rules -title: Codd's 12 Rules -sidebar_label: Codd's 12 Rules -sidebar_position: 1 -description: Explore Dr. Edgar F. Codd's 12 Rules for true relational databases with examples and diagrams. ---- - -# DBMS - Codd's 12 Rules - -Dr. Edgar F. Codd, after his extensive research on the Relational Model of database systems, came up with twelve rules of his own, which according to him, a database must obey in order to be regarded as a true relational database. - -## Rule 1: Information Rule - -The data stored in a database, may it be user data or metadata, must be a value of some table cell. Everything in a database must be stored in a table format. - -### Example: - -Consider a database for a library. The Information Rule ensures that every piece of data, like the title of a book or the name of an author, is stored within a specific table cell, such as the 'Book Title' attribute in the 'Books' table. - -## Rule 2: Guaranteed Access Rule - -Every single data element (value) is guaranteed to be accessible logically with a combination of table-name, primary-key (row value), and attribute-name (column value). No other means, such as pointers, can be used to access data. - -### Example: - -In a customer database, the Guaranteed Access Rule ensures that you can access a specific customer's details using their unique customer ID, such as querying "SELECT \* FROM Customers WHERE CustomerID = '123'". - -## Rule 3: Systematic Treatment of NULL Values - -The NULL values in a database must be given a systematic and uniform treatment. This is a very important rule because a NULL can be interpreted as one of the following − data is missing, data is not known, or data is not applicable. - -### Example: - -In an employee database, the Systematic Treatment of NULL Values ensures that if an employee's middle name is unknown or not applicable, it's represented as NULL in the database rather than an empty string or a placeholder. - -## Rule 4: Active Online Catalog - -The structure description of the entire database must be stored in an online catalog, known as data dictionary, which can be accessed by authorized users. Users can use the same query language to access the catalog which they use to access the database itself. - -### Example: - -An Active Online Catalog provides metadata about the database schema. For instance, it includes information about tables, columns, data types, and relationships, allowing users to understand and query the database structure. - -```mermaid -erDiagram - CAT_TABLE ||--o{ DB_TABLE : has - CAT_TABLE ||--o{ COLUMN : has - DB_TABLE ||--o{ COLUMN : contains - DB_TABLE }|..|{ DATA : stores -``` - -## Rule 5: Comprehensive Data Sub-Language Rule - -A database can only be accessed using a language having linear syntax that supports data definition, data manipulation, and transaction management operations. This language can be used directly or by means of some application. If the database allows access to data without any help of this language, then it is considered as a violation. - -### Example: - -SQL (Structured Query Language) is a comprehensive data sub-language that fulfills the requirements of data definition, manipulation, and transaction management. It allows users to interact with the database through standard commands like SELECT, INSERT, UPDATE, DELETE, and COMMIT. - -## Rule 6: View Updating Rule - -All the views of a database, which can theoretically be updated, must also be updatable by the system. - -### Example: - -Consider a view that combines data from multiple tables for reporting purposes. The View Updating Rule ensures that if the view includes columns from a single base table, those columns can be updated through the view. - -## Rule 7: High-Level Insert, Update, and Delete Rule - -A database must support high-level insertion, updation, and deletion. This must not be limited to a single row, that is, it must also support union, intersection and minus operations to yield sets of data records. - -### Example: - -The High-Level Insert, Update, and Delete Rule allows you to insert, update, or delete multiple rows at once. For instance, you can use an SQL statement like "DELETE FROM Employees WHERE Salary < 50000" to delete all employees with a salary below $50,000. - -## Rule 8: Physical Data Independence - -The data stored in a database must be independent of the applications that access the database. Any change in the physical structure of a database must not have any impact on how the data is being accessed by external applications. - -### Example: - -Physical Data Independence allows you to modify the storage structures (like changing indexes or file organization) without affecting how users and applications interact with the data. This ensures that applications remain functional even if the database undergoes structural changes. - -## Rule 9: Logical Data Independence - -The logical data in a database must be independent of its user’s view (application). Any change in logical data must not affect the applications using it. For example, if two tables are merged or one is split into two different tables, there should be no impact or change on the user application. This is one of the most difficult rules to apply. - -### Example: - -Imagine merging two tables 'Customers' and 'Suppliers' into a single table 'Partners'. Logical Data Independence ensures that existing applications accessing 'Customers' or 'Suppliers' continue to function seamlessly after the merge. - -## Rule 10: Integrity Independence - -A database must be independent of the application that uses it. All its integrity constraints can be independently modified without the need of any change in the application. This rule makes a database independent of the front-end application and its interface. - -### Example: - -Integrity constraints like primary keys, foreign keys, and unique constraints can be modified or added without affecting how applications interact with the database. This allows for changes in data validation rules without altering application logic. - -## Rule 11: Distribution Independence - -The end-user must not be able to see that the data is distributed over various locations. Users should always get the impression that the data is located at one site only. This rule has been regarded as the foundation of distributed database systems. - -### Example: - -In a distributed database, data may be stored across multiple physical locations. Distribution Independence ensures that users perceive and interact with the data as if it's stored in a single location, regardless of its actual distribution. - -## Rule 12: Non-Subversion Rule - -If a system has an interface that provides access to low-level records, then the interface must not be able to subvert the system and bypass security and integrity constraints. - -### Example: - -The Non-Subversion Rule prevents unauthorized access to low-level records or system components that could compromise security or integrity. It ensures that access controls and security measures are enforced, even through direct interfaces. - \ No newline at end of file diff --git a/docs/DBMS/Relational-Model/convert-er-model-to-relational-model.md b/docs/DBMS/Relational-Model/convert-er-model-to-relational-model.md deleted file mode 100644 index 50538b1ff..000000000 --- a/docs/DBMS/Relational-Model/convert-er-model-to-relational-model.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -id: convert-er-model-to-relational-model -title: Convert ER Model to Relational Model -sidebar_label: Convert ER Model to Relational Model -sidebar_position: 4 -description: Learn how to convert an ER (Entity-Relationship) model into a relational model, including mapping entities, relationships, weak entity sets, and hierarchical entities. ---- - -# Convert ER Model to Relational Model - -ER Model, when conceptualized into diagrams, gives a good overview of entity-relationship, which is easier to understand. ER diagrams can be mapped to a relational schema, meaning it is possible to create a relational schema using an ER diagram. Although not all ER constraints can be imported into the relational model, an approximate schema can be generated. - -## Mapping Entity - -An entity is a real-world object with some attributes. - -### Mapping Process (Algorithm) - -1. Create a table for each entity. -2. Entity's attributes should become fields of tables with their respective data types. -3. Declare the primary key. - -```mermaid -graph TD; - A[Entity] -- Mapping --> B[Table] - B -- Fields --> C[Attributes] - C -- Data Types --> D[Field Types] - B -- Primary Key --> E[Primary Key Constraint] -``` - -## Mapping Relationship - -A relationship is an association among entities. - -### Mapping Process - -1. Create a table for a relationship. -2. Add the primary keys of all participating entities as fields of the table with their respective data types. -3. If the relationship has any attributes, add each attribute as a field of the table. -4. Declare a primary key composing all the primary keys of participating entities. -5. Declare all foreign key constraints. - -```mermaid -graph TD; - A[Relationship] -- Mapping --> B[Table] - B -- Primary Keys --> C[Participating Entities] - C -- Data Types --> D[Field Types] - B -- Attributes --> E[Attributes] - E -- Field Types --> F[Attribute Data Types] - B -- Primary Key --> G[Primary Key Constraint] - B -- Foreign Key Constraints --> H[Foreign Key Constraints] -``` - -## Mapping Weak Entity Sets - -A weak entity set is one which does not have any primary key associated with it. - -### Mapping Process - -1. Create a table for the weak entity set. -2. Add all its attributes to the table as fields. -3. Add the primary key of the identifying entity set. -4. Declare all foreign key constraints. - -```mermaid -graph TD; - A[Weak Entity Set] -- Mapping --> B[Table] - B -- Attributes --> C[Attributes] - C -- Field Types --> D[Attribute Data Types] - B -- Primary Key of Identifying Entity Set --> E[Primary Key Constraint] - B -- Foreign Key Constraints --> F[Foreign Key Constraints] -``` - -## Mapping Hierarchical Entities - -ER specialization or generalization comes in the form of hierarchical entity sets. - -### Mapping Process - -1. Create tables for all higher-level entities. -2. Create tables for lower-level entities. -3. Add primary keys of higher-level entities in the table of lower-level entities. -4. In lower-level tables, add all other attributes of lower-level entities. -5. Declare the primary key of the higher-level table and the primary key for the lower-level table. -6. Declare foreign key constraints. - -```mermaid -graph TD; - A[Higher-Level Entity] -- Mapping --> B[Higher-Level Table] - C[Lower-Level Entity] -- Mapping --> D[Lower-Level Table] - D -- Primary Key of Higher-Level Entity --> E[Foreign Key Constraint] - D -- Attributes of Lower-Level Entity --> F[Attributes] - B -- Primary Key --> G[Primary Key Constraint] - F -- Field Types --> H[Attribute Data Types] - G -- Foreign Key Constraints --> I[Foreign Key Constraints] -``` diff --git a/docs/DBMS/Relational-Model/relational-algebra.md b/docs/DBMS/Relational-Model/relational-algebra.md deleted file mode 100644 index db9983f1f..000000000 --- a/docs/DBMS/Relational-Model/relational-algebra.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: relational-algebra -title: DBMS - Relational Algebra -sidebar_label: Relational Algebra -sidebar_position: 3 -description: Learn about relational algebra, a procedural query language for relational database systems, including fundamental operations and examples. ---- - -# DBMS - Relational Algebra - -Relational database systems are expected to be equipped with a query language that can assist its users to query the database instances. There are two kinds of query languages − relational algebra and relational calculus. - -## Relational Algebra - -Relational algebra is a procedural query language that takes instances of relations as input and yields instances of relations as output. It uses operators to perform queries. An operator can be either unary or binary. They accept relations as their input and yield relations as their output. Relational algebra is performed recursively on a relation, and intermediate results are also considered relations. - -```mermaid -graph TD; - A[Relation] -- Unary --> B[Operation] - A -- Binary --> C[Operation] - B -- Output --> D[Relation] - C -- Output --> E[Relation] -``` - -The fundamental operations of relational algebra are as follows: - -- **Select**: $σ_p(r)$ -- **Project**: $∏_{A1, A2, An} (r)$ -- **Union**: $r ∪ s$ -- **Set Difference**: $r - s$ -- **Cartesian Product**: $r Χ s$ -- **Rename**: $ρ_x (E)$ - -### Select Operation (σ) - -It selects tuples that satisfy the given predicate from a relation. - -**Notation**: $σ_p(r)$ - -1. $σ_{subject = "database"}(Books)$ - - Selects tuples from books where subject is 'database'. -2. $σ_{subject = "database" and price = "450"}(Books)$ - - Selects tuples from books where subject is 'database' and price is 450. -3. $σ_{subject = "database" and price = "450" or year > "2010"}(Books)$ - - Selects tuples from books where subject is 'database' and price is 450 or those books published after 2010. - -### Project Operation (∏) - -It projects columns that satisfy a given predicate. - -**Notation**: $∏_{subject, author} (Books)$ - -- $∏_{subject, author} (Books)$ - - Selects and projects columns named subject and author from the relation Books. - -### Union Operation (∪) - -It performs binary union between two given relations. - -**Notation**: $r ∪ s$ - -- $∏_{author} (Books) ∪ ∏_{author} (Articles)$ - - Projects the names of the authors who have either written a book or an article or both. - -### Set Difference (-) - -The result of set difference operation is tuples present in one relation but not in the second relation. - -**Notation**: $r - s$ - -- $∏_{author} (Books) - ∏_{author} (Articles)$ - - Provides the names of authors who have written books but not articles. - -### Cartesian Product (Χ) - -Combines information of two different relations into one. - -**Notation**: $r Χ s$ - -- $σ_{author = 'tutorialspoint'}(Books Χ Articles)$ - - Yields a relation showing all the books and articles written by tutorialspoint. - -### Rename Operation (ρ) - -The results of relational algebra are relations without any name. The rename operation allows us to rename the output relation. - -**Notation**: $ρ_x (E)$ - -- $ρ_x (Books ∏_{author})$ - - Renames the output relation of Books ∏ author to x. - -Additional operations include Set Intersection, Assignment, and Natural Join. - -## Relational Calculus - -Relational calculus is a non-procedural query language, that is, it tells what to do but never explains how to do it. It exists in two forms: - -- Tuple Relational Calculus (TRC) -- Domain Relational Calculus (DRC) - -TRC and DRC involve quantifiers and relational operators to define queries. - -```mermaid -graph TD; - A[Query] -- TRC --> B[Tuple Relational Calculus] - A -- DRC --> C[Domain Relational Calculus] -``` - -> **NOTE:** TRC and DRC allow specifying conditions and constraints on the result sets without specifying how to retrieve the data. diff --git a/docs/DBMS/Relational-Model/relational-data-model.md b/docs/DBMS/Relational-Model/relational-data-model.md deleted file mode 100644 index 46c3ff37d..000000000 --- a/docs/DBMS/Relational-Model/relational-data-model.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -id: relational-data-model -title: DBMS - Relational Data Model -sidebar_label: Relational Data Model -sidebar_position: 2 -description: Explore the primary data model used widely for data storage and processing - the Relational Data Model. ---- - -# DBMS - Relational Data Model - -The relational data model is the primary data model used widely around the world for data storage and processing. This model is simple and has all the properties and capabilities required to process data with storage efficiency. - -## Concepts - -### Tables - -In the relational data model, relations are saved in the format of Tables. This format stores the relation among entities. A table has rows and columns, where rows represent records and columns represent attributes. - -```mermaid - erDiagram - CUSTOMER ||--o{ ORDERS : places - CUSTOMER ||--o{ PAYMENTS : makes - ORDERS ||--|{ ORDER_ITEMS : contains -``` - -### Tuple - -A single row of a table, which contains a single record for that relation, is called a tuple. - -### Relation Instance - -A finite set of tuples in the relational database system represents a relation instance. Relation instances do not have duplicate tuples. - -### Relation Schema - -A relation schema describes the relation name (table name), attributes, and their names. - -### Relation Key - -Each row has one or more attributes, known as a relation key, which can identify the row in the relation (table) uniquely. - -### Attribute Domain - -Every attribute has some predefined value scope, known as an attribute domain. - -## Constraints - -Every relation has some conditions that must hold for it to be a valid relation. These conditions are called Relational Integrity Constraints. There are three main integrity constraints − - -1. **Key Constraints** -2. **Domain Constraints** -3. **Referential Integrity Constraints** - -### Key Constraints - -There must be at least one minimal subset of attributes in the relation, which can identify a tuple uniquely. This minimal subset of attributes is called a key for that relation. If there are more than one such minimal subsets, these are called candidate keys. - -Key constraints force that − - -- In a relation with a key attribute, no two tuples can have identical values for key attributes. -- A key attribute cannot have NULL values. - -Key constraints are also referred to as Entity Constraints. - -### Domain Constraints - -Attributes have specific values in real-world scenarios. For example, age can only be a positive integer. The same constraints have been tried to employ on the attributes of a relation. Every attribute is bound to have a specific range of values. For example, age cannot be less than zero, and telephone numbers cannot contain a digit outside 0-9. - -### Referential Integrity Constraints - -Referential integrity constraints work on the concept of Foreign Keys. A foreign key is a key attribute of a relation that can be referred to in another relation. - -Referential integrity constraint states that if a relation refers to a key attribute of a different or same relation, then that key element must exist. - -| Constraint Type | Description | -| --------------------- | -------------------------------------------------------------------------------------- | -| Key Constraints | Ensure uniqueness of key attributes and disallow NULL values. | -| Domain Constraints | Define allowable values for attributes based on their data types and real-world rules. | -| Referential Integrity | Enforce relationships between tables, ensuring that references remain valid. | diff --git a/docs/DBMS/Storage And File Structure/_category.json b/docs/DBMS/Storage And File Structure/_category.json deleted file mode 100644 index 431f50bba..000000000 --- a/docs/DBMS/Storage And File Structure/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Storage and Joins", - "position": 4, - "link": { - "type": "generated-index", - "description": "Explore various storage techniques and join operations in DBMS." - } -} \ No newline at end of file diff --git a/docs/DBMS/Storage And File Structure/dbms-file-structure.md b/docs/DBMS/Storage And File Structure/dbms-file-structure.md deleted file mode 100644 index 3b0edafa8..000000000 --- a/docs/DBMS/Storage And File Structure/dbms-file-structure.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -id: dbms-file-structure -title: DBMS - File Structure -sidebar_label: File Structure -sidebar_position: 2 -description: Explore the different types of file structures in database management, including file organization methods and file operations. ---- - -DBMS - File Structure ---- - -Relative data and information are stored collectively in file formats. A file is a sequence of records stored in binary format. A disk drive is formatted into several blocks that can store records. File records are mapped onto those disk blocks. - -File Organization ---- - -File Organization defines how file records are mapped onto disk blocks. We have four types of File Organization to organize file records: - -### Heap File Organization -- **Description:** When a file is created using Heap File Organization, the Operating System allocates memory area to that file without any further accounting details. File records can be placed anywhere in that memory area. -- **Characteristics:** No ordering, sequencing, or indexing. -- **Responsibility:** Software manages the records. - -### Sequential File Organization -- **Description:** Records are placed in the file in some sequential order based on a unique key field or search key. -- **Characteristics:** Practically, not all records can be stored sequentially in physical form. -- **Example:** Library cataloging system where books are stored based on a unique identifier. - -### Hash File Organization -- **Description:** Uses Hash function computation on some fields of the records. The output of the hash function determines the location of the disk block where the records are to be placed. -- **Characteristics:** Efficient for retrieval when the search is based on the hashed attribute. -- **Example:** Student records where student ID is used to determine storage location. - -### Clustered File Organization -- **Description:** Related records from one or more relations are kept in the same disk block. -- **Characteristics:** Not based on primary key or search key. -- **Use Case:** Used when accessing related data together. - -```mermaid -graph TD; - A[File Organization] --> B[Heap File Organization] - A --> C[Sequential File Organization] - A --> D[Hash File Organization] - A --> E[Clustered File Organization] -``` - -File Operations ---- - -Operations on database files can be broadly classified into two categories: - -1. **Update Operations** - - **Description:** Change data values by insertion, deletion, or update. - -2. **Retrieval Operations** - - **Description:** Retrieve data without altering it, potentially with optional conditional filtering. - -### Common File Operations -- **Open:** - - **Modes:** Read mode (data is read-only) and Write mode (data modification allowed). - - **Characteristics:** Files in read mode can be shared; files in write mode cannot be shared. - -- **Locate:** - - **Description:** File pointer tells the current position where data is to be read or written. - - **Function:** Can be moved forward or backward using find (seek) operation. - -- **Read:** - - **Description:** By default, the file pointer points to the beginning of the file when opened in read mode. - - **Characteristics:** User can specify where to locate the file pointer. - -- **Write:** - - **Description:** Enables editing file contents, including deletion, insertion, or modification. - - **Characteristics:** File pointer can be dynamically changed if allowed by the operating system. - -- **Close:** - - **Description:** Crucial for the operating system. - - **Function:** - 1. Removes all locks if in shared mode. - 2. Saves data to secondary storage if altered. - 3. Releases all buffers and file handlers associated with the file. - -```mermaid -graph TD; - A[File Operations] --> B[Update Operations] - A --> C[Retrieval Operations] - B --> D[Insert] - B --> E[Delete] - B --> F[Update] - C --> G[Select] - C --> H[Filter] -``` - -The organization of data inside a file plays a major role in how efficiently these operations can be performed. The method used to locate the file pointer to a desired record inside a file varies based on whether the records are arranged sequentially or clustered. - -In summary, understanding the various file structures and their operations is crucial for efficient database management, ensuring optimal performance and reliability. diff --git a/docs/DBMS/Storage And File Structure/dbms-storage-system.md b/docs/DBMS/Storage And File Structure/dbms-storage-system.md deleted file mode 100644 index 74baf4580..000000000 --- a/docs/DBMS/Storage And File Structure/dbms-storage-system.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -id: dbms-storage-system -title: DBMS - Storage System -sidebar_label: Storage System -sidebar_position: 1 -description: Understand the various storage systems in database management, including memory types, memory hierarchy, magnetic disks, and RAID technology. ---- - -# DBMS - Storage System ---- - -Databases are stored in various file formats and devices, each serving different purposes and performance requirements. Let's explore the different types of storage systems and their hierarchical organization. - -## Memory Types - -1. **Primary Storage** - - - **Description:** Directly accessible to the CPU. - - **Examples:** CPU's internal memory (registers), cache, main memory (RAM). - - **Characteristics:** Ultra-fast, volatile, requires continuous power. - -2. **Secondary Storage** - - - **Description:** Used for future data use or backup. - - **Examples:** Magnetic disks, optical disks (DVD, CD), hard disks, flash drives, magnetic tapes. - - **Characteristics:** Non-volatile, slower than primary storage, larger capacity. - -3. **Tertiary Storage** - - **Description:** Used for storing huge volumes of data. - - **Examples:** Optical disks, magnetic tapes. - - **Characteristics:** Slowest in speed, used for system backups. - -## Memory Hierarchy - -A computer system's memory hierarchy ranges from the fastest, smallest, and most expensive types to the slowest, largest, and least expensive. - -```mermaid -graph TD; - A[Primary Memory] --> B[Secondary Memiry] - B --> C[Tertiary Memory] -``` - -- **Registers:** Fastest access time, smallest capacity, highest cost. -- **Cache Memory:** Faster access time than RAM, used to store frequently accessed data. -- **Main Memory (RAM):** Directly accessible by the CPU, larger capacity than cache. -- **Secondary Storage:** Larger capacity, slower access time, used for data storage and backup. -- **Tertiary Storage:** Largest capacity, slowest access time, used for extensive backups. - -## Magnetic Disks - -Hard disk drives (HDDs) are the most common secondary storage devices, using magnetization to store information. - -```mermaid -graph TD; - A[Hard Disk] --> B[Spindle] - B --> C[Read/Write Head] - C --> D[Magnetizable Disks] -``` - -- **Structure:** Consists of metal disks coated with magnetizable material, placed on a spindle. -- **Operation:** A read/write head magnetizes or de-magnetizes spots to represent data bits (0 or 1). -- **Organization:** Disks have concentric circles (tracks), each divided into sectors (typically 512 bytes). - -## Redundant Array of Independent Disks (RAID) - -RAID technology connects multiple secondary storage devices to function as a single unit, enhancing performance and data redundancy. - -1. **RAID 0:** - - - **Description:** Striped array of disks. - - **Features:** Enhances speed and performance, no parity or backup. - -2. **RAID 1:** - - - **Description:** Mirroring technique. - - **Features:** Provides 100% redundancy, copies data to all disks. - -3. **RAID 2:** - - - **Description:** Uses Error Correction Code (ECC) with Hamming distance. - - **Features:** Stripes data bits and ECC codes, high cost and complexity. - -4. **RAID 3:** - - - **Description:** Stripes data with parity bit on a separate disk. - - **Features:** Overcomes single disk failures. - -5. **RAID 4:** - - - **Description:** Block-level striping with dedicated parity disk. - - **Features:** Requires at least three disks, similar to RAID 3 but with block-level striping. - -6. **RAID 5:** - - - **Description:** Block-level striping with distributed parity. - - **Features:** Distributes parity bits among all data disks. - -7. **RAID 6:** - - **Description:** Extension of RAID 5 with dual parity. - - **Features:** Provides additional fault tolerance, requires at least four disks. - -```mermaid -graph LR; - A[RAID 0] --> B[RAID 1] - - B --> C[RAID 2] - C --> D[RAID 3] - D --> E[RAID 4] - E --> F[RAID 5] - F --> G[RAID 6] - -``` - -Each RAID level serves specific needs, balancing between performance, data redundancy, and fault tolerance. diff --git a/docs/DBMS/Structured Query Language/DDL.md b/docs/DBMS/Structured Query Language/DDL.md deleted file mode 100644 index c6465d009..000000000 --- a/docs/DBMS/Structured Query Language/DDL.md +++ /dev/null @@ -1,56 +0,0 @@ -# Data Definition Language (DDL) - -Data Definition Language (DDL) is a subset of SQL used to define, modify, and delete database objects such as tables, indexes, views, and constraints. DDL statements enable users to create and manage the structure of the database schema. - -## Key DDL Commands - -### 1. CREATE - -- `CREATE TABLE`: Defines a new table in the database. - ```sql - CREATE TABLE table_name ( - column1 datatype, - column2 datatype, - ... - ); -- `CREATE INDEX`: Creates an index on a table to improve data retrieval performance. - -```sql -CREATE INDEX index_name ON table_name (column1, column2, ...); -``` -- `CREATE VIEW`: Defines a virtual table based on the result set of a `SELECT` query. - -```sql -CREATE VIEW view_name AS -SELECT column1, column2 FROM table_name WHERE condition; -``` - -### 2. ALTER - -- `ALTER TABLE` : Modifies the structure of an existing table. - - Add a new column - ```sql - ALTER TABLE table_name ADD column_name datatype; - ``` - - Modify column definition - ```sql - ALTER TABLE table_name MODIFY column_name datatype; - ```` - - Drop a column - ```sql - ALTER TABLE table_name DROP COLUMN column_name; - ``` - -### 3. DROP -- `DROP TABLE`: Deletes a table and its data from the database. - ```sql - DROP TABLE table_name; - ``` -- `DROP INDEX`: Removes an index from the database. - ```sql - DROP INDEX index_name; - ``` -- `DROP VIEW`: Deletes a view from the database. - ```sql - DROP VIEW view_name; - ``` diff --git a/docs/DBMS/Structured Query Language/_category.json b/docs/DBMS/Structured Query Language/_category.json deleted file mode 100644 index 817e9b142..000000000 --- a/docs/DBMS/Structured Query Language/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "SQL", - "position": 8, - "link": { - "type": "generated-index", - "description": "Explore SQL in DBMS." - } -} \ No newline at end of file diff --git a/docs/DBMS/Structured Query Language/dml.md b/docs/DBMS/Structured Query Language/dml.md deleted file mode 100644 index 3b3698561..000000000 --- a/docs/DBMS/Structured Query Language/dml.md +++ /dev/null @@ -1,78 +0,0 @@ -# Data Manipulation Language - -DML is used for performing non-structural updates to a database. For example, adding a row to an existing table, retrieving data from a table, etc. - -### DML commands include: -- Select -- Insert -- Update -- Delete - -Let's see each command in detail: - -## select - -This command is used to retrieve data from the database. It is generally followed by from and where clauses. - -Example: -```sql -select * from customers; -``` -This query will return all the rows from the table customers including all attributes (columns). - -```sql -select * -from customers -where address="India"; -``` -This query will return all the rows where the address of the customer is India. - -```sql -select name,address -from customers; -``` -This type of query returns only the name and address of the customers, i.e. the required information, instead of returning all the information. - -## insert - -The insert command is used to add rows to a table in the database. - -Example: -```sql -insert into customers values("Riya","India"); -``` -We can also insert multiple rows at a time: -```sql -insert into customers values -("Riya","India") -("Aditya","India") -("Chris","Germany"); -``` - -## update - -This command is used to update a certain row, given some information about that row. - -Example: -```sql -update customers -set name="Tanisha" -where customer_id=125; -``` -This query would update the name of the customer with id=125 to Tanisha. - -## delete - -Delete command is used to delete some rows in the table. - -Example: -```sql -delete from customers where customer_id=125; -``` -This will delete all the information of customer with id=125. - -We can also delete multiple rows at a time: -```sql -delete from customers where address="India"; -``` -This query would delete information of all customers from India. diff --git a/docs/DBMS/Structured Query Language/sql-aggregate-functions.md b/docs/DBMS/Structured Query Language/sql-aggregate-functions.md deleted file mode 100644 index 914ef38d5..000000000 --- a/docs/DBMS/Structured Query Language/sql-aggregate-functions.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -id: sql-aggregate-function -title: DBMS - SQL Aggregate Functions -sidebar_label: Aggregate Functions -sidebar_position: 3 -description: Learn about the SQL Aggregate Functions. -tags: - - DBMS - - SQL - - SQL-Functions - - Database Design ---- - -# DBMS - SQL Aggregate Functions - -Aggregate functions in SQL are used to perform calculations on multiple rows of a table's column and return a single value. These functions are essential for data analysis and reporting as they help in summarizing large datasets. - -## COMMON AGGREGATE FUNCTIONS - -1. **COUNT():** The COUNT() function returns the number of rows that match a specified condition. This query returns the total number of rows in the table. - ```sql - SELECT COUNT(*) AS total_rows - FROM table_name; - ``` - -2. **SUM():** The SUM() function returns the total sum of a numeric column. This query calculates the sum of all values in column_name. - ```sql - SELECT SUM(column_name) AS total_sum - FROM table_name; - ``` - -3. **AVG():** The AVG() function returns the average value of a numeric column. This query calculates the average value of column_name. - ```sql - SELECT AVG(column_name) AS average_value - FROM table_name; - ``` - -4. **MIN():** The MIN() function returns the smallest value in a specified column. This query finds the smallest value in column_name. - ```sql - SELECT MIN(column_name) AS minimum_value - FROM table_name; - ``` - -5. **MAX():** The MAX() function returns the largest value in a specified column. This query finds the largest value in column_name. - ```sql - SELECT MAX(column_name) AS maximum_value - FROM table_name; - ``` - -## AGGREGATE FUNCTIONS WITH GROUP BY - -Aggregate functions are often used in conjunction with the GROUP BY clause to group the result set by one or more columns and perform the calculation on each group. - ```sql - SELECT department, COUNT(*) AS total_employees - FROM employees - GROUP BY department; - ``` - This query groups the employees by their department and returns the number of employees in each department. - - ```sql - SELECT department, COUNT(*) AS total_employees, AVG(salary) AS average_salary, MAX(salary) AS highest_salary - FROM employees - GROUP BY department; - ``` - This query groups the employees by their department and returns the total number of employees, average salary, and highest salary in each department. - -## AGGREGATE FUNCTIONS USING HAVING - -The HAVING clause is used to filter groups based on the result of aggregate functions. It is similar to the WHERE clause, but WHERE cannot be used with aggregate functions. - ```sql - SELECT department, COUNT(*) AS total_employees - GROUP BY department - HAVING COUNT(*) > 10; - ``` - This query groups the employees by their department and returns the departments that have more than 10 employees. - -You can combine multiple aggregate functions in a single query to perform various calculations. - ```sql - SELECT COUNT(*) AS total_rows, SUM(column_name) AS total_sum, AVG(column_name) AS average_value - FROM table_name; - ``` - This query returns the total number of rows, the sum of column_name, and the average value of column_name. - -Aggregate functions are powerful tools in SQL for summarizing and analyzing data. By mastering these functions, you can perform complex data analysis and gain valuable insights from your database. - diff --git a/docs/DBMS/Structured Query Language/sql-basic-concepts.md b/docs/DBMS/Structured Query Language/sql-basic-concepts.md deleted file mode 100644 index 4811cea15..000000000 --- a/docs/DBMS/Structured Query Language/sql-basic-concepts.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: sql-basic-concepts -title: DBMS - SQL Basic Concepts -sidebar_label: Basic Concepts -sidebar_position: 1 -description: Learn about the Structured Query language (SQL), its basic concepts, data types, operators, and commands that form the foundation of database manipulation. -tags: - - DBMS - - SQL - - Database Design ---- - -# DBMS - SQL Basic Concepts - -SQL stands for Structured Query Language. It is used to access and manipulate data in databases. By executing queries SQL can *create*, *update*, *delete*, and *retrieve* data in databases like MySQL, Oracle, PostgreSQL, etc. Overall, SQL is a query language that communicates with databases. - -## Why SQL? -SQL helps to easily get information from data with high efficiency. Best Part? Without a lot of coding knowledge, we can manage a database with SQL. Anyone who knows English can master SQL queries in no time. -When we are executing the command of SQL on any Relational database managemnet system, then the system automatically finds the best routine to carry out our requests, and the SQL engine determines how to interpret the particular command. - - -## SQL DATABASE -The very first step is to store the information in database, hence, we will first create a database. - -1. **CREATE:** - To create a new database in SQL we use this command. Note that blank spaces are not allowed in the name and is case-insenitive. - ```sql - CREATE DATABASE database_name; -2. **SHOW:** - To view all the databases, we can use the keyword show. It returns a list of all the databases that exist in our system. - ```sql - SHOW DATABASE; -3. **USE:** - To change the database or select another database, we use the command: - ```sql - USE database_name; -4. **DROP:** - It is used to remove the entire database from the system. Once deleted, it can not be retrieved. - We can use the if exists clause to avoid any errors. - ```sql - DROP DATABASE database_name; - DROP DATABASE IF EXISTS database_name; -5. **RENAME:** - It is used to rename the database. - ```sql - RENAME DATABASE former_database_name TO new_database_name; - -## SQL TABLES -Now we have created the database. We will create tables inside our database. They are very similar to spreadsheets, which store data in very organized grid format. We can create as many tables as we require. -1. **CREATE:** - To create a new table in database we use this command. We define the structure of table and the datatypes of columns. - ```sql - CREATE table Employee( - EmployeeID INT PRIMARY KEY, - FirstName VARCHAR(50), - LastName VARCHAR(50), - Department VARCHAR(50), - Salary DECIMAL(10, 2) - ); -2. **DELETE:** - It is used to delete data in a database. We selectively remove records from a database table based on certain conditions. - ```sql - DELETE FROM table_name WHERE some_condition; -3. **DROP:** - It is used to delete data and structure of the table from the database permanently. - ```sql - DROP TABLE table_name; -4. **ALTER:** - It is used to rename the table. - ```sql - ALTER TABLE former_table_name RENAME TO new_table_name; diff --git a/docs/DBMS/Structured Query Language/sql-clauses-operators.md b/docs/DBMS/Structured Query Language/sql-clauses-operators.md deleted file mode 100644 index 5a8c80454..000000000 --- a/docs/DBMS/Structured Query Language/sql-clauses-operators.md +++ /dev/null @@ -1,203 +0,0 @@ ---- -id: sql-clauses-operators -title: DBMS - SQL Clauses & Operators -sidebar_label: Clauses & Operators -sidebar_position: 2 -description: Learn about the SQL clauses and operators. -tags: - - DBMS - - SQL-Operators - - SQL - - Database Design ---- - -# DBMS - SQL Clauses & Operators - -In SQL, clauses and operators play a crucial role in forming queries that manipulate and retrieve data from databases. Understanding these elements is essential for effective database management and query execution. - -## SQL Clauses - -SQL clauses are used to specify various conditions and constraints in SQL statements. Here are some of the most commonly used clauses: - -1. **SELECT:** - The SELECT clause is used to retrieve data from a database. - ```sql - SELECT column1, column2, ... - FROM table_name; -2. **WHERE:** - The WHERE clause is used to filter records based on a specified condition. - ```sql - SELECT column1, column2, ... - FROM table_name - WHERE condition; -3. **ORDER BY:** - The ORDER BY clause is used to sort the result set in ascending or descending order. - ```sql - SELECT column1, column2, ... - FROM table_name - ORDER BY column1 ASC | DESC; -4. **GROUP BY:** - The GROUP BY clause is used to group rows that have the same values into summary rows. - ```sql - SELECT column1, COUNT(*) - FROM table_name - GROUP BY column1; -5. **HAVING:** - The HAVING clause is used to filter groups based on a specified condition, often used with GROUP BY. - ```sql - SELECT column1, COUNT(*) - FROM table_name - GROUP BY column1 - HAVING condition; -6. **JOIN:** - The JOIN clause is used to combine rows from two or more tables based on a related column. - - **INNER JOIN:** - ```sql - SELECT columns - FROM table1 - INNER JOIN table2 - ON table1.column = table2.column; - - **LEFT JOIN (or LEFT OUTER JOIN):** - ```sql - SELECT columns - FROM table1 - LEFT JOIN table2 - ON table1.column = table2.column; - - **RIGHT JOIN (or RIGHT OUTER JOIN):** - ```sql - SELECT columns - FROM table1 - RIGHT JOIN table2 - ON table1.column = table2.column; - - **FULL JOIN (or FULL OUTER JOIN):** - ```sql - SELECT columns - FROM table1 - FULL JOIN table2 - ON table1.column = table2.column; - ``` - -## SQL Operators - -SQL operators are used to perform operations on data. Here are some of the most commonly used operators: - -1. **ARITHMETIC OPERATORS:** - Arithmetic operators are used to perform arithmetic operations on numeric data. - - - **ADDITION:** - ```sql - SELECT column1 + column2 AS result - FROM table_name; - ``` - - **SUBTRACTION:** - ```sql - SELECT column1 - column2 AS result - FROM table_name; - ``` - - **MULTIPLICATION:** - ```sql - SELECT column1 * column2 AS result - FROM table_name; - ``` - - **DIVISION:** - ```sql - SELECT column1 / column2 AS result - FROM table_name; - ``` - -2. **COMPARISON OPERATORS:** - Comparison operators are used to compare two values. - - - **EQUAL TO:** - ```sql - SELECT columns - FROM table_name - WHERE column = value; - ``` - - **NOT EQUAL TO:** - ```sql - SELECT columns - FROM table_name - WHERE column <> value; - ``` - - **GREATER THAN:** - ```sql - SELECT columns - FROM table_name - WHERE column > value; - ``` - - **LESS THAN:** - ```sql - SELECT columns - FROM table_name - WHERE column < value; - ``` - - **GREATER THAN OR EQUAL TO:** - ```sql - SELECT columns - FROM table_name - WHERE column >= value; - ``` - - **LESS THAN OR EQUAL TO:** - ```sql - SELECT columns - FROM table_name - WHERE column <= value; - ``` - -3. **LOGICAL OPERATORS:** - Logical operators are used to combine two or more conditions. - - - **AND:** - ```sql - SELECT columns - FROM table_name - WHERE condition1 AND condition2; - ``` - - **OR:** - ```sql - SELECT columns - FROM table_name - WHERE condition1 OR condition2; - ``` - - **NOT:** - ```sql - SELECT columns - FROM table_name - WHERE NOT condition; - ``` - -4. **OTHER USEFUL OPERATORS:** - - - **BETWEEN:** The BETWEEN operator selects values within a given range. - ```sql - SELECT columns - FROM table_name - WHERE column BETWEEN value1 AND value2; - ``` - - **IN:** The IN operator allows you to specify multiple values in a WHERE clause. - ```sql - SELECT columns - FROM table_name - WHERE column IN (value1, value2, ...); - ``` - - **LIKE:** The LIKE operator is used to search for a specified pattern in a column. - ```sql - SELECT columns - FROM table_name - WHERE column LIKE pattern; - ``` - - **IS NULL:** The IS NULL operator is used to test for empty values (NULL). - ```sql - SELECT columns - FROM table_name - WHERE column IS NULL; - ``` - - **IS NOT NULL:** The IS NOT NULL operator is used to test for non-empty values. - ```sql - SELECT columns - FROM table_name - WHERE column IS NOT NULL; - ``` - -This covers the basic SQL clauses and operators, which are essential for writing effective SQL queries. By mastering these elements, you can perform complex data manipulations and retrieve valuable insights from your database. \ No newline at end of file diff --git a/docs/DBMS/Structured Query Language/sql-data-types.md b/docs/DBMS/Structured Query Language/sql-data-types.md deleted file mode 100644 index 8550981c5..000000000 --- a/docs/DBMS/Structured Query Language/sql-data-types.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: sql-data-types -title: DBMS - SQL data-types -sidebar_label: Data-Types -sidebar_position: 5 -description: SQL data-types -tags: - - DBMS - - SQL - - Data Types ---- - -## Introduction: -Varios datatypes are supported in SQL. They include numeric data types, string data types and date and time. - -## Numeric data types - -1. int-
For integer data. -eg: -```sql -create table temp( - age int -); -``` -2. tinyint-
For very small values. -3. smallint-
For small values. -4. mediumint-
For medium vakues. -5. bigint-
Upto 20 digits. -6. float-
Used for decimals. It has 2 arguments, length and the number of digits after decimals. -eg: -```sql -create table temp( - cash float(10,2) -); -``` -7. double-
Similar to float but can denote much larger numbers. - - -## String data types - -1. char-
Used if the length of string is fixed. Has an argument, the length. -2. varchar-
Used for variable length strings. It also has an argument, the maximum possible length. -eg: -```sql -create table temp( - name varchar(50) -); -``` - -## Date and Time - -1. date -2. time -3. datetime -4. timestamnp \ No newline at end of file diff --git a/docs/DBMS/Structured Query Language/sql-sub-queries.md b/docs/DBMS/Structured Query Language/sql-sub-queries.md deleted file mode 100644 index bb90f1c1e..000000000 --- a/docs/DBMS/Structured Query Language/sql-sub-queries.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -id: sql-sub-queries -title: DBMS - SQL Sub-Queries -sidebar_label: Sub-Queries -sidebar_position: 4 -description: Learn with an example. -tags: - - DBMS - - SQL - - SQL-Queries - - Database Design ---- - -# DBMS - SQL Sub-Queries - -Subqueries, also known as inner queries or nested queries, are queries within a query. They are used to perform operations that require multiple steps, providing intermediate results for the outer query to process. Subqueries can be essential for complex data retrieval and manipulation, allowing you to break down complex queries into manageable parts. - -## WHY USE SUBQUERIES? - -1. **Modularity:** Break down complex queries into simpler parts. -2. **Reusability:** Use results from subqueries in multiple parts of the main query. -3. **Isolation:** Encapsulate logic to ensure clarity and correctness. -4. **Flexibility:** Perform operations like filtering, aggregating, and joining in a more readable way. - -## SYNTAX OF SUBQUERY - -A subquery is enclosed within parentheses and can be used in various parts of an SQL statement, such as the `SELECT`, `FROM`, `WHERE`, and `HAVING` clauses. -```sql -SELECT column1, column2 -FROM table1 -WHERE column3 = (SELECT column1 FROM table2 WHERE condition); -``` - - -## TYPES OF SUBQUERIES -1. **SCALAR:** These return a single value and are often used in SELECT or WHERE clauses. - ```sql - SELECT first_name, last_name - FROM employees - WHERE salary > (SELECT AVG(salary) FROM employees); - ``` - This query selects employees whose salary is above the average salary. - -2. **COLUMN:** These return a single column of values and can be used with IN or ANY. - ```sql - SELECT first_name, last_name - FROM employees - WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'IT'); - ``` - This query selects employees who work in the IT department. - -3. **ROW:** These return a single row of values and are used in comparisons involving multiple columns. - ```sql - SELECT first_name, last_name - FROM employees - WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees); - ``` - This query selects the employee with the highest salary in each department. - -4. **TABLE:** These return a result set that can be used as a temporary table in the FROM clause. - ```sql - SELECT department_id, AVG(salary) - FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS high_salaries - GROUP BY department_id; - ``` - This query calculates the average salary for employees earning more than 50,000, grouped by department. - - -## SUBQUERIES IN DIFFERENT CLAUSES -1. **SELECT Clause:** Used to return a value for each row selected by the outer query. - ```sql - SELECT first_name, last_name, (SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) AS department - FROM employees; - ``` - This query retrieves the department name for each employee. - -2. **FROM Clause:** Used to create a temporary table for the outer query to use. - ```sql - SELECT temp.department_id, AVG(temp.salary) AS avg_salary - FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS temp - GROUP BY temp.department_id; - ``` - This query calculates the average salary of employees earning more than 50,000, grouped by department. - -3. **WHERE Clause:** Used to filter rows based on the result of the subquery. - ```sql - SELECT first_name, last_name - FROM employees - WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'HR'); - ``` - This query selects employees working in the HR department. - -4. **HAVING Clause:** Used to filter groups based on the result of the subquery. - ```sql - SELECT department_id, COUNT(*) AS num_employees - FROM employees - GROUP BY department_id - HAVING COUNT(*) > (SELECT AVG(num_employees) FROM (SELECT department_id, COUNT(*) AS num_employees FROM employees GROUP BY department_id) AS sub); - ``` - This query selects departments with a number of employees greater than the average number of employees per department. - -## TIPS FOR USING SUBQUERIES -1. **Performance:** Subqueries can be less efficient than joins, especially for large datasets. Optimize where possible. -2. **Readability:** Use subqueries to simplify complex queries, but ensure they remain readable. -3. **Testing:** Test subqueries separately to ensure they return the expected results before integrating them into the main query. - -Subqueries are powerful tools for SQL query formulation, allowing for modular, reusable, and flexible query structures. Mastering subqueries can significantly enhance your ability to manipulate and retrieve data effectively. \ No newline at end of file diff --git a/docs/DBMS/Transaction and Concurrency/_category.json b/docs/DBMS/Transaction and Concurrency/_category.json deleted file mode 100644 index b0eac087a..000000000 --- a/docs/DBMS/Transaction and Concurrency/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Transaction", - "position": 4, - "link": { - "type": "generated-index", - "description": "Explore transactions, ACID properties, concurrency control, and serializability in DBMS." - } -} \ No newline at end of file diff --git a/docs/DBMS/Transaction and Concurrency/dbms-concurrency-control.md b/docs/DBMS/Transaction and Concurrency/dbms-concurrency-control.md deleted file mode 100644 index 88a6b5538..000000000 --- a/docs/DBMS/Transaction and Concurrency/dbms-concurrency-control.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: dbms-concurrency-control -title: DBMS - Concurrency Control -sidebar_label: Concurrency Control -sidebar_position: 3 -description: Explore concurrency control protocols in database management, including lock-based protocols and timestamp-based protocols, ensuring atomicity, isolation, and serializability of transactions. ---- - -# DBMS - Concurrency Control - -In a multi-transaction environment, managing concurrency is vital to ensure the atomicity, isolation, and serializability of transactions. Concurrency control protocols play a crucial role in achieving these objectives and maintaining data integrity. - -## Lock-based Protocols - -Lock-based protocols restrict access to data items using locks, ensuring that transactions acquire appropriate locks before reading or writing data. There are two types of locks: - -- **Binary Locks:** Data items can be either locked or unlocked. -- **Shared/Exclusive Locks:** Differentiates locks based on their use (read or write). - -### Types of Lock-based Protocols - -#### Simplistic Lock Protocol - -Transactions acquire locks on data items before performing write operations and release them afterward. - -#### Pre-claiming Lock Protocol - -Transactions pre-determine the locks they need, request all locks before execution, and roll back if all locks are not granted. - -#### Two-Phase Locking (2PL) - -Divides transaction execution into two phases: growing phase (acquiring locks) and shrinking phase (releasing locks). - -#### Strict Two-Phase Locking (Strict-2PL) - -Similar to 2PL but holds all locks until the commit point, releasing them simultaneously. - -## Timestamp-based Protocols - -Timestamp-based protocols use timestamps (system time or logical counter) to manage concurrency and ordering of transactions. - -Every transaction and data item has associated timestamps for read and write operations. - -### Timestamp Ordering Protocol - -Ensures serializability among conflicting read and write operations based on transaction timestamps. - -#### Rules - -- Read(X) operation: - - $TS(Ti) < W-timestamp(X)$: Rejected. - - $TS(Ti) >= W-timestamp(X)$: Executed, update timestamps. -- Write(X) operation: - - $TS(Ti) < R-timestamp(X)$: Rejected. - - $TS(Ti) < W-timestamp(X)$: Rejected, rollback. - - Otherwise: Executed. - -#### Thomas' Write Rule - -If $TS(Ti) < W-timestamp(X)$, the write operation is rejected, and Ti is rolled back. - -## Summary - -Concurrency control protocols, whether lock-based or timestamp-based, are essential for managing transactions effectively in a database system. They ensure transactions are executed in a controlled manner, maintaining data consistency and integrity. diff --git a/docs/DBMS/Transaction and Concurrency/transaction.md b/docs/DBMS/Transaction and Concurrency/transaction.md deleted file mode 100644 index d49ba2ed5..000000000 --- a/docs/DBMS/Transaction and Concurrency/transaction.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -id: dbms-transaction -title: DBMS - Transaction -sidebar_label: Transaction -sidebar_position: 2 -description: Learn about transactions in database management, their properties (ACID), states, and the importance of serializability in ensuring data integrity. ---- - -# DBMS - Transactions - -A transaction in a Database Management System (DBMS) is defined as a group of tasks that together form a single unit of work. Each task in a transaction is the smallest processing unit that cannot be divided further. Transactions are crucial in ensuring data integrity and consistency within a database. - -## Example of a Transaction - -Consider a bank transaction where Rs 500 is transferred from A's account to B's account. This transaction involves the following tasks: - -**A's Account:** -1. Open_Account(A) -2. Old_Balance = A.balance -3. New_Balance = Old_Balance - 500 -4. A.balance = New_Balance -5. Close_Account(A) - -**B's Account:** -1. Open_Account(B) -2. Old_Balance = B.balance -3. New_Balance = Old_Balance + 500 -4. B.balance = New_Balance -5. Close_Account(B) - -## ACID Properties - -Transactions must satisfy the ACID properties to ensure accuracy, completeness, and data integrity. - -- **Atomicity:** Ensures that all operations within the transaction are completed; if not, the transaction is aborted. -- **Consistency:** Ensures that the database remains in a consistent state before and after the transaction. -- **Isolation:** Ensures that transactions are executed in isolation, without interference from other transactions. -- **Durability:** Ensures that the results of a committed transaction are permanently stored in the database, even in the case of a system failure. - -## Serializability - -Serializability ensures that the transactions produce the same results as if they were executed serially, one after the other. This is crucial in a multi-transaction environment. - -### Types of Schedules - -- **Serial Schedule:** Transactions are executed one after the other, without overlapping. -- **Equivalence Schedules:** Schedules that are considered equivalent if they satisfy certain properties. - -#### Equivalence Schedules Types - -- **Result Equivalence:** Schedules that produce the same result after execution. - -- **View Equivalence:** Schedules where transactions perform similar actions in a similar manner. - -##### Example - -- If T reads the initial data in S1, then it also reads the initial data in S2. - -- If T reads the value written by J in S1, then it also reads the value written by J in S2. - -- If T performs the final write on the data value in S1, then it also performs the final write on the data value in S2. - -- **Conflict Equivalence:** Schedules with conflicting operations that access the same data item, where at least one operation is a write. - -Two schedules would be conflicting if they have the following properties − - -- Both belong to separate transactions. -- Both accesses the same data item. -- At least one of them is "write" operation. - -Two schedules having multiple transactions with conflicting operations are said to be conflict equivalent if and only if − - -- Both the schedules contain the same set of Transactions. -- The order of conflicting pairs of operation is maintained in both the schedules. - -> **Note :** View equivalent schedules are view serializable and conflict equivalent schedules are conflict serializable. All conflict serializable schedules are view serializable too. - -## Equivalence Types Comparison Table - -| Equivalence Type | Description | Significance | -|------------------|-------------|--------------| -| Result Equivalence | Produces the same result after execution. | Not generally significant due to variable results. | -| View Equivalence | Transactions perform similar actions in a similar manner. | Ensures transactions read and write similar values. | -| Conflict Equivalence | Transactions have conflicting operations accessing the same data item. | Ensures conflicting operations maintain order. | - -## States of Transactions - -A transaction in a database can be in one of the following states: - -- **Active:** The transaction is being executed. -- **Partially Committed:** The transaction has executed its final operation but not yet committed. -- **Failed:** The transaction has encountered an error and cannot proceed. -- **Aborted:** The transaction has been rolled back to its original state. -- **Committed:** The transaction has successfully completed and its changes are permanently applied to the database. - - -### Transaction States Diagram - -```mermaid -stateDiagram-v2 - [*] --> Active - Active --> PartiallyCommitted : Final operation - PartiallyCommitted --> Committed : Commit - Active --> Failed : Error - Failed --> Aborted : Rollback - Aborted --> [*] - Committed --> [*] -``` - -## Summary - -Transactions are vital for maintaining data integrity and consistency in DBMS. By adhering to the ACID properties, transactions ensure reliable and accurate database operations. Understanding transaction states and serializability helps in managing and optimizing concurrent transactions effectively. \ No newline at end of file diff --git a/docs/DBMS/_category.json b/docs/DBMS/_category.json deleted file mode 100644 index aa94290b4..000000000 --- a/docs/DBMS/_category.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "DBMS", - "position": 5, - "link": { - "type": "generated-index", - "description": "Database Management Systems (DBMS) are software systems designed to manage databases. They provide an interface for users and applications to interact with data efficiently and securely. DBMSs support various types of databases, such as relational, NoSQL, and distributed databases, each serving different purposes and use cases. Relational databases use structured query language (SQL) for defining and manipulating data, while NoSQL databases are designed for specific data models and scalability. Key features of DBMS include data integrity, concurrency control, transaction management, and data security. Examples of popular DBMS include MySQL, PostgreSQL, MongoDB, and Oracle Database." - } -} \ No newline at end of file diff --git a/docs/DBMS/data-independence-dbms.md b/docs/DBMS/data-independence-dbms.md deleted file mode 100644 index a5289c66c..000000000 --- a/docs/DBMS/data-independence-dbms.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: data-independence-dbms -title: DBMS Data Independence -sidebar_label: Data Independence -sidebar_position: 6 -tags: [dbms, data independence] -description: Understand data independence in DBMS, including logical and physical data independence, and their importance in maintaining flexibility and scalability. ---- - -# DBMS - Data Independence - -If a database system is not multi-layered, then it becomes difficult to make any changes in the database system. Database systems are designed in multi-layers as we learned earlier. - -## Data Independence - -A database system normally contains a lot of data in addition to users’ data. For example, it stores data about data, known as metadata, to locate and retrieve data easily. It is rather difficult to modify or update a set of metadata once it is stored in the database. But as a DBMS expands, it needs to change over time to satisfy the requirements of the users. If the entire data is dependent, it would become a tedious and highly complex job. - -![data_independence](https://www.tutorialspoint.com/dbms/images/data_independence.png) - -### Data Independence - -Metadata itself follows a layered architecture, so that when we change data at one layer, it does not affect the data at another level. This data is independent but mapped to each other. - -### Logical Data Independence - -Logical data is data about the database, that is, it stores information about how data is managed inside. For example, a table (relation) stored in the database and all its constraints, applied to that relation. - -Logical data independence is a kind of mechanism, which liberalizes itself from actual data stored on the disk. If we make some changes to the table format, it should not change the data residing on the disk. - -### Physical Data Independence - -All the schemas are logical, and the actual data is stored in bit format on the disk. Physical data independence is the power to change the physical data without impacting the schema or logical data. - -For example, if we want to change or upgrade the storage system itself − suppose we want to replace hard disks with SSDs − it should not have any impact on the logical data or schemas. \ No newline at end of file diff --git a/docs/DBMS/data-models.md b/docs/DBMS/data-models.md deleted file mode 100644 index e9f45520e..000000000 --- a/docs/DBMS/data-models.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -id: data-models-dbms -title: DBMS Data Models -sidebar_label: Data Models -sidebar_position: 4 -tags: [dbms, data models] -description: Learn about different data models in DBMS, including flat data models, Entity-Relationship models, and relational models, and understand how data is structured, processed, and stored. ---- - -# DBMS - Data Models - -Data models define the logical structure of a database and introduce abstraction in a DBMS. They specify how data is connected, processed, and stored within the system. - -## Flat Data Models - -Flat data models were the earliest, where all data was kept on the same plane. However, they were prone to duplication and update anomalies due to their non-scientific nature. - -## Entity-Relationship Model (ER Model) - -The Entity-Relationship (ER) Model is based on real-world entities and their relationships. It creates entity sets, relationship sets, attributes, and constraints, making it suitable for conceptual database design. - -```mermaid ---- -title: ER Model Example ---- -erDiagram - STUDENT { - string name - int age - string class - } - TEACHER { - string name - string subject - } - COURSE { - string name - int credits - } - STUDENT ||--o{ COURSE : enrolls - TEACHER ||--o{ COURSE : teaches -``` - -### Concepts of ER Model - -- **Entity**: A real-world entity with attributes defined by a domain. For example, in a school database, a student is an entity with attributes like name, age, and class. -- **Relationship**: Logical associations between entities, defined by mapping cardinalities such as one-to-one, one-to-many, many-to-one, and many-to-many. - -## Relational Model - -The Relational Model is the most popular data model in DBMS, based on first-order predicate logic. It defines a table as an n-ary relation. - -```mermaid ---- -title: Relational Model Table Example ---- -erDiagram - CUSTOMER { - int id - string name - string address - } - ORDER { - int id - date orderDate - float amount - } - LINE_ITEM { - int id - int quantity - float price - } - CUSTOMER ||--o{ ORDER : places - ORDER ||--|{ LINE_ITEM : contains - CUSTOMER }|..|{ DELIVERY_ADDRESS : uses - DELIVERY_ADDRESS { - int id - string street - string city - string zip - } -``` - -### Highlights of Relational Model - -- Data stored in tables (relations). -- Relations can be normalized. -- Normalized relations contain atomic values. -- Each row in a relation has a unique value. -- Columns in a relation contain values from the same domain. \ No newline at end of file diff --git a/docs/DBMS/data-schema.md b/docs/DBMS/data-schema.md deleted file mode 100644 index 181554ade..000000000 --- a/docs/DBMS/data-schema.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: data-schema-dbms -title: DBMS Data Schemas -sidebar_label: Data Schemas -sidebar_position: 5 -tags: [dbms, data schemas] -description: Learn about database schemas, including physical and logical schemas, and understand their role in defining the structure and constraints of a database. ---- - -# DBMS - Data Schemas - -A database schema is the skeleton structure that represents the logical view of the entire database. It defines how the data is organized and how the relations among them are associated. It formulates all the constraints that are to be applied to the data. - -## Database Schema - -A database schema defines its entities and the relationship among them. It contains a descriptive detail of the database, which can be depicted by means of schema diagrams. It’s the database designers who design the schema to help programmers understand the database and make it useful. - -![dbms_schemas](https://www.tutorialspoint.com/dbms/images/dbms_schemas.png) - -### Categories of Database Schema - -A database schema can be divided broadly into two categories: - -- **Physical Database Schema**: This schema pertains to the actual storage of data and its form of storage like files, indices, etc. It defines how the data will be stored in a secondary storage. - -- **Logical Database Schema**: This schema defines all the logical constraints that need to be applied to the data stored. It defines tables, views, and integrity constraints. - -## Database Instance - -> **Note:** It is important to distinguish these two terms individually: - -- **Database Schema**: The skeleton of the database, designed before the database is created. Once the database is operational, it is very difficult to make any changes to it. A database schema does not contain any data or information. - -- **Database Instance**: A state of the operational database with data at any given time. It contains a snapshot of the database. Database instances tend to change with time. A DBMS ensures that every instance (state) is valid by diligently following all the validations, constraints, and conditions that the database designers have imposed. diff --git a/docs/DBMS/dbms-architecture.md b/docs/DBMS/dbms-architecture.md deleted file mode 100644 index e0a01aa67..000000000 --- a/docs/DBMS/dbms-architecture.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: architecture-dbms -title: DBMS Architecture -sidebar_label: DBMS Architecture -sidebar_position: 3 -tags: [dbms, architecture] -description: Learn about the architecture of Database Management Systems (DBMS) including single-tier, two-tier, and three-tier architectures. ---- - -# DBMS - Architecture - -The design of a DBMS depends on its architecture, which can be centralized, decentralized, or hierarchical. The architecture can also be classified as single-tier or multi-tier. - -## Single-Tier Architecture - -In a single-tier architecture, the DBMS is the sole entity where the user directly interacts with and uses it. Any changes made here directly affect the DBMS itself. However, this architecture lacks convenient tools for end-users, making it more suitable for database designers and programmers. - -## Two-Tier Architecture - -A two-tier architecture involves an application through which the DBMS is accessed. Programmers use this architecture to access the DBMS via an application, with the application tier operating independently of the database in terms of operation, design, and programming. - -## Three-Tier Architecture - -The three-tier architecture is the most widely used to design a DBMS, as it separates tiers based on user complexity and data usage: - -![3-tier image](https://www.tutorialspoint.com/dbms/images/dbms_architecture.png) - -- **Database (Data) Tier**: This tier houses the database along with query processing languages and data relations. - -- **Application (Middle) Tier**: Here, the application server and programs that access the database reside. This tier presents an abstracted view of the database to end-users, acting as a mediator between them and the database. - -- **User (Presentation) Tier**: End-users operate on this tier, unaware of the database's existence beyond this layer. The application can provide multiple views of the database, generated by applications in the application tier. - -The multiple-tier database architecture is highly modifiable, as its components are independent and can be changed independently. diff --git a/docs/DBMS/dbms-types-of-languages.md b/docs/DBMS/dbms-types-of-languages.md deleted file mode 100644 index 063136560..000000000 --- a/docs/DBMS/dbms-types-of-languages.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -id: database-languages -title: DBMS Database Languages -sidebar_label: Database Languages -sidebar_position: 7 -tags: [dbms] -description: Learn about different types of languages in DBMS. ---- - -There are 4 types of database languages: -- DDL (Data Definition Language) -- DML (Data Manipulation Language) -- DCL (Data Control Language) -- TCL (Transaction Control Language) - -## DDL - Data Definition Language - -DDL commands result in structural changes in the database. - -These commands include: -- create -- alter -- truncate -- drop -- comment -- rename - -1. ### Create -create command can be used to create a database or a table. - -Example: -```sql -create table customers( - name varchar(50), - age int -); -``` -This command would create a new table 'customers' with two columns, name and age. - -2. ### Alter - -Alter command can be used for different purposes, such as adding a column, dropping a column, modifying a column name,etc. - -Example: - -```sql -alter table customers -add column city varchar(20); -``` -This command would add a new coulum 'city' of type varchar to the table customers.
Since alter is a ddl command, it cannot be used to delete a row! - - -3. ### Truncate - -The 'truncate' command is used to remove all the current data from a table, without deleting the table. - -Consider the table below: ------------------- -| name | age | -|---------|------| -| Siya | 24 | -| Dipti | 45 | -| Aditya | 18 | -| Lakshya | 51 | ------------------- - -Now, lets use the truncate command: - -```sql -truncate table customers; - -/* Output: -mysql> select * from customers; -Empty set (0.00 sec) -*/ -``` -As expected, the command deletes all the rows from the table. - -4. ### Rename - -The 'rename' command is used to change the name of the table or a column. - -example: -```sql -alter table customers -rename to cust; - -``` -This example would rename the table 'customers' to 'cust'. - -5. Drop - -Drop command is used to delete a column or to to delete a table, or even a database. - -example: -```sql -drop table cust; -``` -This example would drop the table 'cust' from the database. - -## DML - Data Manipulation Language - -DML commands modify / retrieve the data in the database and do not result in any structural changes. - -These command include: -- insert -- select -- delete -- update - -1. ### Insert - -The insert command is used to add data, a row, in a table. - -example. -```sql - insert into customers values - ("Siya",24), - ("Dipti",45), - ("Aditya",18), - ("Lakshya",51); -``` -Thsi query would insert 4 rows in the 'customers' table. - -2. ### Select - -Data is retrieved using this command. -example: -```sql - select * from customers; - - /* Output: - +---------+------+ -| name | age | -+---------+------+ -| Siya | 24 | -| Dipti | 45 | -| Aditya | 18 | -| Lakshya | 51 | -+---------+------+ - */ -``` -3. ### Update - -This DML command is used to update values in a table. - -example: -```sql -update customers -set age=28 -where name="Siya"; - -/* Output: -mysql> select age from customers where name="Siya"; -+------+ -| age | -+------+ -| 28 | -+------+ -1 row in set (0.00 sec) -*/ -``` - -4. ### Delete - -This command is used to delete a row from the table. -example: -```sql -delete from customers -where name="Siya"; - -/* Output: -mysql> select age from customers where name="Siya"; -Empty set (0.00 sec) -*/ -``` - -## DCL - Data Control Language - -DCL commands are used to control the accessto the database. - -These command include: -- grant -- revoke - -The grant command grants the access to the database. Revoke, on the other hamd, revokes the access to the database. - -### TCL - Transaction Control Language - -TCL commands include: -- Commit -- Rollback - -Commit command saves the state after a transaction is complete.
-Rollback command retrieves the original state of the database, i.e. the state before any operations of that transaction are performed. - -### Conclusion: -In this tutorial, we learnt about the different types of database languages, how to execute various commands and their results. diff --git a/docs/DBMS/home.md b/docs/DBMS/home.md deleted file mode 100644 index ce495b107..000000000 --- a/docs/DBMS/home.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -id: dbms-home -title: Database Management System Tutorial Home -sidebar_label: Home -sidebar_position: 1 -tags: [dbms, overview] -description: In this tutorial, you will learn about Database Management Systems (DBMS), their architecture, data models, applications, and importance in modern computing. ---- - -# Database Management System Tutorial - -## Discussion - -Database Management System or DBMS in short refers to the technology of storing and retrieving users' data with utmost efficiency along with appropriate security measures. This tutorial explains the basics of DBMS such as its architecture, data models, data schemas, data independence, E-R model, relation model, relational database design, and storage and file structure and much more. - -## Why to Learn DBMS? - -Traditionally, data was organized in file formats. DBMS was a new concept then, and all the research was done to make it overcome the deficiencies in traditional style of data management. A modern DBMS has the following characteristics − - -- **Real-world entity** − A modern DBMS is more realistic and uses real-world entities to design its architecture. It uses the behavior and attributes too. For example, a school database may use students as an entity and their age as an attribute. - -- **Relation-based tables** − DBMS allows entities and relations among them to form tables. A user can understand the architecture of a database just by looking at the table names. - -- **Isolation of data and application** − A database system is entirely different than its data. A database is an active entity, whereas data is said to be passive, on which the database works and organizes. DBMS also stores metadata, which is data about data, to ease its own process. - -- **Less redundancy** − DBMS follows the rules of normalization, which splits a relation when any of its attributes is having redundancy in values. Normalization is a mathematically rich and scientific process that reduces data redundancy. - -- **Consistency** − Consistency is a state where every relation in a database remains consistent. There exist methods and techniques, which can detect attempt of leaving database in inconsistent state. A DBMS can provide greater consistency as compared to earlier forms of data storing applications like file-processing systems. - -- **Query Language** − DBMS is equipped with query language, which makes it more efficient to retrieve and manipulate data. A user can apply as many and as different filtering options as required to retrieve a set of data. Traditionally it was not possible where file-processing system was used. - -## Applications of DBMS - -Database is a collection of related data and data is a collection of facts and figures that can be processed to produce information. - -Mostly data represents recordable facts. Data aids in producing information, which is based on facts. For example, if we have data about marks obtained by all students, we can then conclude about toppers and average marks. - -A database management system stores data in such a way that it becomes easier to retrieve, manipulate, and produce information. Following are the important characteristics and applications of DBMS. - -- **ACID Properties** − DBMS follows the concepts of Atomicity, Consistency, Isolation, and Durability (normally shortened as ACID). These concepts are applied on transactions, which manipulate data in a database. ACID properties help the database stay healthy in multi-transactional environments and in case of failure. - -- **Multiuser and Concurrent Access** − DBMS supports multi-user environment and allows them to access and manipulate data in parallel. Though there are restrictions on transactions when users attempt to handle the same data item, but users are always unaware of them. - -- **Multiple views** − DBMS offers multiple views for different users. A user who is in the Sales department will have a different view of database than a person working in the Production department. This feature enables the users to have a concentrate view of the database according to their requirements. - -- **Security** − Features like multiple views offer security to some extent where users are unable to access data of other users and departments. DBMS offers methods to impose constraints while entering data into the database and retrieving the same at a later stage. DBMS offers many different levels of security features, which enables multiple users to have different views with different features. For example, a user in the Sales department cannot see the data that belongs to the Purchase department. Additionally, it can also be managed how much data of the Sales department should be displayed to the user. Since a DBMS is not saved on the disk as traditional file systems, it is very hard for miscreants to break the code. - -## Audience - -This DBMS tutorial will especially help computer science graduates in understanding the basic-to-advanced concepts related to Database Management Systems. - -## Prerequisites - -Before you start proceeding with this tutorial, it is recommended that you have a good understanding of basic computer concepts such as primary memory, secondary memory, and data structures and algorithms. diff --git a/docs/DBMS/overview.md b/docs/DBMS/overview.md deleted file mode 100644 index 2a1afad5e..000000000 --- a/docs/DBMS/overview.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: overview-dbms -title: DBMS Overview -sidebar_label: Overview -sidebar_position: 2 -tags: [dbms, overview] -description: In this tutorial, you will learn about Database Management Systems (DBMS), their architecture, data models, applications, and importance in modern computing. ---- - -# DBMS - Overview - -## Database Overview - -A database is a collection of related data, consisting of facts and figures that can be processed to produce information. Data often represents recordable facts and aids in producing meaningful information. For instance, data about student marks enables conclusions about top performers and average scores. A database management system (DBMS) stores data efficiently, facilitating retrieval, manipulation, and information generation. - -## Characteristics of DBMS - -Traditionally, data was organized in file formats. DBMS emerged to overcome deficiencies in traditional data management. Modern DBMS possess several key characteristics: - -- **Real-world entity**: DBMS uses real-world entities with their attributes and behavior. For instance, in a school database, students are entities with attributes like age. -- **Relation-based tables**: Entities and relations among them form tables, simplifying database architecture understanding. - -- **Isolation of data and application**: DBMS separates data from the application, utilizing metadata for its processes. -- **Less redundancy**: DBMS follows normalization rules, reducing data redundancy and ensuring data integrity. -- **Consistency**: DBMS maintains consistency across relations, detecting and preventing inconsistencies. -- **Query Language**: Equipped with query languages, DBMS efficiently retrieves and manipulates data with various filtering options. -- **ACID Properties**: DBMS follows Atomicity, Consistency, Isolation, and Durability (ACID) principles, ensuring transactional integrity. -- **Multiuser and Concurrent Access**: Supports multi-user environments with concurrent data access, maintaining data integrity. -- **Multiple Views**: Offers different views for users based on their roles and requirements. -- **Security**: Implements security features to restrict data access based on user roles and ensure data confidentiality and integrity. - -## Users of DBMS - -A typical DBMS has users with different rights and permissions: - -- **Administrators**: Maintain and administer the DBMS, creating user access profiles and managing system resources. -- **Designers**: Work on designing the database structure, including entities, relations, constraints, and views. -- **End Users**: Utilize the DBMS for various purposes, from viewing data to conducting sophisticated analyses. diff --git a/docs/Deep Learning/Activation Function/Activation Function.md b/docs/Deep Learning/Activation Function/Activation Function.md deleted file mode 100644 index f952e202e..000000000 --- a/docs/Deep Learning/Activation Function/Activation Function.md +++ /dev/null @@ -1,107 +0,0 @@ -# Activation Functions in Deep Learning: LaTeX Equations and Python Implementation - -## Overview - -This project provides LaTeX equations, explanations, and Python implementations for various activation functions used in Artificial Neural Networks (ANN) and Deep Learning. Our goal is to offer clear, visually appealing mathematical representations and practical implementations of these functions for educational and reference purposes. - -## Contents - -1. [Introduction to Activation Functions](#introduction-to-activation-functions) -2. [Activation Functions](#activation-functions) -3. [Mathematical Equations](#mathematical-equations) -4. [Python Implementations](#python-implementations) -5. [Jupyter Notebook](#jupyter-notebook) -7. [Comparison of Activation Functions](#comparison-of-activation-functions) -8. [How to Use This Repository](#how-to-use-this-repository) - - -## Introduction to Activation Functions - -Activation functions are crucial components in neural networks, introducing non-linearity to the model and allowing it to learn complex patterns. They determine the output of a neural network node, given an input or set of inputs. - -## Activation Functions - -This project covers the following activation functions: - -### Non-Linear Activation Functions -Non-linear activation functions introduce non-linearity into the model, enabling the network to learn and represent complex patterns. - -- Essential for deep learning models as they introduce the non-linearity needed to capture complex patterns and relationships in the data. - -- Here are some common non-linear activation functions: -1. Sigmoid -2. Hyperbolic Tangent (tanh) -3. Rectified Linear Unit (ReLU) - -### Linear Activation Functions -A linear activation function is a function where the output is directly proportional to the input. - -- **Linearity:** The function does not introduce any non-linearity. The output is just a scaled version of the input. -- **Derivative:** The derivative of the function is constant, which means it does not vary with the input. - -- Here are some common linear activation functions: - -1. Identity -2. Step Function - -## Mathematical Equations - -We provide LaTeX equations for each activation function. For example: - -1. Sigmoid: $\sigma(x) = \frac{1}{1 + e^{-x}}$ -2. Hyperbolic Tangent: $\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$ -3. ReLU: $f(x) = \max(0, x)$ -4. Linear : $f(x) = x$ -5. Step : - -$$ -f(x) = -\begin{cases} -0 & \text{if } x < \text{threshold} \\ -1 & \text{if } x \geq \text{threshold} -\end{cases} -$$ - - -## Python Implementations - -Here are the Python implementations of the activation functions: - -```python -import numpy as np - -# Non-Linear activation functions -def sigmoid(x): - return 1 / (1 + np.exp(-x)) - -def tanh(x): - return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x)) - -def reLu(x): - return np.maximum(x, 0) - -# Linear activation functions -def identity(x): - return x - -def step(x, thres): - return np.where(x >= thres, 1, 0) -``` - - -## How to Use This Repository - -- Clone this repository to your local machine. - -```bash - git clone https://github.com/CodeHarborHub/codeharborhub.github.io/tree/main/docs/Deep%20Learning/Activation function -``` -- For Python implementations and visualizations: - -1. Ensure you have Jupyter Notebook installed - -```bash - pip install jupyter -``` -2. Navigate to the project directory in your terminal. -3. Open activation_functions.ipynb. diff --git a/docs/Deep Learning/Ann.md b/docs/Deep Learning/Ann.md deleted file mode 100644 index 8686cdc20..000000000 --- a/docs/Deep Learning/Ann.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -id: artificial-neural-networks -title: Artificial Neural Networks -sidebar_label: Artificial Neural Networks -sidebar_position: 2 -tags: [Deep Learning, Artificial Neural Networks] - ---- - -Artificial Neural Networks (ANNs) are computing systems inspired by the biological neural networks that constitute animal brains. They are a key component of deep learning and machine learning. ANNs consist of interconnected layers of nodes, called neurons, which process and transmit information. These networks are capable of learning from data, making them powerful tools for various applications. - -### **Structure of ANNs** - -![alt text](img2.png) - -1. **Input Layer**: The input layer receives the initial data and passes it to the subsequent layers. -2. **Hidden Layers**: These layers perform computations and feature extraction. There can be one or multiple hidden layers, making the network deeper and more capable of handling complex tasks. -3. **Output Layer**: The final layer produces the output, which can be a classification, prediction, or any other result based on the input data. - -The learning process of Artificial Neural Networks (ANNs) involves several key steps, starting from initializing the network to adjusting its parameters based on data. Here’s a detailed breakdown: - -### 1. Initialization -- **Architecture Design**: Choose the number of layers and the number of neurons in each layer. The architecture can be shallow (few layers) or deep (many layers). -- **Weight Initialization**: Assign initial values to the weights and biases in the network. This can be done randomly or using specific strategies like Xavier or He initialization. - -#### Example -- **Architecture**: 1 input layer (2 neurons), 1 hidden layer (3 neurons), 1 output layer (1 neuron). -- **Weights and Biases**: Randomly initialized. - -### 2. Forward Propagation -- **Input Layer**: The input layer receives the raw data. Each neuron in this layer represents an input feature. -- **Hidden Layers**: Each neuron in a hidden layer computes a weighted sum of its inputs, adds a bias term, and applies an activation function (e.g., ReLU, Sigmoid, Tanh) to introduce non-linearity. -- **Output Layer**: The final layer produces the network's output. The activation function in this layer depends on the task (e.g., Softmax for classification, linear for regression). - -### 3. Loss Computation -- **Loss Function**: Calculate the loss (or error) which quantifies the difference between the predicted output and the actual target. Common loss functions include Mean Squared Error (MSE) for regression and Cross-Entropy Loss for classification. - -### 4. Backpropagation -- **Gradient Computation**: Calculate the gradient of the loss function with respect to each weight and bias in the network using the chain rule of calculus. This involves computing the partial derivatives of the loss with respect to each parameter. -- **Weight Update**: Adjust the weights and biases using a gradient-based optimization algorithm. The most common method is Stochastic Gradient Descent (SGD) and its variants (e.g., Adam, RMSprop). The update rule typically looks like: - - ![alt text](img3.png) - -### 5. Epochs and Iterations -- **Epoch**: One full pass through the entire training dataset. -- **Iteration**: One update of the network's weights, usually after processing a mini-batch of data. - -### 6. Convergence -- **Stopping Criteria**: Training continues for a predefined number of epochs or until the loss converges to a satisfactory level. Early stopping can be used to halt training when performance on a validation set starts to degrade, indicating overfitting. - - -The learning process of ANNs involves initializing the network, propagating inputs forward to compute outputs, calculating loss, backpropagating errors to update weights, and iterating until the model converges. Each step is crucial for the network to learn and make accurate predictions on new, unseen data. - -### **Types of ANNs** - -Artificial Neural Networks (ANNs) come in various types, each designed to address specific tasks and data structures. Here’s a detailed overview of the most common types of ANNs: - -### 1. Feedforward Neural Networks (FNN) -- The simplest type of ANN, where the data moves in only one direction—from the input layer through hidden layers to the output layer. -- **Use Cases**: Basic pattern recognition, regression, and classification tasks. -- **Example**: A neural network for predicting house prices based on features like size, location, and number of rooms. - -### 2. Convolutional Neural Networks (CNN) -- Specialized for processing grid-like data such as images. They use convolutional layers that apply filters to the input data to capture spatial hierarchies. -- **Components**: - - **Convolutional Layers**: Extract features from input data. - - **Pooling Layers**: Reduce dimensionality and retain important information. - - **Fully Connected Layers**: Perform classification based on extracted features. -- **Use Cases**: Image and video recognition, object detection, and medical image analysis. -- **Example**: A CNN for classifying handwritten digits (MNIST dataset). - -### 3. Recurrent Neural Networks (RNN) - - Designed for sequential data. They have connections that form directed cycles, allowing information to persist. -- **Components**: - - **Hidden State**: Carries information across sequence steps. - - **Loop Connections**: Enable memory of previous inputs. -- **Use Cases**: Time series prediction, natural language processing, and speech recognition. -- **Example**: An RNN for predicting the next word in a sentence. - -### 4. Long Short-Term Memory Networks (LSTM) -- A type of RNN that addresses the vanishing gradient problem with a special architecture that allows it to remember information for long periods. -- **Components**: - - **Cell State**: Manages the flow of information. - - **Gates**: Control the cell state (input, forget, and output gates). -- **Use Cases**: Long-term dependency tasks like language modeling, machine translation, and speech synthesis. -- **Example**: An LSTM for translating text from one language to another. - -### 5. Gated Recurrent Units (GRU) -- A simplified version of LSTM with fewer gates, making it computationally more efficient while still handling the vanishing gradient problem. -- **Components**: - - **Update Gate**: Decides how much past information to keep. - - **Reset Gate**: Determines how much past information to forget. -- **Use Cases**: Similar to LSTM, used for time series prediction and NLP tasks. -- **Example**: A GRU for predicting stock prices. - -### 6. Autoencoders -- Neural networks used to learn efficient representations of data, typically for dimensionality reduction or denoising. -- **Components**: - - **Encoder**: Compresses the input into a latent-space representation. - - **Decoder**: Reconstructs the input from the latent representation. -- **Use Cases**: Anomaly detection, image denoising, and data compression. -- **Example**: An autoencoder for reducing the dimensionality of a dataset while preserving its structure. - -### 7. Variational Autoencoders (VAE) - : A type of autoencoder that generates new data points by learning the probability distribution of the input data. -- **Components**: - - **Encoder**: Maps input data to a distribution. - - **Decoder**: Generates data from the distribution. -- **Use Cases**: Generative tasks like image and text generation. -- **Example**: A VAE for generating new faces based on a dataset of human faces. - -### 8. Generative Adversarial Networks (GAN) -- Consists of two networks (generator and discriminator) that compete against each other. The generator creates data, and the discriminator evaluates it. -- **Components**: - - **Generator**: Generates new data instances. - - **Discriminator**: Distinguishes between real and generated data. -- **Use Cases**: Image generation, style transfer, and data augmentation. -- **Example**: A GAN for generating realistic images of landscapes. - -### 9. Radial Basis Function Networks (RBFN) -- Uses radial basis functions as activation functions. Typically consists of three layers: input, hidden (with RBF activation), and output. -- **Use Cases**: Function approximation, time-series prediction, and control systems. -- **Example**: An RBFN for approximating complex nonlinear functions. - -### 10. Self-Organizing Maps (SOM) -- An unsupervised learning algorithm that produces a low-dimensional (typically 2D) representation of the input space, preserving topological properties. -- **Use Cases**: Data visualization, clustering, and feature mapping. -- **Example**: A SOM for visualizing high-dimensional data like customer purchase behavior. - -### 11. Transformer Networks -- A model architecture that relies on self-attention mechanisms to process input sequences in parallel rather than sequentially. -- **Key Components**: - - **Self-Attention Mechanism**: Computes the relationship between different positions in the input sequence. - - **Feedforward Layers**: Process the self-attention outputs. -- **Use Cases**: Natural language processing tasks like translation, summarization, and question answering. -- **Example**: The Transformer model for language translation (e.g., Google Translate). - - -Each type of ANN has its own strengths and is suited for different types of tasks. The choice of ANN depends on the specific problem at hand, the nature of the data, and the desired outcome. Understanding these various architectures allows for better design and implementation of neural networks to solve complex real-world problems. - -### **Applications** - -1. **Image and Video Recognition**: ANNs can identify objects, faces, and actions in images and videos. -2. **Natural Language Processing (NLP)**: Used for tasks like language translation, sentiment analysis, and chatbots. -3. **Speech Recognition**: Convert spoken language into text. -4. **Predictive Analytics**: Forecasting future trends based on historical data. -5. **Autonomous Systems**: Control systems in self-driving cars, robots, and drones. - -### **Advantages** - -1. **Adaptability**: ANNs can learn and adapt to new data. -2. **Versatility**: Applicable to a wide range of tasks. -3. **Efficiency**: Capable of processing large amounts of data quickly. - -### **Challenges** - -1. **Complexity**: Designing and training large neural networks can be complex and computationally intensive. -2. **Data Requirements**: ANNs often require large amounts of labeled data for training. -3. **Interpretability**: Understanding how a trained neural network makes decisions can be difficult. - -### **Conclusion** - -Artificial Neural Networks are a foundational technology in the field of artificial intelligence and machine learning. Their ability to learn from data and adapt to new situations makes them invaluable for a wide range of applications, from image recognition to autonomous systems. Despite their complexity and data requirements, the advancements in computational power and algorithms continue to enhance their capabilities and broaden their applications. diff --git a/docs/Deep Learning/Backpropogation in ANN.md b/docs/Deep Learning/Backpropogation in ANN.md deleted file mode 100644 index 442040f78..000000000 --- a/docs/Deep Learning/Backpropogation in ANN.md +++ /dev/null @@ -1,120 +0,0 @@ - -# Backpropagation in Neural Networks - -## Overview - -Backpropagation is a fundamental algorithm used for training artificial neural networks. It computes the gradient of the loss function with respect to each weight by the chain rule, efficiently propagating errors backward through the network. This allows for the adjustment of weights to minimize the loss function, ultimately improving the performance of the neural network. - - - - -# How Backpropagation Works - -## Forward propogation - -- Input Layer: The input data is fed into the network. -- Hidden Layers: Each layer performs computations using weights and biases to transform the input data. -- Output Layer: The final transformation produces the output, which is compared to the actual target to calculate the loss. - -### Mathematical Formulation -$$ -a_i^l = f\left(z_i^l\right) = f\left(\sum_j w_{ij}^l a_j^{l-1} + b_i^l\right) -$$ - - -where f is the activation function, zᵢˡ is the net input of neuron i in layer l, wᵢⱼˡ is the connection weight between neuron j in layer l — 1 and neuron i in layer l, and bᵢˡ is the bias of neuron i in layer l. - -## Backward propogation - -- Compute Loss: Calculate the error (loss) using a loss function (e.g., Mean Squared Error, Cross-Entropy Loss). -- Error Propagation: Propagate the error backward through the network, layer by layer. -- Gradient Calculation: Compute the gradient of the loss with respect to each weight using the chain rule. -- Weight Update: Adjust the weights by subtracting the gradient multiplied by the learning rate. - -### Mathematical Formulation - -- The loss function measures how well the neural network's output matches the target values. Common loss functions include: -1) **Mean Squared Error (MSE):** - -$$ -L = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 -$$ -1) **Cross-Entropy Loss:** - -$$ -L = -\frac{1}{n} \sum_{i=1}^{n} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] -$$ - - -- For each weight 𝑤 in the network, the gradient of the loss L with respect to w is computed as: - -$$ -\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial w} -$$ - - -- Weights are updated using the gradient descent algorithm: - -$$ -w \leftarrow w - \eta \frac{\partial L}{\partial w} -$$ - -# Backpropogation from scratch - - - -```bash - import numpy as np - -def sigmoid(x): - return 1 / (1 + np.exp(-x)) - -def sigmoid_derivative(x): - return x * (1 - x) - -# Input data -X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) -y = np.array([[0], [1], [1], [0]]) - -# Initialize weights and biases -np.random.seed(42) -weights_input_hidden = np.random.rand(2, 2) -weights_hidden_output = np.random.rand(2, 1) -bias_hidden = np.random.rand(1, 2) -bias_output = np.random.rand(1, 1) -learning_rate = 0.1 - -# Training - -for epoch in range(10000): - - # Forward pass - hidden_input = np.dot(X, weights_input_hidden) + bias_hidden - hidden_output = sigmoid(hidden_input) - final_input = np.dot(hidden_output, weights_hidden_output) + bias_output - final_output = sigmoid(final_input) - - # Error - error = y - final_output - d_output = error * sigmoid_derivative(final_output) - - # Backward Propogation ( gradient decent) - error_hidden = d_output.dot(weights_hidden_output.T) - d_hidden = error_hidden * sigmoid_derivative(hidden_output) - - # Update weights and biases - weights_hidden_output += hidden_output.T.dot(d_output) * learning_rate - bias_output += np.sum(d_output, axis=0, keepdims=True) * learning_rate - weights_input_hidden += X.T.dot(d_hidden) * learning_rate - bias_hidden += np.sum(d_hidden, axis=0) * learning_rate - -print("Training complete") -print("Output after training:") -print(final_output) - -``` - - -## Conclusion - -Backpropagation is a powerful technique for training neural networks(ANN), enabling them to learn complex patterns and make accurate predictions. Understanding the mechanics and mathematics behind it is essential to Understand inner woking of an ANN. diff --git a/docs/Deep Learning/CNN.md b/docs/Deep Learning/CNN.md deleted file mode 100644 index 27ca48807..000000000 --- a/docs/Deep Learning/CNN.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -id: convolutional-neural-networks -title: Convolutional Neural Networks -sidebar_label: Introduction to Convolutional Neural Networks -sidebar_position: 1 -tags: [CNN, Convolutional Neural Networks, deep learning, machine learning, classification algorithm, data analysis, data science, neural networks, image recognition, feature extraction, pattern recognition] -description: In this tutorial, you will learn about Convolutional Neural Networks (CNNs), their importance, what CNNs are, why learn CNNs, how to use CNNs, steps to start using CNNs, and more. ---- - -### Introduction to Convolutional Neural Networks -Convolutional Neural Networks (CNNs) are a class of deep learning algorithms designed primarily for image processing and pattern recognition tasks. They leverage convolutional layers to automatically and adaptively learn spatial hierarchies of features from input images, making them powerful tools for visual data analysis. - -### What is a Convolutional Neural Network? -Convolutional Neural Networks involve several key components and layers: - -- **Convolutional Layers**: These layers apply convolution operations to the input, using a set of learnable filters (kernels) to produce feature maps. Convolution helps in extracting local features from the input image. - -- **Pooling Layers**: These layers downsample the feature maps to reduce their spatial dimensions and computational load. Common pooling operations include max pooling and average pooling. - -- **Fully Connected Layers**: After several convolutional and pooling layers, the network usually transitions to fully connected layers, where each neuron is connected to every neuron in the previous layer, enabling high-level reasoning. - -- **Activation Functions**: Non-linear functions like ReLU (Rectified Linear Unit) are applied to introduce non-linearity into the model, allowing it to learn more complex patterns. - -![alt text](img4.png) - -### Example: -Consider using a CNN for handwritten digit recognition. The network might learn edges and simple shapes in early layers and complex digit shapes in deeper layers. This hierarchical learning enables accurate classification of handwritten digits. - -### Advantages of Convolutional Neural Networks -CNNs offer several advantages: - -- **Automatic Feature Extraction**: CNNs automatically learn relevant features from raw input images, reducing the need for manual feature engineering. -- **Parameter Sharing**: Convolutional layers share parameters across spatial locations, significantly reducing the number of parameters and computational complexity. -- **Translation Invariance**: CNNs are robust to translations of the input image, making them effective for recognizing objects regardless of their position. - -### Example: -In medical imaging, CNNs can classify MRI scans to detect tumors by learning relevant features from the scans without manual intervention, aiding in accurate diagnosis. - -### Disadvantages of Convolutional Neural Networks -Despite their advantages, CNNs have limitations: - -- **Data-Intensive**: CNNs typically require large amounts of labeled data for training to achieve good performance. -- **Computationally Expensive**: Training CNNs can be computationally intensive, often requiring specialized hardware like GPUs. -- **Black Box Nature**: The learned features and decision-making process in CNNs can be difficult to interpret and understand. - -### Example: -In real-time video analysis, the computational requirements of CNNs can be a bottleneck, necessitating efficient implementations and hardware acceleration. - -### Practical Tips for Using Convolutional Neural Networks -To maximize the effectiveness of CNNs: - -- **Data Augmentation**: Use techniques like rotation, scaling, and flipping to artificially increase the size of the training dataset. -- **Transfer Learning**: Utilize pre-trained models and fine-tune them on your specific dataset to leverage learned features from large-scale datasets. -- **Regularization**: Apply dropout and weight regularization techniques to prevent overfitting and improve generalization. - -### Example: -In facial recognition systems, data augmentation helps create diverse training samples, improving the model's ability to generalize to unseen faces. - -### Real-World Examples - -#### Autonomous Driving -CNNs are used in self-driving cars for tasks like object detection and lane detection. They process images from cameras mounted on the car to recognize pedestrians, vehicles, traffic signs, and road lanes, enabling safe navigation. - -#### Image Captioning -CNNs are combined with Recurrent Neural Networks (RNNs) to generate captions for images. The CNN extracts features from the image, and the RNN generates a sequence of words describing the image, producing coherent and meaningful captions. - -### Difference Between CNN and Traditional Neural Networks -| Feature | Convolutional Neural Networks (CNN) | Traditional Neural Networks (NN) | -|---------------------------------|-------------------------------------|----------------------------------| -| Feature Extraction | Automatically extracts features using convolutional layers. | Requires manual feature extraction or flattened input. | -| Parameter Sharing | Yes, reduces the number of parameters significantly. | No, each neuron has its own parameters. | -| Spatial Hierarchies | Learns spatial hierarchies of features from images. | Typically does not capture spatial hierarchies. | - -### Implementation -To implement and train a Convolutional Neural Network, you can use libraries such as TensorFlow or PyTorch in Python. Below are the steps to install the necessary libraries and train a CNN model. - -#### Libraries to Download -- `TensorFlow` or `PyTorch`: Essential for building and training neural networks. -- `numpy`: Essential for numerical operations. -- `matplotlib`: Useful for visualizing data and model performance. - -You can install these libraries using pip: - -```bash -pip install tensorflow numpy matplotlib -``` - -#### Training a Convolutional Neural Network -Here’s a step-by-step guide to training a CNN model using TensorFlow: - -**Import Libraries:** - -```python -import tensorflow as tf -from tensorflow.keras import layers, models -import numpy as np -import matplotlib.pyplot as plt -``` - -**Load and Prepare Data:** -Assuming you are using the MNIST dataset of handwritten digits: - -```python -# Load the dataset -(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data() - -# Normalize the pixel values -X_train, X_test = X_train / 255.0, X_test / 255.0 - -# Add a channel dimension (required by Conv2D) -X_train = X_train[..., np.newaxis] -X_test = X_test[..., np.newaxis] -``` - -**Define the Convolutional Neural Network:** - -```python -model = models.Sequential([ - layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), - layers.MaxPooling2D((2, 2)), - layers.Conv2D(64, (3, 3), activation='relu'), - layers.MaxPooling2D((2, 2)), - layers.Conv2D(64, (3, 3), activation='relu'), - layers.Flatten(), - layers.Dense(64, activation='relu'), - layers.Dense(10, activation='softmax') -]) -``` - -**Compile the Model:** - -```python -model.compile(optimizer='adam', - loss='sparse_categorical_crossentropy', - metrics=['accuracy']) -``` - -**Train the Model:** - -```python -history = model.fit(X_train, y_train, epochs=5, - validation_data=(X_test, y_test)) -``` - -**Evaluate the Model:** - -```python -test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2) -print(f'\nTest accuracy: {test_acc:.2f}') -``` - -This example demonstrates loading data, defining a CNN architecture, training the model, and evaluating its performance using TensorFlow. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Hardware Acceleration**: Utilize GPUs or TPUs to accelerate training and inference processes. -- **Batch Processing**: Train the model using mini-batches to efficiently utilize computational resources. - -### Example: -In real-time video processing, leveraging GPUs ensures timely analysis and response, critical for applications like surveillance and autonomous driving. - -### Conclusion -Convolutional Neural Networks are a versatile and powerful tool for image analysis and pattern recognition. By understanding their architecture, advantages, limitations, and implementation, practitioners can effectively apply CNNs to a wide range of computer vision tasks in data science and machine learning projects. diff --git a/docs/Deep Learning/Intro.md b/docs/Deep Learning/Intro.md deleted file mode 100644 index a009858b2..000000000 --- a/docs/Deep Learning/Intro.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: introducation-to-deep-learning -title: Introducation to Deep Learning -sidebar_label: Introducation to Deep Learning -sidebar_position: 1 -tags: [Deep Learning] - ---- - -Deep learning is a subset of machine learning and artificial intelligence (AI) that mimics the workings of the human brain in processing data and creating patterns for use in decision-making. It uses neural networks with many layers (hence "deep") to analyze various factors of data. - -In a fully connected Deep neural network, there is an input layer and one or more hidden layers connected one after the other. Each neuron receives input from the previous layer neurons or the input layer. The output of one neuron becomes the input to other neurons in the next layer of the network, and this process continues until the final layer produces the output of the network. The layers of the neural network transform the input data through a series of nonlinear transformations, allowing the network to learn complex representations of the input data. - -![alt text](img.png) - -Today Deep learning AI has become one of the most popular and visible areas of machine learning, due to its success in a variety of applications, such as computer vision, natural language processing, and Reinforcement learning. - -Deep learning AI can be used for supervised, unsupervised, and reinforcement machine learning, each utilizing different methods for processing data. - -**Supervised Machine Learning**: In supervised machine learning, the neural network learns to make predictions or classify data based on labeled datasets. We provide both input features and target outcomes. The neural network learns by minimizing the error between predicted and actual targets through a process called backpropagation. Deep learning algorithms like Convolutional Neural Networks (CNNs) and Recurrent Neural Networks (RNNs) are used for tasks such as image classification, sentiment analysis, and language translation. - -**Unsupervised Machine Learning**: In unsupervised machine learning, the neural network discovers patterns or clusters within unlabeled datasets, meaning there are no target variables. The machine identifies hidden patterns or relationships within the data. Deep learning algorithms like autoencoders and generative models are used for tasks such as clustering, dimensionality reduction, and anomaly detection. - -**Reinforcement Machine Learning**: In reinforcement machine learning, an agent learns to make decisions in an environment to maximize a reward signal. The agent takes actions, observes the results, and receives rewards. Deep learning helps the agent learn policies, or sets of actions, that maximize cumulative rewards over time. Algorithms like Deep Q Networks (DQNs) and Deep Deterministic Policy Gradient (DDPG) are used for tasks like robotics and game playing. - -## **Core Concept** -- **Artificial Neural Networks (ANNs)** : Inspired by the structure and function of the human brain, ANNs consist of interconnected nodes (artificial neurons) that process information. - -- **Hidden Layers**: Unlike simpler neural networks, deep learning models have multiple hidden layers between the input and output layers. These layers allow the network to learn increasingly complex features from the data. -- **Learning Process**: Deep learning models learn through a process called backpropagation. This involves adjusting the connections between neurons based on the difference between the model's predictions and the actual data. - -## **Key Characteristics of Deep Learning** - -- **High Capacity**: Deep neural networks can learn intricate relationships within data due to their multiple layers and numerous connections. -- **Unsupervised vs. Supervised Learning**: Deep learning can be applied in both supervised learning (models trained with labeled data) and unsupervised learning (models identify patterns in unlabeled data). -- **Representation Learning**: Deep learning models can automatically learn features (representations) from the data, eliminating the need for manual feature engineering in many cases. - -## **Benefits of Deep Learning** - -- **Superior Performance**: Deep learning models have achieved state-of-the-art performance in various tasks, including image recognition, natural language processing, and speech recognition. -- **Automating Feature Extraction**: Deep learning reduces the need for manual feature engineering, a time-consuming and domain-specific task. -- **Handling Complex Data**: Deep learning can effectively handle complex data types like images, audio, and text, making it well-suited for modern applications. - -## **Disadvantages of Deep Learning** -- **High computational requirements**: Deep Learning AI models require large amounts of data and computational resources to train and optimize. -Requires large amounts of labeled data: Deep Learning models often require a large amount of labeled data for training, which can be expensive and time- consuming to acquire. -- **Interpretability**: Deep Learning models can be challenging to interpret, making it difficult to understand how they make decisions. -- **Overfitting**: Deep Learning models can sometimes overfit to the training data, resulting in poor performance on new and unseen data. -Black-box nature: Deep Learning models are often treated as black boxes, making it difficult to understand how they work and how they arrived at their predictions. - -## **Applications of Deep Learning** - -- **Computer Vision**: Image recognition, object detection, facial recognition, medical image analysis. -- **Natural Language Processing**: Machine translation, sentiment analysis, text summarization, chatbots. -- **Speech Recognition and Synthesis**: Voice assistants, automatic transcription, language learning apps. -- **Recommender Systems**: Personalization of recommendations for products, music, movies, etc. -- **Anomaly Detection**: Identifying unusual patterns or events in data for fraud detection, network security, etc. -## **Challenges of Deep Learning** - -- **Computational Cost**: Training deep learning models often requires significant computational resources and large datasets. -- **Data Requirements**: Deep learning models can be data-hungry, and performance can suffer with limited data availability. -- **Explainability**: Understanding how deep learning models arrive at their decisions can be challenging, limiting interpretability in some applications. diff --git a/docs/Deep Learning/Learning rule in ANN/Learning-Rules.md b/docs/Deep Learning/Learning rule in ANN/Learning-Rules.md deleted file mode 100644 index b9bbadbb8..000000000 --- a/docs/Deep Learning/Learning rule in ANN/Learning-Rules.md +++ /dev/null @@ -1,106 +0,0 @@ -# Learning Rules in Artificial Neural Networks (ANN) - -## Introduction - -Learning rules are essential components of Artificial Neural Networks (ANNs) that govern how the network updates its weights and biases. This document focuses on two fundamental learning rules: Hebbian Learning and Adaline (Adaptive Linear Neuron) Learning. - -## 1. Hebbian Learning - -Hebbian Learning, proposed by Donald Hebb in 1949, is one of the earliest and simplest learning rules in neural networks. It is based on the principle that neurons that fire together, wire together. - -### Basic Principle - -The strength of a connection between two neurons increases if both neurons are activated simultaneously. - -### Mathematical Formulation - -For neurons $i$ and $j$ with activation values $x_i$ and $x_j$, the weight update $\Delta w_{ij}$ is given by: - -$$ \Delta w_{ij} = \eta x_i x_j $$ - -Where: -- $\Delta w_{ij}$ is the change in weight between neurons $i$ and $j$ -- $\eta$ is the learning rate -- $x_i$ is the output of the presynaptic neuron -- $x_j$ is the output of the postsynaptic neuron - -### Variations - -1. **Oja's Rule**: A modification of Hebbian learning that includes weight normalization: - - $$\Delta w_{ij} = \eta(x_i x_j - \alpha y_j^2 w_{ij})$$ - - Where $y_j$ is the output of neuron $j$ and $\alpha$ is a forgetting factor. - -2. **Generalized Hebbian Algorithm (GHA)**: Extends Oja's rule to multiple outputs: - - $$\Delta W = \eta(xy^T - \text{lower}(Wy^Ty))$$ - - Where $\text{lower}()$ denotes the lower triangular part of a matrix. - -## 2. Adaline Learning (Widrow-Hoff Learning Rule) - -Adaline (Adaptive Linear Neuron) Learning, developed by Bernard Widrow and Marcian Hoff in 1960, is a single-layer neural network that uses linear activation functions. - -### Basic Principle - -Adaline learning aims to minimize the mean squared error between the desired output and the actual output of the neuron. - -### Mathematical Formulation - -For an input vector $\mathbf{x}$ and desired output $d$, the weight update is given by: - -$$ \Delta \mathbf{w} = \eta(d - y)\mathbf{x} $$ - -Where: -- $\Delta \mathbf{w}$ is the change in weight vector -- $\eta$ is the learning rate -- $d$ is the desired output -- $y = \mathbf{w}^T\mathbf{x}$ is the actual output -- $\mathbf{x}$ is the input vector - -### Learning Process - -1. Initialize weights randomly -2. For each training example: - - a. Calculate the output: - - $y = \mathbf{w}^T\mathbf{x}$ - - b. Update weights: - - $$w_{new} = w_{old} + \eta(d - y)x$$ - -4. Repeat step 2 until convergence or a maximum number of epochs is reached - -### Comparison with Perceptron Learning - -While similar to the perceptron learning rule, Adaline uses the actual output value for weight updates, not just the sign of the output. This allows for more precise weight adjustments. - -## Conclusion - -Both Hebbian and Adaline learning rules play crucial roles in the development of neural network theory: - -- Hebbian Learning provides a biological inspiration for neural learning and is fundamental in unsupervised learning scenarios. -- Adaline Learning introduces the concept of minimizing error, which is a cornerstone of many modern learning algorithms, including backpropagation in deep neural networks. - -Understanding these basic learning rules provides insight into more complex learning algorithms used in deep learning and helps in appreciating the historical development of neural network theory. - - -## How to Use This Repository - -- Clone this repository to your local machine. - -```bash - git clone https://github.com/CodeHarborHub/codeharborhub.github.io/tree/main/docs/Deep%20Learning/Learning Rule IN ANN -``` -- For Python implementations and visualizations: - -1. Ensure you have Jupyter Notebook installed - -```bash - pip install jupyter -``` -2. Navigate to the project directory in your terminal. -3. Open learning_rules.ipynb. diff --git a/docs/Deep Learning/Long Short-Term Memory (LSTM).md b/docs/Deep Learning/Long Short-Term Memory (LSTM).md deleted file mode 100644 index 7d1abd455..000000000 --- a/docs/Deep Learning/Long Short-Term Memory (LSTM).md +++ /dev/null @@ -1,161 +0,0 @@ ---- -id: long-short-term-memory -title: Long Short-Term Memory (LSTM) Networks -sidebar_label: Introduction to LSTM Networks -sidebar_position: 1 -tags: [LSTM, long short-term memory, deep learning, neural networks, sequence modeling, time series, machine learning, predictive modeling, RNN, recurrent neural networks, data science, AI] -description: In this tutorial, you will learn about Long Short-Term Memory (LSTM) networks, their importance, what LSTM is, why learn LSTM, how to use LSTM, steps to start using LSTM, and more. ---- - -### Introduction to Long Short-Term Memory (LSTM) Networks -Long Short-Term Memory (LSTM) networks are a type of recurrent neural network (RNN) designed to handle and predict sequences of data. They are particularly effective in capturing long-term dependencies and patterns in sequential data, making them widely used in deep learning and time series analysis. - -### What is Long Short-Term Memory (LSTM)? -A **Long Short-Term Memory (LSTM)** network is a specialized RNN architecture capable of learning and retaining information over long periods. Unlike traditional RNNs, LSTMs address the problem of vanishing gradients by incorporating memory cells that maintain and update information through gates. - -- **Recurrent Neural Networks (RNNs)**: Neural networks designed for processing sequential data, where connections between nodes form a directed graph along a temporal sequence. - -- **Memory Cells**: Components of LSTM networks that store information across time steps, helping the network remember previous inputs. - -- **Gates**: Mechanisms in LSTMs (input, forget, and output gates) that regulate the flow of information, determining which data to keep, update, or discard. - -**Vanishing Gradients**: A challenge in training RNNs where gradients become exceedingly small, hindering the learning of long-term dependencies. - -**Sequential Data**: Data that is ordered and dependent on previous data points, such as time series, text, or speech. - -### Example: -Consider LSTM for predicting stock prices. The algorithm processes historical stock prices, learning patterns and trends over time to make accurate future predictions. - -### Advantages of Long Short-Term Memory (LSTM) Networks -LSTM networks offer several advantages: - -- **Capturing Long-term Dependencies**: Effectively learn and remember long-term patterns in sequential data. -- **Handling Sequential Data**: Suitable for tasks involving time series, text, and speech data. -- **Preventing Vanishing Gradients**: Overcome the vanishing gradient problem, ensuring better training performance. - -### Example: -In natural language processing, LSTM networks can accurately generate text by understanding the context and dependencies between words over long sequences. - -### Disadvantages of Long Short-Term Memory (LSTM) Networks -Despite its advantages, LSTM networks have limitations: - -- **Computationally Intensive**: Training LSTM models can be resource-intensive and time-consuming. -- **Complexity**: Designing and tuning LSTM networks can be complex, requiring careful selection of hyperparameters. -- **Overfitting**: LSTM networks can overfit the training data if not properly regularized, especially with limited data. - -### Example: -In speech recognition, LSTM networks might overfit if trained on a small dataset, leading to poor performance on new speech samples. - -### Practical Tips for Using Long Short-Term Memory (LSTM) Networks -To maximize the effectiveness of LSTM networks: - -- **Hyperparameter Tuning**: Carefully tune hyperparameters such as learning rate, number of layers, and units per layer to optimize performance. -- **Regularization**: Use techniques like dropout to prevent overfitting and improve generalization. -- **Sequence Padding**: Properly pad sequences to ensure uniform input lengths, facilitating efficient training. - -### Example: -In weather forecasting, LSTM networks can predict future temperatures by learning patterns from historical weather data, ensuring accurate predictions through proper tuning and regularization. - -### Real-World Examples - -#### Sentiment Analysis -LSTM networks analyze customer reviews and social media posts to determine sentiment, providing valuable insights into customer opinions and market trends. - -#### Anomaly Detection -In industrial systems, LSTM networks monitor sensor data to detect anomalies and predict equipment failures, enabling proactive maintenance. - -### Difference Between LSTM and GRU -| Feature | Long Short-Term Memory (LSTM) | Gated Recurrent Unit (GRU) | -|---------------------------------|-------------------------------|----------------------------| -| Architecture | More complex with three gates (input, forget, output) | Simpler with two gates (reset, update) | -| Training Speed | Slower due to complexity | Faster due to simplicity | -| Performance | Handles longer sequences better | Often performs comparably with fewer parameters | - -### Implementation -To implement and train an LSTM network, you can use libraries such as TensorFlow or Keras in Python. Below are the steps to install the necessary library and train an LSTM model. - -#### Libraries to Download - -- `tensorflow`: Essential for building and training neural networks, including LSTM. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install tensorflow pandas numpy -``` - -#### Training a Long Short-Term Memory (LSTM) Model -Here’s a step-by-step guide to training an LSTM model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -import tensorflow as tf -from tensorflow.keras.models import Sequential -from tensorflow.keras.layers import LSTM, Dense, Dropout -from sklearn.model_selection import train_test_split -``` - -**Load and Prepare Data:** -Assuming you have a time series dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1).values # Replace 'target_column' with your target variable name -y = data['target_column'].values -``` - -**Reshape Data for LSTM:** - -```python -# Reshape data to 3D array [samples, timesteps, features] -X_reshaped = X.reshape((X.shape[0], 1, X.shape[1])) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X_reshaped, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the LSTM Model:** - -```python -model = Sequential() -model.add(LSTM(50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2]))) -model.add(Dropout(0.2)) -model.add(LSTM(50)) -model.add(Dropout(0.2)) -model.add(Dense(1)) - -model.compile(optimizer='adam', loss='mean_squared_error') -model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test)) -``` - -**Evaluate the Model:** - -```python -loss = model.evaluate(X_test, y_test) -print(f'Loss: {loss:.2f}') -``` - -This example demonstrates loading data, preparing features, training an LSTM model, and evaluating its performance using TensorFlow/Keras. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Sequence Length**: LSTMs can handle long sequences but may require significant computational resources. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In financial forecasting, LSTM networks help predict stock prices by analyzing historical data, ensuring accurate predictions through efficient computational use. - -### Conclusion -Long Short-Term Memory (LSTM) networks are powerful for sequence modeling and time series analysis. By understanding their architecture, advantages, and implementation steps, practitioners can effectively leverage LSTM networks for a variety of predictive modeling tasks in deep learning and data science projects. diff --git a/docs/Deep Learning/Multilayer Perceptron (MLP).md b/docs/Deep Learning/Multilayer Perceptron (MLP).md deleted file mode 100644 index 6b3128be6..000000000 --- a/docs/Deep Learning/Multilayer Perceptron (MLP).md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: multilayer-perceptron-in-deep-learning -title: Multilayer Perceptron in Deep Learning -sidebar_label: Introduction to Multilayer Perceptron (MLP) -sidebar_position: 5 -tags: [Multilayer Perceptron, MLP, deep learning, neural networks, machine learning, supervised learning, classification, regression] -description: In this tutorial, you will learn about Multilayer Perceptron (MLP), its architecture, its applications in deep learning, and how to implement MLP models effectively for various tasks. ---- - -### Introduction to Multilayer Perceptron (MLP) -A Multilayer Perceptron (MLP) is a type of artificial neural network used in deep learning. It consists of multiple layers of neurons, including an input layer, one or more hidden layers, and an output layer. MLPs are capable of learning complex patterns and are used for various tasks, including classification and regression. - -### Architecture of Multilayer Perceptron -An MLP is composed of: - -- **Input Layer**: The first layer that receives the input features. Each neuron in this layer corresponds to a feature in the input data. -- **Hidden Layers**: Intermediate layers between the input and output layers. Each hidden layer contains neurons that apply activation functions to the weighted sum of inputs. -- **Output Layer**: The final layer that produces the predictions. The number of neurons in this layer corresponds to the number of classes (for classification) or the number of output values (for regression). - -**Activation Functions**: Non-linear functions applied to the weighted sum of inputs in each neuron. Common activation functions include ReLU (Rectified Linear Unit), sigmoid, and tanh. - -**Forward Propagation**: The process of passing input data through the network to obtain predictions. - -**Backpropagation**: The process of updating weights in the network based on the error of predictions, using gradient descent or its variants. - -### Example Applications of MLP -- **Image Classification**: Classifying images into different categories (e.g., identifying objects in photos). -- **Text Classification**: Categorizing text into predefined classes (e.g., spam detection). -- **Regression Tasks**: Predicting continuous values (e.g., house prices based on features). - -### Advantages of Multilayer Perceptron -- **Ability to Learn Non-Linear Relationships**: Through activation functions and multiple layers, MLPs can model complex non-linear relationships. -- **Flexibility**: Can be used for both classification and regression tasks. -- **Generalization**: Capable of generalizing well to new, unseen data when properly trained. - -### Disadvantages of Multilayer Perceptron -- **Training Time**: MLPs can be computationally expensive and require significant time and resources to train, especially with large datasets and many layers. -- **Overfitting**: Risk of overfitting, especially with complex models and limited data. Regularization techniques like dropout and weight decay can help mitigate this. -- **Vanishing Gradient Problem**: During backpropagation, gradients can become very small, slowing down learning. This issue is lessened with modern activation functions and architectures. - -### Practical Tips for Implementing MLP - -- **Feature Scaling**: Normalize or standardize input features to improve the convergence of the training process. -- **Network Architecture**: Experiment with the number of hidden layers and neurons per layer to find the optimal network architecture for your task. -- **Regularization**: Use dropout, L2 regularization, and early stopping to prevent overfitting and improve generalization. -- **Hyperparameter Tuning**: Adjust learning rates, batch sizes, and other hyperparameters to enhance model performance. - -### Example Workflow for Implementing an MLP - -1. **Data Preparation**: - - Load and preprocess data (e.g., normalization, handling missing values). - - Split data into training and testing sets. - -2. **Define the MLP Model**: - - Specify the number of layers and neurons in each layer. - - Choose activation functions for hidden layers and output layers. - -3. **Compile the Model**: - - Select an optimizer (e.g., Adam, SGD) and a loss function (e.g., cross-entropy for classification, mean squared error for regression). - - Define evaluation metrics (e.g., accuracy, F1 score). - -4. **Train the Model**: - - Fit the model to the training data, specifying the number of epochs and batch size. - - Monitor training and validation performance to prevent overfitting. - -5. **Evaluate the Model**: - - Assess model performance on the testing set. - - Generate predictions and analyze results. - -6. **Tune and Optimize**: - - Adjust hyperparameters and model architecture based on performance. - - Use techniques like grid search or random search for hyperparameter optimization. - -### Implementation Example - -Here’s a basic example of how to implement an MLP using TensorFlow and Keras in Python: - -```python -import numpy as np -import tensorflow as tf -from tensorflow.keras.models import Sequential -from tensorflow.keras.layers import Dense -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler -from sklearn.datasets import load_iris - -# Load and prepare data -data = load_iris() -X = data.data -y = data.target - -# Standardize features -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) - -# Split data -X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) - -# Define MLP model -model = Sequential([ - Dense(64, activation='relu', input_shape=(X_train.shape[1],)), - Dense(32, activation='relu'), - Dense(3, activation='softmax') # Number of classes in the output layer -]) - -# Compile the model -model.compile(optimizer='adam', - loss='sparse_categorical_crossentropy', - metrics=['accuracy']) - -# Train the model -model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2) - -# Evaluate the model -loss, accuracy = model.evaluate(X_test, y_test) -print(f'Test Accuracy: {accuracy:.2f}') -``` - -### Performance Considerations - -#### Computational Resources -- **Training Time**: Training MLPs can be time-consuming, especially with large datasets and complex models. Using GPUs or TPUs can accelerate training. -- **Memory Usage**: Large networks and datasets may require significant memory. Ensure your hardware can handle the computational load. - -#### Model Complexity -- **Number of Layers and Neurons**: More layers and neurons can increase model capacity but may also lead to overfitting. Find a balance that suits your data and task. - -### Conclusion -Multilayer Perceptrons (MLPs) are fundamental to deep learning, providing powerful capabilities for learning complex patterns in data. By understanding MLP architecture, advantages, and practical implementation tips, you can effectively apply MLPs to various tasks in machine learning and deep learning projects. diff --git a/docs/Deep Learning/Optimizers in Deep Learning/AdaGard.md b/docs/Deep Learning/Optimizers in Deep Learning/AdaGard.md deleted file mode 100644 index e9e67cfd0..000000000 --- a/docs/Deep Learning/Optimizers in Deep Learning/AdaGard.md +++ /dev/null @@ -1,109 +0,0 @@ -# Add AdaGrad in Deep Learning Optimizers - -This section contains an explanation and implementation of the AdaGrad optimization algorithm used in deep learning. AdaGrad is known for its ability to adapt the learning rate based on the frequency of updates for each parameter. - -## Table of Contents -- [Introduction](#introduction) -- [Mathematical Explanation](#mathematical-explanation) - - [AdaGrad in Gradient Descent](#adagrad-in-gradient-descent) - - [Update Rule](#update-rule) -- [Implementation in Keras](#implementation-in-keras) -- [Usage](#usage) -- [Results](#results) -- [Advantages of AdaGrad](#advantages-of-adagrad) -- [Limitations of AdaGrad](#limitations-of-adagrad) -- [What Next](#what-next) - -## Introduction - -AdaGrad (Adaptive Gradient Algorithm) is an optimization method that adjusts the learning rate for each parameter individually based on the accumulated squared gradients. This allows the algorithm to perform well in scenarios where sparse features are involved, as it effectively scales down the learning rate for frequently updated parameters. - -## Mathematical Explanation - -### AdaGrad in Gradient Descent - -AdaGrad modifies the standard gradient descent algorithm by adjusting the learning rate for each parameter based on the sum of the squares of the past gradients. - -### Update Rule - -The update rule for AdaGrad is as follows: - -1. Accumulate the squared gradients: - - $$ - G_t = G_{t-1} + g_t^2 - $$ - -2. Update the parameters: - - -$$η = \theta_{t-1} - \frac{\eta}{\sqrt{G_t} + \epsilon} \cdot g_t$$ - -where: -- $G_t$ is the accumulated sum of squares of gradients up to time step $t$ -- $g_t$ is the gradient at time step $t$ -- $\eta$ is the learning rate -- $\epsilon$ is a small constant to prevent division by zero - -## Implementation in Keras - -Here is a simple implementation of the AdaGrad optimizer using Keras: - -```python -import numpy as np -from keras.models import Sequential -from keras.layers import Dense -from keras.optimizers import Adagrad - -# Generate dummy data -X_train = np.random.rand(1000, 20) -y_train = np.random.randint(2, size=(1000, 1)) - -# Define a simple model -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(1, activation='sigmoid')) - -# Compile the model with AdaGrad optimizer -optimizer = Adagrad(learning_rate=0.01) -model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) - -# Train the model -model.fit(X_train, y_train, epochs=50, batch_size=32) -``` - -In this example: -- We generate some dummy data for training. -- We define a simple neural network model with one hidden layer. -- We compile the model using the AdaGrad optimizer with a learning rate of 0.01. -- We train the model for 50 epochs with a batch size of 32. - -## Usage - -To use this implementation, ensure you have the required dependencies installed: - -```bash -pip install numpy keras -``` - -Then, you can run the provided script to train a model using the AdaGrad optimizer. - -## Results - -The results of the training process, including the loss and accuracy, will be displayed after each epoch. You can adjust the learning rate and other hyperparameters to see how they affect the training process. - -## Advantages of AdaGrad - -1. **Adaptive Learning Rates**: AdaGrad adapts the learning rate for each parameter, making it effective for dealing with sparse data and features. -2. **No Need for Manual Learning Rate Decay**: Since AdaGrad automatically decays the learning rate, it eliminates the need to manually set learning rate schedules. -3. **Good for Sparse Data**: AdaGrad performs well on problems with sparse features, such as natural language processing and computer vision tasks. - -## Limitations of AdaGrad - -1. **Aggressive Learning Rate Decay**: The accumulated gradient sum can grow very large, causing the learning rate to become very small and eventually stopping the learning process. -2. **Not Suitable for Non-Sparse Data**: For dense data, AdaGrad’s aggressive learning rate decay can slow down convergence, making it less effective. -3. **Memory Usage**: AdaGrad requires storing the sum of squared gradients for each parameter, which can be memory-intensive for large models. - -## What Next - -To address these issues, various optimization algorithms have been developed, such as Adam, which incorporate techniques. Which we'll see in next section . diff --git a/docs/Deep Learning/Optimizers in Deep Learning/Adam.md b/docs/Deep Learning/Optimizers in Deep Learning/Adam.md deleted file mode 100644 index 74d9df09b..000000000 --- a/docs/Deep Learning/Optimizers in Deep Learning/Adam.md +++ /dev/null @@ -1,116 +0,0 @@ -# Add Adam in Deep Learning Optimizers - -This Section contains an explanation and implementation of the Adam optimization algorithm used in deep learning. Adam (Adaptive Moment Estimation) is a popular optimizer that combines the benefits of two other widely used methods: AdaGrad and RMSProp. - -## Table of Contents -- [Introduction](#introduction) -- [Mathematical Explanation](#mathematical-explanation) - - [Adam in Gradient Descent](#adam-in-gradient-descent) - - [Update Rule](#update-rule) -- [Implementation in Keras](#implementation-in-keras) -- [Results](#results) -- [Advantages of Adam](#advantages-of-adam) -- [Limitations of Adam](#limitations-of-adam) - - -## Introduction - -Adam is an optimization algorithm that computes adaptive learning rates for each parameter. It combines the advantages of the AdaGrad and RMSProp algorithms by using estimates of the first and second moments of the gradients. Adam is widely used in deep learning due to its efficiency and effectiveness. - -## Mathematical Explanation - -### Adam in Gradient Descent - -Adam optimizes the stochastic gradient descent by calculating individual adaptive learning rates for each parameter based on the first and second moments of the gradients. - -### Update Rule - -The update rule for Adam is as follows: - -1. Compute the first moment estimate (mean of gradients): - -$$ -m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t -$$ - -2. Compute the second moment estimate (uncentered variance of gradients): - -$$ -v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 -$$ - -3. Correct the bias for the first moment estimate: - -$$ -\hat{m}_t = \frac{m_t}{1 - \beta_1^t} -$$ - -4. Correct the bias for the second moment estimate: - -$$ -\hat{v}_t = \frac{v_t}{1 - \beta_2^t} -$$ - -5. Update the parameters: - -$$ -\theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t -$$ - -where: -- $\theta$ are the model parameters -- $\eta$ is the learning rate -- $\beta_1$ and $\beta_2$ are the exponential decay rates for the moment estimates -- $\epsilon$ is a small constant to prevent division by zero -- $g_t$ is the gradient at time step $t$ - -## Implementation in Keras - -Simple implementation of the Adam optimizer using Keras: - -```python -import numpy as np -from keras.models import Sequential -from keras.layers import Dense -from keras.optimizers import Adam - -# Generate data -X_train = np.random.rand(1000, 20) -y_train = np.random.randint(2, size=(1000, 1)) - -# Define a model -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(1, activation='sigmoid')) - -# Compile the model with Adam optimizer -optimizer = Adam(learning_rate=0.001) -model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) - -# Train the model -model.fit(X_train, y_train, epochs=50, batch_size=32) -``` - -In this example: -- We generate some dummy data for training. -- We define a simple neural network model with one hidden layer. -- We compile the model using the Adam optimizer with a learning rate of 0.001. -- We train the model for 50 epochs with a batch size of 32. - - -## Results - -The results of the training process, including the loss and accuracy, will be displayed after each epoch. You can adjust the learning rate and other hyperparameters to see how they affect the training process. - -## Advantages of Adam - -1. **Adaptive Learning Rates**: Adam computes adaptive learning rates for each parameter, which helps in faster convergence. -2. **Momentum**: Adam includes momentum, which helps in smoothing the optimization path and avoiding local minima. -3. **Bias Correction**: Adam includes bias correction, improving convergence in the early stages of training. -4. **Robustness**: Adam works well in practice for a wide range of problems, including those with noisy gradients or sparse data. - -## Limitations of Adam - -1. **Hyperparameter Sensitivity**: The performance of Adam is sensitive to the choice of hyperparameters ($\beta_1$, $\beta_2$, $\eta$), which may require careful tuning. -2. **Memory Usage**: Adam requires additional memory to store the first and second moments, which can be significant for large models. -3. **Generalization**: Models trained with Adam might not generalize as well as those trained with simpler optimizers like SGD in certain cases. diff --git a/docs/Deep Learning/Optimizers in Deep Learning/Gradient Decent.md b/docs/Deep Learning/Optimizers in Deep Learning/Gradient Decent.md deleted file mode 100644 index bdb7ee6d5..000000000 --- a/docs/Deep Learning/Optimizers in Deep Learning/Gradient Decent.md +++ /dev/null @@ -1,131 +0,0 @@ - -# Gradient Descent in Deep Learning Optimizers - -This repository contains an in-depth explanation and implementation of Gradient Descent, a fundamental optimization algorithm used in deep learning. Gradient Descent is used to minimize the loss function of a model by iteratively updating its parameters. - -## Table of Contents -- [Introduction](#introduction) -- [Mathematical Explanation](#mathematical-explanation) - - [Gradient in Gradient Descent](#gradient-in-gradient-descent) - - [Basic Gradient Descent](#basic-gradient-descent) - - [Stochastic Gradient Descent (SGD)](#stochastic-gradient-descent-sgd) - - [Mini-Batch Gradient Descent](#mini-batch-gradient-descent) - - [Comparison](#comparison) -- [Implementation in Keras](#implementation-in-keras) -- [Usage](#usage) -- [Limation of Gradient Descent](#problems-with-gradient-descent-as-a-deep-learning-optimizer) -- [Results](#results) - - -## Introduction - -Gradient Descent is an optimization algorithm used for minimizing the loss function in machine learning and deep learning models. It works by iteratively adjusting the model parameters in the opposite direction of the gradient of the loss function with respect to the parameters. - -## Mathematical Explanation - -### Gradient in Gradient Descent - -The gradient of a function measures the steepness and direction of the function at a given point. In the context of Gradient Descent, the gradient of the loss function with respect to the parameters indicates how the loss function will change if the parameters are changed. - -Mathematically, the gradient is a vector of partial derivatives: - -$$∇J(θ)=[∂J(θ)∂θ1​,∂J(θ)∂θ2​,…,∂J(θ)∂θn​]$$ - -### Basic Gradient Descent - -The update rule for the parameters $θ$ in basic gradient descent is: - -$$θ = θ - η∇J(θ)$$ - -where: -- $θ$ are the model parameters -- $η$ is the learning rate, a small positive number -- $∇J(θ)$ is the gradient of the loss function with respect to the parameters - -### Stochastic Gradient Descent (SGD) - -In Stochastic Gradient Descent, the parameters are updated for each training example rather than after calculating the gradient over the entire dataset. - -$$θ = θ - η∇J(θ; x^(i); y^(i))$$ - -where $x^(i); y^(i)$ represents the $i$-th training example. - -### Mini-Batch Gradient Descent - -Mini-Batch Gradient Descent is a compromise between Batch Gradient Descent and Stochastic Gradient Descent. It updates the parameters after computing the gradient on a mini-batch of the training data. - -$$θ = θ - η∇J(θ; x^mini-batch; y^mini-batch)$$ - -### Comparison - -| Method | Description | Update Frequency | Pros | Cons | -|---------------------------|--------------------------------------------------------------|-----------------------------|----------------------------------|--------------------------------------| -| Batch Gradient Descent | Computes gradient over entire dataset | Once per epoch | Stable convergence | Slow for large datasets | -| Stochastic Gradient Descent (SGD) | Computes gradient for each training example | Once per training example | Faster updates, can escape local minima | Noisy updates, may not converge | -| Mini-Batch Gradient Descent | Computes gradient over small batches of the dataset | Once per mini-batch | Balance between speed and stability | Requires tuning of mini-batch size | - -## Implementation in Keras - -Here is a simple implementation of Gradient Descent using Keras: - -```python -import numpy as np -from keras.models import Sequential -from keras.layers import Dense -from keras.optimizers import SGD - -# load data -X_train = np.random.rand(1000, 20) -y_train = np.random.randint(2, size=(1000, 1)) - -# Define model -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(1, activation='sigmoid')) - -# Stochastic Gradient Descent (SGD) -optimizer = SGD(learning_rate=0.01) -model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) - -# finally Train the model -model.fit(X_train, y_train, epochs=50, batch_size=32) -``` - -In this example: -- We generate some dummy data for training. -- We define a simple neural network model with one hidden layer. -- We compile the model using the SGD optimizer with a learning rate of 0.01. -- We train the model for 50 epochs with a batch size of 32. - -## Usage - -To use this implementation, ensure you have the required dependencies installed: - -```bash -pip install numpy keras -``` - -Then, you can run the provided script to train a model using Gradient Descent. - -## Problems with Gradient Descent as a Deep Learning Optimizer - -Gradient descent, while a fundamental optimization algorithm, faces several challenges in the context of deep learning: - -### 1. Vanishing and Exploding Gradients -* **Problem:** In deep neural networks, gradients can become extremely small (vanishing) or large (exploding) as they propagate through multiple layers. -* **Impact:** This hinders the training process, making it difficult for the network to learn from earlier layers. - -### 2. Saddle Points and Local Minima -* **Problem:** The optimization landscape of deep neural networks often contains numerous saddle points (points where the gradient is zero but not a minimum or maximum) and local minima. -* **Impact:** Gradient descent can easily get stuck at these points, preventing it from finding the global minimum. - -### 3. Slow Convergence -* **Problem:** Gradient descent can be slow to converge, especially for large datasets and complex models. -* **Impact:** This increases training time and computational costs. - -To address these issues, various optimization algorithms have been developed, such as Adam, and Adagrad, which incorporate techniques like momentum Which we'll see in next section . - - -## Results - -The results of the training process, including the loss and accuracy, will be displayed after each epoch. You can adjust the learning rate and other hyperparameters to see how they affect the training process. diff --git a/docs/Deep Learning/Optimizers in Deep Learning/Introduction.md b/docs/Deep Learning/Optimizers in Deep Learning/Introduction.md deleted file mode 100644 index 57e1a49ce..000000000 --- a/docs/Deep Learning/Optimizers in Deep Learning/Introduction.md +++ /dev/null @@ -1,132 +0,0 @@ -# Deep Learning Optimizers - -This repository contains implementations and explanations of various optimization algorithms used in deep learning. Each optimizer is explained with its mathematical equations and includes a small code example using Keras. - -## Table of Contents -- [Introduction](#introduction) -- [Optimizers](#optimizers) - - [Gradient Descent](#gradient-descent) - - [Stochastic Gradient Descent (SGD)](#stochastic-gradient-descent-sgd) - - [Momentum](#momentum) - - [AdaGrad](#adagrad) - - [RMSprop](#rmsprop) - - [Adam](#adam) -- [Usage](#usage) - - -## Introduction - -Optimizers are algorithms or methods used to change the attributes of your neural network such as weights and learning rate to reduce the losses. Optimization algorithms help to minimize (or maximize) an objective function by adjusting the weights of the network. - -## Optimizers - -### Gradient Descent - -Gradient Descent is the most basic but most used optimization algorithm. It is an iterative optimization algorithm to find the minimum of a function. - -**Mathematical Equation:** - -$$ \theta = \theta - \eta \nabla J(\theta) $$ - -**Keras Code:** - -```python -from keras.optimizers import SGD - -model.compile(optimizer=SGD(learning_rate=0.01), loss='mse') -``` - -### Stochastic Gradient Descent (SGD) - -SGD updates the weights for each training example, rather than at the end of each epoch. - -**Mathematical Equation:** - -$$\theta = \theta - \eta \nabla J(\theta; x^{(i)}; y^{(i)})$$ - -**Keras Code:** - -```python -from keras.optimizers import SGD - -model.compile(optimizer=SGD(learning_rate=0.01), loss='mse') -``` - -### Momentum - -Momentum helps accelerate gradients vectors in the right directions, thus leading to faster converging. - -**Mathematical Equation:** - -$$ v_t = \gamma v_{t-1} + \eta \nabla J(\theta) $$ -$$ \theta = \theta - v_t $$ - -**Keras Code:** - -```python -from keras.optimizers import SGD - -model.compile(optimizer=SGD(learning_rate=0.01, momentum=0.9), loss='mse') -``` - -### AdaGrad - -AdaGrad adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters. - -**Mathematical Equation:** - -$$ \theta = \theta - \frac{\eta}{\sqrt{G_{ii} + \epsilon}} \nabla J(\theta) $$ - -**Keras Code:** - -```python -from keras.optimizers import Adagrad - -model.compile(optimizer=Adagrad(learning_rate=0.01), loss='mse') -``` - -### RMSprop - -RMSprop modifies AdaGrad to perform better in the non-convex setting by changing the gradient accumulation into an exponentially weighted moving average. - -**Mathematical Equation:** - -$$\theta = \theta - \frac{\eta}{\sqrt{E[g^2]_t + \epsilon}} \nabla J(\theta)$$ - -**Keras Code:** - -```python -from keras.optimizers import RMSprop - -model.compile(optimizer=RMSprop(learning_rate=0.001), loss='mse') -``` - -### Adam - -Adam combines the advantages of two other extensions of SGD: AdaGrad and RMSprop. - -**Mathematical Equation:** - -$$ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t $$ -$$ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 $$ -$$ \hat{m_t} = \frac{m_t}{1 - \beta_1^t} $$ -$$ \hat{v_t} = \frac{v_t}{1 - \beta_2^t} $$ -$$ \theta = \theta - \eta \frac{\hat{m_t}}{\sqrt{\hat{v_t}} + \epsilon} $$ - -**Keras Code:** - -```python -from keras.optimizers import Adam - -model.compile(optimizer=Adam(learning_rate=0.001), loss='mse') -``` - -## Usage - -To use these optimizers, simply include the relevant Keras code snippet in your model compilation step. For example: - -```python -model.compile(optimizer=Adam(learning_rate=0.001), loss='categorical_crossentropy', metrics=['accuracy']) -model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test)) -``` - diff --git a/docs/Deep Learning/Optimizers in Deep Learning/Momentum.md b/docs/Deep Learning/Optimizers in Deep Learning/Momentum.md deleted file mode 100644 index 3c1b82b18..000000000 --- a/docs/Deep Learning/Optimizers in Deep Learning/Momentum.md +++ /dev/null @@ -1,109 +0,0 @@ -# Add Momentum in Deep Learning Optimizers - -This repository contains an explanation and implementation of the Momentum optimization algorithm used in deep learning. Momentum helps accelerate the convergence of the gradient descent algorithm by adding a fraction of the previous update to the current update. - -## Table of Contents -- [Introduction](#introduction) -- [Mathematical Explanation](#mathematical-explanation) - - [Momentum in Gradient Descent](#momentum-in-gradient-descent) - - [Update Rule](#update-rule) -- [Implementation in Keras](#implementation-in-keras) -- [Usage](#usage) -- [Results](#results) -- [Advantages of Momentum](#advantages-of-momentum) -- [Limitations of Momentum](#limitations-of-momentum) -- [What Next](#what-next) - -## Introduction - -Momentum is an optimization algorithm that builds upon the standard gradient descent algorithm. It helps accelerate gradients vectors in the right directions, thereby leading to faster converging. - -## Mathematical Explanation - -### Momentum in Gradient Descent - -Momentum adds a fraction of the previous update to the current update, which helps in smoothing the optimization path and accelerates convergence. This is especially useful in cases where the gradient descent is slow due to small gradients. - -### How it works: - -1. Momentum builds up a "velocity" term based on previous updates. -2. This velocity helps to overcome local minima and reduce oscillations. - -3. Momentum can lead to faster convergence, especially in cases with noisy gradients or shallow gradients. - -### Update Rule - -The update rule for gradient descent with momentum is as follows: - -$$v_t = γ v_{t-1} + η ∇J(θ)$$ -$$θ = θ - v_t$$ - -where: - -- $v_t$: Velocity (or momentum) at time step t. -- $γ$ (gamma): Momentum coefficient (usually between 0.5 and 0.9). -- $η$ (eta): Learning rate. -- $∇J(θ):$$ Gradient of the loss function with respect to the parameters. - -## Implementation in Keras - -Here is a simple implementation of Gradient Descent with Momentum using Keras: - -```python -import numpy as np -from keras.models import Sequential -from keras.layers import Dense -from keras.optimizers import SGD - -# Generate data -X_train = np.random.rand(1000, 20) -y_train = np.random.randint(2, size=(1000, 1)) - -# Define model -model = Sequential() -model.add(Dense(64, activation='relu', input_dim=20)) -model.add(Dense(1, activation='sigmoid')) - -# Compile the model -optimizer = SGD(learning_rate=0.01, momentum=0.9) -model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy']) - -# Train model -model.fit(X_train, y_train, epochs=50, batch_size=32) -``` - -In this example: -- We generate some dummy data for training. -- We define a simple neural network model with one hidden layer. -- We compile the model using the SGD optimizer with a learning rate of 0.01 and a momentum coefficient of 0.9. -- We train the model for 50 epochs with a batch size of 32. - -## Usage - -To use this implementation, ensure you have the required dependencies installed: - -```bash -pip install numpy keras -``` - -Then, you can run the provided script to train a model using Gradient Descent with Momentum. - -## Results - -The results of the training process, including the loss and accuracy, will be displayed after each epoch. You can adjust the learning rate, momentum coefficient, and other hyperparameters to see how they affect the training process. - -## Advantages of Momentum - -1. **Faster Convergence**: By accelerating gradients vectors in the right directions, Momentum helps the model converge faster than standard Gradient Descent. -2. **Smoothing Effect**: Momentum helps in smoothing the optimization path, which can be particularly useful in navigating the optimization landscape with noisy gradients. -3. **Avoiding Local Minima**: Momentum can help the optimization process to escape local minima and continue to explore the solution space. - -## Limitations of Momentum - -1. **Hyperparameter Tuning**: The performance of Momentum heavily depends on the choice of the momentum coefficient $γ$ and the learning rate $η$. These hyperparameters require careful tuning. -2. **Overshooting**: With a high momentum coefficient, there is a risk of overshooting the minimum, causing the optimization to oscillate around the minimum rather than converge smoothly. -3. **Increased Computational Cost**: The additional computation of the momentum term slightly increases the computational cost per iteration compared to standard Gradient Descent. - -## What Next - -To address these issues, various optimization algorithms have been developed, such as Adam, and Adagrad, which incorporate techniques. Which we'll see in next section . diff --git a/docs/Deep Learning/Recurrent Neural Networks/Recurrent-Neural-Networks.md b/docs/Deep Learning/Recurrent Neural Networks/Recurrent-Neural-Networks.md deleted file mode 100644 index 0924066e9..000000000 --- a/docs/Deep Learning/Recurrent Neural Networks/Recurrent-Neural-Networks.md +++ /dev/null @@ -1,153 +0,0 @@ -# Recurrent Neural Networks (RNNs) in Deep Learning - -## Introduction - -Recurrent Neural Networks (RNNs) are a class of artificial neural networks designed to work with sequential data. Unlike traditional feedforward neural networks, RNNs can use their internal state (memory) to process sequences of inputs, making them particularly suited for tasks such as natural language processing, speech recognition, and time series analysis. - -## Basic Structure - -An RNN processes a sequence of inputs $(x_1, x_2, ..., x_T)$ and produces a sequence of outputs $(y_1, y_2, ..., y_T)$. At each time step $t$, the network updates its hidden state $h_t$ based on the current input $x_t$ and the previous hidden state $h_{t-1}$. - -## The different types of RNN are: -- **One to One RNN** -- **One to Many RNN** -- **Many to One RNN** -- **Many to Many RNN** - -![alt text]() - -### One to One RNN -One to One RNN (Tx=Ty=1) is the most basic and traditional type of Neural network giving a single output for a single input, as can be seen in the above image.It is also known as Vanilla Neural Network. It is used to solve regular machine learning problems. - -### One to Many -One to Many (Tx=1,Ty>1) is a kind of RNN architecture is applied in situations that give multiple output for a single input. A basic example of its application would be Music generation. In Music generation models, RNN models are used to generate a music piece(multiple output) from a single musical note(single input). - -### Many to One -Many-to-one RNN architecture (Tx>1,Ty=1) is usually seen for sentiment analysis model as a common example. As the name suggests, this kind of model is used when multiple inputs are required to give a single output. - -Take for example The Twitter sentiment analysis model. In that model, a text input (words as multiple inputs) gives its fixed sentiment (single output). Another example could be movie ratings model that takes review texts as input to provide a rating to a movie that may range from 1 to 5. - -### Many-to-Many -As is pretty evident, Many-to-Many RNN (Tx>1,Ty>1) Architecture takes multiple input and gives multiple output, but Many-to-Many models can be two kinds as represented above: - -1. Tx=Ty: - -This refers to the case when input and output layers have the same size. This can be also understood as every input having a output, and a common application can be found in Named entity Recognition. - -2. Tx!=Ty: - -Many-to-Many architecture can also be represented in models where input and output layers are of different size, and the most common application of this kind of RNN architecture is seen in Machine Translation. For example, “I Love you”, the 3 magical words of the English language translates to only 2 in Spanish, “te amo”. Thus, machine translation models are capable of returning words more or less than the input string because of a non-equal Many-to-Many RNN architecture works in the background. - -## Mathematical Formulation - -**Simplified Architecture Of RNN** - -![alt text](images/basic_rnn_arch.webp) - -The basic RNN can be described by the following equations: - -1. Hidden state update: - - $$h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b_h)$$ - -3. Output calculation: - - $$y_t = g(W_{hy}h_t + b_y)$$ - -Where: -- $h_t$ is the hidden state at time $t$ -- $x_t$ is the input at time $t$ -- $y_t$ is the output at time $t$ -- $W_{hh}$, $W_{xh}$, and $W_{hy}$ are weight matrices -- $b_h$ and $b_y$ are bias vectors -- $f$ and $g$ are activation functions (often tanh or ReLU for $f$, and softmax for $g$ in classification tasks) - - - -## Backpropagation Through Time (BPTT) - -RNNs are trained using Backpropagation Through Time (BPTT), an extension of the standard backpropagation algorithm. The loss is calculated at each time step and propagated backwards through the network: - -$$\frac{\partial L}{\partial W} = \sum_{t=1}^T \frac{\partial L_t}{\partial W}$$ - -Where $L$ is the total loss and $L_t$ is the loss at time step $t$. - - - -## Variants of RNNs -### Long Short-Term Memory (LSTM) - -LSTMs address the vanishing gradient problem in standard RNNs by introducing a memory cell and gating mechanisms. The LSTM architecture contains three gates and a memory cell: - -$$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$$ - -$$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$$ - -$$C_t = f_t * C_{t-1} + i_t * \tilde{C}_t$$ - -$$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$$ - -$$h_t = o_t * \tanh(C_t)$$ - -Where: -- $f_t$, $i_t$, and $o_t$ are the forget, input, and output gates respectively -- $C_t$ is the cell state -- $h_t$ is the hidden state -- $\sigma$ is the sigmoid function -- $*$ denotes element-wise multiplication - -**This is how an LSTM Architecture looks like:** - -![alt text](images/LSTM.webp) -#### Gate Descriptions: - -1. **Forget Gate** $(f_t)$: - - Purpose: Decides what information to discard from the cell state. - - Operation: Takes $h_{t-1}$ and $x_t$ as input and outputs a number between 0 and 1 for each number in the cell state $C_{t-1}$. - - Interpretation: 1 means "keep this" while 0 means "forget this". - - This is how as forget gate look like: - - ![alt text]() - -2. **Input Gate** $(i_t)$: - - Purpose: Decides which new information to store in the cell state. - - Operation: - - $i_t$: Decides which values we'll update. - - $\tilde{C}_t$: Creates a vector of new candidate values that could be added to the state. - - This is how as Input gate look like: - ![alt text]() - -3. **Cell State Update**: - - Purpose: Updates the old cell state, $C_{t-1}$, into the new cell state $C_t$. - - Operation: - - Multiply the old state by $f_t$, forgetting things we decided to forget earlier. - - Add $i_t * \tilde{C}_t$. This is the new candidate values, scaled by how much we decided to update each state value. - - - -4. **Output Gate** $(o_t)$: - - Purpose: Decides what parts of the cell state we're going to output. - - Operation: - - $o_t$: Decides what parts of the cell state we're going to output. - - Multiply it by a tanh of the cell state to push the values to be between -1 and 1. - -The power of LSTMs lies in their ability to selectively remember or forget information over long sequences, mitigating the vanishing gradient problem that plagues simple RNNs. - -## Applications - -1. Natural Language Processing (NLP) -2. Speech Recognition -3. Machine Translation -4. Time Series Prediction -5. Sentiment Analysis -6. Music Generation - -## Challenges and Considerations - -1. Vanishing and Exploding Gradients -2. Long-term Dependencies -3. Computational Complexity -4. Choosing the Right Architecture (LSTM vs GRU vs Simple RNN) - -## Conclusion - -RNNs and their variants like LSTM are powerful tools for processing sequential data. They have revolutionized many areas of machine learning, particularly in tasks involving time-dependent or sequential information. Understanding their structure, mathematics, and applications is crucial for effectively applying them to real-world problems. diff --git a/docs/Deep Learning/Recurrent Neural Networks/images/LSTM.webp b/docs/Deep Learning/Recurrent Neural Networks/images/LSTM.webp deleted file mode 100644 index 9112ab5f13e31b5108938a6a57be389098a66406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38522 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≤M793|9|Tu-n#Lbpgfhn>M&-X$ zQ|G*SG~+bdU*(SdmY#XmQ(L-+l!BRffu3mHQVDqH&VQhu-Mc?_2aO4P@e5WiOh!|e zQLTPZGdB@83!h$_M@q5LL`Y-C@}%|2XdWwn}aghJFe~c<;ITsrJLKI;B?`}6DFnHSMPQFd3~3W;dpvU zo(rT&ZtzlbJCo`HM6Mq&QC?FMjX^Cv%>{9(*8!}p%)UjYpjNRyX$bYu7K|Em>bX_) zui?nB-A4j53SA}A=I(S+iFz#RnwixN6~5&U?W;lJ<;i5M)b!ZZz{~n{UwzOGnGK-l zU9~Uq!|?L&HpEuibTeId@~TYcgn>X|?HmW#FT|hyw~3T;?32@$f9B%e%IQ6BsTp>v z;g(q;d?k8g&~Nzwpaa#vp$EtVk&;J9!C4M_9+EDAidTRtepR4&u!2{u~$F3=@$;l_aJCkVdxvBvyW z1|hzd4m&PWT4otg6Q+ngS6SS!xCL2je<~_W8@8tUta$Qo7L>tb%YhtLT!AbzB>%l) zn>}jmq%mLDux%3KyaT6fn?Jb~Sfq-tsfU7yUHLIs(EXbp*#(-eUfdMH#Y zx{xyM%-|TIwS9!C6n;QG+>QVcO)KJziV%%Se`#G6;v_NbUR8Nd&SOOj#2#8Z`-Hfi zZ$`nL8!Iekzpd*w_%<5Bb05+$&B;icu>~d4#QbRI85A;uy8OivF3wdF{7n`4OWwRg z=Yjo>p>aZUB@%@$#}98V@|p4WG^0W}9*1nl&s3mhjZk4Oy|iLUXIvoSZ>Yv#W=t=$ z-)rr*zXJU$L(xN+xgAzs1+-f9%u6H=c>orH#Yg+-!j?iUUC zN_mPoF$#Az|5KuCVQHG7(SlJ0Dy7=^>m2)?AA9R<1Y~ek|@Uh#E zi$N4kDWM7GqMfIoJub4B4@S^AnTd@#4!KQVKZR-nGjQLZP8KN#Ij};;T%4nFo%q!+ z+>t*#GuiH-Hs&6hnxhE=3>ll^4V=5~`SaxZQ*I$>;xe_!W47UkZUg)#hrL55lN0)B zUkrv9MH&V6eRC|bW@Apew@Eh?4l3`u(jZP%_)p& zEv^oxIkF1ip9-nIP-Ij+4^`gaPoYjB0f|4VwKJZ%nv4>@t0p`v)6_`>yBwtr$vRZ$!c9 zPHRzL{uOUP6CEz}4?cu(m$fYSOPaoH4j^FIvNUZPX!Vj;=Pto&ENdjY(Z|)h$RShS z*nb{g?w3?RhI@S)Z(*f~2~Q}vlf_T$e0Qer5k{0>Dy`T#+wbS$FMjvWdc~WMd-k|) z%zj??*i44^Rjv{x!x5uj;4XT7JHK%N*z7>qX^_e6diFCPJCrDcqMvU5D(;4qV2WAH zYy}-2=?9Fd_cMMG5W3yg9|MajuA*xJb>SV$W(h8x=KCl0`y1}&N*#;~8EIy3Sj-kO zx6rLtqW5+Bn4!8rC;tlU&6=;B9OLkCT=vTI6a5=t?5ahyddV+{5^A!}i(Am;1^@%OM59;o~&&I&Mq*lf9bFUBgdn!n5 z=yNW8wbVO6V{r0!8PR}|#dP7l?_Otx2S@O6DArc#F z5IpowaZ5;OUN0yfp}AmBMHp{Q#C*x&C|cgJ*aTA{$G6!JwI}>3z}WoIjS8Oa(NK>EH4uIhguu#G%qD_G{?p8g-f1Zx|WOw89z-068ZSSN2P~s{(dDxmbAntyy)JyUl}Ww+yLrwU9h$-35l8!1@; zpAUEXoU?a2TeG{aM7!^-!BR5}>h!DhS@=@r$hX@tc|m5X<>gts3rLJx^MMbTY}j#@ zfT_1Jy>}t>*ahru3Dqvf)1S5Z^0elRlT1YK^h})9X*lu2RNVa_A@*4)VsE|oWm##@ z)!`Bg#Y2?L;*Vs|q2W~n+(Uo9eoGb~8qpN|t8)c8@h+F5eS@v+E zzf2^)b(=;wkdA(@m@&k?FNwao%~I^wD{$(5tdNo1T=MCLYGn^RW(wa$bdbPs;j=?k zq>#+9s(42Ef3wcbPk26SWs-#^x^;2%EC_Y((Gh>CNsew=oKb_c zj{CI}@ux1bcg!Gm9`WqiZnRhTqE4r{Pw7iM$&Qv4mVpP2{8~9db5Zw*`Zx0uvkgMS zNrRspz);C zD;^_g)%yKoL8k{ZdK{6edv%;#@P`$4zfWJnLzseEy@0>zSE7x%mC|p7y^I^fK@1z@ zj!WgovW~-^mMQ9{%fDg{&9ZaZ<{)lrCcmR%UARTievuM8K; zq{t9OL3iulo=HaVv#s;&N=C&mA6ZO~9~bL!q9p@G02cr?lg%l#ckwTT=nMYQ>lh#( z{ovNKRZm{s8^jK*H@ok`YJxxhr3~nfERzRg-2g3)xTym>+#z3$)rNrveH6R?wXh>* zC00dwV#iv1B<4r2i?FKHUb+h08*9+F@+Yj$D*VE~Z$>(N7`G$uH#j;1wP8{Abz8Ih zXXypmstw-Qf>pG1Pj%MP7SiqMb;Y&kkv}&s;px$@P4!a8Q0qbM7#`lW{Lg6Spm?Sy zeLs;w5opKqP}mo4Nns?%jK;iRVli2u+E?87EZIDK3&FDBwGTJE^QtZUUd5i=Bo#zB*@m;5(Qy62qYSzapYyfrT z8Fy9RQq8)gw4guCK(4OtYVl6}aYG+u0e>W``xBPCF7Hn?^V07(# zYBL=>H`Q_$w2Ke>;5$tiYM?mWw-sVQ7^Or_)H15g!Wj?OpoTZauju;Lzolv>X-q@( zXa4vs*r=Q1KA(q#xxpV@gmzHfa-9#iD!H<+9<@5v6=m!keN`nU^Ig+-Z?W zG~`P?qsQG|Xg%b|m2SG{lfle8RlslT-PgfWgl?ldf&{)3xj<#sJdC&CK zb{e&lqnICKm1K%1m17mntbqszI-(q#)o!~2HY?pq`Zo|@Ry`6By_R`a0V%D^^E0c) z#=VY`N|{;D!Zey`if@S>Z`16(FAYu^(nAC@=FC}= z_aFHflVQA=??SgevLMn)^ex05jGLU~a44nU!TB<-*nfN^hBIyi{D6^IU-!_)>qMIwgl7ftW?W{5(KDB=IqPHo?HWKQyl#|8net9uh&!sWpY7Q%ttL$<~CME z{kbN8$S6S}N*oFDtNX~w2SwN&HS>qU2A?)?sf*#9O4Zyc3z|iOwnbSq+j%L1AD4W? zPi&cS*pj({=fMaJ8;1E%I!i=hAPuyui@RpmRLDP)B>4!$58*ESbG8B0b;vJ1DUndmEsGN1t$blWD`0)mXXwN-7h>qWM(^nPIo%MG zNeF6+9g>T6xRp3YU*3+PL7fzVTJ1t~|El?-DOArbkKC032g{ytaKSVF*0g_J2%;5i z8|*ui-x9^@qZHPp8hd4NWoqrN_USPOu6U|9qtjfe0VWj79m6|GpE==yfh2ux>wHIp z^=c#F)jb zfO|>gR2B|>HFLpof+;M;mBoP`6z6Xyl0Yr$$CI(>s-t3!227$#qT?y$2#@+6XjBf#gF4-ujevMR9OgQRMronoQfddxylUHao_3`Fk)38YLvLcLPJX;4UDJg{# zOJ}O2_lbh1lzb9)yFM*`!Z~B5?9eB)&PYs6q?hv7AeQAp@aj zcgDk?3yn9m_l`6`*9Rt1TL?$dg5EnMGGP_r>z)Y}*!oHO0dGv{bLA~7#MygDiLi4i zNnzGo4ac#%Wp<(m*4NXnjJlPeQ|a=^I%}*|LR|Tkvi4+p1`I$2ykzL>Jot-Cr@kV$ zyQ*@iiRAI6VJ~POmau6JcU41$ioT1YTl~HQ+UF?>x}4G=4kC)H-ld;CC=sy-elHXu zk=^hndinBr9Qo=r>TL4~UMtq2YZI{z_337}7gk9MkB%4WaQnz?myI07%(MA9S!R_b zH+T<=8e-)gP13-JZb9w2g%wsI?9LHp$iGHCw`9aMBu-M!%~FxOpVB_%clQ$jnYpLZ z+T~1Ms_myNA7+tXkAMQRFG$jcADZmiMdyc^NZ^7IEvNqw4mgZ~awyCsCJDCs*w8ph zX~vM>}ofk&Ob?{rF?3@gYfm1^qr_(%~yYj$E2(P6R~sCW&j z?*yI_)ba81g*{XLFt-v6}fC0$S3^1+tYNd5b#O(13vt6t)< zmnU~qJ8eQ$EIxAy3o>*_mf@ni$&OeYvc(Ul9CBOh4F{FbL={?u9H%`3P%MMY_+q+4 z;+BQII3YfzfucccyFtBlt-Oz73W)ylkTTm8`V#t=mO0ygbe_XZ-&gjA>A^^IsWPFx zlvnVJi2xtd+=EFtP=9g;5BV}FP$!0vkqpP)i`XtU`Y!<3g)oS$jC=gA;)eG?Gr@7$ zM-`LFN1D*86_RsX&QHJ>MDkD_|3Kmk%YP}hTvF++EX;Q6IaKdr-!l} zBA8C&vM^cEL*FNWw4~3xZYz(7@i?NL^jrnfkmV{qSSmeogqp{jCNMq1cXC25R zr#8(;jC@VwM442+Qgx7;cM$bPPxEELM(>}V<#R)~*5U{VM*nt)m60WnWOX}!fg?hIX_QFa_A_uS|@J_-G&onJPWrYe^6;2~sQ zHF4B)#jW>}ErV%i!_bMlg%`=RdSsL6ew;IgvO3#uEvU_j+~hD|iD{9ew~83_8Uw8b zq#pAm`H7B0ZV}VNr4~|SbV$LkKDm7PrW|WNA&>XE1_o6We6U>%YTfKINDmPq3m)iE z-AYY^YCjoRbP7rqi0rN>1D>q|5>PI)!_bx$&x~;>k2qmjKNxUnX(wTQ`*_p@4@}$C zKW}nvvNoq@g`CA1W0Zi=UO7?XBa_g8{Oem9!tQPg?^yzV{NF%l+P|64p7f9{$*-n-)&O=o26O8AGOv)$?H0RZl{Fs3iB5#za*+t&Jwr( ztMOj41g2=Mf}T;#x1KE<|GkW;iJ~R+y3S)C2XADJ`D_2eMu7K;JLuE13mvIsTCEQ5 z@=W+~*zlb$Bdb|&!7@Nh#E7Ng5`Suuhd9x;;CM2R$^Tiv2Al<P|qC7kg)c_j%&SnR> zz@9@(9#^5)XU6RFZwEfES^xjPU8!(8U?xm?$i5j=bc$x}0<**B8F)IsVWH-zLz)hf z6MhyDAE3|WcCHcp27C|`ydNLpj+uqPB@!DS+iFrJ`R6aU^}p|pR_Lmom}}*EgLHhk zF_$&^L;k-_0BVD*k>KAST!&LHpZhsLiZSB*U9jbwP0R~Bpz~Mj18*bggQmME*Y`poZPciA!l+|*I%k=B@hgf*zTkLYJHz}M-tYh83ixsFUE0MT&wd<6y*XhraYgYcxo;5odcwQ*( z9?vglz~;sl9lOIUu6~px12!#iS|alJHmWRUxPyX`fpPI48C~~rhBM{ti%Bg_E_Ay| zqJ4X#cfkpD28sE$CO+%QIWhWXO}$o8+G461WU!40l%sPiYbe<0OY@2ULtlJU(0SC0 z14-Wv2vxQi;F}61)cPNdUC5;aq(bF{O87qlt_1NxKPVJ}P>)dharK6~jM+sA3YpK_ zhz&J}3Wbj~1_hdH5D=omwOKt`^Qw`gQ8QXlh0+aDg>3E|KmY*5&-tFN8dLp=q7Eg1 z(1vE|IeG3v)Nih_?OZeTT;fc73C2gxUJ`EzTMu3svM^`l)yx^v3DM(R*PDCRmEQw1 z$KW1a#}Lns9ap8yJ4t=L|kn(GW1<_B$Qhf#3NNMAr-gXBgo>1ZS)rTZ~It z`va@1zM{JY3@i~;NuK`|CCcNYv!a_qh}oM=xJZE9@Y8xBwa??6w$n{yaeZ0S{WZF> zWwhyAJrv7{S5;o~z4RyjbDes54urk>^7HA_PGS-uWE(H4YzrGwjytm(p!wVJ4aJfH zv0OauQD$jyTfBn1 zI9>ey&~X@lW|43Y4^oQ|a&+J4t-(~r==z?`TImdmY}{HX8h_Pk>44+Lu0?327L0Ba zK2)j?gMoXvZhK%&s=uQtNoRln0000000000000000000000030SDHbdu7{=LAad;P zzsq@ZlrfQ1@9?bElm&g)P8Lu_0(K7SEgbOt@+Y>Q-`K`!gwcZzTDxKg zQset3P>O!p^78_Fi^Cx_ry3{i{Wh8chyWE?16_=}fuoP!`ll0jTCB&h!mQJAkl09= z9FzA#4GxztsJh!!v^jhkhWzGJ?vv6-T<>i=()+CcNZBlwpT%Q8ex&ypxi^4=0w2Vs z)Gm5)ZmOoq65=#|MumHt8Ek1w{~2}U0;ZZ*TqCsX!!+~Ja%j(U*h`z$Lwr%?o);-` zL5D=*3k{9X_s|nWp8GW^`N8jA7J2KOm-a|jA=yjd!uoKpgB;+dXkTZE29BrxZ(%WS z*uV|gl8$dDkpM~9&?cK~M9piJhIX7RT2SyE7=;)4pxGqLt;KQS?KcYr|&i?F>EM0YuKDN{5}Sj@!1ParcQNE#CuDBRFE>Xd?F z2xTlzRT#S$UOhTd>N;Hl^cwDCL=N+atldd#o}cp5px_#bL8$01G}wQZC#+uQ-A{Q( zGU5@0Q*-#132z1JYTB9t2?Dc6d^e{`$eyd0po;1 zy#wMmyNNsWosgj7BU(n)%TFr5#r$sSyxq}XqI_MZ(eT{%aCcFOKBDSDQ{>CopL1DHq`XMEy_Si zgA)f&J)GGBsxO15*aw=3KOI zt*cEwhZn*KQ0vQDCi!iw(RSLdg&ssFyUsV1ZePhEz7@(=qwLvO9=Me3!rUA#W`{mW z%zQIaD)@{fFjUp-KJX8V@3c4d4TR=fj6NZ?4l@m)ZwfE@l zY*idV1ZgA)@5JDah~o^BODyhSH5d>R2{oO(J0nb!vj&ut$>rGfN$UIGS~7IqJsC$H z&HtEdC07gqQe&>=XQ|*DfG4@`2R+CMZ=VhjLW!be&Ys)Icoy=+mShZq^Acf@Nhc(( z3Lj-(ZJM6+?c9T_o6hmrx%;#W$`qR8uHGs@!8xK)L2g^nxSdtSgN&-aZ*d~%KH7oT zFT}!`x?pJwbFl1Y7Qs2CbV}1W87s<7p#c$JJZC+)Nor{N;9HF7KEc3$t8#G!i+!##NvCU?!gbm!2i6qv^Zytu%2B3c=}=BZ zI+&bSkGb=X?z)QQxlk3ZJkSia;f90(a){D5C0KiMMw=*M_XYG&4!7spQALJPkaWyuo5- z<*XHOqMKzj)xY{PHQqxXfGsgUo--Ye=@)u9;IKSBK@dpYO<;q62wr+OPMG! z8pee50d6s>Is%Qx&Zh}Jt+UHy`ojiqiIzp3mGc4l*6~5o9h?W3g^nz9Y(mb~^{u{D z0$wd(Bz=*oM+5ajwQcZhKM(8ST}>7xsm4>{iRh%1bgfcy6^w)1G7i}*PbjGJNI-IA z7D%KY4>^-5T3c4@ey6=3|0mlc`9k|=3og<#d&)C2IIhF&BMGj~Sjmi~QS93VSWFCs zM!~vhhg)p49SWuGir>pjlFc%*5Db#tGyZu3IF`3ndR{AkxfD7 zN8jn>A>{Tg{nEmrP;Qtc94AV_EzD6h`BY@+XpiEK!rX#AgA>N(S=MvPSmu0jj&^=r ztiVp99vpGrq@21pK7`0q3-WpU7C1ic_oJe_fM+9+v;zW7XiwPpJ9@%&!zJo0X-6}7 zlNJRf;Wt(yxQ*4ERJF1Z?ew*HFpl23&8tlt0Qb0Xkv-8p@FzhY;{GRVaE5Saz~}zWCpdmjgo0TDGD?7qFg3h z{c8#d(KH@7*oDO=848Q$t>qi{PD#g5RZ+)V(>LG=H11@MU!hk^uBOrY(;sVG75n6%4o|UU%z3O0djB*6{Zl-+Xgp*qN*&76qjq zBDBu{{0`+rsvr#zFLe9NeUaD(rr^&yBnDC?15SpSYRI3Zt7}?UC!?RG?>dd6Y=dBH zpitv?;Z2!sYSaVhJbPPm4Nwh~3B>b%q)P?LD<(e-_Y!iyt&}ePGd=mY)5xNMCY)&R z3~cd|3x!uD$9F$T=HyKVMY!d1o3Z6vag6o(yzcUFWXTc>>8KKCM`He9&e*2ENL4h% ze@YSJE(Jr%@^K!>eqL3PvWz1w^;@aZ6_AvC7w5QYNuZelUI>&6L4L>D!rKE59dFN< zcn*~YvdUX5H^X28`nPt+binRviu&;n%q9~8hFno(r-n(6bQ+s^r4>n0j6#4x5mnoC zoAD2g6T`96{hlQ)#w;xb^3+Nf`iBoMp+k2JL#GMXaNCFv4^g+4PqsF~3^=G?6nk5k_x2-qlre=3=2$qFrf6L6|Ip z>N__Wyn<}k%v!&kG4;SI(vIVQK?f5Tzk5?1?n2npK{77ip_nP5r5;!tB42$N##Rwu zl;Ks?@HD=w20G2(H~ehDh#$X(J1bjjYLO=h^ju8*wk)w5J@V&Y%ZM zJU6^bIe5BUpa9Yi&UZzi5VC$#c_w%x5;P70sZ~UFbX036m7$(08ji?eu8*hF#LF-9 z`w%g~y7&rP+H!Adk~kBi7y5=Hwicnm5;{SJa0!!hJa`wNSa|v~Ts0lcs03ly2`$Lm zc+z*fy*id{_v&S6GIROi?f(;&y{#3LKT#7gWo~rAlz)6B+4`^D&261<9R)r#$=mWW zCRDJOzVzB;!s2?60I8)pE%&NST8*uq?sT*6v-z+7G8av*UeiY{#N{P0(MgBKl#(24w}_74D=!sYO}d9dNAo zu&TZZ6-t9?DNgb@uq9Azj7WM9=oMZP=65=6#p7l=sz+HX&c`-Cw_U}9G2_XPIJqnK z$Nh!d>K(-EewpC1TQZtSj5!Y&{)Uk~v%De)q6cndb_;Lxatul)rh?9`P9;05*%PY1 zo#&bC-7)xKwc%gb0e`K1w!xer7?u>0MgLaD`)ilhQQyRaAM_>sQLXZ2>9~`U{AM>Q zIu@dw{8>&io_(!&)f!bB>=(d}x3m?M1JFY1aRaOJ*^seeAY$1{7C!I(unkQ<%rX1V zV$|DFm2VhSKXMfL8nO%}>*8xd?ojL6)$O5RYz_+7pn*p%2xI?zQZsJ~v76*?VCM6T zT4q$@qC;am@GjOxfMY)9Gj8st8X~XTMHa+Abzm))W|jC^YB!N2j@i!*#n;b}(jS7a zEz-#uXp|B1H_kDE1pg@XvnRcuMqFDI0_(Uo9U+wcHaZX-3`C?mbtt1^?$^aFGpH5m z@bFeut+kUGp*lV{L3UOkPn@#Y&Cx8z?{^LOdSf_(f@!~cyLc~Rb~5%p^65qKco7+o z{j#9Zf%%B(?g8A0UYiSc6ZYQ;h2^t+*jpIAQNm6CFZ#QSm0JDF7*FMr>7JE2z=Bv8 z6!fD)JYV^Xzon1Jd5j5j&fd9K!SpmtWiWCz1Xpd)bcL+Li+>yq)i)02Xtwd2@y z0c`4BqPA;3mGUlB64i%v=L{gf&~VZ`Mp1ATBm6jk|W<;_}tz?g{4?p2nVjyR*=XDI#`&3d+672%YnVD*Tim-?}Tjn)o+GBYu^&|6e ze2PY)f=}|RPKP+3^d+~_@3kWgd+Zq8gn-%Op*ZZrdcy@t7^q_AkJGxg&i}~bqDs(? zc-y8!Ycm_D>~2h(A`YTGAi_*cer3{@2VYX8rPShhr&z0<>HP~Jbi5(69Gm#B{5e;Z zP3WcSC#%+)Lij>K49T?3c{iJ;78a;Foh~9m`r&bVXqD9SHy91UIb>b6sc_>Dn;mxt zBK7;9C^KBE@X~Hi(F4Ff8hn)wZ0B;QLV{UDyBE}fPk4MLzDvTE(2EL!k)gPh#e-w; zdip50VPrz`lJKXXRE6N#x374BV@Sqe2P2fAZN}|;*=XboMBH2m`mf0NP#b0;lK1zq zlQyH3HoOc1YBxzRLvzQy43rSB0?28i9BF{k;fO!4RY@(ueVf z9Uw_(v1odJBPEynu)@Ovq)P3u8)U2VIA_qCu?bIN8)RebFrHQzgE!^)CRIa>0^Bv9 zT~Zu+>-Qz8=KH3zzCDVEVK0mQ1pNSGE*k;2=tuz$uGIygQ1k>{Nu~>y&az1Jf)16rTSo6aApgJ%*_cA@`H=OkNsl;PyZLj6*uK*!b9=Snz1FUuzAOn4x9vRS{kUn7%P8*?#glF2!%z%c`R*Lgg_ zi-tYNYv{b*v8)|{bA3f29S~$yVfViPn4|%BCw$xDH{(sbO;C!&p#pGzU*UB!lLZRH zYI0JiiL6gnN@CL46M@&+nF%x9NRpI1n`6qhL8r?&vy}$wYM-IEo}e<}_}nh> zJCO>ssN670(1SAVZ8;6N+6+tDbZ~G;@HujGfmJ_}JM>M8GY>59o4H_gn$xcM#*cpT zVUD_2HVuy7rr~BLe|J#tLT_iD-O9n$j`*;D%ocbHf2LNa67QC4)xtYo0@X0psXYHW zT(1=R&9)vLnfM^Lg+LUCVbJ2bU!u6F>W8!9=~|b)$9V*n*$XZ(P`pv?-YGeMFoD;e zD%jV2){2?o%Ms_Ddg!dT+AH6r=Y}wSeSfAmHkrq7f(-mz8o4-!UJ9Z;I<6g1H5OGq zYx-a)^!0RCf1=YkN)azu@PUR)-g+dXyz!psg}C|uU$1S0I_vyEMh#NiKGgoPg?8p7 z?OLg#m(IS!d!JPy7*s<_<>?v-WqaGT6xZ68ll)HS1-VsNXCy#cyd7W?gwI-Y#e}f# zGhtW3E5KiwEcz92?UE}Otx(riJ@*-tfOK;d$Mh9e57n!Y=dI$QOSNyJ38ebmNV20v zUPStIkb*l~eMCoTf%pJwH=R1=xIFaq?A9-rcNvstX55P=J2(!0E3Go6b|l!d;gF?k za3jT=M|uermVSV3%8x+vBnO(dh$u^2xwjTFPQK$JuS2vc@PE}v4*1RzeFcd3SrICF zUZHv!Ra+vyq}9QN{jHaflmZN}v-!WRbY8>-=;?x=x(4RL_tZ-V30&OF3y0xuUq}mY!j6Rhqq$X7Kpc!mJF8! zQZ6g(JkKq`;KSxD%`c6aPwY&iaYB52;>^mfrHX)JlJu>ho{#NwTw+*kF^mr57N}Gp zb_JP-!qBrOM*t}8FVr9Peb8O9PnGE%{A=>rS6ktHx(&AhNU`^*1<9#9mUz7A1@2S0ryyy5E# z1L?eg1Jd~2X1zIG=;nh2b^AKws~fmb_i`0Ek?`p^dc855^Fo{}Z=K7Ta94}4bJSXd z6mvd?Gl!Zb1UMo(x=-4~E|cpaU1{=G-=a+B@2^(&*t^uVEnAP(-V9QbCy}5w>!6N8Dgppon81mK{D;AW-|) zPRySzN+D}1yH#)J`RZ_m-nr#RA#bUNUn z`*zE_&pAJAUGE(6vJoo&`;(Gq+9BhEfk5r7@oS^HiR5?DdUWO55BiBx9_AGOHBirs zI1w?}kj{Y*x_W6qu?IWtdG_3p%wqR(i-{b^kCjS=hebDyYj_G0X;UNQVm;Hr7x{Zx zv_0jX0y+Bvq#Ws`(+*@28g5jv@Nwj@im6=Qy2a0nz0pu*b%U1>H0m;wG6^RBkC!^(K@ zf+4z*9H3umkU*o(E15$7lbeM?@5b|WQel42$q+x-NP#7KAsGZxsKGg7N7 z#3V2YgAPtMjwXG;9V%^BGJCi1j+i?K6_G3XPa~02rQ_#+g177K{Z3O1#sMR;(3Oud z{n&mUz(hUOX^ao0KS*n^pzbIF8a3%$*-sv~(`-jcfVCAOHi;!4QbiY70ZRD>!q6zt z^0IQAV^MR|8!i1ob4nA#gA|~i5~#esn74RJ0eq%l>w&PgRJzLQd(sbN%O~{o(HhSO zTNh1F87py|QXuTXRd&LMsElP?5H=y-fK#r421^l+e|8{Z-l{v|rhJb~PV#?&(JC1C zZCu;n`WfS}d(K=4o&nn`N2zPO!MP^5yvRs-l9iX0E_z=sCsuoWpeSye^C^}065-64 zd2m*VdpThuTVo%7BYG+hgV)S0pBcCmMgT&i4-fAKm|eE7!qK9I+=4b7YZQaYcL`QW z+&7tj0ypQX*dW zRi(sa)bFo((CZa4pbcpm+psWv1rNNZs$2i zoiI*4ei|4DI|#O`F>W|T;j+Y^57NH$Cue-zE` zYR~u*^~rTZUhGD`&`47(M`yp@w<^;?BlO3zN3TysL8>}S;H?tut}C>$i8u3RMUcx% zsBhEh<$*B>wT-QX>&&Hz<3pOLk*bmKi_Qm(zI`)|eW|~XRfcRw90?AG^>BIzbTyxp%$Wtwd5*oqa^900$<&Tog)X+OFC%e^mjexpqGflbr9b! zf1485fiYJl1l(~C6WR&K+Vaa|IMYe4dP}O)m}9m< z*2D5a63(?D0`zD{f=ukj#GR1<$5gc}Z{38flX5jMTu(rZ;#zO7`iPW6ksE{vPxbuz z&L{!DdtrEa09V7hMPFfkbYphP|8vhhqZJQ+2RU2thmk&R5I3LYwWFT!8+qnyrHsHX z%kT1MVir}eYihtW`+C4iz@&^7Um=R0`PWd`*nqx&zvpr@K3PA8H4`P+K5amj;HMfT zjuqzpSi;?(99O#I0#J(|ML!mARCJwavNrZ*PK`ihi}D;};Rk=PxZ`8Ui4*w*xBEWz zmQSb%jj1Br!!!j&o%E1~o+qMfC5Xn;;v30}T^=u~I*?xPI-B^QxZ#Bx=y-9>hH{8J zcj@|ln+&pusFZ47O{+I92JP|*h}7;$5JX!0Axu;GZOqp?ghVy-y;imUPgAI*(;S&j|~q3JU&fUSf&qS~VTB~Y8{f1WL4(;9qgT7WXKOB!;U5At9PwVRCZytv#@ zSrFHu>P^Fz1M{)W128NOI>xxT=PrukvA7;bj>5Ru$A z(s(AQACrK5kiDX;OtWfVIU+$n-9$Q4s30abO^A>+ujt;{A*DZrXgfF#)$0cd6)R1> zi4H>wxlK*bNvVo#hWjM)tFV@g^WhCMhZ*Imzot#$+_+anQ(mYa=91rP<7t+MI9=aNxPgG}nD6kJvY@1n=hPUa1{AfVjzYvzGh5aY(Skg zyYJA&>IsFRlL2CQ&w>m^M$ZGg#mLgATckYh9}&jk6xXE_CVHZKyoEr2{{6kZh|rgy z;-)n6+Rdz686sjJH5x6;XyYIbuMw^Up-22?Z)K~b1dzUWMZ@+j84w^6bzB95$ZRjz zZJMBteRCh~7S948ZK#8WC?g)p_&VrZ4UjVQA65<8Rf)s$F$x#^`33j0T z%b*lg^%1OFGW^rI$UuKAv9Lh^JFo-VV{GPa=}s6sP6?N5z00RI6eTU&RvwUeKb#j! z>*8nzyzDmBM!<2}%1Q_L79l9LPVpsbk5DzlZwJGkaScLJtAPU!by)qQ$5i8=>=;wW z#O?yiUuNfq4l1lq-Q{$>QwSty1)W|1VrAA+wEOi&Nc57}?`!m88>kbd>jE}dh-yeq zk}_40CUf(kvKN&Xm>Xm-=Jh&~gM;R}2O0t{mhY48)DLg|{kNLPruX1T)7GA<6@#^HFgL zpZ+_>3ALHET&aV_eCy6UUvFr8b~dRABi=~zH$Y!?QY3hRAM_Btm-@Pan+N;N%xDvn zST*KAWxh_q8`!1VLx@p*23974zqyzU&1InV-c=^ zI}b1;UwQNIC%&0Sm=;#b*oX?7qIkgLi{M?Bu3x`3pMkR|xq|Il!H38XzSKW4-UZp1 zE;4S$m(Pslk5LyuybgbJ=#;fuB^_*e+a4{3X*ybb*AL2G) zC4=N5XZjX+rGLL`MktGip`1#n-CdG(HKvb~`Sf}QES!%u+ifP$<+>NwJx+zrfi+-7 zQ@}l5X$6dBE6uH>ZO4%a`Z;K&0z2VI#uN4+PrcuRnGW;6#f)$*OTp4O`)s%kTm^b4 zXz5hBh)4Ogsl%J;lFtGBB)1_ejbHbhILnZD;^O*%>obqNg_9uq-+}xgK2u|=S8yZ5 zfKaw2q&;CxIfz%+x&k+w{u`P7<=eFn2RG?(M{n5)O`y=rpCqHbuSnKG6K07(E4XU-3#!+eA;mORnjvZ06P$WW7T(V zInlojqwOFBgPO|EHg9H%+(D4wF}qCV_k=V_hsp3skuE*$ru9aLZ|uC+ABjwlXs}C9 zY_%YTbtiv~uu!;<&kmHUcoBP(s|EiR9;|gCOQ<%=gQ{+Ob?l>_?KW&Vj0;Ma{5|yf<&mb@YB7)4Ud`3Vz{?%V`((n_x>NtIpSWvh#n*r#4PGq zrCkUH2pS;#m)S;eG}*3aV&tjE&7E&vz>XH+B*!xi@$rLiJ#^sna*wN#kmiEkwpK&d z>NoZP+c`4DBtWo@1NlWqUdNos4Nup0^JnbRXQ?+q6XuOwAp&D#E$S4L@B2r=CXG1z z&-sE`bMsg&{+8~PW2HR}kO4IoMn)j-y3=tFfJWuacOI5vfNyhiX9CZR2^if}YXobo z>0^RiJ3gP>CY0hTn5sHBKo!K7nt^Y=VXmBVv$0kZBtgL z_8!a+29mB?_1%u3sm_-Mg{I=9pO?qWjL5<`blm2Vg6*CIEzGk57U+e&)0CSqX;ebV z$3KvvixA0)po~#F9gIu%C1%=1q}ut}R1Q+YJ(ZV2Z zO9)4izodeLN>UNNGz3>=pw~2l<3aT|SDgGOYu(z8Uu*8ZK^&-;*cZ3IK zP=gkBb4O#MZvZ%s`Xsb>={!rMe*RQScffkD1zInmn*vXL`rqNW&dMF#iR@OJ&(hqk zMk7gwCggRco`#!*2!ee$TpNn;Vp}kU>Fcd%;zr25g=K-pGU1wq-L>;zV>gV}2v4%l z_kE%`20=lKKPc`$>%)+gR{>Y5EBHfyx`=cf~fn?E1M!?v-j$dBN}i0 z4t5O>%eL4V!R~oA+AuWMJ2ufR-y9pEJ@J?6d(B#$pdKjV;h7ZbJcU1~>dJ*4Q;$*eif@D&A7YaRkfIyT%2CTZb2syy`70jb znMxMD;450RmURZ-4=?SWQLW1+tx)j?f($3b=CVFEsYcFfh5ttRzoKh9z|qZaW!)CJ3)j!0 z-b8<>w;ix}pC8ptZ|sn*!ICwyHv09<3VE#CMn_f1`y|nB9C^)Ar*n$bvBx zCY+GU~eP=a?oby zlUw3nMu~F9&QwnlYDcFE`l&}2#>HdeU#soInOUKxR8Y%IvxJLON#;ZNAptjipqc;% zfOh8iodk2VO|WBi;sWphw0=4ziRu3J*QB4weYh?cdfI4JkGTqa5c0gjIC>p~YapS+ z^+=;+!F5J89knI*YpO{9*@9H8QpKoglnx;>Nm$?I{Mu#J?(2LMiXRlc=hNFs)4L|J zl_wSpsfuhbA^cW6>-BN0-w>dgbY(b$(npRz71tc#bM$lFP*r46TP75di;lq2+GhcGZo24g$ zcqQ;MV6+Jz@2=LR*4B`2GADC@#khexx;UP+xAimdc#5d2VI7nv@oUTH)0~h+<2Z?& z1q^FQZ|LHUPzZIZXFcGkzJ0g<0F#g}K(Piojlwu`NodRk{ z)ia!Ph(5}G{MKTJsI!V*-7#T*3wVw(1DNp_E@I>Gw;C95(Mc385 zJp&%?8JfK9fXm#Yzpu1@Ba=2)lzmT|Pc+2Hxa90`j_74sSY)k5dv)j$?Ek@sDk%}L zgjDhhLE0i*P=r7%N7E)8po`}=Sj}n3*nAwqoUHI9eGmbsK#wTBi5L}c z?98lA;!?24uh(B-w$`|;&Esua_EkuG8rCa{(MB(g!n;F&vpnpj&)vsj63w)7F#6fS zV+FlL5rZmYqNNau*^?4QZ8iXZ48FrWGXJm;FKji83ZIt-Vm-`wLS;{?4%8R=^aZ^S zLc^!oM;+xN(gd6%`_o74@dfzXd7E}`XI|M)C6PnR{WK3gO9;MtD#0oSZ4s2YU&qd! ztI1#S^RhUNLx}|5)7(xdT-|14bP&+Eps*^tc$7=R4v}2bmoNij|A2F~9LJl#!I-+- zVjUif5)8G22Yqk@+jdaH`e>)2o*Dyku2eLUYb<^fTQ}!kr&oDqY^k=Y5)mQEKh7}WO8ZRFWBVZqynSb5d*iXHS4U$bBv7g&ud z235L}uNKsP>5T;+ifQ9OQYBwXCHuS25)uCo&B}NH3_3Ohs#Ad%Ug&_iyRzU8J_9O* z2Cc%SsqViFw9+FiOV^Upblx*y0a;JFB{0$Uq%LO+#r2mSk^?<0^?w$%$iZiSFB4(J zvkx))2zkp@BA?oT1_91RPm-I#^Nz58%7CA}J~Y5)ve>>9mOdzkbMqWYzTg>RJLV6` z=zr-*HP{i!m-`kE*NP6+;!wk~Fs%;*H`^2JuD;r{eTi9IjAs`{p0sw*H%r-_1iikkOI~KBe7A|2P;gX~&jK1|TwAlmX@)Z~GY_CWGadDgZohLI zI!2p|^V;q^HGDTaU{vEnBLFOCtxS*V--XI}D4o_sQ5=_l&d52@FV0kkTtPFSU*f!# z2^f<9nd`Z3-HaCf^4gP<*BhwiA7p|tUn+J>MVmer@)7L9CUgP}{LwmBUh2}E8!RHR zCiq}wvQNxQFCA6)A>OVYZ}jm8hg`Jj(@__Vt^;X<#XroZg|_$I>!#rsY&Pm-q>#S7NdQc$0QoT7KwdEvOb(ecG{)4=C)Dk}M5YR!XCL&Lp?zEupCol{1 zW5jvwoU3?K6<_VYnsb$;**x-`B2D#5N}Fj5r}f*J8+?-nL4G+27&OgtAd z53AGS&T4 zJk3=wV4{P{O7LFvye8?qog-;qHScG?iszKXg9QJwX-X5{4*Y`RT~*e#3i|)$Meen{ zs%LgKHLbIE7l@P9sw?PR>4tHMXjxhhQ~Q)GfJXB^zRd z5J7eovVAgf>Jh`SlUvuQ1tqz;;hE!J4=|XIMbW&TMaYA!*n|eX%ss+k{jzqtkwIsK zPIV>N#@(Ya;j{pZoCY@4Jc97tNg%7r2%c_{Qfh;CvR#3w{#y|6W^b3AW+`rf7~rgG z-d@(wh3(0-3v4JJgu^89>h(*GK4*T5)9_f11MZh|vcF>$8ZRXn^Ae!1s=8#RQpU>G z(h>8e1)JD5U5R925S~;=2?GWx6o>BXj=N*z(Y?RE(H`}}mTBFbVhzH=S=VM8p}6n5g@Ko= z#N527NUBoEE$QyvjcqOB17$NX%XuF#uyikeU#b2JMRDiR-;aBV`Zec_0gdO+5IyqGsb6aLqk+gllLww-^g=}}U)Kh8 z67VR830QAdH%p5HPUy?`L(?p!s7V(*1HXWqdFp8zdbZ*7@2dY>+kE90v-GhT)o=kX zb0g>@sG+q1D-cw=!_N4w4ZWWE&e1hE8o%a;Fq`Lr2e_$b(UG{J&;5?)9Q{7fixFqn zfwiT$U@n=26Hs@qGUX!807IDja-GtK0P5A9VHJ|zlcc87Xyh0`?BlU8OM)%#?k+)s zLy#c*^4xpB`nqbS&rEflsrk`WQ#I3b^!cvl?LQ=)SR}E~)wdj9&5QdYtoQDXa)RBi z2=pU%({gCx(%auL?JLX=n~$|zfwz;&f;imUwF%*g`SU454#V!P!qiq_SxnnX2_(Pi za8MjV8tLiZ%L`KSd7*O_$Gqkhyh>IkuVV7YGW}MR+s|_sCwBm$weqdiR-iILj+EP> zc|{>q374F4JlZu%0U2JqVKx6D)?~-E|K738qPadL+tGpXB6pCP)>5r{r9C<~C);*+ z?raiYEsg7w{WK7CB8yzQ++{D>x1Z8rZ<)fQ>oyIgs(3`gt!ba+u}Bl&J{qsNA9C&c z%{xAZQ$dXOCIWm>R}ZpmbDw?ot9%!n>eZN=GBjqD$i)vL785@#_Nc{H)qH@3o^~4r zjAybGuu{)C{=B}<1bN{t?z4xI?_ht2w2ai$kt&aEZT~PUp0T@KyHcv53iR+P>Icyq z;Vi~vIiZ`5_1c4I_zCvwY4D0f5 zSzl#!GQJZ!xIvF3^}Z0IEehCR*wu7YEBwlo6Qj-^K7~E|^?nRB4Bmz4et3J9)!g_F z7OEkbbQDAosN~#6?d>NOMi>h4k3rV)+bc8%w5ruhz}l%5iLi+HK?W7S%*J z#h%p_&STs*{b#&Q82;s=K4vSwx|;dNDj_WDq8EkSvMu5h82t7z@4i_2Pg~${v150< zpeI*ovh-9ka_cq+-o*1?CT^K`GtYZC9-qDFiWOvoUJieaE;U} zW<9l1m1OBV3AIPE*ymnkGNo5if2x2z5+uu@vRl~aHIAbMdUzZYL_xSH@ltAGR8k4) zTUO<{uihTUyVh!&vrNA&e}rgx3l1EY6BPx9j?U+68_#52gume}Q*1R3qbK1&jpM|9 zax}<)hRS_zoHB?O21t{PzRzzhH&{G+$Gmq$nC{|idYm4uP?2gM(vh&g-m`*fdUeOb zy51;LSfeWgwi@6)HHfQ;i!vPk0~l~Q*=L?sJ4)`uU#qL==+q5^C>wLVDj;z}xl+7& zk5fHlLe-y75{eE(Xh}5})-w7=gt#4jx!Vz{J07bBNPkWET0{%N@!E)LlK-@|qI+z-_9j zF;EGd13F8HLz?JwlDlhDp3&bBDE(FQjPex#*R4EX`urg4Sj8i3(Nb7cA1AuE{*rO< zx$KMl4IAu_7IE@s8$Xxa%zW_?q>tP0Z~tG7I?+3!2I_0;t@LJ|FmZ2f-TRHe-0KDV zrFi2(#og3-ew);KXDl{u)Q>o{(WfOodY$Q<-^piBm$B@ExdQ89Dpu#B=}EaLtI#|v zDMpiaCj1ruW=_$n(ap^M9v6w;it`}?d415-I&NOhJg^~o_pGl@8fsMPN@GxXkp0p1 zfvP$^{44cd!v_cKv@N!uvzl^m3f7*XHfP8{dn^oUCIFS`iRbE&31&q zA+CL9JeAD=#;O#giwlT`5g$yL#7PO0bWUqGiTx|)9s_oy^ zFH>SrKtr$H9p0HoG<&!FT{twc4TvAR4pVD!-ce$wSo^iqLZGdnBsUTuvD0s!*tZU$ z!iw7nVUMFNjkgXvytBkvge`1L3ATCBiei8J zY184)!GU?2sAws?tXqS@^xPt(ZB(MWa16xza0n+`Lnw0@CGx&kF-TFprkfZ0_)rl{ zyFmxSS*;UO52IE?O$=|>HNK$Z&cwn~$jQTae^z5z9(Bd}aAD5OjAmd`dpExpopm1* z>{3^xSO4j>utO=qqrKd2yS2a!F6hZ6k%_El#9VZq?`dEDk(anKcby)sIykA3dx)00 zI>;e;gv~iJGP-pBa&H%;1|d1jq=(`>BURY%dl-~6tFe`c339@usj=B>G|RWrDfX+9 zx@xw=Gi>;GgcChNjVQiknrka{I#Yfec@2)n_ZEaH?;n2{R!5hjA}n#J89Go z%CnG1)K7Vl3yI)j5msoTs7F*xsa{4Yy;-|oQ>$)=w8_>Py0hD?e=XSj3E#tmIpzGN ziBd~tT`l|wx9$*l97S;xpg<2nzc=xIyG@5O6f&1CV}|$sxJ5Y5D=gGkSjo?kGQAMon!;Mw~e z6MzP`Xj{F3f=nR4D!KX#r!9`3`H9(72Gb^8H|gFxF&%v)icO!Z^WrWFu%_=?8&!Oe z3eC-7al0yRti5?8s}Q;_|&2<`})^PjhG3o44aH0OJRg749cOvBADI`}zFz-9nPMxrjW1AfITQ z2c2KWhD=7=0KFR|X-2^+1!r>#qj-h+mpWlpsvP0NE_7Pu_y#rmkl*CX8i98&O-*Bh zpHhHvxQ!q(d)PB^4H5fG2K{T}NWFbua2SGvx9gpicoHhLRVBY{bzZfOSApg?*QAol;$I`9 zU?QKeNYMdcGE2L~%4qVT%UAHzu=+@U&>p3g@L4hJQu8Eg}ja zjfkCRietxG!U zd+ii@n6U6{W0L7*$MA(JJdYVdSf(@lumSsdZWyL?jxDO2XjD_I7~Ji`cQwOhTP=Us zbE?XbWAW3F!ur$W06p?1H?EOHetX`?jb34M^S&Cwg!v?s`sn^-rxM%qx4c(TW7UPz zs)-XNL(E;(%kv|LQKmPUz0rt_Of%q%6j?1%y9FJ=8e(Hqq-(v*T-c4 zHcby`yl3O7Y4v>LIU3&wo*eP5mxNO= z{Lv{mg=Pojc(8$91DmXP^+Ak@9Rhu@97j(1LNoWy6Hm; znzC?d=*psW1S(^W>B{z4IO|?Yb8pEk=%0eu^y>!RA#k7qVkbI};XSd3tE7PdAjaX= zaiCVhuTQ=)eyux?op0xm*!9tExqgT8r%C1p+pvL@ z8Gz|E5O0J%{OPBYD`j^--rsf{Xb1U>8(4r{ow^HSRd<^z2)BT}Ey>tpvBRWc5yE_6 zseU`F(sZeU3Lx4pfmbk~KC|K8n6i`-4ugU=hyWRd9gMS!C5imp!G;S6x%t%P9hQMa z>J((e+_k~KBm~A2q@kO!bx+}0ck)+f;v=kp1=W2mL+cByQ47@^yC%4mpSJvzzo_Wu zDvm+-uU#OdrD4N9#{`GTs^U>hJV=awZ7Dw!)1eyD$!FAj5s1$ zvmJZAIj!Ai5Xvry%oS#YKU0~O=@(0nV&9p)9vF#rhHpd}-5P|OKJ%xn4-Hf(o}ca? zCUOwj>-wDsUXq?=l5|-O3o$t2=}ago)9X^$bz);Z12Vby521C=MKj_b+JqStbFRk= z^%o8Xw_VxVX!P{wJn#09`5Rrw^17llw{8ayJAV6#-ihx}UD~Wcx}QYD?o(^%*2Ja8 z4z!W$B5ua%WVX{)6YD)OnVoqgr_=lFONt`Mh)B--5a=h{^qN|>7WnQUpSBuLn;dK@ z1%t>hoP;qJ`7KP*obMZ%gX1nUQ~l3rKejiFvI|HL3jaKAz)p$(-NE#zay-ti2$bZF188ly0L2An| zVaa?{!BUmj-A1;kBhSFln*`mHsu$^@$*A4bk{`M`x}uJXM>rCvZHnAt^TM*6w@!6x zzekTxMC9>r0xn5W`=~1+C*D({M$YcL48j&d*c&>DFG>)8aW!+|Ko%6m%Arn-$~7L| zM6r%GPF+tzoR$+K^UV{s7{c5gmVhSw-ZhbW8aipJ6-QChx3bdgXV%f>QUv`Q=`(|U zWVdUvovmS#oie^%u&d}WX+pDi4k>THJ7Fw?7f#$y^xnHVxTp|U3(W<3U`ly;%~ryK zo(okgk(1ktgY`LyZpD;FT07ZqD5uam#s*Q85BLUOM8u>pTy*w5W zE6dn=z^5P-^{x!bdw(%RMcIjA-**Wx`5A&Sw3LgaDA5Rs=k2Y%q6nO$kGLvL>AuaZKj z^$#p24FBjWrJt68X(^ddYalsZM7~Ag_4xr(NfKJW{alMnp}x=2Tv<;*I=Qb6s!rak zvtJ+04;QN($(Ze!fdyc9Ww*RAbu#dUiPEM*WYuB5XvR1&BHWAa*?0#1n=1tY5*J@@`On#k&c<=S45tf!47000KF0Dvze z6aYQ~5&+=^{jZTBy!yv$zhLtJu+a-<`Y#6Y1rs3t|9G1)&sKm;Qe||IecU z0CA`QB!ITx^+Kas(Harayo(cY%+I|2iBTojy6HV1;Ocrt2zunE(?d+* z3fPr66?NyZ;WSoPCpY>T0emEc)wv)0=?V4k$7ed`@|Lmg#E}!wN#zj<2^%coZWdA{ zACgp05=p96wwsj&6{{pO3h4OdF_2jHXYVw2WDiHF`SA5qIoXnAdotKLHd9g}f6TNA4xC z#~`S3%Djkbun3(I$xW9+9b}mWCVamxd8@j>re4_{wo_ctC0kJco;LLWQ1Mu1?ZlN* zh@oI02cz%FpAcNUdJQ+z3FCEFuHb^ica%7nEqv|sgjNl17iWcJ4PgCoBETGHjt;Ks zD)JiDwzJ!$yf}yRqBgB^TUBLrXb;D#(JZL6E<7v+ksfss!4-8d7H)1{x>Vn%TDEn% z)G3J%SsxBG3gV>(h-G+fqO|Nh-}-S;ak*4^LV0(q(9i=NoqH0X;gayg(Yyk#k#+Xe zualg0H168hMm1don%LB3l)e^Tc~nVNIu3ak|E{q4?$6Lpg*RTs&i16WbU?yzts%CO2L4P)NTE9$S- zr)S#ZOw6g=1p@qql!C}jsl#^WZfEl2AntgE^?@hP^EVn)to)N|#R%UsxTV`J=cq$4 z)Wej9O-a6djxjJ_h@PmW@Io9C<-qR9&Kv3Y(lmGX38#Td!Ld!pcCzZjq;+9KcjK`f z(;@h`ib#8N8t_!HMxP=wWT0)dciD#gBasiy2T}ZXV9v?_lFnw8v8LXb0h{)dp>(bFWM7ZcOYkbL zIDo)JR)da(p7K)gj#Aq-C%^h)0`_ic^d)TL^3@OG?wMs!*WtksO{5F?ut`ty$}w|iFdug}EUHB_vFz--hW=;fINBtLgHB|gO>~{~DxWh4@u^b1>7Fj7 z>aRbXi`DdRZbv^*PM_XQd0DMow?*0#@0dfwxi6m7Q=h|BLb=vO1vh16-Hlx6)jEaQJNBGLicPU&)`4m}8ClncMjf5P)p;n!15W~WK zjvZ*(eSX~fXN!%ui4TtiyP17a61}Wt<=~!n#DMN)X7i`bCm*9_FEGIr747`}GFua<&M@SF$4aZGGW46gpiK;)K+U}gLhjNt@7ohGdnsJj6NIE9hHBb2 zjRrH}NO1-!Ccb9rSnH$02B>^ar2zHo3&xv4e|6p1HRLy8D384(c4q7DswvCVwh7L( z-){;k!D5GL+`IPb5{^X5+j)72{`+nh9yAnj}d~ha_TCzXUp5 z@hDU>ZD1w)wX{Yq8uPARHSw*)wUIeaI-1yU8rS`g1Ik~!4PvBs7hx%2UVJSc-ZvP} z`lUj~sddiEoK@^kAGYsQX5!1vyI4W|OqsrJIq_CN2rBvMdJ93(Z+8YWt3I&<sZ#L|cMil=td<=8J7>%^l9Gyq;9O^H_@=#tNmx-S2GK+cg6Q z1v{?np1LCC}*`VcfCFcqs5c_{e%FgUrdpuXv7#!Q~p6*^9IDcJm^mO9;?qcyzvD#Gs7 zl!lK0Rz1%5`Uxh1ULuoz35i2&wy6Ei7JzI<>0NRp%W(yY*4~qKQ~tK#85z*|oSjbU z=QC@k!^cGf3nW#zh(EB48m5Crh_5`aSKMSt6549@t8+~n(o?wDiJB9v@k$2_{VdA_ zU6ylxejpw~gH3nO4pggteZYS#Ri_wWPDJ}^6*=T>P^G0FEl7gMd<0->9H(aKBC#T^|6_75B*?0 zyFT2M^WZyfp5;^h3^aLY!v~3#vkQ1GbJgVe3~xg>(;WzkE&hpwr1R-P7h*Y{PVh9^ ztuX5sa{v?02KPJSng>=Wzn=Q+wChrz(%Z|55km18Iv$6qoj!QK@`Gfe4Z=9l$YZTv zFY@O;W7V{|Oblu}p!NDuuypLN6&D|P>e&7r@wN^*N#+Mx8d65???~|=7r?T3_1mH? zkg0~Z4B>*{;L^hMglKRCh=i=@ z(AosR3lrrV3Ko?|f4Qx+@r6xGs_p#9v=o#e=3mSS;(oYc@U7Sgj@t0kgKDj>y&3MU z>flOCN@nf~SCSHpM&FU&cqHQ}#8 z7SMrawU@ovSkJ;Tc|1tqE>`wp)cM_G05LY~`dgoPdjJ5&#?t>>Lv#Q(AT z_f^*QJV+3-|GRU3Ui$5s-=5Wi8NOV1PM_K7%@D#2-|nf`Dmqvcl=XIHw=dbUxlrI+c^BJ~fLT=st6cL^ z{uZ9@o2w}LsYA~)A>XQV)$QMJcM6qi{jIyPpW~pbQM-zxg!Osj>o+4)7luZfUFK@G zysWGiTQd3O?zOA`F(q&qlvh1yVEFfcV_tXy9F=`1e;0Hq`&?gi*K}$@wO+QG$u*Vtr~IZC>rMaL!*xeQ)KeSg*V8u7Z)rLKNomir!ISK^Cw z+x_S1_m9td-d1c**3Ik>OnUNY6WfNpS2JunHq72MiQD{7&Hb;2-Q0gZ*ZKblPBCNM zx#ND5-1*zB+Dj~cl+Tix=J(5MCD&FtjpNBR$K0m(Uv+tTB`m@>M{xEN+te8!CcQA( zFRVBB!=a8V_J7`S7{9$!Ul^~aU7Vj*{Qcg`2W^rN^Z03RkqFFye zZR^!y_;+OMCtGc*G28pOa@+rVe@pfs5Ma(+_4?x^3*CEtX@0+p8E*>wy~V5>D{pe( z_p~;@^?Z_lTcnv(vd^+F-n@9Hn!kK8cf)SiD{t4H3Tl7XRepI!OoLU>k6(pn_UNB) z3$<5&$iR1~iaqx5+U9R_4eL)mda zwgyxU6Ob*;gixQ^&H`2sG!P6tfF#Hq7|jOE-0Td%0)WB5$k2dsB81HdG=X6ORNT77Ow<7y!whBb1)I&l004iE(&+#I diff --git a/docs/Deep Learning/Recurrent Neural Networks/images/input gate.webp b/docs/Deep Learning/Recurrent Neural Networks/images/input gate.webp deleted file mode 100644 index b6f33163ed736b9eca057d31be8cae2f99d0abde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3450 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 J`_Y5~{sTdMH|78U diff --git a/docs/Deep Learning/Recurrent Neural Networks/images/types of rnn.webp b/docs/Deep Learning/Recurrent Neural Networks/images/types of rnn.webp deleted file mode 100644 index 916f5a10eb10ef35c6a0f8bfbe8ac1ddb0f0e226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16692 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 diff --git a/docs/Deep Learning/img4.png b/docs/Deep Learning/img4.png deleted file mode 100644 index b6b57bb776a7f19c6652ea0f6c963549b5b17b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161821 zcma&N1yCH{7CzX(Ai)U`+#wJ&xVr`kB*@_I?moB$hXl6(!C|l}eO3Yh@3#OD5CQ;qFGT@=0l@7&0PGn8fIun$5IANw zeG+>40m)cFRtk9j*Xw(0(bt!fSB`R8E&zbp{jU#PpF^?fOLgFbl(?Gb{K2C~yy=H* z3il_!BjvDZqLMo1gn}{!SFjDYu(gH9FZqr)iO2!S6P}x=mKJ9mWJ5 zds%a2bDR}!>M7HVb<-RiKRvtruVqcm&FWHjm*(ttb9nYk2P4o=*L!@PAV*IwwAAsm z9}@rX_m45Yx4eP>oYJ0G{P%dkm+3#3(SG1qk^gs}0n zj18c`iC&O%EXwBqi}U$(|8C4(OPCH-2zF4sOYdwf15*fP3P5CmPK5nR90ckoy#F1c zbJ&j9ffX}B*cp08$+lwv64) z{gf`Hx~kIyI=_uHzY?Q;O&Q5lwyV~(iA68r7dMvQY5rXGfbt_QxSZ`j#^jiQfK81> zd7hLpe8yy@D(;}Ka*Z0W__2a>x&>#sMti!P4;Hoiu$qlXvN&-u+JOFn?U_EdcAu;H zr7vmaRl4&nbprdzx-~NveMqcXt-c=4Zrm2*+ZBly>l~QcW)LdlXWn;kvj9=8%KcPJMim2>uWVS9j=p1;#BB;>DkBqktZfLSNZn8b7z7L z$Dxd@ET}vtbSr_RQvZ)Ytki23JseC%pb?X)f;D=n(bYu0uT`7!4Z-c@f`vnzPm%Az zW_F=t$DisuN+3hk-cI%#m^UPWzK;&R{OY%c!du+e3>vv=`dVdT;}v|ratI7M}A@qff@&%0Kj)gFaEFTIfUfo9P@*% zWRj@rK}2`&S}Q5N|~tmynGdaQXE*u@TLS54d=K>n*ES1 zJ}9`cf8WPOlbBh>^gpc?4vGLdg$56HfXK1KsL-)dqEGY@-ys<~|0YV!m71A(_WH~I zNln7eDXt!08}17L0uT)4M2@H`1+tKBz(3vgiSghl9$S~5s%|)YAQ7n zZ#DkovIZb=pb$M9T>D1rCTu z_-K9BTNk+BP!y^1)3qo1tp~;8lKRZjs%ob;c@u}ANIed}Amw@8F_q7Pe#H1=$?Yp|kfCOmAHa;AsAYf@b7w__xsfXxaDi zR`hw`k9>A$*Has-iTR*b9Sw%AQD&yR0H@F6d>Yum|MuZWKHeZBr}gWhJd|*nwd4>j zeNx}+uCeTPo%{VNt}nPdG92~zyXA+X1J)+t+ONsU8j>fH;K2W5{BO7vI8^{2kkP;? zM0P-5%H}@@7Y@cdtu@)R*CjaXD(lP|qX$aS)rw>&hwF}f{&2GHY`xcOBidX;D&Tt2 z{%}`$$Z2>|K~mXzm#haA{P5QM723I;LH0E25qs!e9%}y4|2SOLBp839rLa^d zZE7v$X{o*a@5Q(FyXU)ha*QbkCML8EQQ!T$S+Xan=!sMgSd+S;#ru4IcS%|F^3So~ zK1C9=M1oJxcNt5idgF`|Jy&%{)6r3 z-n=jo=1;4NNg1Pamn?mj%k5Jai1#l7A= zUwIoVYs?XW8N+rr@H1=iuIrR<={ ztv6@xUT*AV-!7STh#I}7v`)|%Sp|2uf|@p2iz0bY*1aiz-~Kg$_%!LXqF0F!M{*PT znhAqPlQwtg|BC>hxtCF~G2fGsZoWb6;O0dmi#lZe)K@dqljj&BZOcj4sO6{;e-PQt zVFsytP2WcV!Umw`-*=IFVKkoA%r!Q2V3t&jAS+Cl*-_l~M-l5z z`R#{LH6+@DE+mk*1Piymq|x>D5bAelt%yt&rb0%pwz+F`N&@u6|LHy+DKR9mjsQNj zfVqY4Br8rfj!`^yb)qwCWj5eD=AuHs`lJbxP${PYbHQi2vpqFUT`gilrJ|Hpwa=~T zc|AhjgUqA$rh`2k>_5@a6qts}hPI3|2GfiJHsIoji+9Tf&r}>jeDG)i$~EQssd^rn z7GsPw2EKQz;-QLnLm@AypeORFbt3^i%5~%|&Ul zH9b6J4>j*_ld0K(F3sWJi}7w0CLAH3oHW67t#z&?K*a%+Uu_B`>#=T@=vI-62f;$4 z8E_bwc;oAwTb!9IWQ2De|&LX(SU^52D7S^qsnK_ZXSpZWb~ zuC*+;+H9p$Z;1?}&aYcdJ#MTVyO_KiMQTs`KAl9z-L1jxXxE`E>TR%o&e&K2Q$1pn z^0=GcBqDDjhFeSw#=v(2wX@-ikfu1d>CioR6xy@7$nM94dcEeRL?v#K@+oSI&z9CG=8>fIRD_LK{>Xqh=^m>L|Y|AMmQr$!ZwlS^~LGaj=Ds^8|f%r9zDHG75E+j?#67IXe z4uKr7eubd!pQb*f0B74u-f^F;kSIc|W$>T9y~y)za)4zS=4tC}#KJ9pb^80V2Jlz9 zu2?*Du>d)>R%H8S!?sGmRDVrfi|lP_Rz_Z9xV z`zxf>$-Vo~&+7V*&wsefpk)JS8`kHyS`c;FT_wS3ikgDK z^uGPYhgnHgrHJ)@%kH=m0LLu!^J81z{EeO+QVLd8d#aY2CI&&tn56kaDazbH~f5OWNS*i#*Y%pIjy5cIF5n&e)*uKfgNHKeT zA0-eXD&3vi5M~z@lbe(<mV6)VT~EWZRul+@Te+L}ypKqqK!^DVEubZq3h zKQd_Hk?OYJsr2751w$B$0URngI24d03w_GRrR>2sdk+x)KJ|b<);s)^@UN;EZ4{y; zO=!wGpO&+G4+(ILK+_|=E&2x z{yLzFWd@%%0tjG=%wt3k2%)52tRZTwM+MPPOM;w3_qAiOLFfrgnVh}xZ~@ps5rlcz zT~2!9zhHR`q@gDK&<*=(TZyp9($l?T-{I3_9?l;OW-ddu4M$Ks2|WnDJkv6g3TEifdYAt6H+{6S-vR>&s4JW1xmC#j-Y>v>u5Y zfqtP*z97*?a5K`U5>y6D016OZbPF&k?IVc&)tykRjM$L+achz&mq=rP5q}V|%TkCK>;7HC&&0tBQ$|Jc)iCS3 zuWkeJ;A@5)O?omQ!7mA2wW|WDu#xd9AVHT6FcE zg-nnfB?r|Dh{IzOS!B9sWy}BL33qu&x=4y}Y8~SCp8#E45CD8R>pfUJJZF14#j+oE zP@K~)_-i-ov-dk+`RQ&l%lDv8$KiSNI=m^)e|O;cVQ+vhKwDRrqWPA7#fQnjr~L9p z)nLCYI_G|EU-afF)QdMsdNsjvzl6T+_GHpvc`_vJ^qfuC>#}0X6KpS%m99;u>Ki9| zKU+(Ge+F*5UQZLOT+$v#Uqce0u8?g%KeQnKTVWSvm19b}j)$f85QYK3iva+~XW?Jm zqm=8?s)$Dz^s)Z;B=?I&X_dKD2b_cnVn#_5CAvI0Yq=;)&05Tj`e;AN*5*blSWU@B z)>^VHay8*h`<28h=GB=7VV~JsvuPF(p_bVyi^t=wj0iv<<3bY0jIai)-mop6*r!$_ z2TIc4;zlU_reNqlXmt^a));`Y3gG_Ag&#%&IRZ5{wUUz?Ci71lKKHl!3pE;rh3B=B z9?Pw6RfS6D-jdmuySddRdNfvNcPa)s3xv%gJoRs)`SpcG&!^A9_QRMbkN3)SLa33S z>6*D}IXF(PniDFI&>|jW?7dglzvJ2;+54M%l=c0Mn78RZZt*ta*sl=1jX_>7jgg7r zogPoPKt{iM;b)k+%vt-R}wUsB26nCG{XS z{Plc2-g|@_M`oi8GD)YDm`h^%hiZd#V#76cgsf`9xdLz?vE2BfO{Vgrfl98v*Gg9c zimeY8mCJrs54|0Gssn{rVN0?)InPd3CR?Mn)kS)>({I3U>7DHxImr*u?Gzt6v5pD_ zo$XdU&%oaExWigGqz?oBzINuT6}lq>^)!)P80E~&jTmu9J{J`JW^q_UG?lvkJ4 zd)ny9AI=|*;9h?m?Bax zS6w^NHQ5+m%y(e;d{<-Nc32@BF2}P`(4zWwr(*Y9YbPoM)@*@5)`#4R*q2&Vr3{j+JglSt+!V(wtr_$o-Z5x^FeFX0q&`DxNRf zMQ|!llO}gV(Fj;aDwW$Foqs--U}m|*z!b{nB*#RqFC8+=b8kCy9!}O58Y;6X?9ULf zq!Q)eu~AI1{>R;=#R3=rX}51@t)~NT$<6ZkWnzY zbN=ogH+j#Hw|Kdj87P}OLChpU%>vzDBB-}HlSK^}BI?#oa{~&g=e&4}nASX9RCN(B zG1*7e4SsVeeMLa%Y#FfJ&&7?~a)@F5IJQEp8#a(u@N2jifj-uQ7QqSEe{EjEADJW^ z_yWU3aLtbyx3pPkds>c=-C&UVqT>=gQ;Dv)1Ipckr$R6XG_b`#Vb_$+rKJg$of;~S zNn#!DmTY-*C`~&*)S;VL7i7ACW!@50tbN`|*tm})KeUe0+FG??HB~axUPzlcf)%1q^jJ7GqeIamP>PAm3oFaq!Af9d zMQ|;2KXDbEP~%?y)t@T*wYlrYL7J4gx(u|Tx$)cu-koV_rEvRnc2&tckT*3B$i?>K zW-p0#oQU5UlYtj)ZxACYu)`~6L7+c?q$4sQg0bmV(du2DB1_DdyQPYB z))3wV#fu}<9vQS!BXv}2?$&JZbR85Te46|N4!u>0>`QOqyju$*>$j9I2g@XqKc0qD`~=pWea* zQPQqYaY&Ie1VBqrdzp;gE~aM})4tsvJa2)qTz_&4*z|PfFtROr+i;EaBLYw#c(QOT z+VGUo%%@3F9oeOY`NfBmBQc*Wa1L(WDiaI6BGT0lDIUYF{KK(+7kNBH^E_6 zzT}c%=&}!s;*=!!Au_qVJB80Oj76Tm&(bgfl->{<_I{Gwpe;!i2s7T9 zr+Eu?23unfDvGLOF~GN=ycd*6fMZD2zJ`Wq8~Rn{az4MW>1%6DtDTaFFyg8Jbvw z>bFE(UT$g2ajgg`r8ZNq*`3wah(mPHj=vkG10RDTP`)<}Ct_;K0Qh2;UVo})eipjy z@2255v&w~T-QH#()Skbi+p|pXZGp?tK$$&9LxaU2g=>02_C_~nXJ@_Nb_QC(smIXy ze$8S!%-ctO(g5?&B!Sn?42W7)3A zO@ZU#ksj`?@%T7?c7*J2lzgISDTq@JrI?htOh#A53&*~-4c&eWHzvn2p$s5eJrwbk zcd!)Xs@5#kWCdR564^&g(La(;`Jb#Ank*PC<9!He=_j1|X{qx_exq&%o_j0(iF63H z$2t*%14QYU>)}B5k$t;NoWo3M5Qgf2GDUWG zw&CID`E+6M7{}Hck$W}msl-9*Fxp2G-OO`#^(5Js>3S#Hc603a>~p{-@ucVT8j)sh zN*ZqPT{2lTkMMbO`+&ap`4+*`{qrS#m^7tsF&^YlmO|iZc%$9993dc(DN{F=(QKAD zXZQn%5r4@^*HkQM;B?@hROSQ$8a41ABCv~>wT#a6srMFO| zJ%_Z(YB4G@CD4$nR4_?2{uZOwD-x zvbm^+0V^QOJ@IpAP4*&IIEKY%U(x*g_~V}saq1>h7r!8WBPK{0KFW~Y0XeX(Yk@Ai zb%wPKi7|4VIfT2y?NUE(+d}EFnL?wjFnY8COggeKF=@;YBIljgO0x#$^8fjG@?;XB z?aLTtCW}o4GjGW+teCtJYRoy6}YjNjm6eFgk!93+H){mLjs zVe50XAuQd2ct+x zK^@hEBh8T%WuO~;n3Jxd>>mN3-fp3bN(r1`wXpC}X7T!e)2a=3MHDeo_oM^-!IbKv#i145j_EpBNipHi@$Hrff5MJW60!Nov!V7{BN8w5aHwB z-;FiuR~+!VbRTk)S}FUJinoo5dWAY+o0l$6vQy+LR=(LfqB*blhs>sJ?l0@56>Dx9@t|MRH&jx+gxy$t zK8u1d+uPv=xO$DN1dErOt~A$z+v%OV&D`tXiEPC}9;ofH-;pUV3uS3yS*y4QkNqQri<-b}6s${{i#ZNDT)Mm+o z2QT3`bgL_pG4PF<>c~w7hcb5?1N11~u8h!-%3{vB+hT_%u1K|w5&D==B|E3jk_>!m zj8$Kh+ltf(#q$?hnbVdCmh721x16bFdp<9k-=mSaJf~~o zrFnJQ265U^x{eK*+FzOCK00mn>ED((x>=SD^NEWF6!AWXh9)EwBr>{E*dE>8uY5eX^&ohokZcCh z8#}G^yI*tgv++k43qAa*0BdCTxeZ@|?CkydhAVuj{Crz|)T=LgADu;CY6tZG>is>~ zza{EPgS!h^?GMH}`jRK>bzGuxXS}uGgOE71KUX)$#Cwbf$;#b+yx&uclaTsZ_k(@0 zEFtI`3fOt@9uUs9zyuE)@sIUPsPlYQ$X^G6a7@t6yvEr&*yrn*Ua%`fDj?cP66_9* zcs!+e11HU|n(ezY5hSq2CE`?7@%CUm$)JUxjrSckPD1hYvMj&knMt!Tyx8iu8WIyQ zn_ipS<>=4i-6N~ZLmtJ2YSaRB3dox8e#4d9w3}2?1v+elv&EnAEO_r@}Z#H*jzzD~jIt_@0>Mf^IWM-o( zfwbl8Rb!?oZrm;Vns06$WM2m2F1lln!32<+co+}c)7}xvMt&GO+}-gb+Xf{M;0CT)p>ltP8cjXSiGFcd5%(htYs;3cawq*jN^ys zm|T4+p6{&6cWSTwYS`>ZWVf;dsr9nDw->|IOuJMx%BOuuFzxsw9C;w}L@KM($5_Za z4OT6QY3b30S5u>VUHK&h7cOTo9@6n?L)fSL%CGUEfcMHU%B$gtl$aPpNPIiuFdfB$x=b^@jCB0u8xHe}8N5T(}MJ zk!!yh%+z6Z7>>!jA1FIEg<7OPEw|sCAwVu;{3=wOEZCk*jaTmuv~zjh3FK4C#qXoc zxS;?WPW5hf)pzb83ZVW3r=*Q-sWLJL*+wW6DG;V;l9idNRbnj{$0ck;Jr4$F;oj{GYphwaxo$_KCNz8z(=JY$Kb zwmsw%?8SQgk@8Ldz-nUeZe)729h#8zAP@IjtcW&5GG~1MyA&nq%)6va`9Y^h))rn@ zwUyb}viT{^=zwD)2~A;_*LFP{6=5`XDOa=O&I@ymQXSSCFTDD&r9|RJp~$#zlo)^x z$f1;}xiZ_h6d9uQ!!?lX-(<@?U%6p-jJO7(sMzUI-G65yKo7tM0RdkL&K+{R?nn1G zj*cpy^Kr>8AF1#_&WF2WI_Pj>Kv`-=^V2r$++uXOQLr`EY=LfxhWHAyRZ`@4c=~k! zm?X3Zw=K;#TgsjyP*VZ%Km!)9&hA-o*$`@VUFz*Lq%;^2yNuiI%b`#?>_vOPye)wK zMGOTF#nuOTg>)EUDk|F@W~x4j>8L*Gre~5_gtXFnI?D8HMCo+#r+ejY@Jsvn!rbtf z;zy!eIiIQRDpOv;uh~M++n0iA>Bv{2=Vg6&IvM$egK6S;o;M_ivN0V&GfXV31+K@O>s8_*5coO>9)T`c{$O1mAf6dFi zRK@`ScujSiv0Zazesem@re<>cd}bjTp`AnI~!5IDTF=3ZAkA&-23{ zlUfRmr3TkXHeF#QC8Ul!3j;edXRvQT-wJ3pVIZLnJ2D>Q^g&9e~Lb zeA}73R!i_EUB?}!!J09})w{;26Jcucrz#;*?nNwSt3T39_Si60Hrfv~Y=g!}jdZWQ z?co5ex`oWrb~zoB+!fBnZ}sFK0LexEWAK%hZ{DrD%}*!p;ymf$xuz>af^&_MAF0dE z>=|PPQD(V55>G0$e<#&rB^tM!5rO#r5?j-n0>!irl8EpJr*`C5dd-G9bVFOE_Ipj8 zKtHQyl5sAx+LGF$vAeag^U3J%h_Y)XDSWPd;Q_~ve8!s4XD`$SfLheUXK%V^$AIVq zN$1V@jsOZ@fJw?{CR}&(s|nku>W?|4wR=F|weGk4Llew(4UdCuLghuq&RREgm`9zN z&zQ_&X&hDritYVhY0xSv(BM65BEViL_VIdT_}8K2&h#uEd@(ad78w~~W~rC4hirH5 z+pLKASJ1|w4ry0@_*IQhPwl-6bHw(H*H3Z20+P&y;AHc+Mbi(t`7BtZ4hk|tg}txh zsfu$O>D9~%u_oE@U^+DBt3mM39UY!a3>6h2qWUc1pQ1gm^hid}}W3kay5{M^)- zsTp#4*JXL#d4$kMzV|^hpSRauziIQ}cxA?8Pb?ok05%shH@;(F@H@l13G3{b#8ao6-h{`7ZL)jbjn7nk4 zVX{XeFUx4oxC@2ksHU3)>MWhb?eyPY2TAyKy9wKcVa4DDl!ia_y#&5doT@acR0+^J zf}$EE>5Y-gtWVwVfhA`vldJhz3485hK0n7e^EmWny;`_~G0W>ichS&}n4s+nhCTC* zs1QA<>CR_j?ql1m$+%UcwSX>-FdjkWOj4rAs15*X=shQh5^Djn zm)19JW;j3E?|prq{~F;%GNw|a0N)$yt9S%IolgCjEGsF1)wwO8(BqCAE-f8a2SE9@ z{wzw3zs9FxOq=Toy;u*kk+p7WZoYQ^DUDvkF;p@&SMd3LW_ei!ry@Lkd$LwGd8$Ri ze0t+p8gaH>s`jjAUeChJaYUq!y{BbdpUPHbTTZ^C0&7!G(%Siq{^ObgINja<(ni^L zXSdr3wRCupnJx1cE5%l~KbdR>;Y9(gTc%b$@Fqa<6SvZgtF(9+6dP(c7l4k!bQ^?* zQkrLzUdotBH7Bj`9$7uE)LDb&n#Oja+Af8O(IPq!DAI*$nk^uj>Q1SvbK0(ARoW~hN%XwAZY7IF{}6AZgD-{DF}M}9feH`ZD}{dw!ps4lR zm$OtB9QICon)rvWfKIc~e)s=ov6w&$ei1C5E|s|;3{j_E?5M&L3zUOXPApwLLO3|P z3G^YiNof0Zan@$*B(-R}aH+Z!taS6%2)_2V4@)WSg0<-gkg?^k;-I7Xo35A{g9oj` zqsCo_7-WJmT>;2d5^t{*^HK8PNBzy{f^Qp^ZV9bUakHq6=)mD;ufwC&sVEB>(z5GR zQM}mm*9FMXEZ7r)g>7AaHEY999?^`CJ7`Bi1uLx_Kads#b%+tNn=7;1eza=|xu3|% zb|EKCl{D`d2%jJQuB#5xA{i>=Ipe=RiZuPVQ79B6W9};NX6+Muuwbxr?is4rU-Xt$FK79;0!z5hHTP`oIj+YJGnh~3YrBX- z%rIH?C+s&&i%yNG0l-Iou-ph+tR9g8cgYtN=2xnJdYl^{A5Y8uqAmpp8_Vno-n-Y)A?U{p(Furr@ok=3!vr#OmBDA3 z_Y}8sVv_x(+%IKm{@nw+hF)iq^7eEc7T1D~OR1QKPcv z;2+qK6(IL^VZMpP+Jvh6-LOHZ+!inyPQ-Vb&YthQD1S&u5Tj z3d77Ni_>!ph289$J?PchEUYhs3NjFV5c}a6w305=Z`!TAnSGjgEkoAk7V*XrJ|Lb@v#UOnL)$v~ou3KQ z<+{6)38j>x@=}}2Re>lhwUYm2@mT2oCL0@Ew36NQu;=f&i^a;&g;+p; zTAzid5S&9#xk5c%&Y?}TEnhqDk!Z=`{V4B!Fxe%}3P#JPBw!jw{&be4;cSvJ_OP2XLYEVfeKVCj`|G5~L;vmxw&pt^)7!yJz#1!ju6RWf zmtz@HP_08?;CVV_a68N0#0;SL~#YkMz9!Xesr5>ZQz zB7DGr`vl;<3Ae}4YxUjk)&2Couy}6kL9APTNPPc`Y|~!L*4f>`R8Cu!<*h>Y56x8h zoe6%m(Yj&bo8Jj0OSuof7gEA*-XC5*nSYlABiO%^-^eF$$ZSq7^}k{A$t*XEX+N*6 zQ_jEiaXi8mfZu(ZQV;`ZanWGMGhF>`X=_J!_zaYo31XT95lCL#(O6G4E)TE z4zC(F78Z1I-*}sE_m;D{wru$D|qh4^fU2uLSc79W5$ZYJ0R2mn)r$ZuqNmWtP)}+hGhbb9L{E4o$jjw@EA9|?l zPH}v^_nypu0;9%vXKb|6RO79M%k6u5sCWJ{RI=Io>e}7iM%#BLsm$gm=Ffz-h-ww( zQ9_FH3ll4nQ7?ayoKnNo?XWz$^K}3s>plY#ekhF2SF&qZ5XgijSMkhE_<4G8Y>u$wMF)N98vef-@bv)-$EV{-{Z2ZIA zq21TzJE8sj^&&0?BYRH~;#UYpXI0U>71bClN2+aUIqgHd-n*|RoPd~0YF?S&NV&s` z&-#Fa@O<7@VGdjC2Nc9{tym$ANbabf-WpQkix#aqK`&J}N8k0AthydahOeNoxlZnuN3 z!Ov~KI%XQnmcSHSV!!w;0?-?*nPIUynMAElrwxpudhc52dxw7|#kepPJoR16cKPM#Fpez| z!JKcqU=s-U*%6VufBs~!<>*i6t%Y4hd^OM|ZsT$D_#MM#Jr5O&W`rmE9q$9{O3Ql3 zIu@(ns8Rj(h?-5xH`59vZO__U5MA31)WBploq67|?AeZ#NTSZagBx#+eqXu<55WZfePmw{`5C_$Ao zQsIEYGOkWgX~$k{EQnot{qx91>A^Gh;F5c&i+a-YJNq)Ek$(>FvtcmxhwU_)(r;vN z*;2*zHXgyw3j=XVtOUkUQTrt&o3!Z#N6I7|J2iW#uG;me0czmtgmF&R2}q+pp%uLJnwU-GtqA;T1s*ESGoxN z?x*!?jPMSlLWl9I#SXxNeO+E8jF z3RT`|@w`W(^`PFRsV5aRU2}f%zT8SvH+0n(4%O>oewRqu#p1DZ=|kKAVUq@3tLOe< z;CR|A>*e!bl{vOQ$oH?d2->fwXJguH_L}x7PLw{ztdMH1HIqCnduMCu=o={QM1HK+ z)l}M9w+R&M7Yp_0X*;IyB;N>N1cElK{oWk^JzS)?0tMNVy9|3>K6G84=9ak1D)~Gw z4?f+^gfS@ubCwh>tXEanzi;P|Jw(QJYwqsZ6&2-8w_~jrYCO)picQTU08b+9QnU!V zok!PR$hpLSU2$ZliT^9;cm}Jy4A*top5LqxWSZ0cUfXv4i>8?y_5LA@4V#NQl#|Fo zwE87hsg6EmQvvh~w^@JI?dL!M96Y6qz?kzBkgv(8rJmZQFVBTap}zjNx{PE6T; z{g`YtIBxJ-0@Vcg`-XFl>4iBL@MO*LJ`M2m1>oiXuL)O)aL6! zRg|{W8t3*Ujg!~F@02I=E`>hMU39r3_-nT3e$mVdA7pJSXYmqNq5PA$^gX4*l{})Y ztaxF*tecuNp?n=?HXNb3Hl7epwq>c^O>dj4J4;4Ua;1oS`L$p;waoifZOxMx&gkZW z)r7zPVRQ}+VWpXP_PV+Kwtu--^3x1sbk=ic+*ljr@Zxe!#nOTL0MYcxQ^(^trR~&4 zm?d{Brey!*c=;n6%TkMo%ch#@`(i3=JNKIp6oa@Jz1qe`D=KZNS(>>PYBctVp7 zLi;J#RZ4gju1*PfN5oe$P^9a~8-%iAAqy3p0rAgA2CLb-Ve}L8v#u_=eC~&5ku|#2 z&e^f)u}~>$m9V-!R!mbIHUGG(zl>T#U~DRNhP_x$r@A2xPcGg(FTzQb0M0jOBz|$S zW#7oE0@zj0Jw0cKeD%YMQB@Ep8+oJCkpl@`2vHpaw{)4&q&71-DV-eeDKReaa`{`8G;1I2+g>lh<`eyQ#D8u@^oV1kqa&IzgRwmlY zV=HfpiwoxDQs}@d%}OqMCNnawN_wvgF;AzFv{c;^Qr;ScGRb_Vq0S}q*{^D6DN)%4 z32U&*9#N zj1i2C+HNuQQn~M>rJeY83gH|jUrujD?A<*0IN^Z($g7XlFqksa53?K2%$!T2rxqeTU?&Ftjd z{8C~B(Hmv&WRg*(v=la$3R51`k8(x=)9%yL6blRU>E+j@+FtBG&M}4tcZQ(fD}n}{ zsqe=4ZE>)P6Ph$_l))F<9kYiG`g{v_f7(Wg9mEi&hS{(xSx2HH-VWE^VXN84Dvtid z+-fFqL)6%r=;o#8k&t&N&;7(n_#Wg+6mdAU-sxUq*(?PVTbftpS}0pMaR}aT?+!hw z&HY}#WMOw0wt3USEN`N4PPP;7%zapBpa8DH#jSPWx5eb*=kpb)*GxvjI|K@n7rc zc2&PQd|}ogr6A4`5>$(&n46jZL#nD$q95mcU`%Jm&t90i7O;zUQ*BB#{KlP8kCCNW zTh*lR2v;_0mv7Qjtnx4VL#cJ54P%q+xLZ9;UI2n5`+2!6hgtXMWUU9Ap0NMvU81>7 z-2g*Aby^!2@&eKf9Q3}6tS^?UEiJ7Lvc0{8Y-C&TjiurEsKO!AvdX*}Xj-wL-FpqE zis1Z6h?*9oUt3tmvT5?28P=rKw3=Ch5=0dyG=3zE1*sz?oa%eST$HLu2=kt2>6%0q z-1o*6NTmGMH~ueo;cY7=D`pL3dEwV+V**+5!uhb_*>TJi!W1&4Jsb1#65&QZyGG#+z40JlI$zo7wR!m%Ae zVl&>#OB|o4mJuK_Zg>oI)Y8UU%F2}l>V!mF>roLB30D+KPKA7`k*rr$Ke&zqT#tGU zf7pX5Tev0R>I6CqB?EQMaZN{LnlSuj^i*7M9fv5^P}kVg9z8cbvoOOmzRJ{6K}5rK zU5y4GC_0!`8WJ&2$Y1RaH8g*~7YpciR#=v`)uoI88Ue4?4`d|)_Ex^N0E%1pA^^t` zZrOH(RVLRVU_buxu!Yu)j>Q9E7_VjnZGkIn1_Uo@*u2Cy3v7`rpXl>%^ z^z`^0Uv$3_Zf%YlZ%<7Q4V=DNe=MY(r za2)}Hsa}7wckk|n(e&`;)7SQ>b$feTyBqvQ*cYH^Y4xC&&bs#(rw zGgIT^t+om=!zHjw=qiHQ72V5t*wrYjrz)IA1khAZw@c!ZD?#%!-@Yr8i!F z{@qOfKRvRy^??Q_zcgT%u4Sfk7NQMY@dOk5PPJZpaqykD-hIbwrdCYXvwv?_OQVlf zmJJQ{XfjZ@|Hz5@u!p&}qbMo_qrP}@Z#1yPv=P^n$vK6x;~)T2fK=5q>kd41qQ19d zetd0p;l_n)cdwnE^>ll@{_cccUC>EJoR2x*3Ial4+x@oNE9DKO{MILT*YyT09*tIK>J09OipfC0gs`4a2ik@%i~&#$4|P? zCY1pS&Ok>%UTj-!}L?cToL+3fVl_y6eseYqSCMdL^JH?U~Ix53dyBqI<^ z9NpJ9^7@Sz{_x8GaQ)iaof(VQNm?scze(c#N z^DmwG(d)nezr1Crx~eIZT`kr<_}mkJ|JR=FPBeHyqnc1Fxdb3e;Fzh=$(bqWdGP4I z11-A~+|)MLm;Vg3Ge4|;GFYy?oXup?1*4^ZSO1aT{o%|8j^1(#<)wmfbwCZ7M*hQ% zwO8A{FaGF9|G8{-cJ6uLw~~RzKt$bWY>gXN3M>WQNax<&^}zrq1Ol!wMe`^ewuWV? z00sf8z6=JMrpA+vp-8k-q?FW3esuco)Kqp?gAFk*kAa^=zQxU5nE(M*-B47ORj>PV zovA)RhSjODf&=4B*A%bLbVU%9%bGFmrP_?^`PCd*V%DbHbUve)iTO zQ}^_RDyt(GM#ncMtfu;wcp_$?1?2jLYq-?`yJVr8H=$St+X5s2GtpSv-P3>NwdJw( zpRCsxSW|nvt|Q?wpr$b>I{3t`GuN68=-eL%YjJdH{QC4db?uKfG{%T34qA@sIsx0^ z4w^#s1G86F*6iVhlL6oI%-o$zBXeu35m8Y!j;Jz1s8lk`bGh|qtKwHRjhqTp@<191 z5~%TbyU%k$-MIPgrQ>1Mh$k^MeQ|JNan=>*2TmS+fm&mTJ zYy%(%C;y^T8v+1hs@I?B+* z|K*6i#~1JI-_sHdXq+*w`f3{Yo_MI}H6u-FM9b9`Jyy5p$o}0;^+8<);b}hD@v#0| zh3?%wb&PS;LN%TH58A94Sy;_$x4ITidgVxaVz(Ze+?Dp($Y>Sz4*ZCARSBU_?%CBrJOy0e4eKu1{2_{^Jg3aN^ z-X{*W)r38|f>a$>LfeDgap!E<&0DwrL7S)b>h;6w(FEU9B5Lbbw(hg@k*jS+0zu&B z*YXR4cgKqUrZ$^4*W3aiLU#YN!`6~qB!~nN0Wd^{C@R_X=$R{1_Eb4>;zWN_+#l57 z1Ktk8y;peeHNWreNYWSioQKtK0x`|wZ8>q`8Mhg0_qBu~2HP6##T6|SZa#kSM3B5a z^Q*Q1P*m>NM)QHAyZW1&g50AZk*;o@LQNE1`yV1tO}chhLrc`-)jwnPlMw}g*c^g| z40Rt@3>9@W+FDv#`dcOk&cE=pp>uOh~PLI8;jXeeD~1<9bJtfW&0p3cjAvV-)>a{N3N;fNPSC}H(nF-FomNL zu8B1F)Wt(#Q{{v}svby0TG~4!_3@aG2rNr@6ZN&Rdf)Q!_}zu+TmgJtrw;7@(%1Ia z`q0bUImbswXP$re*6Y{r-tioN@Nh%_Q=RGCN<&>(RZJG`>+D`UHo5eZD;I88L|#km zZBNDmhF+b9D?i)Mc=`YUKn2ZMQ`heO%kyWydw!f-Z=0^$rRs{BPv*dO_WA24Nl%k>xpB> zT07g~P@X}R&{Qzs3MQD3dlR9AcVKO4{@qJMo}@E5dH42G#wkZt$504S(LDjvqm?Fa z&ky=XT9jx*y=J@Ib#wqGz(s@C?rCZoZu5@aJbk4WE72Zp{_1PDrcx`u&d2sPw={Z{ za>YglT+vmA2tbH}ag8%hKu)!Ogq$Jy5%)0!Mqt!*?oYJsI#4K8Y+<~2`{c82hbxteRdGourlNTQ1}TgY8a&$3b)vo9WtyroL?9h}T?ZfR*mn{%O=X+| zFaTe;<79vH1G{WTRTN$0j3IzPu4ANY-=mE^#~-ga0EkRcRi97iTtz|xU-RLv#zUQo zq9Wq}0E)k^w=3S3JXCgE!MWo1`H(RJBCc>mriNpC9(%Iu_#;-i;(%@#rlGUYmmb=! z9A~PIzyQD#j_-Nw;m+g7%B6}6$Q4b~OpnPK0{}3an)lb%?{QRBWgLO2U^ez1ukSoY zOi>jkcd1WPz;!LRoLU&aGjRFhyDy)eNSD@_Vp|m_+!^mqC!+yXtE~-cM1=POAp#KI zKh$mO2HGljy!j2G&7ZtC99DxWV)cRVdt?AaqRpA;cG)RrH}binW$pM?de13(t5AS& zt#W2cP5Xb1)fAL{*RC>FM2j$XcHsc|&^ z0Pd7|u<^jIBj%C4O`0zps%vU>;<2#F0f0~xRx?xA-hSi!+rpg$imfUmdk=8@| zTr=SFu=29kr(z+Y1W!KxXmc_E+_i!G{h@Hsk0t{Ej}h$X`TD=8eZ2JR6#?Azc{S7E z4?d1wzb8aoQNpbUpNMxHK2<2Yicj-}Yr`PDf{=-Li*La*qxCn>bKmYz8{@`8fFa7=;H10oo^6QVEJkb(~ z>uWg;{HlYhyE$f<2hi8Ro0EDXVrpK7z!cpZh;?_iCnx8Xk{RpX6HV6nfuo3bocgks zsLT9^mq&m0AO7`^L{SG{$Dyuczx$g{?C-1(Gke(=3M67sTVy^1Ro&-}wLkdG*K$98 z>(w9sn}7XsXZPObwyp<`Xfuf>Gf-YdQB&8`cksc3=lY7CS8AfcKmMa1zxi*!`=Zxha(o>RJo?zzo_KOkU46(ZuVU1v6?_Ua z7%~8^aIX=p^O@j7ZUU3zlmEIYfe<({L-%MZZB08xhTHQ^kpb5fQ)N2of{-y}jHB4R zgbkX)h;J8&MTT5c7;pf#V=+L5ajr2^HN@@iGX_Wmz;%yDHO#FmhR7HLfkc2z;f!+v zAOx}54q*ycc_3(1FJW-Tcb=#b5jkh3N7YSZ>%kZ(DxgB!WqyztQw$H&42=L07-Nhv z*i0v&s0vqj^;$mwAY%$LE?0T^bnUeOz}!kEd*`oy{DW)HUw8U{?O*=t?&O{XbA_@# z_}1+B_4BvexMn2#Yc}^Q#CtO)NB|+>X2<5%CyPMU=?%D9JRBJ!Az-yjcC$~kdh=$k ztp01eL$*4%T>v?ZF$4fogcBj*-FgHD?7opDh_Jm^7BlnLzyH5og8pph*Z=7Q;YJ;S zaWuoBn6KU&3202+ei0w=cD7&G)@#21?MRZe8FCqFI^P_3iT8&+1OiZ0g>#Q#nzVgV zLZs^H3=tWz&Ff(R09@6W^4Xmk$^ke4Dm8l=113qvI z)zlJZ2)4V9{9)Z63T{tAM5cK|nkN(>LWE+8Y|C|Qmnll5uCA%Z>qDyUXIp11##E0t z?(xQ}KN8ix;^@68;ffK682)f-fj)zj0zt0C@Fbqu)ip8a3`j#bm;3!=#pARLJA zdg3|V^43Qib+5(&nc}U9?tAVDZ@NBZw(o1~N_Z4v0(DQQxv9^1<{N6??Alu1wp1<9 z)YH_pyR$wVFjc{WfvzV{_(Y2pZwQ(?a@7+`_8dR)lrLOAwdN*jTk0B`LgfP)GZKr% ze5S&AvZwRd*T3WTEtXV>HTBeZYxHiPSN+w16KQUb>s(Ph;rfogW6Iacfw@dE%XFbc zntFEk>~5_OqN#B7H|=@iw;TN(N>cGC2O}HVDOa{CiV@K@P3Ht?<#NSB(J_4?Zmp%~21keP-m=tm zsdpqAho+>ddxD)u59?M+EA;k>&6953THA{BK#W@0SGYgB0qw}JEZ+%O9UqmrE;8tTn_eFGH zBm#oyeM5`2kme7C?)!<))V!_X_clzn&){;O{hNHWL?2^SCfY0(i-@JwnLB^}|2)4I zTCRQQH-7CzYa-~CpP=+}TXceewyP(-=W@p8khkrbWC8(U>-zqCs^o3`rrJJq3mhE+b?!O=)_ZR6Gf1&Vw-!FLp{tO)r2|?s0=kK2V{r~OXuhc)$ z@YFy22ghUafF?HA>D&I0iJXd+UY;4cH9k7F?0CxL)qJt`zFlpNvD%2n?A+?q#M1nd z6RcZbnO$F)C_ARFwzsyuZ&z#3T^m@P9-XeV)U`Bqw8aeqCh~>c+TGi;1s?LoYy0Y$ zwK6~qP2QRs9~xW3G6hV3qP451r7=+(H#JsTof%%5o2&S{oz>~${NPlc zo6(l~mhPV3#<17WncUYU>92XnA^7XoZ~X%FHwu9A@Q;7*-4|Z?N%S9o<;kPJ`$!W} zwUb+RwtgynytSAR5P$(g1l7=Md)u4VgNiR6&=l>1T3wO^JEL5+0LgYMk1@72b%X!} z5R%v`u2j9IcrOVGA_UwTdI|tUBmfYQZS{2$13>^{b0zKjIzfrHi@Auc@qC+CFp-3) z&M9Nt>lSVPq}uJaJ@$_f*!B=VQGKb%7(*09B&zXv$F(3q0%^PRj&1e{ZpT{jzMv~f zANdRQbN(rP%0Im7iP9>pWme~wH)_KNTlO7_nI=OL3>g9-Y#&lwJHIk_?)yJ``|6u_ zmm`T}ekGsJW90a+JontOFP&`kJ1Ya1UwrvzZ_W7oy``d=nx9zQaO3+Lk39Cf|KyS2 z?Dg^2e(-x&cOUu2Gv98DHv$-ine51g*Z$yqruCub$0IGCfwOPC{-d8(2%F9BM^hIiJ zZZ$fcQmLHHrz?6wGi$=CiUQwzcqD6mYHs-2U!5MCg@*RWPxjY_*v7>2)adn*HwLe% ziN@dqamUK1vkS|sb>8}}?!zbc>|VHgZ6rNEboS=>zJ1E`@Y=g7*jM1)(5 zv$J<@kLT1{!))N$n=id`ecaBrJn`6`q))dC>x*;eFJ`CCoIUGldG2s@`{f8g7sw?m zZxz-{T1Awr*C|~pWUbY;O2Sb)>v|g1)bWWKPr1HSd*Z1>ZM*uKTMSpLY@~DPxxAUP zgi~Bhuibj#wHt%QQ2gkTBTXS*m|vY4AGmpb;E^(LH9mi9i>JCuwLEA_(l1Q5LvT-R6=)ny&KFMPh;`t+IR^)(;vtX5%^`-AjRcAO7ib3Uy|Y%zRsd!QA9}pRpYza?Bz^8vE|Du7+qGN-K<(aA z2Gv^;5E!}Tm5G@_=%^! z`RmU#Dp7TAZQ|Sy|HprGW%l;Pn+G0kX(y&}P4`7x`cFLeji=lF`P(o5*`NRPr5jTd z%PXx7&}?pwwv_D-N&4_)ySdO7kr2YND&=yyQmHtOTm9-(Q||l!!Wc6Q!{hN9h5?`R zfx3*qh_vnxx9o=A#z>Oy}Dl&!V;N0 zxW4K_^IP#32+=7Qa=Ep<5Ooc{=-v=2PQ_J{dZ@oO?k#i5W!zF89EQH6_uwNP?VSlj zu`n1g^`Ot$uqq{+8vKF2NA`!$IEA6X>0(o8ZaIB-PEbdKFH&Om;$W`c>}xsH8}u83 z0ax{Seea>f=;+jZ-m+bLM?-^Df#o7&Y2+J#E&*%5KFGG1Tg>u1k0{fmX`~>rzg?W->7h5Ic`kTdmCfHv7EKKo-R3zRPL|w_C0pA zrMuP7IroLZND{=swMp1wtL&9rMNpDHB;0O}L`Fo$uw1ST3=Rzr42+GBr8m+*#5mfv z%NcvmUxXm9*R!jy_sEeWeYzE@00zj3F%ZNoM+guEM4a3JIVQRUB#1bYp>tFi07KMtLI5E$g>l`dD7pd!Tv529ah4|G z2qD`VlJtx6EdZeF+8Y}ilM@r;ig`lLa=fdU?gpXV;c< zb|OR?Id*<+btP}P=m{E(s|Wy$gbA(+0s%DuQ@BQ@EL=wjLFJ-dELSRSg%}|!1iH;N z8<;By5jk$wujdFHzy@?RgBiMNtroKzt63*%Dom8^^2SDmY{f9WrostH2nX!4>)O>N zafzc)m~b{L3T{ncmTeD7`hajtj^h*x`BZ9sW@hHb^&2B2BZlFfo}8GUn>==OS1{nV6ite*J1&d&jZk$7^b8IA=uSy|b@ASNT@XbNJ%q z+iKa^4_}P<{bPdu7DovY(T5HA|FCEIyBeb;7u@(e*rc?zs1Dq}$w`Qyc-heCE=lP^@bcz3k%M|Y3^`fkI&d~@;k^JkYZ z-qFzCS06AJSfxUF7u@Q?YCt8>oQf9<3|#==M!?teEb3bK zXUyvlF0JG|KJSG~H^;`uhK7a$!64_Hi14%1vLV_ku8#7gE%WVrK6a=ssVf}YMaCH8 zI|tvBaE0rXEt?1cIdN50xTb6^6;0$g4!O2)U8lO>3L@iNQB*}$*hhMP1ae8Z4k2Tl zR~K`q&1m7+mSa_%>Ku55Gfh(%+kF4RCE+>(9M^SSQC))u8B+{X;p`W0BjLKPQ?_g& z2#|rIYYNx7{0jVS9dW8jar1NB(aO8;4m)r9YaN5$|LgB{-9PJH;KY2 zSsTN*uMZDTuIg+h#5eeQ~9dnuQnGxrh7Y(aEjK(@a=2Ew{Fko8CtHU7}4bJ zgZpFLx*w+~GX?(NUVwJP2qwk&_oX)JUQ14@pch^T6J#r8GJcL|g znjWlcJN~st#d+`bvGEuGcNz*idA$}Gu|1hYmUaj{MwVLn=6A?{`mh>YSLM8 zDVHhv4u5se(FgV<4G#xR(M;XTkZ&HZRB#!0Ks69m1mv3HZ)&a!_a#biU7pZekN0*R zPX>H`1+8f3Bj0+e^6u2NGk^Z4xwAnpv&+TlOmAZMk-f)uC4#211b_@wAE1sxK_%MQ z-m$xPY~u1y-Wt8OT znN(^+1VgcKA|6nyqmYD4PBF8(y1KlUuGj*Q>mD`MSQqgp{VD*ul}tIay0}`(6z#I@ zAQAy^!xL%lj0Zen4Yzvm?maneUi~Em*UG0d>#I{sxr*yDt_mewQxmPN37Hy`A@^_T zni`Q1uIsu&R6hn}Oi@)p0sVGS?K&6b1w& zTt_&Lv-!{rxXKauFM90i4k?6iUB`6=0U%R2SCp-C3$%5+RXpa&rf9(6a_ctso7%(qL1uv4J33R;gs_EwVA0que|V=Z=b%A>-;Be zia*p5)oJr|S3Njv7w#si)~-e2RI=-1=dQhT>7}WSLGy#P&n!I!rk-F|LOB*=f-&3uQcxWhQc!6eqJIjSIkIk z@8ge!0&O+y&%b+q;C3;~ISE@N57zb{{Ac@Gy6ZxwRsXeb6wRNVe(B9u-W}!@JsD`& z`@~m&?db0MmVnDFJ&XI$IDdGv~43HuB#cG>7x_jz|i=O7z z=DqtvrlA5Vp|+#H`pt6X`-P#OU3+`D$h~^7DZc9~dynn^(#b|0p=^dcvDVh6j+$UZ z6^v>ArtUp%X>IV%TZ7}%%b}K2kG3}VClU^IMOau7x;NZ$_@P}(r)MT^UOJmE1d~Q> ztkIiH)F@3X5ik{%M}yH_&wk@6_~BbWd-0v~b6U|dyrHI3zxkzyk8~ZZ*MO;>NPV=m z*9>{Q8bd%5fncbnxuq@@_XSLK^V$H)@yXH`J=|9R@4BK~Ddlsy<)!7@w{P9Kb9-$q zwR_Lr6DLo!cXkAPeniY=bBJhLcBxz{mCQ=TVmo@S1QBBnV^}Wc?Q)SJ6idaG)wO&+ z9|!~$MIj>m%*;_GE5DXcuP$wHGZG8e!~zO(+}d2iaw~<*+SV>9h1Kb+fBrwedU@vZqT&r|j#ClbsM-DW)6YEo)WiKz z1r!iO#2712{Wrke4VW8e9gj~{3~ zQm=^3SjDPWg{uo*10tZyFtarH_N7-|`Qx`{vyP*iX0cd*>dVhQ_su8!>I|R87|78K zzf`mZ03cx%bE%DVI#&Pyt|*4-2_=)Jrl~~eRyNjCD{CoN5Yq!@ARLYPyc*X&!uWFn zLKNj(D!aD6UU3AWq8Uo4J{B+{9z+tA>_%p7ZN1_!u4*2y60HfDT1feMquZ*1hlH>S z*;G2Sk;%D&RDawXP9(gb17i#k!M4i9TxKPeDOYUZnjUG02F$RB$#HWZOEv(8P)e_^ z&&`e5HG95v^0{5R;%Z^wXWu{f#+jeK)S@fc^;nmR?#9@K8*e`U|9k$-(0Cbqoh`(H zh)5tX!s;^0_m()`+yM{}t#UCnaCy|%{=he%{_nb@jAq`Nyn5!3-#&MDzw^c`KY4T1c<$(L z?D_8=sMQ5=!>{>6wPB9}0Dz3K!qVjOz_~k_)RN;Ol3H=Nvt5Bm`kd^>W^z~iqmBP; z|FK6!01d2w=3H>Z#fPuOHJrUT;Jd3NjwT*#{gge!OoLkuHW~#@Wnl*0tl#t_dfDm+o4AtJ>>Tq0EoyyUPF|=s12&Ef=|d8 z*tVP6*ccufym{-!?Hjj3;c#zn-+_Y%Yig1{zfae6&bT1)flYqeyi#XX0m%+W9ls6<4B46WtN z^o^JP?3K5#Pv2e1d;J`nkJRmd^k07aXm>(Y{_Z9`N}o)=rR_f}mHgV&wQCp7zINv9 zxl1>SE%9_$$rgeDNH|V8mz`fNEjj-FlaD9_BApt(dt-Ls%1?c@{xA2nM$mDyON-OX z5QMIyC-($>nh;D4)b({W#ylMORtL%EI6%P7ft^SI0!mBig^@R2JbUi#x3AxwoznXD zu9a*X1OkCuDHNw}&!sFqzVFcEDv9D!dUf^u&6lo3A=!{PT(6;(&*#?%3XHYvI@Z%& z7h($Msz2J+5~}gC?a2d()!rK1E>0mFr;uA+OyyHN*#AVAq3cFDH+lN((%7}1oo|dh z)!Q8L=yEUnrFJa@H(O5451c-GeSB#wRq}GOJ@sZ?-{X&m+H1gPuP@!ccy(an*7Q1a z+>+x_g7pU;d!)a!wk>J`2|-k?-@Y}@bMvwYG6W#EoJ~(%y?Sl*+TEohSQRj}V14(I zhYofpgB&vV2Q_CB*&AVMn zmn_pMRji5)gaQccY{e?f6?nkoO9Z?C!Ybs;#ZsAh3=dPxXv4n8lA&g^xx3!S9M6)w zF|E8aw2@z5%nCcma!ZSgBjbxAQQy^@=&&!Z=qRe=k{MFjE|*fNBG-N1K)_HKBiFIZ znam2B0aaxPeUM49rQrJ5C91T zLbceW;)z5&;Ycls&Cyzjn27jb$D8Ba2t|^iNOH%phI?hD6*Cw!gF82n;tfT;p(woX z-AkYSM#6R{hx|-`eyrV5Mg+ihMX^*|TV0)>n;#t?Pp8w4WAEF)zoDU_t-Zait<5ye zdlRSVqa=Xpvk2rEi6u8^6%d*!DLE$%rnPT|}<6AM7~tyTA2hyfLh~P+fBX7zlLBMT;te`%H~(^enFm|zA|74t^1sBsg($4--15lzcVBwt>Oy{jv>MgP z`yHd)xG(26M#@%haq9A00|WDSR&CRDSC{g6;a^c>s;buo>og=H5}Oqcs)sVF)_g)@ z;1o*hlXuSk^zBPa7sp+{$Fg`(jZmOHTP%m|vb{WfckJfP+jk}x>|!Rrk+X39R)GWS zY>L;Kpa2O$h@1Vf)r+G-5OSbOI=?(La^dZp)2UI5YYZ|=g0b5Wi>n?p+Ne1BrN!}E zcP?ERSS_bZR;lc+X0EPhODtFu*d2>{RoRXEcbf?SK!D~;#5~bZyjZN*rS;Wyatbae zk!Z{e`b?cjfLkboim|q*kMvDkxjlGms#vz|iVMhygeb0MRwgcvI(3chYIl1;t7MiZ z7pE3e-nRP2n&#Sg_lYMe`BJgCQm9}q=Vl;s^alhrn-Y9QPnPd4lL;V=9O@BAx%v~RuiH_J!wJ8*mo=F!mB*&KeU zx)ndCFzM&z!=ufX4+$YGtCGv-mzI_%C&tIe#-?XxBav8NU++T?o{Yz1in=-O?H3Lx zt{!&8{l^EcD4|F!5{nszHa$Dt)Y81Q>(Hlo*Cql2XCuEhaQ3wyU%WdvR`l7Vs2o+c zxx$eUHk4A6Pc7gG2Mqcp-SAza{1~m~G{j=N8vDvMx0C_G;<%QZ5sJ^qc)K6Rphr?{ApE z0W?4Y1jQ4HA9(g@!4+;Arlv4Vcp5socLgoIoJ%dcuIB^am>_ZyIa*dZH8wh$p_m$M z-d(4AHRcpEbJyQ21lyFR{Y|ls{h_8^E}34hDntpn;t8SZk^9y!-)bWe2!(~)r!T(z z)1RgK4n1}3pFg`N%q(PHriY>tk15uQ`E1cn9)9e^GY1X?36?MZ?8ccl|Kj}lXe89$ zR@dTZIs*=bSe-32@ohfvNG`6fBNZFZPydu{H<>vi3q>SLD5ZLFz5p-zcDku z9%|bA)kl6c8a9;D?ELVxfA{ZS8o84AQTxGP->t_z43QXTh)4iL#E>x#fLJQ#OBKu0 z|IkxUHUDO7djMhjmA|<1_8ae9z7|Ua_SQ9J^OdYw8`%HUKkMJ?_vqQ>>5Je0Kh7`R z`rhk}olOsVy+OGHeGHdv0UgK6td86moLU}T+@S2-%wlF04m^JR@ZrvSgQ-kw>OLH) z-+j{5*PP{v!P^YE2~0x-2CTHPGHUt-$_2vv^akGr|bE_KmLC%Gs$i&;RL5O8-~C^7xnhYcr`*rfj&C%-w6(My=bG zEH?u+UHhB6_q2GyP~iX1-hT$km1XIH;JNoc;qSSY;X1TLC;$N<0VG6fQI#dK6r1d7 zHrYnoT@FdxHRI0i+ODnH{M((`A$P}?!{v}ecC*Qr)!kKDB6TJbTB|^4tvw=KYk%V2 z{qfub0g;&i639d#{ghQ^q^qaSJ@f(l;kM0>9Y!x=vm#1PyhLk$M zeWr^x&&+w(^TnqrQc^~lZcw4BtLhkIjJ{z_9fUAOH4&Cay*SD!qW}nfBY7m`eZkPi7H91(i|?m>^m%rN^($ zu4{|-y?c-EZ|m@jNCn^-U_i!xqWZRU z%ZZFpi-1v;sih*NloJKXj4=ispj098wZ-e_J~hF#RkJrloq^`gpvA(2UMS>7&R<%> zo90g8htIc|v&FgLzxnkwORqfGfTA*wi>c!J>ec0qLOxYWZ_I6q&gQN+2YLe*Nq{;f z|Iun{0Kh<3S!r!cT)8H7 z!z*lL^QC;MsDxQ;ZY{r*CIkIZr&;2(N+rD*OO-O37-?y$%udf-8%}r*?d?8%q_3sL zj3f*U3}swRksQ(f-Pr21hC+6WNzh~qpXv%K(|T@pGhfk^<>k$l^^Dcu*5I;u%osss zV{Un4EzPxb+c~#AxU0*KWtZ3O^GZlBU2*UjWeQNN0KvRu3pTaeJW*(C42qIiv~#T8 zIyR=wCUT{cs%s4DVg*lpQUe5xQB5soH)AVvvn!IanJJhR*@ZX(V}ua~%$sa3-YSb) zQRE019T92_P2T2rh1&OoF3&8Fp8eIkVsm_EBss+z+dD%ZzlAUz>E&cTJ`d0U%DYS|p1NQ<&ozt+kOd2nSd)JN$bOwl7>wj-3A8Iqw?8uFs6d^|sgS zA-}BVb7h)Ms`-3oV}35jRrF#~E2pn7raf!u?;UFiOPS*Ot!tO(QnW45w>J>P(L4GRQtwF4+asI~ch6#E2rNZLxXr=FV>Ol>9n{z zd<^o#6E}w`Qz}f?wkNXeHsgXR=~#McW+5$r&)pdC2t0>~B=S}tn$OJNx=_rGi)Bk_ zSD;fd9qMd!i$nu47hAhIe=#@N(i5zhmWrciKfGS-^RhjN0n^Iq)z!%>CofKJZZ4|j zY*LT(_ck5g-R_YEzV2d=S}_I&pjGtv!qQr1Iwy7S3OlT9eQ}O5o|mkW*7@H)GT&?gHXDv*_~)D-x?H6$bk1!svxd z6I?SJ>TR_*$*8n2b^Xfqo13BUM|xYley2k$q;rMx`rItW<;7GviT(bDfZJx_h+uJs z%}xf40#$T`FweW}g4HZw;IR(qX;))-7OXm}VUCw=qS<1$n4KI)awx8-OAG63VP`pF z5fB3aYHW7Ufa{p#Zr z?=5WR%LN=c_J^-^^}4L;q(W)72-z&t0dXdoVG99AgNV6`f)N#)3zkPF1(M)$Ku05>O5FLa9(F6w76uqkw>L#O$<6qE#f{NGLI& zn^wu^=1$&NG0#F@gUc$5{DaJylu^V8uH~*;rBo@G3QRDWM2jTgXXnXPl@=*ng{L&BDa_5p004jhNkl|dOc&!3gpH`nSe0!JGcFa;U%4?ti7|R95 zph3v!GKw%uP9!Hk{fqNTIT}7b)YWV@Spln7Z_i6_X>IF`S&ipR@z`8!YU0lqva8=c z_MPwaM;eBXy|m)s693a@|M|mF$5_ZRk!)@|{@l^;4mceq%ydeD!vrG)m=M{91=IHW z6GpgNWny$~;@b7kJ{l?Zy%6sCVXw&{VdU=$9QgkCNZVSxR4g;5WL8J6ES?{YmH+6? zLv1fKdb)r3y+iun_3K%fQVVq2+R_0d{6<4SM8Fb7FJeH{pype3+HCjJWdzDFNB}} z``_O^)ZSq1mSdFZj3VGLVp_Q{I<~r*vYH#c7FiUy`u5we!^aqK#N=>y?mrst-CM2* z9NxV7?)6ij{;$6&T6nHwS1>97K|nBo0E$jaISLd2C?I1c6mw>8@W|V}u|HeA`Tp7K z(Z*Mso`3N`m(Ah?U|2+Qbk`nFbJsz}5X~;EO6e|qM_OP?;qU#nzFsVi#A0HZ)$zrAOuyY0nx(Mqt15QikVtehkQVsvX2 zx^8u=Tixytktk(=7%k)Uojx}_o_7^>j<@+-2Y&ME?v@u@t=|M>VF)M!L`#L_ z=%s5Dj_ac9&F4BAoaQe@rwAdA5JNf1Scpz7jm?bTx>#=P>25o;D{QJNp6zH@YjDV` z>yopxvzISjnwXf-DRnp;`}gf_Yj2A*MrB#%d7e^QmB++iw1CaF;PL~M9yC?eDJ2|d zwVBJ6^7?vA(^Pa@9QNtV1^^hMjMEUoyo6*6U|a+5bZeJ!J}<_T<|f9uJvOg{Q{eRlCJ;}}DfLsTTdD5Vu0-LCBzn#WXy!ur(pbLUQ7$$0nl z4h+56>vx$50R*xuFz~$4lx-<13gruHj^(k-?|yuG>bmV>TeG{v>TKQ9QONDT_Se_u zRxWKcdiK85*}Z$P!6G3F0A$Ov7^UjA^;-lCRZC1-Ig^?C?A)cBCzdVUFCN`9)DbiT z55UZBXSDC2*pSVa%Vky9lm+?ykxSREeR@9P5c}FXUEW>&12g5drC*-AwxHN7&AmT8 z&^^%RHS-845pDj4mfeTsyrOBWl1xpU_-u0a+9%TfE|c*n~T>_Vs?G_?3sAkA-plv>T9wQ1b`6&tqhs*k%_UBv!zf=Z$~)n69i(8cJFFE zzP9?o#Sc$!nm7FA%QJR!SKGk8s8uLy@o`k z)oJZt&!mO`bAn`ZijsrrfO)w!npyEx-d~R=Qb`3uJmQUv3IpK~Cm;Q(DUF$s_@$C@7Pq6$CmFFcu|FlL?qP$>s1g_#7@OfTb~L8+KF@@ujuG z(yjQ7^D|`^CArGxHL5ILJAY$3mMFgSXQkMoRA29bc8^u!S-n$G-Rf4i`%S$@&RR$@J zn9gW1Ha)(ww4U}KX!JYV+#E2-FV8Go_~c}&mou4%c7=Do8fX>VCX&gOmF1b~srA@; zHk)(1Tn&DIBpM9`Ltd}fX18sF`~Y9NJbNE~vCkEZVvGR=ffpmu#)XCX&5g}$HfOO| zd7gi|mAtC+I_Mgx$~HXDwl1|uOhubNyl-De#BE~*mNe(z9X~&Dern~#u*cQls4D8# zxp&VXzC{3pF-!?i9subKG#zTnjuZd^)3tIsJ9Y8O#T#eG^TFfC_CL30PooV31%`-V zu}8ZdjJ5z%0F$h=>dN1E|1Z`T=SF8T#~US=Jz@^^?{fdu_*62M^R)%K8oj|VK|pKu zCt4d`2EIjGLy$29teh*XP2M{3w-=|>1>4XczWLnlW}jeir+L}zklG!A+LhonJZni_ z`0(T5g@Lv>^xBxK!PnT)6cRr;RVHr1)zcC31nfpI#DdlDu{OA)6acZ}x+ag0-l-5z zz|u9a&jK6c|LNlNnZFx0B@(`&pFH>G_g)Kou!NZ=xNOY_dZcDgN78OC&Rn>B?eg@g zvtu5sZ6ItD5W@&Drh}48OkEkhc}!ed)0oP^x8DM$er+b#-=k znn%desHsgu4wbgh$>2x{;L7>!7`g~gNE&>d| zsLt-dx5lkPgfN}wbcfTwcW75@AcRU70&|lalUFXSZ4{CPikyVe`p&Xv6yE|MiZKuc zxFP@*2uM62%xeCDK}%#;Z@l{_e{vz|t#tnMM=uQYH@Of41o%E`DJ8n_{DPLU{~wWT_FrKHZ?wa_H@a<$LaSrnnA#n0-^v!F9KD7QKpxGDu#3?D2dG4 z$nXC2y(^^O^7cRYrw!LGT%9@d(b~z5292?k|1dSpQl^k^HgWp{L=xieJ z(hr_Ha`^B-#3~EVo}|jRxeWM(;01e_MbAT9FIp!58R&=T| z%7CGIuK$eUTS}>_YFs7HiaDUVT2V^5LaAg`B#B@~)Wqb46X!oV@&1h2IeI`BS&jQrqr^u+LV?C#Ozd zzA-1asoCW6^;^ry0`oM5?SfN8 zP{%5d9B2q3vP~2u6CfQ-oM^V%B>-fxn#@=&sGw;GmOCWaR$Co`L?7eC%4rO`;+ z-oB{h(Uv~>bb13?+Fp94YoG_)H_fH#Kf8Wgn?K(;XK@OZ z^lVabcE5h~P+!y+wgT_*G?b{SGsFru%1zu@Z*V}{;9ysGbDPg(;&44GJu`U3XuPed zIv8zRYW=twGiaGwS)py=2a^*s+2Mch~sJ!DhPn;lxn)Fsrqep zD8iUCNgTo4gAGGn(^OT}bsYc@!h|D&AYdc=u5qt`YN}2(1{^OCjOvW~Cq3&LI=W0P z71w507g8G;+ph2R_Y6iGToR)aAc7D>*8Z|Cst9ugm6P*{`LPR^W;XIl32~Y#H1+T4 z9@^XHL|98_6N~e=u4hzJfm*T)^XWoGx44=PywKYchzNz%3-6BPElEe$>wBAARuf_h zuEcI$o*$jbdk;L<7UI2n?AFI8reo=~64F&{_O}Mxd!8EzyRD|Jx*!6;j6ormi7#H6 zSQ7(nq4u7jzyu|h-dO(hLQ?iM1cRpX&EK3odFs@SnRMb$ez&?SKheGC*rA5fni3zm zlxpu_qR(j|98>cf$l*Cu3R+}TC?;3NZ(Pi2vWjfkxyg90 zQV<;ej(xp7(XJ*Z4-}y%zJK>l5-b9MQmGhEBqk@umzI{}@wi#GMk3AONTjK;+2`}w z>^6iku(BN_DNGF_h1%xqPv# z>ZJlMrYa>#MIt9io@l$*pA*u{Q)4SF7E9DwNl#o@SSYRYT?0X@+fLAz^%Ae!PQ|y3 zYFa6`xw=|OO|4Ha=PKn~YBM%7IcCeNZDF_9Y%MK}oH_C9zx?o~_qAi5K%_z6T$qY0 z8WAK51{e-v7u@3BiZ ztGU667dDrR@y%?>DM2}(D`bnHJ3Js;n4*@8@#V`WFTDTmCv(xhz5BoO=AH-vu3T0K zAsnaW*VY$@KRUmh1K;4@#@Xqq<+;&MCOSR6E*Hy{a@jbQt&-r9IAD6Iq+}F?1VjXc z5d*E9S{ffc_vtTxH>&i%+4aJA_BNS)LZwv3oM0k^)Md$@q-!z8fFWXWdIQ0RfO_KW zNc^)T5=@kN1_QfZ{e!m-?}|8NsDPe}&)>Xx@`E!oD5q+iRSK zOzYw2djBzS5d!_r%zG1)pH5c*7|0<@cwqM%-#xgud0&_Z zfJACBHg@vFXKTyxlCH4^S30wDXkw~wziqfWeN%=2#Z$9=4y)iETX_6UB+1g;3}d-pW9G}-}a3~>M$0b-m_ zAdI7`UP{NNuiZTJ!LQ$&iIp@3*Q zmNVHSd0PcPXZ4p?&;8>48ON~umCk0bWHt#}iNB;Hol_biZx|xnECDqY4C}zfTH{SWh#B(pI!tPd&2@3J$(cyEa-u>It zi@8b;i^Zf8-Mh9@=H+9(5lgPHIey`t|2SXr6{L2Uzq+;=-=J3KK>jWIf;V7y3yg;+ zxWlw2L0qLi=(?sTO0igst*_6{&0e{5F_}zTt@f8*c%iGi%O40Bosg=x2_Ai^`2mPN z_uq}{cDsYYKzwsOk&J7aMhJN-AueNps9GrJ5^J$kX?b#PYB^iV+BO%~$F7g10!@*C z-zhs=_C`Bnfz6SH%U4Hf$r_}~pPZjv7g@`Jwq|F*NpL-9d&cnXZT^yy$}L?#`Dg#> z+*oXMT`#0_S~@kqJUsH(kwZWG;mbcd(3_o3B;(0qNy?nR@pmIL9|%O(2{qXoTKD{; zfAKr(9Z}8@{!w%H93Xy}8$KjkY|uVZq0y-buxlPEHK|xTQBZ_jkjezWe_^?<(s$ z!z5?#fAQtx|KzoUtsbih>iZ}kv4#u)n3v?>K(ym#bYg7!+_^DxrHQxD8}Epyd?>v-`HTPY-+nw%*>LUqqZfiruEPBI1R>bwZg4s+Hf{3iiIac#>ygyZAH8wV zcF?o%pZ=F$PhJ&&!TbOD51QLrBI!ZvCl@b|joYtwaDKEjc6Ic^jRF@u)D{T07dJLO z`VYVU_1X6(l$Ia7*4pm3uZ=AgfHOJFc6ZP%$FAMD{JW1nPPGiY@zPITYOVbCzyEON z)O&wM_WsKs6qDCiFP(ZP7Twj|dbHmUdUpEk*$bzyE3H3lY-;O4Wm9_W!*}2RtG_3vc=3n-V)tuht)e4@8E`Tu zS$%G+L;w&EVzl>#pGS9p|7R7TMgs(dfMLRkHm^?t59{CC^oC%zTU>w%nEiWRJKA=5 zK$k2wv(3yo-u}NtU#t9Hg#yz7^H`8&yUQk5MNAy+M~3{pO>b0GjaAo7C<4rjR+n8S z5?23N^YciyN)FB@FzoDT*cbY5ntuSYO>zh}0a)k$eZh{_H!2m%C?bGlyUXqnkbnUg z1;l`1j1a;m23`BV6W(=9HF>d^3_%e9grFE3o4WYXzx&gRmBvH6Ui<#|9YZSL}pPkmx_6NbWi*KSKfO2=&pd>N2pGjvFM8s0!A5SMmscw z5kjCVx%lkxNB`mfdveB{@gDjY|MwsEM(lQ`BP5g;uT7l(<^S^+S68xxGg&b!@&F+DZ!BnLE1`ki{=Q@X z$3HyU=@$qC$|yqRVrJ>mum0?ppI*EYha>;^|MuNOea|=BP@UQQ#Et4&B^OU*nWT7{ zJd$X^2pES9w*Ul;Aq=dX%T2uh@kggVxRnb2j!5KD~J5<6oZr@T&K_&%e3r%>g^jPMm({u+SM`r7^@P1OpFR#7Np zie6UA8Jx)Bq5=Q_m?^4~%_P<{4kkL<`n#h45;^`9EEnc`{@Lq?27f#huzTDv0uxlx z^2>~-5npDh%jZ7*;8&l{n2-PCxBJ`o`1H)k2OoSoa^jEwXKMeyzBFhJ^L%o-G@R7S z-A(`7|I^z|m67<3Q~&TXKc&pjeBOeo*=%-UVd2V^tK;Jn znM`(QZ{JHVz1-B&X17{RCKI|X6Ab_ee}#nNOZ1bs@sqcQCdODa8tv=rJMrmH(m!^4q= zq5b!0)ivGyP`|-`<{QILYLUbnbtJix%38 z98VZ9$|zP9TT_2DVv)^!*WgQU6aN9#Bxnq%P5}ThUb6WjAzOppWV7@g`R)%I)^f{b z%$Uw>VOyx<;9w-;l4W41Vd%Nzx_giJ`BrbxDx3H~*K^-x4Y|IOHENS>Vp!~X{*cz* zTGT6qa2(Q9jbW25+SMF%i&oU}!jHe-6(1_<7#kBU({)X-MZJ+`pT*`3@3I`xzH5)I zm!O0>44R{5Akwp|D=b^NVnK=azWjrL5Ei1XA-l_Z~r< zwJRr-HHtWqy1EAX+IK}97E+fd{c4Vdcx(!^_a8W(FQ^x;&YhY2^GR1>Hm->s`@Y+E zxWgOaGD>`Yb0b$M>1t_X_}s^H9MMZE)wuBB^Id~|J=*L_2F1;NhmP*vKj`cru2=Wn zIzO*umgm-rP0fw_JB}zXCN9O7&;RzXrY&kNmlgEDf#b(_4|LdgZDV6)WiwmI>yTc& zdZRqD#+QmEDtNj>ZT+w9b0Eoz&1)tfuRdQ!{1T_p;G&}rehrd?KgDrX{004;0=CA@q)h>BNu($+^ z%TeQx3EoDtx0;;PX207Zfs-6o$zkAVy@9}fP!9Og@qeuFMam@ z=?iDBO=R0dRxW5%Gdi0A&{DjVT39M`j+UPNgMBul2#A;M{%F|dlQ1B_2s6YGP=h@R zz>u+Aj3_{Qaq|52GbhhZBPqQ5t$jhW2+SU}1)Dswz!{>C07`OsbLztN$?;oLt4ld^ zCQ~jey3T;qHC&!-WJCanF{G;+)5{ntJfZ}uOX^keDTDx2t(@K%yE(V6#?8BaIM98d zGZ^N40n?lF8^2wf3YesrlQzg;d8f^_cKh)jZfT!WeTLMu=dJLju+)GIC3V5FwZoc!U_kx**#;0bkJL^Vl{Tni?XFtq}(UNHQpD zoDMRF1WqX@rYELni%Z3(p9~J{8EERTs;aBJJhQSib!%y1HQp4C2$+|Uzdd3;ysxLH zqZ!yLtjiy)r{l%tL_rPM5F-d4r-L%K1u(1H$b~{NoleDKYqPVn%S(%8MThgH-eIMypD5Bk0KlzSRWawT<@wf=$ z>tYtq9=_djQ^eaW{+|8c?b&}v9tdD0e+UEY-WS-t@3k67>2|H7CZ>a|{Xb~y-`XSq z8h{SK0RjNKx%tK8EpU8mFRRJw={kO-3u@uE6B;^xcnIH4Pj5G8MgY+NouBnFxF3lE zAq33UW%qae@X#IkZSB&mW^d`EQ{5iD zX2Jk~AZ&?t?z2cje&dg?&ClFiPNfU2M_zyK%^w`-4N6jeW1VWgw%%@gIzjd2@d?Hl z(?KhfimS`ktVi_<@9l^l@V~Jy+|gjS6imksAH&wvXr@vIsy7S{eVMvXd77f-$W z;l(ncie!;QGupoUm1&4z66)Xc>RW&G(^mrm;08~@8QdZ+l zz+f zmxq@t8K*N8X|SQ`L|U6KG``svZHm|c7?L6l;ilFW*R7>ku8_)slL8<@IG)1@2<8YU z0?#p0b3|SsvMdQaAXL#P!jy18c!MI#5a>pm4~6oKI5{j6MUBs`#8VQr^z3f&MO^}- z$QUXrS({BeqnxUdTMQTxuTT2x_S>BIN0CUcRS#J6HSTl6P|Qkl1(nRn-isM zt`J*``TY%oAUs{gsoH*N-WKuL!pAyZVq2;F)@Z1mG3Ra$x|@T$@3>xeKdH02Jq!5u zuAxXNWyW%UmB&)Wdbrk^)}TKbBNiFNCB&+P3t&JgV@97`K!6b90Ff0XEs}U9TT+)DGyJ)nOAc5Syp#^?w{X zR{lYSG97V(ESk+u8_zMGICkxOJKR%N%39TR7-NhwESN>f?6RUrLv-kXE?8`469V8t zi1xkkqm}~|Wb?`*7Mb`N3rGyPdH2@uB%qUQb5JH8uTzvVHMJW^x_P6>)#>&}LYGZ9F zp0J0bUayU=r}${!!0!zlvt0i0hW%1zo3AkdBr(AQLJ)|pn(i^6jOhqrS}f<{qvJ~j z;*~wo-XM`VUCqarZ=Nc9Te(1EVE)R|Y;l1O47~9|M}Lb5R0j-zFak;`Lx8Y`VQFS^ z{K~~uU)$c@>QZVwLph>R;3%zYls;L%VhjP|M3bv2V6`OZe10yjM*Mn%MOQS07{VAc z!~p^waGr@AXLSoU0!Y&}sw)DaK&zP+=0uR>oJ2XK6;w(Y291HjfPt=1t;n#~=5q&w zo`!RavA8=`32de@wnn|}-9dqlP|5*su>j#I)ez-?@R*4R3Kd6LlkPlgs%fP%EhtVC zm22E54uMdO*^D8k3t9!#l49@=7}8ZH@B}QpjuF!V6aWSwnvfkK2?M57S9JoMQF}pH zri!5Ef$4xX%2#w?JOIW(%_y&d0-xU!_NyRUBR9YpW%GsQ<&~S)Z_dq4Clebc$+Bnf zzTJEG*ey1T#d3R+`ugGH=kSw_f5|3kcW-Yzo*JK;?d<9>Tkb5AJw-+hoMAN0qefcK z7{&-;3<#q;%MG9dCc8O53|* zVyk}DfXTSJ`hg6=^y(kmRpwBw6$e6yF8QltJx1AROMpP6etF3w%KnOsT9UjR67!0~7XZKlb+rA74 zA!ali;5gY~H`%Rh+iX@NhE+>Lb*m%my4CHA{Dn7}y&bz>LQJn@v+40Gn+z%(sm+88 z0RxSyscib@nVYco?xv$me8EV#IojYc0k12?_{xpnUcb?_Z}I5yms_>W)Txn+S8vkx z0nQf;G@ypQK1uYq>rLwmm&PizQeceMGC^QWMU@mt`(A87X;oAa zry*W98aY;zEJP3%2qwfCh&Hu01}!>iFNpEfzuxz!+GKUdm)Iz~T39e~9 zAr%B29;fUXt)3(x1e&I2bGfz^|iIPH$|Ijsm?byiQJE$ zj2OZQ5JHkH4-5>PI(24hay*kg>~K1H{^`WG2;B+Q8DOa5lx-NMib2@6bg^#FBEDt! zFn((g_dZ|J&{!~dLb!fhS6JCj1jZi7y=1!Zp^Vk=T?Kj?PF$U7bPKF6-D z7_)nlQ3mXepWC8EfANNer+$S~$V zw6%?eF<{JiAB+jl&{;vX0u45tjWI?k+sf+Tc16VCk}}2^V7wLN*w#{Pb(W%A3%@`J zAk5X)`%(3<>~8Nz2r+`|LG$aIn!mMN@Ol|#r$0YYviN%jf>>Q$pT4H&%4Lc2CT@#O z2ZV8wSrjF*dUIZ#`)JjgVS)C(Jq4W%HaeY1U^-Q&&W$dsGrFf4qxkUIi{~!PwX`-X zf-J~fcuz0lwA@B2&NHRJ)C%YfvD#)`j^_mA)8-Nr%4gY4r>seVZhwbjJ=76#il{>i8Li~sHj{ z()EROT-&B`O75N7!$1$!WG;;S?-r zgf~hq)htQHgc2SDfXyFjY-{d0`#?cj)#U>6HZ}y^HV0#IgZxC9#xN1AvgC5;bZu>Ya&)?_VnJhbvp1&GS&ktl2naCn zJTDTYrIr(GzU2*Uv5RG$DLOE!Fs5UUcZd8=^O~MqxO8h;LS<|%D(mOx;;E!5)E#ho z9Xu&(pb0t?RDums1fxh{ReW33AN*=ULtD$Xln{{W=gr2t6f(7bA@B>X%bHv-`Yt=VvfR!0zA*7~K`& z_DdLJgfW5JrHYz{kU?&T`;}%5J}E)4odSSsY35>bHxV7{eA%2i0-MH(^_4 z@^57pyL}5r-FB=G0{{ou#AIIMF|AHQ3;-}Nled3pFH(esa#`gxRVmM&zxCnd!tfOQ z(NFrC{NA>qfASB<|K`1!6My}0ez6pZ=SykZfg^7n?CK12j55SCgp3L<7EHusLplbE zf$$g*^7lIr!1qkk>q(_pW=ze_j$IzVG6L|2FYRj|3^eTf$=mDjo5BaDPW@NwCu^%p zrrhzPf3){VUw|vGm$hsh#WzG?*zIw89h|y!X83}3ZB}ay|3E-Rym9m9`D?3|{lfl3 zW>-m73%Lwy5Q`t?IWC4B*=$@P zZhPQ+ufO{I?w&BfG615QrdAY%QECrZns)VdU6{Le@|{bUCtBMhVhZwNS*PVPE#w(; zNj|qPWZ~ZX;9vi8;=uCUcaFaKe2a!HoIt(;MrNow1>dv9WO{`84|^RFjD&ZdyK zyfDK&{gKySd1+6$-H|WNs!)n+rL0oc7!yDRT&8AL%qRt9FwxLAJD1#tpNs)?L%kVU%(C5P6HQ`l zZ7tyU+pLzSJ^j6NyW$sLI7%)EEp|O%yR) zjhzS(FkPcs1rUSUtD@EKYZeY!n{$OqxuWQ5cI?#28<)q=pSs|3m|7b3PZnZCNR)7#eM)pWc|InVH*094QR=iT6@4#`ywYEpBNWcgLr!~;| z(i^(m)Y@#t0>+rLnLW+T2VdQ7&4_v5P=80*ZRddicKF*4?0;1(nugc&YKe%l-EZ-? zMLYU;cla9|BCgmiJueM8EPlS(Z59b9h|Z?A=UzD?j#=lEIg7^|XpC6*m|L{KKwF5z zJeECe{kvbzziuAQ3qg<7WXH(nZMF^^|DHY2)gBQ9k#Nzr!Nado8-Hc40w7vVeyh*l zx@T8^f3sJza1>lkeJ^|`ALzB)u!#U5tL$yw`|1(J-xUg3WS)GLDcu0Kic(oxTArDi zU0htqliK)=ZYoR;$%wv0#j$P8!(RRSLp@ zS1Dl(RW}9JS>v^YIss3wB>P-T^08TB$YN-x29)X|VXs2vu}V*LWT~eNNx*p|18|hfqQ+5Sv+Fx_WVCCF6|G zTNg*CE5RX5gX-ei?BYf;QDj9Wo?M8fSG?AMT@-jyfAmkd@P`-!;B97K`@ZiwBeB($ z)p)K52w_gPP=8;uM{cnJFe%t`#1`&pU0X<`i#e5JZhwp4+v>G&9H(&&mWbsAON80% z#EMM}Ky=%~{crxDg_E5&7iZ!y!bGr!0{g%Je3#y%O07Px+bjYgV4S6)yUp3?Y1y^3 zmW-t|EV-P%V1wTqumaD4j_r#3_O#}#%y}{kDyyS1|Uthaf_D1~Pj)3)$ zsvU7Iv9+G==ANG3_V(^TFeph9!Pwvw z(Fmmno?7aVp?j@qS}K()6bgz`fxDL>Zj1PE9OrO29S(ba_IyV0Ev1wYGCDf`$tRzj zIdd|f&k@1_82#$%w$o=d1^|@mR*U7}p`$Op_~PEZyLDZ!?sxs>B2JwN|KJ6vr)=7L zD(?{>UDvbO>^twg^Xp&#x>zhwTHVC-%wIi1z!;;tws-H)i!Z)(@X#Tv)oMib`Xs#* z(XCNn#)!$BX5pxejTKg0-8@#?YQYeqfQSUxWWz!Okxf`YOfBhaWAihM!^?`zBbAb? zqvtMd_8xKAY!YJ(Fs-=+7EDC80>-ykxWm>p- z`t&blT`MGF8_9Sc&BexVe)q~t-}^uRpe^c^q268oiRS}G`!kLgy#9dQ<<$&jZon9L zNg$XpK!7;jWOFu17H34GIv^mt$a5SafDp%V*kTnW2@t`|(8!iWNsL6ifC=F-!3Y3h z&SbMkIxI{BEb<&7nAO^5U|w|i+GMBNqB9^o;RKGu9034Ch+wlvWGgU61P%iL#zc^< zj%cSP(CVk0z;h;^Fvb93gpFgF%@(nv)2mU$FfWJ#hj>IC0W&5X$037Hi$%%W*g6nu ztX>Y!a{|Ex1Au@{oGoBt2qR+rpdj$hNYo055Dq^eRdri4TVw=e08}nlrl+S*o;-c+ z+I5@V(%ISh`s=So!a;|_DakS~2pE7d3J6yvFws-wD4(mJT&tWmH27MY8hq@xsFV946d7p@ty@9LGBxp10rr!S}!a7U8&h*7Ypl zTVq%*Eic}>bwiSHFc5J$9g3>f1bphYgY$lbfEV~=B9%;KM@DXSbad?9yZf8kXsuHk zPsBg{_@njp4MkDw59mwgm#v(WaC`Rb85$arB*_rsuaC>S<}iequIs5(dU0`aeQo97 z!QFzuS1J{ZpK**w8RdCS*XZ2b{O0D`=;+AqJ$oz`OTB)yQ=OSoMNv34$Fez9W91?x z86{WN%c{=l1r{H@xI(9jj+c8I+%`@xZ?0ayG`*OO+oDGs-2tbX&&*%`@VzS=SlRvd z+kKYBxy16#4^Ccff;}z$eo?Cwb;^`NDPN+MvZhxmr2;FIKthU%ZcNN3W>+hLws6pG zcZrl{Cr3ud&yHsu&CLw~pHRqcj(vLh+SKKoZ{W4V{mJ?4`sk(iE;_U!-)`B{7;5k@ zim|1+>6JE@wb7?!XK$`97t?&SG301#KH&6Wvc@mm+iZk5)>ww{i@);(Qr zS>o$K?Q6v@7z-lDiwqE|sd;WyP5@zq5hoH(yt7k=fo%vO7?W+aLxM38O~AHIObB7Z zi6##2n5}BE$V4!ic+mv6Ta{MV{tzM@kC~ybQ9T~U91;i-n5iaaT2s|9zKSv7C7A~R zR&CgU5GEqI{hI(7VO})xBHZ4CbXzqQ5n^x$s+Win#)81X15`)13$kuqrmCu`WNK=9 zdU|>~m5eK@-rwIBi3D0&TBFfMtJT7BoFRC*MbLU0ap9M(Z;7JlbU8zzaIsVzA0O}N z?35(=sY*_^Kb=CcaOLvlTrSzs9pMC0Z*!Jz;Z?oEV zYD}v2zGQdSww{4p=n?U4GLeYKH;x_IvwLt?V`HRPEHK7MwYa;T>30|Fum0B4`<5Xf zY%!Z>X6G+oxpn^Hcq*0J{?NZ>({wEsi~X1X@~5%26_aG5lme?$;6En^0YCtR5M8Gm z@zn4C{?9u*I|V`DIK=9Or~6h6wYi#l@v1MN#TXfjhTep(%y*@=_@^zdk#?o~@*4sxUt{I?m}@z$5FH_~`Y^ z@porsTV+>M1Fz>+CqKA6o3IG&y}MhzVRI(6eDlK-*XC`90&jf(?Ze8=cmC#`UtK(R zZrtN^ba=g5aw(C_t*^!63#rXiLCLPnk55T@DPSYb*7dpZkrNkI{hM9wVPDit)%Ek| zZ_W=V&0WVkTbrFIvoU+}Z6rYfBmmcd^YU1_Vw*=54X3pjYpP8 zmTp`fB_(qRt)II(zsZy4108MtJ&n5}aCk_enocn*nc3{G&F@2D-2CEOFT6DL!tRKz z9?!nUnPofNWUShRpt^!s6PMj;Ey1<~FVJ1zy{$I^09*US5!@BJ7;O98_8t`s5HLWu z1su1Ii|**rf^MJa?cYUPM`yKu8(VDv834n8tJ7rd|Ex-ks4d*w@pJbkBJB1zzYsoc z?IB`}sft=G71OEI-2B{?D_18bCLA{NzWvWVckpn)?-c~m(4REEh-zs3X$DE3<2e8T z7-LyBclYc{CX?5$T?q}vb z&9ZE_Ssiw(z;ldIbVudwzJJ%>dV1e7m^oIf*=DoJl8o^;%>L3;tz0Y>3WXPr9sJST zZxoAV1`MM*C++^BMb~wUMNXx&|F8e?-)pK?EEXLOC#i2z`{E!*uqg62yUpRS0|K7s zw)OdX1_wT+%q&ZaqFSwH!f~pq*OBcG9PPC{o|cM8pPJ@dKL#@~!wSe|z+^b5AJ-=2E!(r-`CZEA&d1y$(SpZ=@UzP5e4_8tGj zpX`hH7kA4OfBQElf16Vfqq;@|gKr%Fr$2aeDAHn!mzKvaj^}l6-+_bQ?Fl=A(ft;_ zyyw=Rmp7WvP8p^4FIi%O&G=6zfiKiE1hWy}!sMvrf2wb7gt z7@$YqbH{y^z=trx7#TfOD8+ZChUo6uxc=7D{uVRb2xEkwf)1>VGOANu*X<5#OG`AL zFH%asan$`Z<6E26VojtZNuX3$DoP!?JQ!AB7**pKLinCO*3Z(wXVuvUBSJ7Cn6dh3 z+R@m97tOxN;0p(weGO?U@Pg5qMAeADr@h@NnJnScW9I8K6AOr};2ozN_IV1k2 zW|ze&w(JsKqO>WIDpYjJCTyKCg&H3}CbiH_#L`wDun4Z0*S3(&#ml zI;{OB!S3e}N}p^-{{;(4=;1zo|F59WJLp$8N~_(v44A6xS}K)VU0q#TTAH6m{CrM0cSwYA;tcJn-E;N_h(dp`g_831^J4~D{$Y|722)9JL^?G{B-bz>ZQ8ZLq{ zMghp`>gugqw{p200OL4?xrexnvh|8+wP-9@~ES+Ukn_btf1I4Xa zA-KD{7k77;;_mJR3KVT|*9L8HcM1e|cZXud-Af63VBYzDrXo!MX>ds*jyGm|3tluxKym>Rx^O3m~(801V=mqy6UQoJsO% zh0y8jS(;aSJXt7#`ye!e!@t!?p>+1z!y{QUx!&Wt)v*f2@em)i_NSRf-I__ zj-4v5f8FJ8UflH*K#I~?GOHnjX=M48jU0EjJCw!&D% zX~-~u;wa&^UCY`lpCR#v4h{~N{Ux(UJN$192B~l6hrhHmQ3m?g*8V))>}XK3R0zsM z@50%5=*kADwog)I^Gl#Dysv9*v($;0Yn8U?RFy>|<&a$KyGH~rM8b~`Iwe*L5_0?(S2Eqq02 z;sTuaUH~qBXwZ2DDAlup@{2{Hnh3LlVY-U%^V_ig{DqmFTbW#IZU`b0cNQu~Je|7U z`{~4E%7z;Yl|jX#UZ0#?S~AKroGs5E-XltE%Q+}kQp>OY+eyf+B@4}W)Y?L(_?*v% zi?ZG!K)mU=@%E3;_l(D!oH13QInrg%qg9T7ZRAKfoD{+n6qbpEx1USR|d* zw1bD&ZEtDRkoBVBvs&?x92O&3)tLBm(DC{;JofSWv-OZN94ThyUgJJfvEpU6&F6){ z-gLw)jBiSfNFATPRT2$XMr51+Zt*{xX|=-@nWB|FCO7_Dd%_^mMWCAx66 zyRK6ujDu6^^v0c4BzWhl&Ps>a-u7md`VvcHMX(FJDxzL??C_9Xoyt`Zw~(Ge%IdGJ z8P-PsFF6a<=i$OSg|mXwEL7eLV)oI~_%>{K7TK+v9rPZETLE@~tWSxGkttE`EayL>POPe@=ATwX`%<)1R?UQSw5g_7iG4{qfAJ zT5#j-Z>D9@b?L7G2{%IpUZutem2 zJt#LFQLU=LY0vp*#_s#?bXZAHoi!agZh>p=S{}6aRj<|S;1M3X4D|5OB;QJ>mY=;5 z!tFfoFstB#BOi75aJU|?oxVM4^%dT(5mKTpkNKC^RyI&j@wMtGb!ld(H8wx5L&xuA zfY0=8;~YH_MoO%}TD@W)Kjf|Q=$QJx;+T^4 z7QfxKWv*I1=&k9tt%Z+|DnIU(?^+TwPMjBXB?syw+aZGDO(#@&$ILmNJJ6le`SRJu z$H#aYd1H$n(6Rl|BgrWuI7%uEC^OLz!eK(h(pZ2VZPRI29_}o0Vx=h>2X1}_MJ!B; zwe>cW8pdSA#M~%ss+-BuJ?!LCspemfR(AFd?0Fy7$T}X@JiuSnGEh*+VJW>&iB5AT zSjXSrS@YIyy(}??e2@C~V(Kb*Pe0cz+BBmmaC8Tr?SaQ05d2PT&CW&!aJmIK0>KhC zS43RNRJm-OUccW#CWiJezYkpT`A_1zA7YQ@Eg{DzpI@Hdpgjy2omNd#(vtlv+@i|F6xAd8vMi6^RX<% zaIo2{osU&S`oACQ#VDLzCgX=7reDVvCeabDjL;*a7_Ky&9Q$RC7;x)Y7#%4@z!fZ{ zwSIi(gzV!FQZpeVX%*lRB+#_Vq%?~&SHk?$vFv=p-%>ffxX8Lg>~XLpESeSCbpjc3Tf?h zp@DAd>B`lLwVkGqccbsi=XzvMcnhud4--NnZ?;o5pFdUO&VE;bXB!(+O|vc|B>r2! z6skM2vhsKAcJJFKs836I=+sq@xkF9dyOe5b?@pf?uL6&6a3YXXo6{vDoBBWogIWuv zI6to%w@_{`NSw8nUo`k~hS_ia;3^y+5YxI}J`l@SBCJ!sy0T?omm!e+2`f3*M>^L# zY7>rF<|B{o@k5id4}1lFQi7l)&uMhaWq{i#H&ab986+$Pc|4**ycFoDb+15ej%&U1lG z%Z`FFaYw*NSD8*}3_L8&Cqf0NCW*zIgI^NJW#*0ClOI3I zM!HJQIn-xSTQF?|mHlq3O7r->H#YE*E&uVs1^**)P&Vpa1T};m783f^WQe(1#YpgV zb<@~%O^^PAZBqNSUiHrM{BfN;ahqiH^NCzGw0_m<4IN%V>2p=a-MpfF1W0f`w-`5f zw~=8K?c=rJ-rnN->%g|o1J=JjA0H5<7oQ)LvdSG5X0co)cuE0g#6~lRyTKZ{;t+cB~T6qB6P2a!3-YB!;u7N zEuxlt))iPnmmH>iKOmY4q036FoZQeVYEWSTs8yFG!;ABM-yE%#Gp34DEGukAvHV;A z3-<6u)qxaU5(Bmov31CjG*KrM+U_O{pi)r*xEP6#m^#c6v@N?)@~v&l^EiodKpxj zh}NSc0dZ~u@UO0|ETnD9pF^Tg#UX3!^ZPYIOBi;Sy3H;&YfB~0+Rahj0RSW_l{$s^ zsJrfULg5q*dg%zv-yB~1H!h!{DV}{a(RDq2cQ?6C4oxf(B-<97?}PD^R;c>9S7GGH z1Lo!j#iH-A0vf$Y`hM(KyYhuX7g(HnUHeAn$8#YMs^>ZUuSb?e%-^094o7(yToD8z z%hO!vAy?V=k;~WXY&@?uvxN+8TlSvcvPkeqwfVe@=>)~l$X1VyT3T9sZ;$7>N>#s5 zMo`9!`aYK`E5`?$iltHK9mZo>4TXz_Cp@yhSOT^LHqP%SC&zy!L370bX#N*?Xm8fc zO_@1ardZPYX_gQueCDqp4N$az%&#M_X(Az#sIc)izW#86M9970zL9W0uJrCF7rjP` zWr4QrYuXGMqy{|=2hAHf6RrnEj`0GQT|7w%4#on2+;dWkaz^nUkBcfB#BwGHE-7eC zVZ*5e#CN`KONs_VN#a8iv6UEpNA;T7yY;#TJCY`j*z4ZG;Y`Q{fDC|G>bO;Dl$%aM z26GZAa@M+4_4>?Jpy_p$OujU>ABJekoZ0{Ns)uyvL-LUvX4;*a6%Gck3Bpy52o%&= z5tfWxBK4tI$F?pQ@I)i2D8-IZZp8N4Ia=B<2tbQ5r`wT94-aE6FKfpm z3jDaYam1rEBh;qviXE_^y{nvKN`5}@&xmUbx`a2|lE={_*PRg8nG>;5mn z;`tt};h!_Nrg2}G^pEkP3jv9>L<;W>j3k+%IWLi1sNe-cOGmf3Xwe$T3e6Hhi_A7O zAR_9+h?3-#|BDe4C{xM$v0t^zDXd4fZ`&@Bj&w68H7F z7|58aHUe6hP)T3yRBnD%{Gi+jCK$ZdspP>#Vqs;On4BP8YM!)jB+$Lqs!c&3_K)kK z9<~-w`x&YQCul`%6$it$;&!Z1t~Qj0k`sIQ+Z!PZAW@#m1n=Shxs5rw7!+ro)yU2OM_FmbE`)aY|M0sT7f~x{>d}WPb`8mLY$m& zf5fVvDuSJYJchUzE;QZAdf6PCBY0`Z6t6ybXv?7ek_yhj|M=HRatCg(*w^k&_wtO|LcAj z_4)j;<;a`Nls@7W;=6DNsBp+CIWg_HJ!L?!&cOUL50BJkKGm1OH_V&tSQ!Ik+V`at z31FHOZaG{stK=d-;HsT-%vv&@Fbg-9QV?kTsaz79Gy2bypTt_9TV5tWRBE(-ktv%= ze(%1?8y)J&`R3^EWkprk(l@Ts?nqmaWg`D8Mj-WC>JNRpzCsn=8Mr-bg%~gB79X^- z2Vu815NP*%?SE15?pwLO6ALhmouuT5z#P0LP8?1q#BJ`QmMEyOZ#A0u^15AWIJBuSKw4rEAWxuWR3>xwnRol>{$8uU|MmQO7$=0g2gqA@WZ3=U>OGEqEWGiB5BV{Z zi%&J^=6s^kn62w>A<^V7kINc#9IN{NZ_Rq}oGj?e-_#GBU!YW`Xt%N&ei66rxp+Nq z)%rb$+SG4jx0At_(`=&gUav3RLAPShpJmPWPsu`D8H5b%AA7qW^nEPL)@ScRmIix| zkG`GQQ2!wcCBlOFp;MJYTXJX@>B5T&Iz70O=tBCGa0o_6_s*Y;40UYO3RbfA6kG`_ z&nj{H?V_Zrk}DEI(bUv``S5UwZ(z7eNJ!|YQ%N7w>{0GAjQi5_Vj1y+f|)tGsP9X& z!FcVGJ!9%iB&A8C&CeowR1ef)UkS{Jk`kHb)zncdvTZ~f`Q!8RcyKkix;im29tn1H zY3{1wY@cHyD!NW&1}6a{02=SwD)7mD8F9Vq_=&z!EZE7<-aHW6-HYyA2`V*COTj3h zX%)0-Ot7+~X$Sx|&o;Hoi|Q%E&uS<-e@?2>%@-j4C^|m!t&sb^x$EHSnu8)nz``W0 ztjjJfH*BrA;=lZB+KJ?tKLH;e<_iYBIoecTt-=Y8*!sVCMWMX>j!u@1W@!;1P| zIQZ^Fq_bHEkie1{Ft_vdeK<~4oYlmsTOI>U=R&^;q|4`U(dXsKz|W?y!=KYU0Tya} zI!T(EnyGlLodNGvq1xDR&7&l4QL4ejWFGl1b5`D}CizAkdOr|~OiBmC&<$t-g^Y|< z;C>AphU8Kk7Yof~Q%nH{+{+9>Cx^v}T(2o*O^c(o)^dFw#-=-d`F+^tg2fVBty8tY-3v-#V3xyR~}En%A*;k!I8@ z(HxPbu|;uE`{R%RVRpMj4x2UEJc|PBHA9v(qv1x^zQCr)2xe$ zYpSW1ldmwQY$_u1o39-Xfy=##6z`LEW-Z?00>pBjq)*fKZSH42yp-OdYk1rckDi1qNR zCC6Sf_019-{!5$a>U6@WM=DWMWSZy>-W~fsaKzM2!@4+TyPV`8T6btB>(DO_D4T|p zWzp85)8)HjqHj6bG7C_gO7OEkB3u(9Ps3w}G-!>*_exiAECukGea8z~n0e%dgIXOBK z5)mnbG_o&!`EmD<9tp2MLbcj)BUU`A!@t2*S>p$HcM0JAds%m25AeBTLybSsA<&+u z$%GjXngRj&do)~GVHk!LrPSp*xMfEBc)9f0s`$+ZCp(A*$s#4eCe0;BrO?}BlWEZO z^dH)aAIq-OxqIT^)tM4`+AqPInZeQ~*(K*tze??Xr&a^%l=pM7R8Y)iXk#)64CYEy3R|4W zR0jHPkUDx__4z)o%zL<3#AUVpR^ej9yxV$iIQj25D)2sWKu6>zg$XxI9aDr9=?!mz zl(+vo2WFO=QLagXV6?8^W8PQ}XaTrkSFH1LeJ=1==HlEU+mZlQd{}XbJ!*q0>-x5P z{`KbZbzMi!Gnb_j_gW%S|BHhG^zMnir*{kZxMgT4FjUs7cdh)EARv#VkGwrP8b;MU z7+bHF$rky-bddq8$CB_beDmG!xO&s{;g;=94_(SM=tQVGq;zrD70aR*h2ocX%<#Y{ zU3&T=Q`29uD4Juc9(r=-M$#DeH?YI|)84pZh@S|d;2UB9;>Ql)J`IezS-)Jr9lV2| z*`H22-3IO=$YID$ebAW+*YIF6Rrm9JX}vC6C)dj>YyIGi9Pq=7t$T-I(vX^QlQeY7 z>~C-Hd9(0m$GlL@(cVrZ_(4q9rW6{~OI_{_+T3ZqhJvS>Go+lGD{DCvFuPlS>gnlS z_=yO!%?Z*61s&$em*OAd0ZOilnxtkkcC7L6n((w;%Yz_ql z4QS+pR~X5VFfEq$&YeX6J{=D61#Um}@6jEmTft+|F1Ze#ch*$jr*^WaR5QcCQ&KIe zy;mjSu^D#=3umIS$gYN5U5na}+SMizHzMO1!Znll9m%Z)I`16(nIAno3$ABba>O$_ z$lEfT@>vpmSwwYn`WD;J;re&zI(*WrorRKu1+i%9FrWGh9|L|-}a|Q za^8pa9A|I+k8c}42vzi0$H&)4hJx1@IdD@QcO>ca<}RK7SGiL2$AEo6b%n)6=(C1% zQChrhN*2KxHyiy*@PV!vHJ9%kb8x`j#_x) zN$Vvk&l_8-r9ZsIV0{FHGJM;4`L;Z~r$NN*7egKFJ->WWGuk{`d%q+^W-muv{I zc5L`i06?Q>56ZUTjDdln8JbJxbWKjZJHul;P_Zr4Q`Z73oon3@0vQ^tXHD%YJCdDfR!Z{#S~eOa$BZRt4K|#Jx`6&`uIT82oG(~?3=Fs7iJdkO#!_UN{wo+}?)6ZCmRN*F8*5(u8 z6g>sfc00juHOtJHH|z~#{~H;IcOAb9B|;YrRm3cJkh%LEB>rb>E6pF|#x(!Qu1n%- zdiz?vXfQZO$VZ0P5D0HPixh>)YkA#7N#uB`%>Z8#j?vIwYV-c~A;9~bHyas*Mqy++ z);Zc)rj8csLWDIwr9VDrGN%Lu$YncVm*Fp|MIDkpCrkxPMn8km~10KNi?Y3bAOr z*4w?Ez2#|*CUC9C;^%z%G$4?X!~XNnO{17}_}*jGjGWXt1Z1ivwk3u9RI@( z<~BQJ28@-U1)POAZ@56|UWz+NLOYjI3jS-lpSnbrfq2%P?RG1QGXtoi;^4aV_BQ_U z@li3IEp?P8c7Pb|ThtvIv%*@YTHZo6yjp1g$%5Y_rACY?qJE zr=!8$(RyiVrsJGZf>WV8uIgn#NptL8^d+sL4ixO7+6&{%8&X;4yNfzeDNm z)H>t;?mi!1RQBnJxNs)j_BHl*Kt!mqOv2kmh2+~c6%3ncYq*7JX@KH_6ET85Bns+d ztwCt*=TYWTC?+0MSMV}M1SFfyK%>J1bQ#mUq|Y5)(yhL8*#E6xbTaHkOtzo>X%m(I zV)hqLQ-(qNWW1z{CXxf2UuBCwkBZpFbHsNg`5{Y=Uj~T_ZQ`qK5$IJilBoWcs|{$#B9+hFnDDZC8GuHhtycZVl;a^nbwy{5g6! zUOWApG115kU4_>})*X#yS%jh@SG}fh?gA@9z`%O>r&ZMuKJU~(Os4>lv1b;hIU3be z?GT($niW=T9g1)idvw?qM)RF(?f85-QTbSJ-SIC$mfuQjHe8Cdhdx0$gBr%4gXs@B z%!wd!>J9Ua^Yzd{ z;b(T3YxKo&uEaZ;wDgzm%fC{1WC(1v7QGlTF)WO})gb}dbC1WCx)Le}i_t0uWeT`t z$|1lHN}-rt8}CidrmYyw;g7=z`IJA$GOVtv^6u8#5#jRa6_BaMwi58Xk*4bJQ6SN~ z0u`Fdvjm{XF*eX#v_ag=@eUQ_w>53DQI)M;Ppuv!lwH;aY0@n{X%ay!I$a%9l>q_> z@J)TfY}Wd|JU8{VJC@Ep98cZ3`NEn*vw;*@_Mxaa!r_y$zCm27(})8$HyW#*hO$Qooa4Y4`LFAP+xcWim513)1%Z)cRx(qO^q|7m~kME5`kLZvpiA(s9#) zpGA2;w{~>YwAQA{+dz-PFX(Ts{J04bL0t&qTg?lJUGwcu=Vbg-k_nn)K$;A=aEkin zobdx4UESB<_r-56Fcc+6{?I;TV4=R%2zqcEJOQNy4d~f;?)F9SlT1V+bdOtSXOj8| zp0TFmh=5>bFD&EKQVY6Sc8UW|u#pxQoGOVD;(uCGOCwppp?!dj@EzXS^x9+TZa2la zN(yEF6Ixkp{R|xs5>zP*s=YR5NpY?)QrF7*GkZa06zvFaO%2|NGOiJrk_Gk+y(h;f z=PU1Pq{%(nBhq2Dwb?e6gx|2tC)b#I#7c1~Jav8CKh!vPN}%_$L;#D!}a~mr_8u#)#GiZKzzFIcu}x{+jHc^Gu7{EsA-uYn9oc;Ix=ed!4w02efH+z;lrBp5<~iG zGQDeonmxk34$bst`}Z$4a%zR?^7H=eI1^4^?T%VOU7U?-{+p|{Cr>hCnvxMkZN}rx zI=aiC_{6^Bsr?0%>+d3JpF>i-&0-6T-+Nkj?}3j)y|pPQRBixV8r`IOi8#Y_<@(b$h_mYsB% zXlqCfp&_oP4h-Z(AJw!|8XHqRX}=*KUi-1&jq09%v#v>jUJ7BNNE@sQmXy*F5x$U+ ztP{)TsSNf$^xhe2^D$_X@knaB1_XS^hmkOJ*bH<0_%HaCjwYGpG)!MCXWH>%BfsBg zM0Z0R{-J`B{eM4SrGSuuXseD4WlY6^d#e$x{y~dIc?4F~@r=vQm*%0j$qA-JTp_rp^B>0sP2) z{qscsp4raiuvT-)34~FRJO}S2kcN;51fqW?y_UOaCVBn|I!TQIGyH9&h(MwM0E)i3 zh&;?p-uvv2k${8KKV|li2;M}wG+Ex`%ahys6ghkMyimEkr54G2#Y!l~#iXoT{}cyD z5_hO3`Fy>3+4ParNX44zcbF9;eBT$BlYr z3{v5x_2r{We-^yTVQO;%I=cW;LCiRGA9DG~|_M`4a+W z_?GpoSke_VahiQGo)Em{lWu_9lonzPP?eKKT;9uRgeZGATQ(00&1BfSqjVHo8(x@S z{Ww{z87!RJ-|JXBRgJM<(CbBS7o(N(m%SDE8t_6jbQ_LC^Pss`aO1>%BP~1{B3#HEV2!Z;56s=UM0WT{L!VrgizmzkRRz4|?JLLZ$T!Fv}EW8QSwehElO zFuRUbHOt4Soc))=FmXSI|HaCwAmq@y?s*UO2&YMI(;pTWDfbh@AcXymiLe}~R2Rqg zb>*sFvs>_l0!IZB)N(bT#MtO0YFG)SACAH5-b-r(F%WL%P&1xbse|)G$L5Bgg(WV( zP7FXs8%xp3s*__A6Z`H0vGe|ar?wXs(n?AW#K`H9{^a783D&*-sU0NU{s)W=qQ^z? z^7ig{-#A}b(7FB=Hf}$V0T5p9tvvB(O(!BDfl76rBO}MGJyJuS*{?cG;|gfxuY5at z&8X9v*4lXLY$gi^%wO^5g)u3FDK>3U)c$v`Pgw?^pPNm>E)##-1a>@C83)_|^dD3L z_Y28*L6I2%$_z6t{1pET$`MICBhQi0e>D^!yS4;9>1j`d(3*-eC`v_x;Y1KzwKG?B zff4eX172?YxOIC1CGXxio5!RQi|43GVQ?09jNpSr%`|3}hK>TrJ$17wzAX&EPC-1V zy@-8s_qgTlfP_lf-pmKw_Wk1qTd6GwG=sK3;t_;UFM#@1f55XgWmxol*tyh)XujbN z%LfuFGtO4f8I~u}_u41KL}WGr7I$sm`6XU=vK%knT`~o`R-<9dnQWrk%*>-~zNqwc zU1&xhbbUA2oSVez(?+a)k29uZ+8dJgKq^`?cJaKZiA33ateng9rMlp$eYcOd$ z@T>O7z7%C`1F?hC+1mUpRg5{<_8Ca(i%w0YpXPJE!Ntetvp?P%LoMPPy{0xx?!=z^qeg4orAm>sZB``aoiA^CI^OKj zo`Iv4pPxKtghruUe5WTdi~<43Olz0JI?F`+;V^pK-b;{#H#;8lABHd#(eDE*2K2aR zj9!?tsx3Jh(Dc*^JB(IZY_fk55D>VE^jd^v^G5FFjj5AA=vL5(h2nm&fbkI5v)R z;!bWiqU4CkzUHGrm6d`Jy(Fvlag*{C^GZdNL|M!TI&R+hs94OErD&G1$rZ47)GST3 zIru#eOXk7?`4_;f(I9~|2uiT?K6`3Zdg4hO9KTkb#j9~j8Zs<(Vn!CpTYXm^T>S4` z*6DVnzeTs0szJ(*vgpx)$SwKy2D8tGMoZV*Qbb>S8-Ks~Or1QA^Jo4}?)-;h2`)^M zHE2|GMPZxdnU|yn%k+45$)v)Xe zxA-Q$N1$}mZNDz)7oP$unp~##IlplmM4YA~IWYm=2pCFEEsU_NffPRg8ffnmFlQLR zS|iy+M5Bs|P$eEyWhKB-*QI-P|LpHyM<<6=YP(o>)9}9A!#DP_pCUW2oOnuB%N><2 zW*!zEo|YY;#y&@0(ON{a8-y?rX#e~0aKc@JEp-e>u*5hFf5NqY=eC@sckmljUmmf$ zvbq}orlA@YHBbHXJeYhk+G63qOA!<;!{Dy^$6+tuXYyJw;c0x4*lR*ytFA~~FsDTX zrt+-$3DJ4T1;O@1$pNh~bmD_6gmA@<5O+8Lv6a$QjJ;0IQbC5ufDKD=i8v{cfS?qP zFb;^+;;pA(@li{w)ziiH;id+{WjZcp?(c4I?Qiep1rH=zX?}j zPJ#Gd>4NNkH@pVfOo^h4vcAp-8ISxmB!#!O!ig2l(b%izgHHni6zdY$NkX6rZHk z%XnK#&xfWhWD`kP@Ud01MTx$ES9pGYoeufa)0|^#pdbJ4^S=HLh-T7dq?NDGHOd1M zpf?$G0Nn>u6@qUTE{2wt#!drSlRqMS7)Ah8#7Un~Oi0 zyQ*ip=!L%P(x9$(OUN*ry7zMN=VAPkdIa~AvL;OEz0b1&qRFva``DxeQ~duP@PE*` zV@LpPNfx%mtBJ7K)%%4!W~DPKb-#5gQQ%#mj*TPTj$u>dA_j$LRKc9cjz+{Gl-YcM z8rB1?OZSuO`X8TAZ<1j`HK2w0x@h(bIxjybL9Y5MLtk@)Lgc2whD8r>mf@2!REy|p z6f}NEAk{Q)z+!B zSw=l>IaRZcw7TVGj)Q5#T>~CHhw!S_HS-KssWCbX_)Pnbtl6_(uSfSb7FMbna~c$- zb|~$|M84~J@U9LG?V3DbJ?4_+^48_$+RMvtAZhhIqGILs_5Ux79~ilqK1HXi>I8~S$e*>Bt$ULqmShsV)M5)bGJ!NL*iI;BY>1xMz_P!Y?d?6y8d zu9EP>teJ{FR>_B9LfkTTp;pFFDA>UpXpvF`h8Y4{-7cRIz%~Q^)1_z0(N5%xggnlC zQuq`#E5Ob^#W%INb*n#yC!d7&CBZ8qjPDtZK!Rhd#v1i<6T(`e7F>n z*H*6AC?A`gX!2@k_HM|Qnl(E5%uXwuEG$GW0ycu%iX$0 zYh}^I^@47P?(V{QOJmkoDy3YQjz|dMh0t?3h9d3vIR#$Tc+WE~9Sbp2CtFxRi_wHD zy%Y~kF4Wj2UpWtPgCHCYvNI6`Zb@;rwlqljZtS}Utdk}@6Jlb*0>m+keyY&}q33m% z4PqH29v&V}nfRC;zT_))1h{a^9k6p{d+!MjgB23M0!=I*J+tw@=Y0Lq*NGS!eC*D1 zRv|ip7~g&B{JICGlwEK7m=HCqT9sPU9Td=^7c_Z>5!qszM06I&2e};?#UXh)J%K70 z^+xvUhAoe0_Ms_^CWUP?8`C1(4b7d!>-(NrN+pC|ne$%1x+Z!qx0?MT4d5yI_uXZRe-425 zPZq0J9Ty;wzkHhJt8FGqm=+C2N?;b&@gxRjJ8}aO-qJo=4S@^LD!E&Pq!N=H&dd5LA<*6Q zVJ+|b85&x~#Bpr1s7=^rHn%Ux+4?{|H~-~t^8*vyXE-1Cg%h_Ej>&hSoO~nHs?*AL zdPoN53z`enuarz`9Lgo?%ZR?_dLy`7nu~zl3CXA|rx(i`rx@~E<#i$a{J^eYPJiCW z+Co^9kcC7S>_Qnrs1}Bg)7`<}y{L#j1Jf54T^FshkdgL_Qh5s2f$wxffNM>8d2M4O z3np5YRei6+dK&#gaz7mrPZ!iQo0h3mk}y%V^fU|=Yc84uH1Z|}(r_-P#c4v_z}EGj zq;CfeP54aUdEi|BO*Ho936!I7WGsLBg1 z&J{&_Ha7UlVZP{?0QL2{pDwE#Ivy50z~~sO6X}`n))!|w(>v-j1FMAP0^!y!-wD_r~(Rdr=dOjNxD2`G^^w&=gw6U8AhU|Wb5iT z+a|R8x}t*GbIKMuWXcPBN1F;uqJBxt^*!)CJbXTvpNIBq?Jmj@8Y6CNb8~Y--B0t4 zOouQ%=8g7kZx5F&uo0meGVD4$UT(pc7e6gTpDtAsi3N6Uef`ACq_Zp97m9}#`KUIs z!$dlei!hz+_a?8Q8iVX{s9bIE(sWsrf&7Yjt(Vd296sg9nVu>D0L+SRX6`vwN88f(0h%(We5TGX5hm~nqBvH+Qkw}GZd#B|2NxbnCCuY-9x)Au{Qnk zv~=`h35R46cA?Agz|r^f>QRC*m&d z0r-eo@)&4chFW6lEFFFPWTLi;|I&#vi!R&t*UbX2(4ZK61}ms)C!SEDyrcq}j7A;- z)hGQU+3bhAfPWhH3U*)bBIgVD6x3wKGYvW$`1)3L*HmJ@{XV%7!Xuw%dGxh_lqQ|X zVva#~*Bl{C&uzzd zoKlyyj^OvVPWBh;T0P4+l87Ii0FWFU{6CHOl(Mxc(0S0=-p!=wlm6pf_{B@K;4aCd zaYOY(Q{Us*uit#x@iLkU^XRhi{sD&t#`i*T8U-m_2Q5uoMo9noF)VP={z`@*!nrW?gLpzz)tZnCIAmZ4T2a8l!9f zPQG1-;2K%l$utM%0Vu>M+H!n{JPl70;QaaEptyles5atx%t=9aJq{jZ zjem3hCmnSZ%fP6m(Wm0`UUS89 zD7tRmdpsJMno?XCPeL7zIlD_aT-OH`5z`!u80LmHN zPnj`PKa`Mylwtn44w}%L)D{6mKgU_M_R+zbosRV8G?zGh0>x=45KzIz0Sdpi7y=E&DJj*OBFs$rfHwucxu{ zSsTY#RB`yyKiH2(YD0%cn+$kYAoD^!W;~Quqb-l#R1JMv&G-1e9!7QGJ5z<7EzlGwLh zk-&?K>&dQ%f$A#WK1eO~`&o8yUHR4z1<_#6+pXT@qf9?{Dc3xi6nzLkRm6h*IFoJ_ z8*5s~O)(i>%m?|3{9FTZuyzva%XDpR^JY+KwH9_9nM2WYAy;ldX}%HzI_zQ{%Y;C| zMo3oujKPvKmrj!_++iHob$Js(_zBAZI%4r$32h=u$sr%8UDVVm+$`ZQYjdZpfT-O6 zwl7)%cmPPlE->(PH!+DHor?kf&{I~h4T0F)PwS>Hdwt6v&#yOw z&VRXB&F{AcEV}51EtK7w461JSCW*8Eb2@btXl`)cmjicP1UMVqPs)&Wm`m;R!ku-j5~(w=5z z*yJRXfCFcO$)AI|=oPr>MWXA9kW#cz5|~b|?xezXgre@lQx{T*(SVs!%)ep3HU1~-D?qK^~2(BgqzZSKgoPsX6T^nykN1>?!CnXMxd{(o~kP<953Jx zeYv(n!tU+;{c1WZ9;&pId4{nFpL_mT&&FT6K{xmFjXrk}>A-g^UkM2{2ONWqC{z&l zuDM&eu&AidF66fRt+E^CCFhd4xsH<|{5!O8sOC=`UYA%_$!eK+{DYkapdclQu+c^| zqSoEhW6ar~VvDv)Z=kuiZcqR0dV4cy^gf)(y|$TLX_~FbU84QN^A5ea+-wh-tUK*` z`>Ii%2unls>*-!gViHN2BI!F09kdMJlD%IbLYp!VuKMskNr~v!;T>3PiBJQ9kefzS zs_m=O*8zbxIZg&m;mcb-*3R41YNIUrm5Ew@kB{VtPI#E0x%>66IX?E>iz#@B!{X8_ zI|XoMa)z)e(lp{qYI2sW%Eekbgzmu{L67^_-Pfz8?eAOajRsDgMM8&Gz)F+e=ub?iCVGrZc9a>f7e%p-SmLA9yGRD!r|DtvB z$7>{@it3BH6yi6f!66-4pfFiI$;c`)P5K&oZQNA&A=g94TePCX^84O zj1y=oydPW>?e8C7T=evqkri_*&uHhZ)%)%~-)KB5DlDea=81TOsh4S0$Wh~W2$^5q zz+?YPX{!pkpBT?Pdfa?E>*nI%P-n&s2yon-3>BGHty&}^dpp%lPAtj(vS#;EmQp14 z^-q`aFT0{T%ctSJ#E^%e2{0H5E<-!la(LAxn_xrzZMyTh_}L_m-$baSBH4o1`q!^tp`IvzaPZm4{N=RzYLgG{UpOgniiuH9 zexAPumOLetHapD|tj*LV`Uw3Bs#|3{r&x8mm((D^2h-rl}sU) zdbM41Kw$j7+ZNsVfq^yw{9XWhP~SaJ&l|i<+SgMi+|#6GWsLy zXi{vt3Urbae7HY~&)jRpxVrOZ)+R>T^srZwhY7g91{#86o_l8DIDcIWeIJ z@f22Vx~y&_20v&PeNU>86qn$@>mN$cW%x6z=7?Xfo z8mS`cWAHFHe?so?DPK2~u5dVZ4}D6JN9$Iz_&TSNKVW|QQD#%d{x6BVqp+16JFE

k8+0G_}I9&EPE9-2sx8LXc`^V$s@$m5AKA+F){dzsuD^cr{JlAjVft<%1*RAfO zOrSft8uV|iu6{(QNZJlV85J8M`v+34yOCy8Swb>`DXYv z@*oHA7O$~C!_lED@UyD)T4VlqHvFpe^>;F)Vs^6)#gBMhXq>A4uHrdSZHKFfhJjO2 z244)0nW`^MVOsvJ7%e9$j8_@-RTQP?gdzarS!n_&f`xl3y_NnJtcNVJwd>_8S<6rvi z)u^xAybr&iNQy5L!`g>r3m`?x3igzx{@UUzy$Ru#;JUkxP0^oBFfy!4x&25sQ{)4& zdif_z`{cF7xQ>K+x>#bY+S`8}4f9t!7sD!*C(S=M*9W3Ooc#I8JBQ^W;pFyLe!uQZ zV@zGP>y;QC#-IYdzlVp1xrFXPes&QlGTCL48gf1$$=eEOI?;m)a1k@mF@liW+?U;W z(L=`mpv{rp1h@$3sQ}Uy!_LH>9()RC}cEupo!CZ~Cnxrv9xf-X;i2(|~* zf#?0{VeJIL@-AqWL0W?F*4>tqohFXp)4xERN?~E4ES8Us{Ne*A=pA8obMu}zJhO(f zCS;kNK{AzNAw^f;zHjg=iXLTZSI|h*8;)?}RVl8~*DrD^tkoVVJuu4>#Z@w5MWIqQ zN&38YjNJqF-wf$L=pksj)oE4r5KJ%mYN1G@;&GPP3jN}-jXTOF^7!NA@UZLauy){_ z(C5mYUyRZ5@%je0e6gJ%C6>|JHqmL_BwaGet>$@E1 z{_AHmT6Z=FQ>>mx?fm*w322x2lASajMQtI?Inc+>4Dsyoc}^<5;BD6XZsCOaZog5L zk1jLqhX0Wt*$3jsw|jXG)E|?zi$jB2tc~sxQ75^*#)BipdJDjDizbL$g!PD?A4$jN z{$5^E(FyzBcKd&A5k~kd4-ovT=uY6y&!2hJ1t)pOJ)W|7G`%uV6_1ZnQ&Jf0?Ta)* z9?c&}^kF?}&In#)Jf>pTOu^irIO^%{Ifx{5mYq}~LB327wq9XujmLQkl354xxOR&s&>X2wNX*gT{R{VhBE z5UZmW4&w{fPH`0qsu{?yF@lOb31ioRU9_(A_-FrlK`Pt_!N*j(T^}LP@TAuvaox{q+-s*oc2*mGP zK(7#;5AE;ECHA<8Wx?zY)TQOFh{5R)DR;rLYFyR1CV_QG{{e~C@~hJ?p4c2v1CF&1dUOuyVmz=~ z{Su=ek{)wh5#HKz*a3XFGS_Zn9A5e?c<{s=ho)S%i_s&G(YOCKfYUX0**eeCnW*Qe zza0dWL${^r_eB@M-2@~*;uoI|EbM%N@1Kh{HKtE_St$G&36t{dY;ZX5Ra4e<8HMp7 zshpp(w7(c0J|)?DO{`qP{v%UKr)K>7{ikjg$q!&hgt;szR%J1+gi@>GcXU51QC(g8 z*-c;eBWD_Xiq0=Iyb^Y5oCKUv^Fg~>gZ0$mu3yO|C=-HCI6}OD{%dMWTxbsApyRju z$72^-;U<%dy?_f#$`}_LzQ`PGAc^*N@t0&Ch>SctYe>Hi3&WH*FV^pf=3eJ)@F-jv z59Uajm5+s9F6C;`rKzo&v{sjHHf zJs8ddx>_EcoXhdLc`TmdxiQ~0_2J&E_e;d^SM?>i&hF3l+qEeIU0 zWKKHaD?3puV2w+$nTp%2dD!)h#Wz#1nXO*qci#~1>EMM+?3YjQeZiWY4Ilzc3JlWy zA^t3w;IX^VQDP86^6seV?7gdHv<-RTBp!6;G3&HM|7`A1`eB6fWrEytgZ0Y3dva+%^25cJD!n6{8Rq;=1Kb(P~ zB;>>`1ch>C{I3_gKBL_{lvGKMi!SfKbBqO63F`L&cF?x0oScmGboqe&Z*I6CIyfOG z2D1`+vwKr#b+zwNGPW{O)a_8nak(nlw&Pytq#Oi=VycA9o8O#`O?WpnpM@dnz3vjU ziWAPg$Whm*jyPs}S+Y5JJ_+UYO&lu~f56H0P9Ih3qVgObLqnPIo$?d#>$&}?E+W|*Tn5bSm2#~2Ay$6}98?%z7!S6aB8lZ#zBzx}xkKbhjm ziaRi$@MY_%a?A87`)1UL9Gx+89iNp!v02S=+?+!862m}9Eb`S5p|G5!z05Nw0c7CQ z;5NAlot@aD?83RppdOcrqr@ivPA&nADVgfuTR1i{u5i&FTDf;MJ9%`Zo`kROIgZej zR|?>~%qM)3#|v2lZ&TD(gK_zZ$q~&BKhZ)CW*uKsgT6RnXS!#XdHn042pgMJA*CffHY9ZkZFfZ|nMI^kJ^UVO4|JK#QNP zjAR6nhA(8F%w6pjahNyxZR2*^fM6uZQq!hjjrCp5*N;cy^V{p@gSQtWtBKx+6f$W^ z&MEx@bQl-z8TM~~nMLeh!Lup|-|*To*Q=<3iLSOFVQK}w__bNBkVW4UD39Qz-Y3`r zQP?g6dB8&<)i9CnBttz`W0zWB0bIjWS6A1HcY{8!F?}kZV!913hIWt%-{H&F9Z78j z&Acy(Z>N3c)9ErmjmBd zV-NX~d&$~Vflu6#`4!TwbY^~OJ2Qt}QrdmHHE7C*9MMcT5_?#;0%Nrz`b2&t$|3UL zsYVO6RDq+Py|mVd9~^Fw zZOsX@VT=?VF{rK}m0zZM#84x@c6X1iR4|brJGt=!)Mx&#it~#99ee;v!(3Px}(zU0E1;RCfONPSz}@f zGqEf)ay~+WwcRvK!pYhNFtu*hG96X?Sl|7IytcM9q2+@Hb3ukAXe1|IgZIuSDa^Md zeJC<%gW4PP-N|B)b@0uX+~(J1K|G6SH64Y3_l)Ym_s<D*VrTamzgAd|8#d z?_wQM)tdI{TOX`pF6nZJG#}MJv}+WE-b_e|mCSy!)}ISECb-zy2^|T~Bz;c{d`IMG zDvlW|a}(0cSY>%^UcPk0`c%+VfZ0+8HD^5nb*d0uc(9e z)oP-ZG<^_0yWAxf)P&d=)k`cBXQuc}A)=x7{I(T*rP&Vfw@!%Js*d*9TkR+)OnK&g z1?9(Z34fxjqc3!zBblJf3)x4F_~SX_6u0^gnI$JF)tofm+@_Jk3eX>TWvC56T-B`U zy46#-ofy@;Sb?l3o+qD{Dwt9*FUeow(30CyXggd-6)Vjt*vgwWtRum2BPb0?&Ilvji>%b>_U?*S~f>PkKyTLpI6P=Lhd0 z?R5>gp8nP|7dNxMI3)`3#G$vAoJ>;|w&8kj6-V-G{90I*7aMXa?k%L4zAjWEoT8g= zHKD#sMtvtwqFDSrTluFs$c)kZt?PWMBtou*#+{P#*2ek@&)vD%hK94?R$cz&=`i#i z40u>9U~kVli~IfiXJ^5dq!cs*Eb<4Zlc8;?gqoUJfV@ki?fghcCnqPQ$s)R*1i6Ni zWpxYuGT-8Z@1&9ktaY|AEBgd?Z)}KsHA~0a4-!Rf&E9lDR5Q6q$Q1`RCK@#sLn%rx zXWO!mJQ2OS5Bu(#b=SBYgeX|`Qw);elk^86&Mo!kWri+e&MihI#!qUY4Y1;IAjDea zB}#&!dWBz0q!?)k`ii~idJTkz{+XXJ=BNK08C;p>@A~=abOJnLocj&Fu8DRQ>&hNt ze%cFDD1Se{#N#pIYk|m(0sP{3CCC5XEpVMe%sfAe?>fPa0SAu>>JRrZaZB!a8jgMu zV91aP{fp$d*>dm!o@fe+kdUh^AC;@D?Ql)9cluA%6J+W$|FhAk7o=m%NPV^| zTW*zygwCUdXd-lVNX0DWk+4l==l9$h_24Ps9WrWiym2g5M2Qisl8|8hAP9P!57Kta zf_1g*fpHrLtd_S+a$RBjoCytQD_`WVFRQU-YI-w24!N?Z@2K2Ue&-E}e$r`Fe$Wy? zb{{ZZ^CX@w%*}EST$;OEpUdOjQ`~0$lE&xpr;y`?vTi)Cmv>|1V#&BD-S#0unov6B zf>-x~s#W3p?%A2ES~c!$&=1EBl>0-n{&&mACRyMjY3DM~Vh&>X!a#pNe=3GYCwuzx zsXFRO?FK_`==DA_bw2b)rop_zSFlTdlgIzVZom=(QQo${zrQ#PM801sTy`n|k8if^ zSllcfN*wfpcXy`2Owd?%{)n}mcZ``y=9(gr1~diX^NX!4xX$Xj4T-=9+ynsgxB$5&&(b4c&eLLvA*%?Ltl3& zOA?2TPm3o=`%<AnWYvXYL9GB1U9J722h*>a+e`+Vco^~Em!;4H3m>#lqd zgE|4=U>6EK17axWf|pPi{<~xtiGRm79Q{&^!MN4}^}pkqWRGOc9Q9mbmJc3#$DE`8H0=w>M15iu>cU&SwdkI30fJ86yYn3Fc1vD5H11`Pq<^n8xu2zc zDw+x0ln8L#zf<$-)}2SvP`ood+E}OzZ&;%{Ttxk zGDn@o(T^Y|1ZDYv{=lAlxhfB*8?xRnQW4c~GK5hKCJht6kmtBO%e`5U%$>Is6yj0O zpsdD*MN(De?w)R|*0<|IH|Ik5)zyrFucGcI>?L;yGj;(^NFjKy!UTLw zMfo{TncGGi;$em%%S3cl>?egDxqNuslUsx)5>Q+0mvS!#Y@*w!PCG=JQArOKi7&@XAlYorV$b8IEkR=?_2JMNScmJ~rvl-f__qxSwM8DZT) zNp@!*NyrFy+>&q%b8Lm4$GA%@(Ax){u#d3}Kx^&2EPvxa0{ryt^INx~iQXgI+gn@p zhpJpb3t45h6%$K5<(bEFuE}uV@QuVy6?qn2+IEIlxtXc^ZXRFdULG=VgkF-^mCj0} zFI3(e0}*BoLE>C$yJs$k4-XH&gkBP<)XqNZIt+%dcSL#wU$KPlJr5n8Fculy;WD-O zXr++;w2%gmXK<-K|EV~yaH(+h2`?RMf3Vm8cYKSBK$(vD!L6@;k~C<7W+jzJNPJ^@ zlETH=b9LJJdSCpu{~QIO%4jAZ;Ys)O!I|zF4-xfO7y!BBn2w zr+b}NA?NF3fug~KJa;3g2}ee%SD@Q%7rWQFIe57%`05PP+HTO*(Zux>kmq27u#wZK zuqbI^xU?O1?t#{H1K`lVM4ptC6nh7}^O*C(MW*3bZTYNbud8mpR4ciV^L{--n=Gok zcjLZ%QGj2r^^KLpEt$iQURLu?9{2uIvrExGUbt@2k-vtJHX9V_#OY{KgOJM7*P|JuG zX+7g8#u96fV3NqRu4WqBh!xY)eP~xY_uY7NtoONry*DfFUx;Kb)rVUb^r?NKq6g|3 zVAQuH^#tASuheQ&YEDCUw*!w*tXT#jc>^;vWDc5qa%YY|%**J=8z!tmRXuaK*DGx! z(nw?DBh;%kNi|4IVm;a!*BmT`yTvw;T`PetmuC#d@C*Oe&nD7_0X?1Nxs=2pt^pB3 zUGS<^(3QU6p39gtL&?{_My1;XmW;SUW5YPugaGFAW>8c7oAp+zqgzoNTKJ)fXW?|6WsROCgV?U?SXhcA=p?LSxf4|d!#RG8Y! zam4|N>#e>HRVGieWI`Lu4g0^1Vi`~=`pzh}p2uuuAJ=1Wt(*}vO*djHKj6P}`0F^XJcdwQE?8 zFaG%(db{D+Sy#x(gVI!Vs$f(W20I%m8bF>595*(QPT?LyoYqWVL&E%u?q0> zOLl%|Qq!OS=Gf{X(oXP?G3POu9Obk224L3OZHn85pz-L&T?iVuaB6<&$`wIvZlX-u zE}-GrPQno9LNUmMXq^2}cW3>@NB$uiyfB|Pat{5up;2lvWCN3oP~Uw-wI2 zmUwik_;J`<6EdFTR7G%aOsVKjqvgC}aT>-{S-7%l14KZor08uTq>Bh^u;@U~#*GHv zLp@EUC;$sC`y@NhY~DEz9^4@KuRT@k7kO08tz|;jwFL$j0IczlnD)v>O2gje^Wpp+ z2=NhGjCVp0#1-LVSuV+!+n96P3e+x1!tt38xO;|*y8Lj zmbtY@M6YF-=Eo)6bZBgTNBG9UBq9TFbAJLobuuf$8eKrG?%p+@z}R#}YX z5v1A;=Vej+M>r(M!{XlHghJYjk|~j0-+?(Pc^nJe`=W&a6s&N%VLX32M1^;syR4c% z&DIaiebu~4`Ums}FngUJl~;*{TpdXQ8$v{bs$8jO5w}Gm?UV1`xzifFKAbEB7nPAY z87dFGiuHhtref+~*q`(s1WgV$etv;(ZTD7Eg@7NG5B~Eue;It*?jF69{YSv5&YijL z;><1Pij=EV<_}IF)xk1ui932x46_IZF0@9#+6b^#0z^H5TdP_#gBaLB2Z-;SB|2fK z{G)WnLSiQ3d(g>ft%E2hdED?Yy%Q*A_PbKhplHfe%r ztEu|nYt3Ok)#U2EVZCm5yj+~6@i1E>t;MF_X9ko_42XbS@$a7MAF2lUJ`7Jt=IqLp zh9Es|JU5a*fOwc`#aay2%uP;JNhw|}AF(?D#%`06S9Wx!TZWJqZ&0D?- zM;DYBx7N7fk0vbrEKXjW!9ed|2mi?b zoAAwEdkEKQB!y5i6sVJ=)KIIu$0nDGlB&-!q|^5k*+{O&Z8lopu3nT*yR$sc004D2 zme|)&Uam>rO1qc`uNk{*VF0isnE@!>j8Nm90IT}}c<=Sf#y71qzNOd@P?G}*sNG=X zZzjoKPTgsn(q(wyoo_^MO2;h$jhr-kb2ZQ2laM$?iwP^Sq?YTR z)&+lq81pxw!g)JvgG~;QSCak)pPS71=_t-w?1Da;bS zei>U@jG!;l%?~U??Xs zTMybT$k8)zY`f)7+MNY$J9M)l88Epbpbhi@F53f$NTL_*8G+ssDQ1&I!3DXWMfO)0 zxVu^J7y3t!Zdrakki*EECS7`R5PJdwP>bzthwv39NtDHZrY4U1w}L z;29@p5EchN&IF3Z3SvgYq7%XHFPlwLd>2Q1|J}O>pz5X>_WDq6Mpf%teSk~>QWsMA z#sE9EJ)*ewn8=FsvyUJ@u2NtE?Iy{{y2Zl0b~2Oa@v0)!lXI_SEZGqCtxO_mhdw_; zuE$$i<#JiDvNFfHOH|q758VFa$N=Q>yw@eH{j->+nA3`j)(foJZ0ou#>v=CqDa^Y& zE>Ch?*)~c={b=z;_EV@^qbXI9!$D%DnY-OQz1;f!8F?WHP87bM;kDYoK4H}qe6oZ3 z8=pVofPF1vug06ikdiB#PA====vWc@>d!a*xM_Yuke9{D(S%iYdVq-B(dl@sOPmdG zAIl=O>zcJ49PB;jTL-`#>`d7ZuWy)9Y=i}*FF-6&FZ&H?o0PE`$L<&=~0H9{{ zA{gduL|UAb%D}GRC-C=eD?UKbA<4_#)bA?>Sezc5zYvhK*%;^ctccut%x1VS5}zS6 z?O4un3ogQVKC+=R)LECggo}GJ`8TTw=;|*i=l|6UaRpDiY{#-`F8%$Z^BCYi>bO=2 zo{J|9N9ZEo@cp!vH`v_kaBvdpq$z}P5)=^70S$V9nTBf}`^g6V{qIReP`67`SdKMT zw^VM`vmF2JNVB`UdoWw!BsKJm!2vtK?1}4>B?tkOOh=nmckfUE^BPH*j(^faDe9}` zoi=w@AX%4%m9c-tCo%DhT6ecjmaLYU*w=xX7u76D`pMAk_N$-~9d?V>%ku^wyelq6 zzvUgpf$Fci%a7@9sA%NJl zr&G0N6wmY;jX{9P5yH`l+*(LO(Zck1 zvMkm|jwhGGd}7r+Z3mnEjOOQP4od7E%=Zmr#{+i=PvL2#ejg*rXoRD3)Z-UkFNgR+ zwfq>rt=E<17g5T;#MDz#QW;k945=wVY+v7sH?4R9ckwtgbj&uTP@V2M7vUrtrywjW zD=RH4W)5CGI5QU{g)qbbJ=zikm^{_PZ?OsI{dvN+cJ0HWY>vu3Sq>U}A5sL7$$d%_+4 zt@zdp^-RV2mitl;UBRts*!SzLxbE&kis1kBOljXttAT-dfFDD7OM93*dRSP~HU*4y zKC(x`up-&^u#)~a<c-ISYEkK9sgN)Rct8DhfESsDigyLaJ!GP z)OsWJ1yf7L0ughRo!moI9P*7m__%~8aU1Hi-hWpPBHQ!ZeH^ePO74E{Mt}>*GT)Gs zIZ0npNgbJ#@Wa83KlYyjR`qzc8T2)l6$*?}PN<{GfSgW#N^SYSm@55U>4SY4ha z3$^aOUr29r#2ufWo+33;2Xo{~#M$MLArC2EOg&bL!Q*-S*-vI>7J;?|NHXkJui}%R z190`JL>`^%?Y67BXV0E(-Z-HS&N_bm`X#g53Ml^q$6t><{diGh#Dq{1tOx8#XJ=6b79AMqg&HdZ(1l0FTxAd zWze5cx_w}zA}P?CKh2J=G6eFa>`V)7Gi;qQ?2G%q#Uyf*FICWpcUJsI(THd2(Wwo9 z?`G;Ts>Rx`1-d`Y^|2`Vip3vDeKtLNU8dVNg*NzoyCDk;s8IEUH;jKuJtRg5Lq|00 zb_ZruC0p`+FiC!#f@c5l#`cO23&PIO)M)B6bN3_DLM>Vu=wbzv1j|5$9%^hO`G@+U zAa-D2e6zO1*j>fi@X4*n;8qjU*> zN}kB(=(M+`(%zWk{*~>%vWSnDZ)H%^jlaj%bfZ)R5Q|*l?RwFhn7(_n(8(gXYp+jc z%|vqL%W`Muj0A+J(JLof@Q}Ya#R#?KWs-Lgy)%T8daWK#-E_|1+;$ku8iH}ONU*

C1`K)YP5%wmM;ji*AnQ5G`pg9mh>6f14LrAA%WoO)XOJBV>P-CNf>K znqO;7CB3F;2r6F+RK&L`AV8Rr{NXQ9Xft*GXx*sr+D9a z74dHT`?syAD+4H#P2v4|%TKbe97LNbRrr$74PEaV0CJ}(ZNF49KI}@mdQuAWDK(VXL zdGp-t^v56HaW^C?nPH#(NU0UQEl`742E7Wr&2&bK7QB6JdTD!5?}h>3%|OW6DQdzB zzK#^NS$bxj<%qmv(EZ!h{UluEKuQwL5(VhHhfp$-i;$i4=-M<_tJ7Y!XC|ai<)7}{ zQWB>usSRZ1amtVj5bJ^fS}=bg$+D&!Vdm*f&C9iLyZvJRe0-*VMhJdZlHSk&AQN_` znWVfA7dt;vm04ZvU!Hxwx5Oh8-Y>MZ_7`_$R<#M+NRgbT@!T2q*`ZTXGUM%zz~c4? zvwZAv-?fr(QIGwvRY#eD(pmsXG-Xt?W-M}I?oww(dL{f{cZ_pTQhq_#XN`ro^IKObt3Vuu#ij#p<5ZGU+uF8Y}#XRjkb@tn9 zgbMMA{LVUv^Y+Epx%QZvq@BolynelmsX60fTglL4BuD%mqz&`%I!0Xl(0YzMM};6o!SZ436EP?{!9mx z&N%N)8V3G!e&EAyx$M*6(T-8IE~O!$v}XL>YL#}N3XPncontdrp8TLp_N%J23u(u> zY}^K)*C6OkNSqroZnnLyknk(+u3b3Du|?@);AG!5cha!fz_3_m8e_mp zGDQ(qQ!F!nyiv7ODZD#%a*za>L~iK(2zPeToqe4B|g1Y`z{nm()+4x+PC`g zFO30TK6h0R2(pB>`;U?1U}HKCDMuuaDdlTuV5)s6G%&UM-T_`tPR@akqZb2Pq(o(k zlA6;Gs>KHIK4o~i&m{9cZawG-fTZ!!`e>tJlBMtbW)-K;`Ryvqi6TvQj4w_0-p1k2 z?WYPuRK;-b9v&AIY^K3UTAGupRt?IOPsb=aC3;V91f|00il6&OGXL|rw!+k;8+U|$ z21R(QzEee8`FafqOOO%emqpeHW8kE2^bUIgu5`-;@zNiFo@c5>MUjhhaVBdgh+()3 zZh=$^Y6@NeIGre9z<{|iD&hKQMI)1wR>|R3q4{m)%ael#^6styTAQ+k$9+e#w*%uh zQIX}xuM_(F4amzjV`F1tDDP^@zs>vR&HCJBc4A&q{;6QZ+t#H`-K?O(`fhMpuDtL5 zK3}T)T(dYt_;fh(v+|yJ?w^H8NSw!9vy_bFZou`5u@xH|n<}@^TcHy6RypPuZ>w|G zQA6hhW7^E=6*fh6ZVpS#+^(%c5nwv+rN9?XhEN)1R$Rl$tNkUNGScq0i)6*+oH%C1Rk>mOT!F7#5%K2m#xHs&EzYr~DXQvOcKR-^qLM%$XguYeJBKH!x(LH3 ziKZ#`DRu$^$u}Qw)~%jfccK|VnmSk=?4Xc9GFy)T{XTr*@Z|ovM%Pb@%b!O+mX%*c z>j9u~-anQ;H5DWNS~aqh5g#L>M#fbrYFT&E_7|}Z)cSwlWh3Hd@<(;t%henS-lGCP zyL@~U;f6C8eoxyTQE+!NQf-vkVxEWpU$f$*FI0+CmoSSEC!w_+`S=Z+>eX`GC>L%2 zH^AbgJuHT)F}m&Xdt9wV#_7@4j%Om$>G7Ce(Wod?y$~>bzTwy7HO{nFc_$1NE!K7E zHU;)V`k!c{V1>kf-8ws$F=PvmoalK>GwhlU>W$NuT{sfSdibU=Gw$!Yk2Msg^5mfa zVdL?}cI`O3X}}&~xKZsU@yBY5FB!CUu+Z3Pz^rICs_ebGC51e?t#AQQR<;fLJA6lE z?Z!H!w1l;=ZJ@WXmj4}cVYYi)sa(GKqsNzf+-o~mQL{ItOHIDl7$6s!<~8yCuln?- zbHKO*UJjmTVQ2r3dUi%-07U4wST#BA1c0C(i?)_e#n`DVXA$Z0B9oYuC_C$6F2DIl zpj-uN&bXBS1cYgSr8@iwtuInkN$^<|m_OM97}_ke4)pdJ|32L~LXr3~h0uM@9E;gXN*?R|ggopXf%%4m+$MPpaop?nb0ead-VJmHsPbzqz zrbw3oI-*1jN!Tt~`^ByEOl$pOL!xZ`zmpT^pth zCEaH;(le7q?kO|U5GY6GCxLmj+(?&ZMlbzcA1=wJVt|;%V0moXC!*H3`Hw&-y(f>7 z0Sp%@9qh}Syzy1Ej>7jOA$Nx0p_}P5S4ok`XTtgQ?J8-#kGH+k5ajN6KE_asOwKC+ zr@ExV(G)`+yKIimQWBv)^xFfN%b+7Q@r1_=>gA^5r}YPwq9b3}498%PP#pypZ)ZxL zBp6w|DlZHb{X=%)Qjllz1Sk$6*Imi5T4o8BXPuoyMDMeFQ1PtlQ_DyG^bdgb&Jf7k z)x&gQ%C^(R&*d#A?D&A;!G9T5tt-gLi<2FrzGMR)9gF5SLta^y5C5wS=%JbcY_#~R z`dRbm2GQwBP-m1G*^_P)!Qc1yYYZMVZP0-pRPzH|0|0aY5C=o%z$#FXot%ncC5Frc zFcf`NXtGbA6hjs+MYysuKc9fGqP~8uX?$yD5!i#LXw_TEuk2(T|E5SYaG<^D zPS_6&_rs|KXCDvN4TH-)K@R&$@Mh)HFc6FwhpDTRS_6R+b}3B3xT}Q9OuDtb-@h9U@K!yCHcOlwlQV2-i`dj^5{Nvy!xsB^vNIJ4GfJu~`58O=D zc_|vlz(*FJ5nhmoT>O5YB*tLQ(H{D+^pMAdYSBGFdHTu7rmVY4Rf+nq(yt z{$q881`9Kd{m8|=-;5699hZbkSF5;P%DYs%XB-NQ4(zhnAfV|lw`w|G=gDmjJoBa| z-VOyn%d#~Ijv&KLR zz;s=&L>=?xixVpLymA<-UYt~%JZ73Q#&Q%0aDs*|v4OQlC1Wmn)q2H-nFD{&GxUeG zjCI8LaG$ay^R(Q|-0ZW%B^{y(KewJER!Prb?2-Azk@@@qCCRj(t4b0e)9k14w*JAy z!2EQe3Zh-5DUq2UUnqG0b64=+{`Gs?MDZ_*Q|K`(&{`NU?HvIIrH+o_eQ#gu$^yFa zlG=~Z&^?0C)4fld(%}c3d*p!N){t>+7lRMy+|xidKLS=>CO%f+M}XC0VLwu2CX5oc z{^Ho!lRw%Pu?7M;D+;F0{UTau^+H6_gAHzV`Rg^w&@*EN>5$bJJJXG*sA3QZBtqU5 z{=E2nd8tjjIzOp^PV+rIDtX+I{lNpjHWku%eL!B+s=oU1s;x-s3|DR8A1k3f=CWHo@w|S zAHRFGbE5gA)~W9N)LjZ{IPV5H4`?QuFE7^pA1 zIN$V`Y4YDaPUbs;xxISz&S&UTHD?D3=dWwNcmmRW6_Y+^zS*r+J8n()+?w&DHDeDj_UonnS}lptD~z{=7CO1o zqPeFl&!`hD4?w01akvIW+4R%LSi)6=gq-v->0*lQHlI z@adR(Ti|@yI*WnP!{$L%M`FvZVbTP?l@Dgw%_ztd%@1d7yLTGhfay!YCUaP!P-LdE=#YF647 zHVDNZ+K#QfW?$A=jgxvr$4Hw|_(?BM$v{*mjQS7ko{Dh08#noV>Q_k*l=5T;mX|v} z*6qsYWakVHA3A<|vAam~iVPkKxAwDV26%s!ln->^2ZTs;=FR>_ZD!pL{b!Qywc~J! zpgx_s$51J5Dta2;NTUfNq_h}^!E|+iFkY9pCv6sp0dT`1_1D*_Ja%4~jQ>&0b)a~5 z93nqL_2N5OQ{9*2yAAynqG=2C4z3Kd!4tkrOKM`v>p{WsFDFjob7z?U%c0@Y6eEzu zRtsF5se6A^Q3w#wUJ8EY`ReuJF967uzgeV!P673;b{qt#FPlzw1o`{#9O8kbNg0Un zAD_oTK;4iy?7^{Q`>|}rl@3d%+%X>V$Q3lmPa@~qR|Zy)`_8bcgr_;(FLJ7deaf&N zrF8iZT&)$r`L=M9LPH|e9s(6$SWLUdsMyG~@C`u5BocqxoDSQaMgxL#6<&TJ0aLebmU4*Ua>i5@7UAVDr-Ybn7zDGV1H4ON zDC~fMqe^-&tX5v3?rWh)@)OKAw@>DSLUce>a#>rs@SpiqC@Nk8Q07+iV+tToV*~Ew z{;+@y{m5IJLcAv${KtB}98a6_dU6zuB3W z@_o&%@t_avHnzXv{?vq+aFXm3+nxq-6kw@MXX^sHd@6m7`vpP@c$S(Wd-PyupKKNjQv-9M!dI_#UwjI$o$Gdf zScAMERQX{>AZKzA98b+#&8;5QZBg14gMes_q^C3Wc#Ve$Dn|v&a}YN$?7o*0kWN880$suKVbAjpw0INZFqo5`nR{`0Fc0`{L>;h>v7m33MZ7(LQB99llG(at{JT-fky`aoRE9MGP$PuNI@M6H zrjQG3){jwQan(Q!R8tPyqh6uw`YAyQ|MDWgaf&@;UxiP)XS~^20R!vLZ~=oD_l!N ziwdC)qZ2nPsaBRv$B%TUQx3vVI}^`->PRdA+%sk|rn2*$2f@#(ZGKF678bnulRK{> zEc(d$xFhz@s5FNeAtSo&R^dyF z0QL<(_cFws4R+q90u(X7*S^!-oBJP2=N(Sv|Nrqr;uu-U-em7BTM`H15LwB`-j2OV zR@r-RhtM&y$zI9I&R!v8XRqJe_xkttp2Bsj+q5LIc!0Rw?p z^lB=+$qC}<_UoVnD1=h37l|6V>*qf;g*{gQnhY~t7-z$h%|Yr1Q>GjPdi zX_dZyftPQflLh{&TYrYXIjH3zO;&h=6ry<*&ov;xZY~IP!h9bS_&xzvf?)|;3DuC5 zgFj33>O~`RuAWZPU$UUKF4$ae9`TnR`o9eob>E>M?}5~KJt`um{s+SFagtqtm*nm* z>G{VRmBC5O{R=(>cSCJA1dZ(~t5!zE3bq)zZwY-*XHvj`?NtutM&=gx5zARh&b*Xc zWt{K8)cjr@I!Z^ML65HA^^DeM_DUL$*Z#(zLhEyqw*DIKEP6MawVu3cW~!6a84zgO zkE`LezF>a4{GiesmCa&a^7~ZmE7p+u6eUH0a=hWq(FWiR*XqkKD=74Of$$G+ftx>v zYXmaaf$;o^Q0ZqjQXlMQKG4Vl-d6dA#2w!_LUwH>p$POQklFUX|4x0 zRt@HQLJ8X^NUT6ptzs@#ySl^Oi`+sjr`E0~oo@^z&l<}3ZBS|=F>oA= zx66KVU*tFz=@VjC2}7fD`>`9u&? zqM1-$63SbyrmG;ZRYwD%q!-?9GeT zJ2UU?zpFtGB@DD9--FEcdj4B#JSNML^g5cc%*hgW+3vWxGJf0gj88~FntyRx*V}}k z;=ab^ekMM*#=1XdY;>6Os2)A{HL-FeK8eQT0mm@Ar+WQ!HS!BZv6FT7OJ@zsjlO)+ z(#|WLdJJIudatpGFH9S=j%QKk5G+X?G$Rc~upkEk`=%E`{Sr|?G|bCIVZXT}x~Hl( zayyfA*Is2mjfg-7b+m_kOW{2a@#RUug(2m^sFW)L^b700GHfI+Ce(MUDLGasOsuQB z+odZ%n28Bu=670`;+t~ql!3{sGdj@>M6EtS*Y~;?d8u@Ncu&sAUWQ_Yh2C>N7;=s! z`!a7V_-4~dUD~O<=A!d6;{^*^X015cNcZ9t!99QBujpg25-3TNd$iyzC?K6n-;mQXNy49`@ru z29Fh_pyRib(jKpB+PdIz-SnsXe^*Q9>GQ|NsW(EOV zckmw=Cjfpt$&2xEttbm}#j4F`8{CWx)^sW0qpNZ`0x#$l&qm%NM6s=D+zf4Lo zrlq4o>-rM<7PCIg(Z^Iv<{j4cZ=)LH1zOGeg2nh~s~tg)Ctv<+#w731$RPqahR7;X zY>GhWFiqc-Qq4BWHyedSxU~XOn?wBt1?Hf^(=;D+-oQQ$;BX zzWT}*xh9re`fzrf*+)oRSo}hPgImnQP$C7WR}eI;&>+L%k%!sl20?7)|j)BHu+j!nWptWa6$_>`Mt;7LE*yTyq*VK5dK_JtFaPyFPB!-#qn#5a zauR#c6`EwPHwEx@ud*b?MJ0}nZ~w}mRURHzfs!^6_B2XLujKwLu%wD5MHjQ1Ti>$# zz3sn;S!siMVuMQjQ8+k8Qu`_%qX}~}l5nb=#z1piNDqjolFh+>1zvLV`$G&2dF`&puKNMUY_U|7?uwY@d5(!$Pkca>Lf7dk-+?r z?ZC@D0KygIV+Xv-0l{Pqpk$ho36p!ImOvdNSk(N}?y9Y3cP@@6&367BqcI3_nyoXP z!>=oNrbGxur4bT+VT zmwT%#H^(k?=NXvM-QF@nULQFv8=zCxHtJ*1G9Zjt2foVlI~wSaSiZE^tYu`1HW$wv zQ5{)qSP|-~oC$|Afcv8mo(`Xy*7ZGKMv#kqhl%-o=&9;de|vmQ2!+EmO(_SMRcnxI z%;t6#wAJu*!texzGP1gXo7;ngIKo&s&mb=sH&3Cmq=<<3YBzRA<2zq3>#f6r{;D{W zfvulIPma()s0|KOiY$BiV=Wf6ukxlEvLc zf3qFB361tV8u@}+)%3f|VGyL53rWl!X3KrrU_Mi>LQw!t%c6b>4sAfx5$3SJEq1G& zWz)6MBxg}>sxf5$trDT40#rhmw*+8VMcBmt|6r?V zff{2nd_rQ9hclLR#x3rw2Q5Nckne2ta!4rT#BaZ&t6vO<;z4go?+MYG#kHBdMnQbM zUZx%-Q3EHkgEq?{R7Y_OcYf2c?Y!S2bWN<);|hP&b8lX6u8tj1{pV{r=QVq9& zNQ9My>Buyy4L$Eo-EY3|m1U=)rhIlc_Ry!r;dKkpF1A$hG>9qrAJNj5tJA319sp|! znf0a&yT)*%rcclwKC``9c=*i?qMCw58AidaTdJjXTsP$Gb=PvXh(>>6qn0uFHSWC* zoa1$csLf>46uIRmcqPV}d?A51qp|h*}wF32Y}J2 z0F63ng7~g>_jaC$s%Ss!$;@1f&k*5J&zhrP$UElw;T)N}mjVC!D!v_k8ie}kL zRK~I(_qkYKuhFRfOU-$^&`4Yb)ivk|Zt2C+{q^~vW){gW)oFZyhJVYmDj3^v=EJ-ByHh z$h%UE;iC&EYSaW8!HVqFYHQ;u;%4Eb};B&Tg`B^enB>3?zmJCV<2`Ze_|uW+2e z+*V=W!7{7ItWz!Hwx@K<2Yi)a!dFPc(R3vw z+d^*Nk;V1zDG!au+S~`%HOsN@Wk@1}*Ih1DWdj8;6XChRghG_$lsUciKZ&u#{aOCY z`Ik`5Ri@49vA^U8E{So#vD)-8ArQHx@U}gZX>+<7-UW)UR(Q_Nv%W|m@iVXKt)$@L z;RfM&VDW70U9Y&%@`e%~B45WB0&zN+f#3lYr{JefzET~VD2oX@9)JRb zm6*>&Y7UE;;z1}1GLKhQ{L}iyl&iUHLp7<35sBvaJ0tEZSYuvCtD!XAdG^|y@L(V* zahKi)kVnGv@*Pr~i~kt*uXt?kB}7_&vTsRfdtbcJ$QyJW$UwuXEDAer;zSr<^kufb5vAWc`q|^?9iLd9OrjXiPlu9*K&TnPdZYeHbMF_bU%DnUriJiZ8#Sp?9I$*}%pT^?j2tQ1O& ztYt4jCOY>HVfBC2w$02kNY6Hk1Tq9-oFela0P5gKI%+hO1~?-0r8A@Hst=i9WTw*d z&0G&_Yts}(gw?mmUH0aR$N(B~kLX2d4 zG>x%E1%v&Yt03(q{@y|zQOAXXzaPA%R9A6qYWrIrK+xiqrKF^cQBzO`*XNIrZc}4# zLw>~)szEyn+vs#J1KY-R8Ksg=HPfJxRn`nq1(Xg;nQ1vlOdUL# zpYH@}$yNBnT9M*P2cz~noR@`pNTvhwVKA?xG$V2U01QCWF@7^u1 ztE4zze9IH0Cd)yLT=diY2JoQ-gL+4xnb_#=4mQV*LNPbqPtZ#=*oJurUvne@`Q_dq zEuH?28AJm%WmC(kTOpJlb-X#!a=h0(U10e-4;IuZ5hlxGZbb}u$Ff<*!uBvq;hgM8$RMfeoV2(oi8BT zHY{d2Wbvj)=xm38yo=r&}b!>=7k~Ji5UB{bT(T zcWNT#d!16@rL%k2T8bvU!ee^V0wyxvY`-hcij%V>a#P+?dghsl+F2ZzCucdB)(|nU z>U`cbH{FL7Txd=DqCYOqNl~6Ktw#%ZV-!hxOnzmir;kzA!ZVLiYX%Go_xFZ#pYu$H z*MTo@$_TG6W!uFN8Hhqd#M>b+ITM<62zF{&>{tma>#u(oJU_HIr;lQ=-uj2lC# zxYSL|$Y{-=SePpcPuAC?&NxUgFmK)gh=Y$)Y+T9am%~|DIlkT}fc%)LrAWb`T@s1@ zpeZ4OYoJgyN7DQJ=I(Mjd(ApO@duP45*?|)x_7Mg z0mOdm&7zO7gx~fA<=cy&KYx~J6>orT0V!EwV&;A%%*FF0A%R)%&6@`I8-1XH)m^;( zu~X5e|MqQ@|4lC{qaK`tKY!An>SLS$^`l+WN5J12K5QIlTjX9-g~}P`EPo1zStErQ z^sdOPadm6=`@aU8lU-io7~O1Q6UufogQqaMQ%sl)6b^`cnOxufc09dEpEGTndAKx6 zpS(B9LQG0(+)AjE&n9&A=exVHv7-{LwGjEmD*Fe?XXD#+Px>As>_aBg-IQigsi$c< zT*4M7@Ez>s=0- zJ9gL9>KKL}etf)iwRqNge0$Z$8|2_g4RJc^?%%)7T4LXb(3~)fbl{I?6BHK}ZRQhI z38Wu2m|yi7P~UiW`Ch6elE6fvV&M`$j_^~wwKAbFamaV!?MDX-njx@sjv+Nqk1oG@ zb{UFTa{PYpYcqw3){>>ZxTpUZDI=UO2+#y8t#`tRdX7$Hi7 zo4S$2BOWqWf46UZJOXy=18l9#ej(=9m;!6gfH?9L{sTl)_4I^{7psHBlDH=fsu+O) zl?7~Y0mp5(cZ#g6ZSacqW3S!@FKY>^-Pmo`$MVT3DRh#aZ{EK3zZgT-FM5w3f6H6R z1HXZXXPBF3xEQXVnL)bLLgGNMblR)9oZqLuC>(M9g)VT&FP$f2u6)W!u3whjwVT{P z0mhtcE*|~lTsnVP0AP!?;mSy%e1{V(AX`^4r?gD+7LHtHi{zNp2Q;nBU=tFI#gC8I zE)1j5|9ptukf<5JhiU+kX(ay-^0^7AJd#=LbN4;}{j7Ii^RaQU2st3RB(zf5m)FO( zA3oe%$hV94Nx?dHk64Q_-g#EKZu}!>__KkV2(ei#ALvr!QH?=~Da+jap1zL;?wxMq z2^MpwRm7$J?c6a_ZTW#dJi&9P352I%5$xUl`#=zD*TuI_Btuc_z$!Hzhd_t);?K>5 zeU1~fxWx^&MjBYqMVpMPFk=w?`&1Kfrr9ud^6t66Kzi7h+90=!{@~ov=2C6ja$DmD zr;Q!sfId>jsMXCh<=pm%(=g5wAse9=_!u=h5JD2?h=>6}!3gDeScy^@6$vdCdmrG_ zW+;XtsAW74a%ZgY2_E79Bk;_g<5%6VbZ)%C=TsrPzS zyy6wzA02#Hs$S`=%3$#SIvJ_YiE>L; zM%HNSTdS#!vWePCySO5t)8!OKO|S@|K`Mja=$8); zapz9;7R>H^R;l+t>KG&o=|LXNUw3-6U7@sC`|RhY^l6eT)xbFAfh={OzBPI~Il25= zC>e~2A?Wxbq$ft^(#*j@(PCywZ|J2ZSHVN10#(Jk`J5(|Oj5Q>bdvjkfqKZVSP;93Ifj&L6- z;+I{@Tt#Jm)8eKfvO;_oEp`tikkxG`}L@b}Qt(1?qacEU=$TM+w;H(>;(v3^^NNq;G7ek3s6qkj#0P zjPKpt60ph{(eFChzrd+`YS`y)$eEDlV4G@yI6GrcxEAuPYjmORi>5;=3(W;l4f^w@V3w!_Ys|H#wsoWK;W~XG(?}6Y=XW}D zu>8}uqHV=T+Gzc_1`39UekWy)O91ZhW0Ds@=huCu>4RwzJ`usP6iR@Er%qX*v#Hl!njFw>gWBy`b6)V6tyQ5sh4Wpy<#+x&u%ub-|iiw@i zsKizuSi^)@L>M;;NTvV*xA5&0tZovz^i{4^cRI*5G=PN6-=9B+Abm)K-Bj`;Je{8- zsr2;@tmI_Q*Q2%hy}y8-II)4U?)a3tZIlw4w!z0A*AQ2RM_>0;sM_O`-U!M@Xw|tL zb!y^zchI&}rS&QnNXv+(C=SU>lT+nX+6@f;{uEyPQLcFp)ECmi!fu;;yNU(k^ulYd z8NItsTdY*XJ_V!a>%0LB!6zqQHb7cUvHDHN z{+-cyTh-j?4B?V3}(4v*{kU-*2^!3(Y-mMzTmUMC;kbF-n382C{D)~)_L-7tcF{R z)>EYX!XIskcn1Nb-RYGz8Bj`wmJT%7r%cOw6@;TL!%8h ztM8lUo5Q!!k}?$7HmL0BX~{3wzZYUKs9Rmg2o6uJY+qENGF4gZd&F#;$F3wMo!;n7 z^PleOzYgjR*!3c5rqZ94xG`%<&iQ7s;tW_WP=-S7u$M74H0%P5Z%DUbtdzc-Tq;g- zY4md=$#lub;jy>3c^xYsNA3+oJ7>;~vKGpHsmf8o8Y5@4(w^k3L>j&N_KVZve(YEl zQdDmk8T5DatQ9Ci;g3AJQWnm0cBsN3}o#KFcxKH<| z&FAcG)f?}U*CDNwG`^ny64cC6;SGM9QvgD-13H}?DIe*jN%0xiF#*oI?*2m+vXP|* zL_tNxe)mW0G25X3tx(_B${1e%e$_@jU&D~iP;HH@9SeJpIZ@5~k~Br?xT`YK`uA*G9AHv5keK>ZJ z0s^oEpFKMoQz47ae`maw@0XKk(}MYiE$gv`h$~(m(6|@tWchiNrZtzu0194IbC=Ioss3d6||o zPX*?ddRR76KBl@;2mZ$i)7K}_sZ%Q$cedq3ZnlqX+(;UAv$}33O2B_VoBnsR`W!zh zaVi~`q2Y5PS?#DYrYCIrT}aNijx|BMP4^Jig;?LiYxOqnzA61zMoo{XTF;0ETX&^p zX3QLjssMwObCP)|^rd11k{DtYwIinkk(K}6-Tg6zhv%;E?!0Ye5KJs-UKCp5Z|7rwep&gH>i*idKt@JJhMJs{1sswcyBrG&RzH5cR%d_qD)#~Rs z<8Ht4Yd~2Pwp7^$ZsvkD0;hLw*B_}B@4c{lHDe}|TnhukM%uL*Q`9Rl)LPiM zZsuDshp3dEBIAMeUZpm^=)>svzMajp*^~B{-|gqk{hgb)5Gv0a;Ose){QgJ(`sJ${ z`iuG6D}L!x($d+7t{gcxzIFWVj0TaCe2r;AI=d^oy|3P2CHEXhYhJ5J#M_znmeo62^hJuZrAxd#=EhgZ2|JF#Z zh@J4O^4TK=Mr55`vA*qmliL+C<&{D5i|_A8nS8SMj%7nkn`%$p+1)qOy?b)8{uA}l zL@k^i;|J#Wnr-4XS?9kzTZBN7l@1ilHYoO|s8-9$m2p4te|y-Ld&8stKuDnw;JX>l zU4Fc_L7}DYJhAVq4_=O>Knah3S+@37i8j1-2k$`(3%=+zAlVGn6cZBC9wg&psOcRl z3$`2B<4gvF$SmfqAp=okpOe?qCy@qMgI-cjH@|hxgad)b0L)-c%)G6v4%T&fu;ilQ zb+nw#PoDIzJMVux9v%U@xsx4HkXPmi{Fw~hbv7~g%A4rsm!l!P1gGbgk$TCySdCZ& zIoBz7M}F+sNVA0Dx8Vw~)kdy?POyc3rHY5kp!4_lDNQb|OrvNt;}1rR_g|L83Pevk zY4k?CPkX0|?6j72n1ZG-&X(zC(ZLVl<1aaU_6`qMu+^eb6UAMXO33+kS*&}U@Tgrw z-!cs^gF)K3M#DA=Bc0z~=)b4cAV(cMGzyx9L?*)LvI@fuyT6cd0B|WJ-OT>O%8Be^ z14iGKOag+KhUn)8X}^Zz=OV{4b9~m51_Y}G0rNBiIJTS0%Y+5$l7eabyT0q)lX=Ti%@owAM7_CeFt%i^tQG1rKekv6}a}#|zoh7)c0BOZgv}h;zgY?ai*4 z7VVPBmpN6rk7!x?kjJaDo)U~KZsbE*AA3=N4y)J z^NniY$?T)|XaC);am1c7($SCP<=B1B1LT&$L8E5>9ZQ+J&xYkvF`R{(kLiO9JoXlI zva_#@Zzt~relG2cMf;cbeb6a=!)DZQFeY=36%b(O`}h0rC3i4xWKLuY(J$a{tBfr? zJU9Sw>Jhy5kkBdZn& zoy3>(YAq7^VG`G7o^=mBSH66}&Kj$GN6*mU08+9Pf3Q9Hp}$??Q)OG%rM_1an7?yz z$X)dNN3rjQcc|rm@7wv_X20Wnq}b%lak&aHC|bovdPD| z(NSONvvbX7GBPQ=q(SubJ7qj{r3Dz+3~7U;8)QXA#R+210&Y9c&r_eCZzNG}l(QpE zO-+IH^5O)D54-!*Dy&}2p-awu62Y(I=K-`ghUT*E8w@=%HW5PgYg!Azf3XH1^dB7ZF=KXuQuk6-sSG_=Rqn;yu zTtIj2>hEvuWnBV_d;X#mTn?eh`#l+^HZ9|g+1IgA|49!>IMMvRA)&mGO$a6QsVtoP z!UZSc-+6!7=4VLc+rJx9_dkq?Nv)i6 zrRE=r;V1olpHFj@ok&d7`0fUozweVgiDSms>)Xdm@_~Mn9i^6+wKE&yJN!FEM^f-r zl&OutD;D-fi;^1sO-&aP^nys2VR1)~xxMhi&d{(MiyJ7O)|r>Y*4~pRbe|O|Umyx* zzD!e@kW)4#Po%>?Pj~TwuKPby$%NOf(co&ME7$~m554TH*MSpJv6Gmcutqqv(XG*&@z1e2UqK!TH zYej+-I%tWjs=CdK1KxOmKFO4J>E#=lVPWLK+9IuCo6+C#ZgF4#L1rDFDFbYpZA)Ld zP;m~hn*HTd!&nJ%e#FHQXASsof3f9I4IeN&D+ zADMdI*gC=Cz+g0_)ACT1x2<)tmd7`d$B>ms{klq{xsTMSs)RDVGuIIT>t-H;$GvO| zuTDI}a^_jOY2XCdkQ$vKz9tt(ft+Iyz{6eg55d+w`3a)&?XOc82Oj1-=%b$Q8SH50$UsiGf(Kg1tr z3JyaFyWmUwq5RQ5#yxPrO~KtEzDXj>8AUl=%NRCxuuCb^I8Lhc!_MEqA7P@Y><7%+ zD=RDb=8m?jk@^VW?g7(g5NiZ_%?r^bUqPsI zQMxH-4o;i~fNjnXr0~3Lyu8>om~OqT^>ArykHvr69;tFade%zL^ZP@CIkICdt-Sdh z)e2$y+KX7f-Vli zT-SQK#bmG~)1LY)x+X>x6peRTH}qNpi6@I;Du^5RMQPfFx7Bq|V!urbEc4_h%n;>< zwnFh-E0IJHq;|m!SBmY4VuA}A1h!>CK5biTQ84-}5DjA!82?&7uz2AFhG*}b1H_Fk zpb|DN-)ofA#2Fxoa0Ufx7Qu1cNgGoD#F(wMU0;97(y()py+%)r6t;{6f>$S_=B@yX zOk4)Lxlo=XZirLw9OGYZrBf122lJ%nwu^rr&!WuG{uC+L&dZlKJi(%%q&WY~dt~$z; zOmD;3b7k2D-!7%&YAJ1ay{(;1%`hOR-7ZL6ok|{$8&?-utR$3&VF%KjA=iRZaZ$BX zm!KkYofIlRB%8Wvo@<8C7gaw9i`q*hWJJDT2Ux>F)FVjdv6`U)%FQDP4|`N$zqNZJ z`d7$P>zSjvK-Wbj1a+I*Ya z;OukF6zUN!O}5c8<*dj`-%=8av_@&YXY)p`OF`ZPS2)aO#9$!nr!Xk%1>T-y)jWgN6Bi zj!-=P9EkH=^*~bHX?S)8^GE7FRwwb7s7rFw)_q)tCcRutOh+^dhn|mENLkp)29;x` zgbz=2*WPzBMvkZK<{+Tr?)dKdu9o|==zmDz=TrR*GP|r_y42r}l*1wOV@7`o=LqEk zA&i>giTjguvx4;qkMn+ePPH+iEMG}Il&;;hyI~5v6lCGq)p`RC z&pj^CZDA-411mpgo~M>6%EI#w%p1=3jl3@=LGNGhwo%^~ULP!mIQqRM$g4KQ<#*j* z92rr+=!>iQ0Dcq{b>EB@?~diIvhHK(6Ek81_j(Kuha`^=c6g-%NR!VItJ1~}xLzr? zPDkg!$;EycBzPTki*Pn-OyY+T#rgixWKg z2<2+Bi@B^{R?NBKFR&q>hdtmWPwHT1A%x|ofPkI!UnFscJ2n>+14ecy_s*?`GqB4Gh;j{RkcN_ z{ptVwNiNGRO7w0hY!N55&+oh7nez6? zF9+U~g`S*@?P1rf&GCqUV4CU#R314}F0%kCS-Isj#7ijul`AXTTk_^Nf&`c=jDXu= zQr{kTu8x4K5^yA~tUN)}xmFS)h-;yo@b<>u@!Rt9X(d1!km3ox+;E}Hysz@J9nly- z_x`1$qr+qA>JkvDkT&vAA`-D!1%`t2e-ED%vwlu|MVzJ_W#ySTClT|$CKLYE{GD&? zTx|sF7~;RC1a5fU_ir@i8=nkjZvQJtnf<%ZLk`nvSG)>Sb7LmPKrbxw`GND*?{dxF zwJJ_#Y=Ow*@q6T=r#JupN0~qg67Yzvi!k` zCxkfB^qooKbhq=tOsvA?%fhDvvH4n@25B^M>r8>9H9E@AYk#reZ0YW_?VRjRUOBDM zI8}=~;=MD#2 znOro=OGAC1KGERoDF-;Yk#)$MuaX;G`so^%OVVspA2X+ak#Ugm0HH9Plrx%&Y08Fsc0v|vEP;@jGuo6@!$MK+fr zhIwrUfyojc`3^aPdZWuln|3k^Bbadb;?J*Npi7WZ8^d!e`}|4vCA0JHL*gvue)1eZ zOXJaXzVIbsRdQk-9wQ?7nwsjDZgIA!w%B}DNud}_2$O?_aJQvdM=6RX@t^)v3I8LO zOekU+gx0_QjeeivDecmkvs^p*i*LEYp02Y#bbVM!$9a^*ry!TkM7p;*dWe^U04%p_tt`>)+~{5A}!H6-EH&E1Bg~j zI(38!huG;8F=M&_r`eI;vlcD2-Z|6AEN_1&E&_hjNyH?`r6vs2Oi=L6AQMqUxg*Qwu59Xd#-g z7f~CXzO|!PPKz)Lz>%tEuZA*U2r9ft>ms*Iq-^3xw!bKggOk}7^c>|TG68WoL*W~) zq{~a{fvI3NBq74nlN?*GbW(dZH8b<_Xn;y?`GG7?%37u^DuMaXFU4iJ5hNInT*>AA zZtQgX;_fHra^3DMWdfA62Azk7WwbU(3S?TmEpem8c2mwtGW*O9ElrJEGjE~407K!Z z)gbTSw2g3IEr`G)H?>%I#A2)O%m|8zi;H88p?l2%)b?rSV~D@cf1PuvjrSne!J5JD z-MfRbeP5}Rkq5}YIi2bK%7|XYm$iwaTOW2LmO8W>;k&*aMR$E* z8B9oz(n;y{VOFpmHw!^n5rNmD0DjAqx0x$Lt7QlT5(rUNkkj_Ga}CzA(Mzs;2wBGq zeivyF31qIO_g_=ZXXN>K$TtT8WK}Piu&>T=+9WbfRg>_%CW~vkX1=@J7IaVkIyMiH zr(fs&#Ns=%G2zTf&l2vZ&IWb+o;~t%#1jhw1I<-T`hBqJ zhwdu|9Mq$D&qv(E3NW#pd)W(;32Vwa^CbQTWz5Y@5>Epn0USwU^Y=~Z#v3MOfE;0^ zpR}4-V~dBw6|n=So_$>7!%Gm`+C#?-ChCL|27Lm$wj{VEoT&SBtwtMd`PfAzAwm7ez>^6!F|xWIz|eDBC5tx2 z?w~O8nuqOhC2Y9teMd78J`P)Y^S|urT)2(3wZH#q|H1d=pUb)C*ruBGJ7lRJ>+N^u z)2b5)=!Qo|mI9oX&RRZxd>s6z93EGjvkajoWCn>r9{USrVKX7OD=wQOdYz0)?uAs2 zI>zMaP2Srm z3ft_+s1jilE3~W?Kx1wT(I5<|%v-?n2oi!sF9eKu!;Nl3uAWac=U{8u$V) z(%K^bHe#R_=zQ$|vkP_(A1|DOViSW@_=q)yG(XDFJe_p@jVtl#TIxP$J0d_zK7%qe z8ftvsH0&ep{7TbYq5V6PNFlfA15WBG_d-a+?k<7-XR){`@lk&N^8BV zDT=JWeyb6>ILJ$Mo~H6I|5cULY+&t)3AykEBDypS*232~kkIwH(iy8Hv@hxYvRQ?C z@#gw@@5u#*fUmG+Q5G3Uj2?)SF{Fsnj46P!3Co*nQcrI`D)<(Oku+$N1gjo>lbNAB zPHt|4jY~u|qye*bE``GwJku>eLP0?y?;!8eH^kgmvCVI9w$~!zvNBGNOa5SZ<(m1O zQx}|VBqB`AR(gP!=~>R%Kp$*{VlVJR27wt4;b#M3B3X7*S4+XAPP&(aB!AImC_o&n zUh>e;tC2y;d;Q1Z$HS}^Lu^TzV<7$vI zomN+2Dsw%Z$=&F0$SZ#f@d>8xWoJ))Z7OYcH8)32F$&Z~JMF43_?)jb`gkfRTD-78 ze&TAI(%IeGTe-b%^%;>`5?{I)4msX@oK{z!-KzRbi>ZBSh#DQj&Iq#RLqkIWh}Xix z0}gYG1Ya@cCFr`jbknQKOFiVXA* zw+~YlOA;9c9<{o#J&xIm&&|h+Qceg__|4AE>~I+PzO=0{uT)8mkD_T^tF_r@Gr7X| z;<(7%J6o4SH&Hu#v++s&>Lt9N5AXOwp6xlD@KOL8M2~04%a*iJK+D%k=j|^GLl0zh z=FEn}pxLTV*X}D*6Y_pD$+&PdS&lR%WPFgzxX>D+xc2FgSOWaT-(#g7*to(2*RqqC zQrO)*{(>*gC@b>e4nJNsy7MxFVk7%A361&eF^B6WH4*6Zx8n@8~ zOA|_IL#xHKruhByY?c;%#9Mht7TQZZiiA(DT~^lpV$rC?qnq4PI;x}z4mixK zmG0>;KVB!Jkz+p!*fhvbz=BL4b3PG;1}VAKz2SN}WYq8uFKr*Ql`e5$y-~aFSd!D8~YQJ>8JJR_qHFE^$evUCBnQdabVI->Tks&mm4p_-2^TRk41^N0S`>>K>0 z@uQ)90><1y+~SVawt;`q5B*NT8uVXJ8-J@(xI=F2P9gJyt z*Q@kmUPmD`lEGBz6B_Y<6Z}yw!$>&v6N8ex!hg{3I@HsA0NtFc6pE|FJ|?WmmGahS z?a`A48dU%L_tNN2Mln^Ncf{C{cwGk{4!YJXF)XvPP*Mw7nbq`ACW&@&Q8iOnyY1dT z!R1>mEm;dj_T`(LCFIYaPsf?uhzct3U|4c7TCu$d&8w}g{gsUEN=AP&KB$hlM8Lwr zf)nx|*M^zCK(hTL?(01fmgfo+v$G;XV!*1@2=u6SJUiXgz32AT4Fp!RkX%EK97z{< z5KY}&W}90fnx)jq+FIEZ`*lqWWsmCDcJ}rCR$n2L20Ko_^=ir8D7pyh!$cQ7w0D{R zwpQ9VZ4qLnZ7;5&p7r8xMvUiaDUL8>d7}RUgG^Cla{AiJmz(fg-KfuwM=qskNK@JQ zNAyti?oz5Bc_ka~bVVP&6^qrXq?^GzcDpa|Kgvx_*3Sr$(p= zd1E8+SNKCACggyB9Sjc@0AvDmI<&(BHQ2MXK$V0P1G>`*N zGuP9trtDXJ+yfKBYUABeaaD#QK7bkK+(_&~t>F6KE5^7=`w0Hf@2*B=OiiEn$cV(r zh!!-VJi+bh^FP$GJ{=SlvDa6*?YygeDesH4sje#h_xkZ!lb4(>&70SLaU$O;MZT+- ztGKdK7q_&aPz752w6Leja!^QQ>IMuy6V46<^($oAGTsO6d;jHqF7>mbrEZ;cvo~=7 z%3fQQftjwboNKCpbF3L87dvsL{aY7B+4tJiar~rH!7;jxl>phG>7?XDd3nJ3;-gpsN%Vok!vK8Nd>GWIFd`Wb4@tG3WT(+>J6}39E7H8nTzUO>DVt zM=iD7UGD5Zi$0!rQKyyuCYmx7mKVtdM-?O7+SnRDadnBu^!!zQ#(?~WTX;~i&iWv5 zvk|0x$HDRO@qZ=1#tol$BQGy4SXx|^mi%@ym?nrD5mD{pVv%D_e!UXZKxy*Q+@%qO zProc#?(b5!5JeLS`OVP~rg z)EjYhtX-W2lV(3ojZL9)<=gg~V$s6dNih zFn(bc*KMaY9pu9s7t)zBd+k}64%htTyF?K5eO;%O4pUAR!=DhNRUIP_?*;(Z*>*Sw z*1v9IWpAc@T0b1Enwjaj=$Uuk^OUY{Pt_@D2$AQ{89|G+p3TZy;GYw~nu~{2^Qd2xM3`@=U1YDwywO$=ckHm>D9+=Vp`PNrgoXuRxDX2}O zb)2=xS1IKl_2j=9*@=g}Acn2O^h%uyEIdrX7Q-y^${zx0KC`#ox4D>|2A{0v**?+# zk#v?}QMFwZ9uNfy8G1k(NdZY|si8%1=v2BprE?s*Yv?XPxGV6k-~7?* zf?v!z&$IVlYp?q^fVyT#x3sfT%#Skw&)(I(gM1>z!_iB%NO$vov-NYpxTLW5%tqQAHTcMTj(IWqWaP5&5avc`KK|Y*ZgFZ7x3p!30FN z;=uNnf`{JtY!(0dRo?cCGCM>*zY`J%;~dpq;G#(SP9In4EI6^UQfqT}@~6}Bd~)PR z%PeWL0TnZCj&jK&Pj}nJ)R2pPZ9?%XzdhgW`>UX zNn0}ml6hc#Jk3J^qDZBw+(%9SV;R=}YM(w_U29vQg9LrfUt?!yR~j3(Xi_g% zJ!%if3*ur;9Gch7R%Ok{uWS~wM&56rBMy*EKRlq~wO%9*h*cV!z2`-Y8;E`^iPhKR zWezgm=a(b?RAlQW=xWXQ*6AaZJ(WoWZQV79MrmgMQi1%qSJR}@8E8i~Fix1%6c3;h zV;^&5-~~4+<$S_DC0Br$!( ze#n~i_Z_1Vja=t*8@ryqcRwCKhYNgIx(ZMrVgGyMdz)RpPc)~aRQ^1Ka2*oW6XosB zl{&%=kKn4S=jMF5#VE5wPw8gJ+5EjeOx33!?+pvWmcgx#L57h2?Abf+Ek)zqYsWz zzD-XzMI$^^p${SSUbr48-v_2W5lZiC+?=gf>h$JtuJecp5g77v0Pt(k=J0US(ZbSk za;5(J<$zU~Jyp1mBb47D97upm<9Em@E3>h;&#JAx$jFh0zRK_C8L6wQ>&T{=a~ew* z0h_z89=G#4dH+;jEZXM3gj!23YxX@Y!9c{kT{c1TNoS zo*>PQ5AQMTF$7RL*=6*>{YU&1i$Ufi4r7-aC70Y(cXdpEd$rORo4?So^P<8&u^hTS zZr(cK%fnuW>$FHIA!>y#jlwP~Y2?V%5K_jf&|fD+nqQ4e3f`!(YeZ6r@^ZFbpR35! z*)FRmg+%5l(=yr_I!>}_01303XY)&r+0i)nfBrafCXL|TgaJ>@8CE__3&Wt#x=)T2 zcubHM$R=BJWVuBX1wi`3*VU{8{?(f!H9|71ow^4R8%E}0(V)#aOU{*q^Nx~AN}~ZO z)mkEv%5UZkdC9?*{<&7t;q8VGiNDijtY)7v1&uE(ENJWKkWPI_Z$j<2Whjtd^_QiM zHPFn>RS{p6A;F+}&F`{(I}pyPh|!z#+QQrcyU4PvG#>^Vq{g7US2qYp381<*&{Q=1 z&VTGY=4wPyGu5PP{|YUq`KuuB(<1E=@Ac*Eh_NSr>)jb&E*lFoygxA0(pM5=hIlwX zZF|GR31Dg)DySbEX+Hf41cALoKVv7r0-Scga;b{Ta;auhJ5bo5335lqs(*5JE-h5@8Y2hOh7#KX(0#Y(JF zoL68WKcUD=b|sSga>6(-zHR$cqvIy9z=8hafa+J(W(G&xOJ7el74r6~Z-MBzKy3Qu z`L0Tjp${PCozI5_I8kdFX^=|NvS=)A=C@dAe_NOcds{5C*j+zTX{usv=;P>|0V!y6 z*&iQ1zt*v%67_r}GrAx3c#0Q;>D+Z5c(QQuva72Vp1n+|{Vggsm37h6<=-7g3&8vc z;Vki7vCmpZVv6G@T>$O|Q2DT65EhNRL-{ENk?sRGeNI??;XJW_ztPOYK()O)Z6iT} z{oQ}i@dCX(c$gPh@!M!wQ0l2W%(@YyrY^*!Skk?NABR5%8Z zmAF`UNcFJ(cZBMpOw=^|I~d1~Y+}P4`Ivs}vwg90FVBqGSs@;KOT0dM5f>s0M9<#- zys(#{N%kZ{4NR5CE2@K&Hea%QvsbBD{pv$|;9ZDUN{2AAW$eXMF^yp^b;|4Jvkl^GBfSG_Q z4Pg1KbOn>Ceg9ea&`qE;JT{gousngN84kAdXxUXmETAIiE_+6$=-&kPd*A-99K z*y{wa?$ql#0ZLx`O0Am#yw}4a0%O8=)}Ees!{^~eO@^gV6>}oolHd6(XW_;W44TC1 z#?8%Gi-or16)Ez{0i{Rd{&E2j2)j%66>yQlNN7)5Q#I6D!5^4Sk`uSlIr}Df6k}u% zsUGYafV-7`2lJ=pu=}D~H`+RcB^tLvW%BSMbgsL<#Q$^#)iuqj_u4~3{&n?7Ze2pS zL8WHsbe2MoL?i4}_ziZKVI-{WuB!_3M`>MhRGJn!c#4c7!KfBAZ{7Z)$F_mA%cIx`XLy`(VPK)Ai$R ztj6r@?DF!_WQu00EqcrnuHM)IV>7e9*|NoF=;#ZJi;F^nV$4M;o6<@Ap{2d)?n+8Z zTqz4Jt98H~VkC0)ZHv;D9icu}|Fh2fq&+(j9mr)CudMUW<{WPMgAaffvN$mKx7XJR zNZ55NZH_!TD0CJXpjMHd4jf-$YPvs^on0b^+5?HwlyQ1F{1Apx^3P}zTC-rM39z*4 zksp{ZOMh`vvt#i6dXGE;iRBpy4jdSeU5t=u+@B`O) z=ZjCJCK`Z}VPs^`t0#X32q43z)r}I__%Pez=ub#Dk^Yw+v(pGaPDFQV%=6yHUc6`& zM=?eF)il3$2mBD@Ne*X4bGX4P{O5{uJbDWB_;3Tv>=~;hy7SReqLOg#(cFweL`3Mg zONlG5y<`vu_N;gp;{C^N(J0k;E0b|5EUDwP%q8-um1ucRv|b1AA~~r1J9oi}1@ATs z>x*SiF?r^Cn3k?CE8(9ffq{pIhxW%@XdewQ@KOr!!UUQM0Q!ls)BG>N63^AHvn3!U zpn7}MSbO2}U^(tXKCdEF?fhyXxM(n<&5#eSTq2N`WZ?m?z z<<2U+H}XA`oKuWedP(m<>ECVkS8_C&;W~Y8g6C%7>Zs_x##S1>wlrT#K%nyAogQES zz6P~7^d?7VlNf-|KI=+uz&x7Dzs3Sr$dSk6s@R)Y+S(9-!TJfMU;S+ir2XxT9%vnh zeH)ND6KMjPHIIOI$`2tkYf_zXxB!kl>BKY+U9Jq??R!BAEm>wYsJ}YezeW~8t;!N_ z0Fi~UoV4D|3(TF}Qv(@toANyXUJ?uQ#yUGX&L1B+j)ONLWQDJe211r|_s-qNIt!+M zD15qonw&1%OAt~6mN3^AjN@cen7b%qf%tu|eCCcNggf!KB#Suj6|)*(%$_b$?q})u z+`iu!sW2#VKqA%8*S#pFc|M@Xe<~w*LDK^<)Afy3%&>g-vrtx40QqIC6!3>FxC}i! zJSle8p1bh$`JQ{%VB-Gy_jucBNb#@Y-9sU_edHxIo-SIoz;;|5kQb32(|vn~?sojk zLTl^cZc_GD3I_1bOzoa`cIK?}8|2~HFFMtH{F42z+Nwk$N!1Y*7$o9=M|_y1_>vj( zBmyH`4pcC`{CS2!^o9VGs&w%=oEu)LdC(t2m-L1a2+4(D_V~3chblWj3uMF6Lg8l4 z@kk)hKMXu-WDsIooY~?Z@eQ#-*VuAg06kTYkS4RYGn%4_>> zGmn3P6IhYkN@oeuEshrf`ao*zPWk+UCL;RhCHu;9#R1ezNkaw@7J3m;i~tVoK!B*U zf_txw@9qOoejt8e-6@_fju_6-27?74Jt2lBtVK+3J@GJEJ^WvxcaF7zjy%WCl^SXg~6eJ{NpBH+8?f$XOgRJJ^5Uz`MCPiVeG=~cs>=;cWfY2 z3V%QWjZaP0JDL67C_bB-;tn=^mo8g56Wep8B-*HtUKo$e$RHzaT$q`dm|KjKXTZ~% zUfX{pMF&;b=*+oH)$Ey`U9Mb1YTEz3E)8FB)xEPvuqKYkmS$~iUs(<+qcCX=;quUE zI|+kCd2@(`BF|FBgjeR~goK2!Kxy2))Yuw?p|ir0Xvp%X*@c83!lQx>WK$mzO1Ek`HTy6}$VZ%0H8TmM1ZW8@lPW`UZME{IxNNIAhm3cn|wow7yC>uL# zx6O7zqVU!JaQH2mY%ykV=k)aS+FIw?*t@C4MLHfm=BHNzbO9KM_j4ET6}F~~n2|uK zFnbg*GOE<}wHi+zg$Za|zj~?q+)}fPsYw9ZxG08%CS61ws?pw9bbPl!;!ytR?694_ zueX6g;%sh&O~IE2IZ-WpY>7s3pDG#%nW3T-!9-VPte|KkT!0Enn4^!P(+uxj0)HZz zlSRq>%5~o22#Jk{pjE+`qcIm2g}wv( zxJJeswR1ptnZwYD*sA={TLR|7eEPEI9Rf-W>*~Xs+?#9wsdR^#!(lb^jDJiY zj9(y__;#>@LhqIF@Mzc5q(Yj%zN|wCZdN^W+cL1})u~Lk`<+!jh)Zj@fjWD_HcJG| z0X_G}RG}Y945MMs{8x^eV&*oR%CYlfCvlhBaRZc5{eXDLV{Ul)wmM4!2Syji`I8^2 z!|2(uG>zpN>?HZ;aUmO>_g?Y-Lz|enxp5i$+`Yl&&pRr}Sj9)ioo+gR{){IGYrVV` z8i3N8rhdGuFG{h8z;C=bF(f(~$AiEULD`0-=c#tSC%>Dbkz{!T*l)%VTH0v*7a7 zV!Fiuf<=JzxOGGl70@VvUlnzHxCQbIUy$>Iqxz2d8oqV8tXu&K7cfOcpaCWHu(39e zo<``~&k@J;qkqrC|4Ck{u7)nJD@>m=PcKlu`wRrwc&;xG`(BWjzZ@nj=)qVi*GQNn zk2;v7qg6(W=&3=-2Jt1$%?25X53;-@pb8{4UuD#I#bt;mztm54m(6$oWy0?#y9sK`mb(M@7%T_TKI(ejC=`M42B6Lh=zrp z{wbI9Yui^;MAvQmP2ynlfbFxJeY!ah4?*tTcyQ;o|31J|j33+XDx8#Zy)r4dku!6N8cqVq|+sh=~~)3PO7(50*NAUIYA-m~7(-v5f$%(GY|Kv5AM4 z-aTn*mLmb14iwtO@$Bm}8CzXZ&!e?-XJWig4m1#|VL$6o1`=7WDt~u{vVJd~fy~4Q z<|K!o5k|R2W@G8cI|n=ahjQKPS5xXzBcIEFLiN3(qJEomqcRgPF!}ZNmD~47M=^Ll z%)!#q(%RV?@M-;Rdq}j9k`bo$meM6k?LPz_)Q0f0quv<6HpCE_V@n7%U^>m<3;rogdHT#b z4=-z>5x9aOdrURSdLw}ZMI5S7xPh~)3vl2Ak+sckHizbRr49O!AaRICn@lz=+d0q= z>#gXIbGyIGnf0}%&(J+sy8tLW@GXFp%NsTwr3UStoxL0lZ&&WeR%UU!xXRuOZt^<} z)nNzL8v`~8TI>K-mWc&qosG_v^AL}=jta6s>JUl$yYy>KCqUMExd6w@kjsbtxQeh7 zz8mIl)cs)pf)^GZAL{TccA(`kmCxs{*N$J3^jVrn1?*Ajsi*+$J}sA6;s^lx`*1v8 zE0QqC)8d@T%3*>0wK!)+w$-@?d<X>#@0IJgcSbX8*9 zG1I`@;dHenl0mf5V^kRX!5H;KSoAy)e1!dl3l7Lt{LJ(TCDrJpMrmh7RZOr%({L%T z&LR-pNj-`hX7kMtEr*vR$C8SY0#Yy2Pvr?)zK0joeo6_6fb%morJ}W4j`kL~*@r~? zVcBXI*h1!8KCym%xq^oQ4jSYrE1k2w-*ofIvq06r8dhIdwyN9n_GG}M0M;)j2C50- zoc{h6ef;{qK#KXIxM0BR+b$yZMGR8pZM?Az%SUC!EufD4<$1i^zRK90&ZL%u<&*Y|6Kp4=Nmc-*toZZX!;B?u4v1rtF&=ZA1*}ErU zvmEag=Yl?e0Kk0;%odC4OO?EeBmw(CMyxf^&{ba^{Ax295|i=t1YcjNfq~?~R-k75 z-G~aJfdYSChPdZB`pmU7`DpF#ON}0zmMrP&d3o`;1vNB#;)4*CSlNm7L8Wq%0Js4^ zCuiJgbqIukC=^bGKwE5sjv9R&&j;j-4U2^Z zJ&e5Wd&~8NzSd!3(xD-~aQYrb(cWE!yc!_!`oZRT80$_twd2%(9U`Cff?o7n|J$TKZZ!|YXSz>MI)%qJi~p{BcnNy;SEcI?nw)hN79UP2>kii8{NAPW?VSu$1@ zmv_4<6sJnP{w$mXf$%ETPToUgp1P;o{-J z08hlGdj4zX*Zt@3fw#%vEoFs|BhWECtk(bV-hT7rtSgl2*TjS+hOL&gaEv^|I%i)b zYIYiT-&>q6utXdtnpr_{&w3NKSK$?&Nh`^G3ijpMS(;wyVq{f?kRD-frq0kxqc=?$4kMjn#-lYI6k`$gD50fKB z;h|NA1#>}-OK*IvT6=jrD>DBqV}Ss_g*cB@Lx?Yyv~ys?y4S<&H@?5m#^w$t)8Q%h zYPoYB&6=SweJI+u1rZ6g`3i7r8AEmuxOfz*T!86&d{1hOjnEytJG%0@ofruFdyx51 z-O-UPBR=*;B}z6$3*+>cXP?i-f*pIBD8aRV!LHbEK?X?U{tX?ShUi(Ritn+~W4nW4 zKgV8saUQf6e>d^R{SejTUeb@7hn2gv$JS;+!3EthI;s67I$b^X_w5jF#bu6g`JS*Q z2Vu>Vm1(86zB5uS8b$lZEKCe=G{!4Df`jbJrQ=DP78Rc=TEp^v{RaCsRo2Uki~Lvz zJ(3H^?Sr#D9;m6g`D?xH!)l<>qFLQ9FM})L%MCRak~jLA!&~bqkw+Qj4Fqv8$I;Ys zg@0a$C$)!)K7T^_?mu6|(b=UTh!YbT848<()^s8G$&uNwE-P_EP29LrRpOkK$QPP@ z|BfcxJP~7(q&H#8kDsuiFW%@}tBMx`k;}1=q8R`QNT0(kB)An7=SrL2q;W5D@hq?E z24&-;;^;x7RZV+QWaoINfbmIKR={eEDf4$F3Dvk>fw1mZ4dAANIYFG*Rf&3R_J)EG zWq643(l{^mQ?dT&iILXN>JM=k@u6g-lY(!)pE2%NWK$K=J;TeDJj=#x{G}ih$C)V0 zU#z-DEMywY_@jej1Tw8AGJEo3@3ntX8>t56xA|$e+xN~YEJS=Uh{ZZye*PMl{aL1{ z31OFaC~fp031bQK!$X^?sW-CB0wggw7P_*b7%?MbV}HNe{k2eFSe~7Y{lEzDDL}H! zK$u%u8QX4<1zC!7Np*EuVPQ4QVW#QYwY7F3i}aG?$U;T*Cc`kcpEQ(AN2J1zK^eNI zA7_00qqN4r$B`!~oOA4~dfu8nHA3KnogIMgL>%}ZrbB7xXC{iRv^hT|r=|i&WzIs< z&M(}tGa%e-EJMI#Ve~g0I`?k)c#Y}b{(m*zSO49T#7mVirQZJUYT4MpC30SA>l~rt zsd1f?D1u8*)5Z3{W;*v$cQgewalR2^1sWE>uarWG4jPl6b?uj3e4D*IC zEWc{oBb=LbFjPlNd$=(J78FowSgFd|m|rD>hE1xhh0!a34;55vC*|lxkzxwr2BRX1 zO8kh_N~xt!5)jyWQ38<^)gUIrFZ64iLsdMANe1n~9Ex;D-8_oaTvEnl(!+J{hw$MT zs4Fh5?N{DF!gbhIqBkz=7SxtbVOq30_7G+Znmqfmc@O6|KYbd9J8;m4Q z^FmWUZ^Vh=q4{-mJZ5M6_+7-H-~}7>Lx2t6FK6}NokjsU8{m;~GMiAW+}a9Y3p3{f z`IXy^<@-(g-E==!dsYK?P3FmQEiI(ZbJ0WI7Srt1g&dqW72FULQ}A#17#f(G&R(^) zIj^*f{U}fUXm^NS?a4Z2EoUYuBm{IyGo>1r$D-6h4N7}~jk>PR=e-*n*D7PeSHlx@ zbtW?}OL*P1{=I&I&QXAr4_{a0Sd|5)U*QHD&%LdK#N>(KT!3O+6QmIus$Zn3#quW_ zBO1f@0tAwb)YokNRFGX5d&(q)7xY2K%u~`Q)Gz04e9R!1RHG8A#AoQLhkmgtOTue; zd0;5CSvBuCe-Q|Zk<0fQ)6pNj@ezXtoJmy1k8F0eGs2+l5Xk~=1~4k>v-YP+{XAlk z8-TxP4kXcwwoV2D1%qDks9-RdaPa+b_BNJ~f1HqEEZ1+QMANroAc|tdc`cm{g~Lr; z-CXyY^n;tzoJL=Uem%y{n!TQ^dK^oQ?XjxpGc}a41JGLwpTn2QR-^&oIr;T>hWh=6 zqU;ooa&+6u-zd{7D@>AA9cHxa?E*6GvV6%iI(={ZL=b^~@q6l&EO^1<)I4PlfZKmh zAq>GUIm#~y2gR^Z842fv*pjcj6MWg0LUr5iD&uD=wj*9k`L|OOcD`z+>RXfjRx5=D`=@u89d~*n z55SNQuOYY~Qug1sBzZ~z6eCUareHGUE`Oz_aJH3%T|fD++bCIwJ_UOBr*>T)wP>%BR@2g}lO(K;{39xE^t z`JstPDYGZVmlV`_eex*(!~(=dgG%CG>-V^LyBIkOAFUeNBIpQwBB zO^WB2;g2o`(~nv+k@+|bS+wN^UeV4iLYQxt*AkkO`xZa`vb)_#9a)v;KdN_!+sdEv zo*q6y1cLA!+De>oXLD6t+?+0K{Iz#1tGlUbJs6o$H~bW5?-=U~F-x+?&@~P_D6Jkg zv|FE{O0XyCX(j{H^j+0Kj&Q`tpU)+;bW{U8Bfr^nr2GD5-UyFH)!nqVPQV6Xjb7`$ zJKfjarJo-6PR0|pdF7ql-U1FRVKhlKQ8v-Td*fH&EYz_P_U)~$YWV1rv1M5j;bPTn z@-0W(Hf8L9=*p7hL+Li|L1x;3RcyX3ZRUJ%$7;AyZKknmbV;5>H-{>s`y1>S>|ZIgPx;Z#V$m-%{}|mR4riQc zShBVYm8>{f;u|FKJp)B!Ml4~cybw-Nup=og-g7;y1R&r7e*6{r_H^cZ3$XD_f+pT` zwiLSWsShoG5kOtvKnSOyrryR&ZPH{#rP(G2>3)Y5$0wkTx)>`nHDQGfiLcHYq4;m# zh!+8-px<8&=FjdOQ!Mq&xONj~XVsU-V`#Q%i4}lJf$?Mr2R3BAzykQMHDkd`LC_A; zK&NiKJLh}bMfkg-r&xYyK3U+2DxT%g`O0LN!K=uJO5afd4OnBj9mHdb@YfhMZ47MW zi~H(Sc{D`0tvC)t*dCe{{nqstPhVdK92X`^3X0F^(-)n;dH^;N2SRo^vPAAKuP!g8 z{V&j$l)|_(!Wjh@7o}B3XI_&Sayosszs^|I$zjnQ+pH4(yNmn$=eE8FbIN<3e6;`6 z*FVhj8;sn&q+L+j(@BLl7nja#?8Eb}*rbbyd$DfDw`@S>reP(1wUGf6pLVm#6YsR_ z)tB@=Qa9r1P95s1Nn~;G%#)u*ZbnfXRJ2N!+1r?90s^xeA4`NS;9_bl&N#2=@T8ns zLF3MB(Xgo?Ai>zAzNV(8zWytWB_A05bX9oVE2uFi<;UZV2x8L-u;5bPl5c*=cxhoq z1M=Gswr$*Lq?h>M2Lpz0qqwNBZh^DFiZzb}nB0uKy#R>>qQpuZuv7_u=Mf!Bh(+{6 z&_Twmq1-aTF!^98iwD3zs7%h?7eu9r9gol)E;fq_28XzJ@xN9d>5dVuveD7<%gak31EHp-?gcisjqdxS zx0&QK*~ZoLFZp^+&4}v`mnzMU^@pmEFH8P)X1~cwnt)xzKXG)J>>vjGkfcvOH#;$O zJ%+zOm_|z!TQ9OFhH_yiCT)qVtYpb3yxzNEdP~j|*?B1_(@|OeBE<ev)9r1Ex= z6xCD3H4L;~VKLgoX0o;XVc@hgK@D<%7y=C2P&mbUlgCRMwU~*Fut^K1nET}7Uw6Fx z;f;&eg&6XlN-ujVUcreko)>zf+qial>B=Wt@;Na4q_4-!{IJzldnOgdmRt2?Ji@C+ z3nH0cK?XPCb@Vwq;z9RYP2;RG`RACwmwTta#B#x8apf3Yn`21 zjzjdVpEeX&)b zfp*$P2Ugc5-ExO?z>;J}`=qUHX>-V$6lMUP>=j<{NU()W>Yc=S7t>y`%7?CXrM4~x z-ZY`9Q{01Nz^J5Lqj;ocSq~VX6?}%WXQ~r@5)Vl-n^kFxNDJ`<5}eayMJqA=ClopZ zVuQ*bT}Wh^1F12(vTj|aGPa)@K;%QyVmYwA#=`LLFqBymF>eC46Nvn1i&X#9qspU8 zWbu9c=rm*oH-SwE!PF&6qZt1QpvAa&F;8+&GP4}al9PM#XLE?k=lb_=fEUM{Pl4$?M3h;f_v`e@wUSmv=^_etu{qyYH>?VWXx_qBl2V^>)j3p4+3dv&4FQv;)#0_nKF&eBDY6w4bqo zB=LiTgYN5V{|9u}gP#VFXVZfDBCot&9`Ee|8Y|ldmd1D8`D(XgM!6d42pZur3R2RP zjEpKar^QGcigXHW&b{D?rKEqJZ`=vx85=gMUgS~0C#^6QiJE% zJ_LdX%oq+`po-;B|8aB$iZ&PvounAB!>6F2Ft4i)rvX1T007#${o5k-to$DSK;??% zR9(I;?GAJWj9cbSG-#OqO$ejVNetl9r6j-cT?-v@hKwM~sCC4jYWNwB+ZChYc3d5#liw2XGV>?t63D0+AR96}G%g)8q~DG2aW2LtA9&kPt1EwZvI6p=SlBMMt>52Fi9XD~Y_bJadC11nkQF!_-Xf0GfqVOO#4)vm zh^jQs9QeD5T!fzZdrio1*na-Zk^bR$p>_MZ^6Jyw#n@=ZuE2RW0s0Hd;k+r}pulif z9lgN;Cf5U_7kP(~Gq=Mspf|(qB9_6CrH+wpxy^rbxLnVdImFewf5)kTi>6xY&VIHzK1%-%%_znOn?G^K#Sg}K^X7q?+!7t(oMOr^ zZB;*Z)&E4;<-6_bQzzR6Eu}MKKU&!aT~H=s6QM}Y1lFezj7qT<%@->E|Y94rQ#y4YFZRaAiiCKr-FHwsDLAMTTW zUIA1$@ud2QNbSZ4v55Df+w8%yvx8-K)%EXnrs_!^H~ z#G|*e%cyzwBbrRys&(va#8-mXKSife;U$g(kK+Cls*eS)DWiP1f=PB5&>$1Ev_w}o zjVVlCfg?T%nPg+=7&|co6;ksbMzxkgfURwFAQIpwI#rsG+tx2QrTKq*qk`i{grnB^iN;Ay13A5b#*Z{ z^{}=Ew#@MSn$DyRpez_0{TDGnHX)49^It5#1jlrkaFp4xvE-0`{ajweEEz8YSRK27BHtvU#lK^+I zuo~3@zB57v`4}K#$|LjdQuVHL70gwVlnV-CAp|DSl`z*}uzay&V>mXJl$(c#mOL)l z@>XreE)3IY-{dDN%+si!6iW8GNu4d?1-&^EF|W>$9^Q2AI10$I83?thAAX4@uhty; zDsx|al`tR3GfF8a2w@si$TRjH`&jngFFHD>V3ya^{Z*E>0=i0T4MboCe3mnyH{KxpOUgqeV&wyaa)w{=?9Zlv;rG-jo786JT?EEAszeN3| zUl7=a&E`~d$*Hw;uH4ndg&}UYNNt?Ln-B$PCMzpLQc`Ymm8cH)j-CbV^nV_a{ckRv z`+5K0ikX?Pm22kP16yjAe6SqJ@N97Q?tiL~YbkoRgj|tR{;B0Y$@2L6b4ENjNEZh- zmA98H6qy|i69`Ezx0>jPL;zWUNa28HJzp2TCv+2=NHJc+)`JQMj!|)DK$ivwSbd;P zkuPK$BFveM=f7e~PnfMl{7w zc1CJtR?7Fa0cE#hW6eH^o=RKk~&6eRYAGoCwU(rDbFQ zOV5h$@!@IZ%RtGl#dU_`1Fuf}F9?j|zO-JXQZ&E5S)EhQ{7t zkXpVEH_$9@fEq6_;Q7I_#$97ApdfhBQ~iOfLAZsB+ZDN>GX{rh6>A`D75#!Ts>hJ| z6B9FYh#1~eA7!S5K@*KBH1Lgo=Ex?kFg9pX!=F(h-!Wb_f{X-RT$4brfFs@q9F+a- zZUa_AoyVb!(PnF2XHytEpj}0__M9=sK4q3&y$aVh6sTEQC&B0CJ{L^c&H?{qjIoQE-F&fD} z6lsAZ7GL_x6K55%R5FsUTB$7Td-?v;-}c{hGS))s$J|%4tf+o@89_-qX_Uk8%X#54OF+xIST(BtU_I?3F}n` zCMc-Xqm8N+@!!dXxSxlkPzRK_8n+$>Qmgt<=d0SadV6_zbW~x3VqvzS_iWo~ptGB` zgW+#F#rJ1_AAfL{X}-Fh6sDxq%@QxBwg-HPZ~6GH{@&XCl^L3rB&DVnccCahHNx8K;>=?^Q{`!jU{%E{FMYEEScnRo_79N)ap<~5Yj5m)z&hl+2 zNU=_Qwk2MgUDP@0(Ep{ylcvY}2fOK?|E92{(Y%3{X2Ys{eIYS_TW+aBHwa& zAQ0WvcVFknoIR#Y@l)M9U@xJ@Dg$&D*4X7Ag^InUR_~4Apl|5#~+uit6Nnb6<$}%@bznxYT5gAUVd-Q zTuFTD&k^LytLzo<)_jb3RRhShe?H*f50Zypm=R`Kn!|OstxGYWEAL@tHX^+c88LW2 zzY(hh0T42wNoc^O*qYm_Hiu>{*4i?lWE*+sN` zI^SPf?J;!CH{qH{t&En-Ejy*L4F#g?*AtUJtX4)_o9j&*2KHBK_v|WJ3c<9dg>UqP z|4#IjhBaEPPpvx*eaX;@*9hxz^!>Yfa$@i1c4c|z^fzL}23W8vyxHB|1uo&bnwr{r zH_bYt9%3q-*9gR`{2I3A{QO{Uk<2%&!y{m3^@ORv5F^T6<>Ap${brv8KVbdP!_!k> z8yfVJQ1MsIbzQ;9Ept4-w{=&$>Rj2sLfC)P*xl@!7$k<_b3O1NJ6l;BwLQyptpRo%*1%d_ID|v~CjwlA0OEHyR$Vh0?yL{lHz%iv=8a z1p;6`72T%LNAp|{IMoxo5O8*tGUR4;MD%X%NAj*d*)1%G-e|t5%;KXicKk63L%H_} zfKQ!?^5Nihz8>-|s>L-m)Lpk8N%`7PFdYjz*)p@eyTd3&{j=}0y0;h{R5~zSdp$FF zA%^p*c>Fu-dp6by*4NKq#cKzXwO2m(%X6DY-^pbUC=uLYlGC>)7jLxh9{AoQULaSP z0;oluE*8+g|K005j$q$bNZVwov>Efg_+l+5GBNwxyrqPt1r-#6L5RW>n*h7)%_lf+ zdyI4Yp0MoIs2h8$o5S6Zae-B>Q&1pM-`R*@T!ZT;;JYj1xX*4g&duUQMnvhgxC3Eh z3QBIc>R3Hgc+OZ*@E2-eB`rqw&Xz-j_fUNhue1%I+CH2gHS@q^U{)C!@|yL|9C&ipg*{X{uHEf zCk{M4Cmon=diu5ld56i3CJjGItIKrDKiBphu)WK=1r*cMw#p3g1&I7tQU^U8(TZNTQu*~NCdQ$cv^%OJ^kPP_ zVOa}`JEj2?QXlwHP<2#{#3CpX?di{&@u1TijCS~EIC%&{W{+v_m$VXaOxc)Ns2?ii zZUdd4wrKonFuyTvSm_tj)8q73SN95`iBx$mV+7b^bFCKlO?u;>-%sm}i@fGj2NGMx zBk?42)PB>KSe0u$$F{1NI5dOcRV31Ut5T%p1u}Nw2;qRzai3SdZLz^!L@gf))+Nw- z$159)t9Qtri{WnyXEypfs;TA?aaP*8#LV;>ztpBjnfy5r^`YfqbfeAp+V@7fFnv(( z=H%}0%1T7bMc1*Vj)$*Oz0Ts(^1XF+wp>tmI~%L_`IM7N{^g_Heb;xKdZYqXc)HKo zr@w18^H%|lR|EIM%|E=?YY7-fy-pQAk&{CZd!oe)nOi>WtBa>`A&6*uOUFGRaCZfu zuk0Nj2g^kDQ+B8>R=ptqDI)mJ<>7W`GJB)Le zBu0qZC;YeM;Xlo+9t*P;PE@4wLu%jrvQGVI{{oHGa=VXLZ%VN%T7n>e4`=9!PNf0F zyoo)iz^aMBZ7qaC~avRl)Y! zbg}Qn~6Q>*B)K#PZ*->DigYmb9ff6JEzyi zB_i~)_sjN?z8;_A;GH}kCn&#DUO=PdIztIzuIcc4E14VuXqm7cpqEH3cm|R$8FveN z%Ed|?mTI-Zg7A|NjfTb0Xcp@-6Doi{_Zf2b0TB~VY}z!OU-!VIP#pERd0yM@NswUR zF)BVCd_z2_KafznACe-$WsIgAwMql3)=_!#RsW`BWYO(~YZkrOGk@$S1^bg_*PAeA z)z96ELKz&S-$xvGNc8G8ndHQXEv9LVBnS!!=J-ioKSMlu)m%?5+n-pB1w#l57D@L2l2O8Lfo^bz>>6){B z;o(Mqs(kn^Md%Y~2o-FSRXB(0P3w{pm5>%h9YMQ9rlCDHM}N@pd?T(G#*2~ce;;w5 zR$sN_MPo!-@rj~$NIU9%Xp^ZL3t7_NG6w>TX};?9hg)vDt46^z^sIr4t_0WN-~iQ} zH9OPyRZvQ3RT_x}oVr#T(NIzCpB(sYdX*Y{s+*{PcEQbuRrVe4(=S+vEUum)L-zp& zkILj1`Y%?>u~Z^{pwsZ>pNDLs@d=0mybLU3eZsf#R5A;Lc?)Z<+@RI-!hN@dDc2Gl zmDKcE7-l8z%P5nE8smp^fb;{0S^}Jna%{)CQtypE)z+(eteIlEQM6U<9R+qVJ(f28 zR`XpZKNR+v0ZpGthfrb_)}F>u3?16KQ9N5Y7cpD*eHDnJ#me~aSM~}j(68*aieIAN z@hs%kAk~ngX#{N4kts|kG&*#8cE!rEtTHLV;uS4a0Q_+YU8&8Ljz5<*m^tcic!sp% z1^=!qmZ!mG{CO8K5HnMihJRlwkBhhE26B^Dz?8mdJAbskJ>2oi*jM(4!GEvMEA{nlge-f6F# zi5VG*kb1M(alq0U1?)8KG_n2^CcntdHJN0dW5hoGg5phl>un2+h~V0of89vX)Uj-n z)-;hWhEtGMwPf&@dF~ju8fBAj_EZPH&)hpo>ywd5q?@V4T#NhH-mmBp8)R+m>-^!( zUwIoHl?fFV(^Z^S;&L}0K4%3?!`~6MB=_RA zr5Ihdjlipd<(!=3O>3&ib!q7sMfthwip8VHzP6*MQZfAJQfHe3aTyJ(t8-Z+P1$Al z%5)*LCwQ1n5XpF8P+OVa=M>D0#^T9i*+cI_o!i z=}J9zeJYhfM`nXso~1@F7~DR+vz<=)`MYn|#v1cZ?F?P_X-^Y$bkfvGvLDx2UGhF0kSz%>0Zv9bUZ&AsXxFrrPg$Uk znrgQkKHPcx=z7MIvY3ebog-%QomgP4jDeDXTzj}m0MWI-zh<}Lum<-ySKCPkYwXp= zQt1KtxBA5O0-RQhz%zx?kdGpOt1KS%0`QRo7<72OwB`uOHodi>jcTEPM4*8MQ>P#H z9$(QT24qphy6e2RkjqxoL1X3orqUu5b<+d42pX!Yg{+9CZ_6ko_XEOwCK(t4c1QDi zLLU-rEPzwv*W=?iDc(Fy{!+4t9Nx!?TDp~umq|hQYXg=LWL!Y#?X6u_-ty0*4~={0 zW0vqi2g^qUQsfJRq>MlOYUzuU+> z1VK4K&G$npVau|}El}`9zegf!v$F>;;KF)&WYR3h%(J~iRd z2dd7H%U~2f_<@obfuu)WSYT&u$iN0`AptU8e^qNkg1)vUP<%$0$I5H!8B7rwaX+Do7ncCu*pqlBHXbf)zt6?exR zgJP{Ves3G!>lOSd@a}n96!%;#%|Y2z!~Hq;`!C#Kx3?|mV82=DLGQrKMaI}K2%?9$3gWb^2k-R-pk=IW#1@fJTp(zu)yZ!Y(9&BgRe_vpLmyy`>$ zop2Hpb~}NWqJ-b-vm4su=>oru?e8BtpB+O2ozxZ`O8g}QeC6VkriS^#lD;X|aAZ6P ztskM)p%mdo!1T-vznD;0Q+lmljj5=8i6=U08*KZZ)a(`2>Uyw${F4?ppl9}Q;4oHM z)!#li%HKp*r@bD3tMtSTn|o4ygR1*$2P~lV3_4j085#|Lf=5w#Jbt~_-`0*g4_`li z)}v*Sn_oEk!XAp)pVe>xqRV7X_KB_*xAu4uo51pT(C>XEN=*y=NSUI;qbXd)ZL9^I z5JfCj?HAsH%%VJIW<(vG53o>w6rDkCR|v@J@}!7nb;Vw;gsttO(Gmg*)@X!<-d9@0 zJ-t%(*)p8!0bPJNH~w5kaC>fTcX~V`CT98z3s2lM16Br(ukUsac6?;PTg@yojj)*Q z*aIs-#izQ|qN10k^OgsB0@w~je9;*=0$B%X28t10{6m^_wV|F#s5UHFZ znr8|er5rn#CiRe>(yLgi$giO9%2N~pjfE&$yHSrmLY+z=onlgx!&#oL$kRc9e7SY_NToT0yU&zM{w2U)Krf1v3Sv{4~rKi zVPSE6xOVNw*j7f|qVFBCC+Mzo?Z$SI=*v!rF0YzZma>sBRaR|Ae|si}WxSD#I&=+=ugenWX`-sX$? z!4DCX{wo>FIrSF@m6>~m)Q+^LqZp3GieJOz+H3IA7ar$l5^YV1+x5E6f4j(n9==^s z)=s*)orwuFZK0c)A?N5h;C%h8+a^JCVtk4+e-AlBc}qv-Sgg`wM9`HiFE3{$*%6+I zXRC$xgjd;Z`Ek=B6eYO+%UaHm{HObD%Um60AhGr$A>- zmo8>^ayrDLhuLKh@N~~3zs+s!Ld-#{ zg)gUR5~xU?2&k{N`xt^Pq4z%JvQo$yG;p0VE9)xalU_r2^+Xfb?{`=NX9c42q8{vw zip5$+MrNMoymSE_!5u>CF46f?-bfP)iT&flwZ?z|AaHei`7CO<8z z#ZmaA@|)(#Mzg7kpOUzKDf?{uJq(3}KEe%UiCI5X{y?hv{Pc1|3p7fn!&PvRRW#Q5 z^zd?x_l-{8v_5O(IG@^(m(2b0`fz21<3*j{-(f+V+JayBY*Ul8B38lPL0&cBhuand z^w|-{KSKCXWUB-S6%6j!S*nGg{ARc0f%42v3LzIrr8Bc`2wx8g?(dab5W4*0pF>(%4xeNsxoMB*$A^|l zF^nyR6Ydk!m4)Hs*~{jEry_#-G%{;{P~$ubeGGclWz8;&a?TK}I9+s^_;!DTw2kb| z4Q6-Wx;^`cbK3Rp&fAkVu?C@oPW-37wuF8WfXmlwyAg5*&M3;BU|Z-0ty=D{6I)rj7vk%B{4K3qH>YM}Nsm`afHdvt;oFqvbwiVh4Lzjzab zPCFoa5iwgsuZNUyu%pn9vlL|(K(@~H2lDpTX-({Y^t%V$G2-X%-`d)|-$A!iNN=?j z72PkcSw6?xb^ht718sY%J}Jok>#JKpWp$D|cf8rsTvZJlZfDR*Vb^wX zF$JUKqzdJ1qvwU*5DyToMOb|Ok&=qWPPzUOUc>$?1JUl|$S*PNz@(rRY|f$^2x>FF z==9%_V=1-dxZmgC-ld{;AW$Y{M6;^S=JMYgmZm?U^Gh_{>!ijI$AQ@QRvj#LY7~8l z_;|k2eRAOAb`MMJ&MD$`7+${j1(&et4;m*$rM`KB7rt9V58g^RL!E{!F5=*%N=m3= zkEb^*x9gBJyBHSlahuZ@nNUx#Vn@O4UDpfRB_M5$3k+jTD=Ro4=aHti_%2^V)y_U) zx*sInsq9=ks?T|qy-&HHk9yCHohuHiq?%j3?kL>j&a!>)5Fc`|7q`QwXw}a(Aw)>( zY!&LX%$@ms5MaCPH+CO;9mILrMx<3){f>x&@neh`V_e~U^fiMo{_`nf)~zs-$Wfn+ zRDfa_o-q3!8{7LUk5N+HAnHcbM8w5pchqg!bl00)IY2}DL_(qLeN|5=N`Stx5Scaw zMjmj}o_y-95Yi7W&A~?_HMf!vs6C(j+Z(La*7;IY93hEPDjA#JunB zYeRO>QOpCXEUd0ub5aXd`O@^iC9G*dhn3|W9i6;rtPx@fI5(%8rmOqu3W-G8a#TB6 zf5y9iMG&di$FI^})7sXSZEhjq>uLGAz?L9`Nio>giBzA_4!}l-THBK;iXQ6hkPtRU zEr|gelMm~ATS;3X;-HBcnxj)9Ig(sQ4>wh@81yktqSeU0CBkOo%R^2EP@FJSp9{2& zQA>J6N5kIjn!S1c=F?_3<$lO9!(W>*&G)thhL^3PJ(J0#ovd&W%THJ^gz#OiRD;g2 zIef>|us1Ga!w_<}?Fp26lkBWMd*82M7xb_^9*henjT&OEp&i)BR(q zS>wBndMLMFsMkXcrX+V&UQQ!P6h{dWjOB ziUj=K%NnvoP3E!fK^HCHKxnZ0?L4qt6NHk5KsphdH6F)npyA~XHZ7euikoHCN8^_^ zki97=RXgGe%Bp752Kvek_Ve<$w+_cfFV%S)<6_+XgM)pqo72W_L zRAO^&lKE%%BwbL`~U+x`^q;I7gL;=(53mF>d(&S}tB%&Rk zk_WM4i7fAaxRrgp7R1EF%w(1MS6IpWfhk$%O{v*pr}vJENS0=);CeUah+c4`m`C(S z<6X3bD&`=MtHaUN+@2`5F=2GN73q=Zvq&>>;T4+tqOsl0_!m=ifwM?MPLKIRYDr|) zH}Y>zR&>r`yJ?8$7{WK#9yqV)(5;~uqyT39HxA|RH^7gGE)fTUGw~)5U_ck!qzjfZ zAo>24!)u=W`*qeunx*cWzi3B3zmh{!;)YtE^N-z6uTtpNu(xNN*YEu(g{wm=NpBW{ z8>_=bNH544eHRezDJ~lq4Y2FD2NsI4_5;Bl>2_P#ONEET+vUW`KQm*;8-q#3UcE#dSd>CBI;iRlBK>H}XD{0v6 zS&U(6nkO&CI=H)2Iy;!W=*SGeGb#uHC06}CPLNkyX_dE=>rnwsVrcjDFa`+&Kue%26{`T;p+q@rQbuj}mQj?UhHez>{k%w^jIT7LkLX6db+!>E-23N>DqfU!S5|SzduIX7Y4c zqN{3wHd)Yz+n#3|s#Hj8CoBJ!s{=Ppn&9977mmJL+ORYYSAETBT<_`KUsI z6`M11$|l>%tD87ggt$0sz#sXn*#$pDmj8^e(0j2VgIu*yc;UM6GbbRi2exql<9!Y% z_XyR3NTD!bW_GQ&es0Ui?SF13UURQ?gvB`(8Djt7%=sxS63#UVsjIT2F4mfxnwSNi zG+Vl^clZn?(xOwMH-fO+2bV`~C6}FIPWPST<;LY>Z&RSDgOUT+F3F62jIrP#*VqsE zYkHr7rJwylYv*o0LP|ca)90Kz6+f)zpNmID_Zr3}&mFpp7yZb>Eg=(eWDpi`CQB0) zUMqgx+fDlm^z&{+aYowEs$DGLWSbau0-L-L{Bs3G;Ba?{&!1#BKhclikOcm#Zbe;6 zqUJoh#?jBg9V2LFJn5WJ$1_svFEyS|ovOcbcO2y07%-5@V|vt?z@i8#yPtSGdsd0D z`DfJJ5XAE7$;XN(?31=xs%bm%yqH>{UI(+1vWO%@fvF)`$+~Y7@lF*K)y1-F{Uc@$ zK0ncsnlL7UvE}*;)w8af6<$sAydo~^VS(xgi?ysBZeBNfEbocVlE~=#aFY>ME+O5bt;E zCVoDCJ7-g^c^q^*LdS-^@0^>lzkd+Z%xdDwqX?Zef9P7qcL+sHUc8g=U}+(2`t)a` zHK3we_}|A#ZVht_5uK=88qm#sc<6NXLmkTb6>?f^S@WGR}I0;YW+mj^ZpcbE5*y&_@@g zLg~A;uYG)ws~87@T@BPK)C|D~B>iF-13Lv@obOrQ_s+O=zhpKt>JJQ1by<}g?t{4; z<8tb`IMY`fa-i&xYlq+;RW}c{DHf3JG;*cQd!{nm;#%}trcI1{5?gOH>foP3XW`<* z?R7a#-=_*0z^nGr=mo84JLA4SQ#4Kj2L}fl^bo+NSzu%|99%d=rCP3=Y4?oL9Z$() z{IE8JR!MQ{rpBV1dh|aleAPONv(cz!YoilxGx>0KFEwNP9+tOPa#+^m)#NPUxWu(c_U}q3Kd?u}ov` zjgB2hewXjR@mFV>`dt{%=L0(>1oBL8{dl|FUpWn^{L}y$6m=$?C8P{%UuQ3TiqX3= ztj9xJc2C$x%fgaL>NCv-o;RukVwEF)xnE|nu#5f-j9d2RXAjrY^SSVF>MijYO49wt zB*zfL7l1@m63b9E%D^l`j)<+LoxLx%Vc_87J5#X1Aw2?z_w-4tC`vdzTSKm;ovb2{ z_Tru!G6}4T`1SoEh?3M;!Bty$1mAfSZe3(5R?#hn`<+5>m%~xshHo{$>wbv$8f1cN za5KCGeCOg8sk@1*Jv|kO@?<>9H7H@8+bH}%g$>A!*{(6{Ne$i{Hp~p!W^6e^I9-P#WCPkt;$sqh3EGxh*6%G* zY3AXDe>Uw$`|rXHH~W-`qca27W=Ke{e`8MBVZ)@#$(%%TdXTqZ_~}CXpT`H}d5&Q~ zbJLK#htu&TFXUlmY1lFZHsOZ4k88=Od&|fNz#{!T|8EaDINd^tWXJtPBF7k4@>h*2 z<`g2Ly5jwS0%ZxM9{A=iKRKzMqIZX0q3&qJ4-_Tr{E?5StqoaprX`eR>%F2*xV^Xr z$6P`DKo}!g=bO+!(;i8HUwrZC>Th1qeboaoO)%;a1_hn1!=PZ)0xzV&W^WQ54pd}e z(l;M(BaQ3P(M%fW<6`uEHwr`83M{YAl{-=Ee=E$}we@&y_g{cE_nWxPpvuPW&hBUX zgcBR;<+lb`yLo^8C(6LbW^60~c|6>{u9uCg0+=6ruMcu6CsV3Vy7`5uzPPhWdfWNN zOby(+dstO$~eu-TgtEoobVdWH$QNibnKbHDx z+?(s93=OQ|!%Zj1nKp0L;-UPMd|=<}zgZUfvxQDy>$Y2`h3ZRc8;QS^&C6V#AD52b zzvEq&Hdy+ylJYaVuV~0S(4-_|CSl+|4^tv3As=%E9;$+uY+M&33)+6`qxoRJe9b$a z_n2`+#I{xD)ql5f%zr0<$-#baQK?0w@F9A*4ej&%lA*lM+1!(|qW!blWf9p&3;&C( zNngi1DP8KnIS5eFDC`!=fX?JC+s}Cy`X&r6E+lMv zcIv`vo3br!a_}W(DJN6K;CC0gyGTP37w`8=Z<3cuE0o2j{W`avUEMDT2ZOKEoVgC< z;4=5w%BAq&NHS2(Jk}zidDZ)8*(CmD-B724L&9gzp5m!*sns27+Vr-N{RvyA{t~Ve z>oxfWU9<2mh0>~jC6e%+;_yoxirzmR!D)Enj5Yw1l7;A2J$_OKf0sR^RGjHX3 z1<nWH;XqRsm?6M2UCu662#q{UC#L&rRi&d=+t zsHTtmXK4OQQA}LC@$#lW{LFs6`qy4G1sz&8B^crxjTH82Jvx3I8eZ%(X~+mq8s`=F zcXo6!I}*y|nbdHV6$Mue%oFfDdV3vj-n^5o^mw&)l%KC2$y!9gpe)PIy;D{T%^pG5 z2&$x{>}v!NoG$&z6i_f8Ni^@)?*CqRy0P)RHD}L`vZkoBL_j(w+-*HysHGz?>(lI} zue%p%zM8+6y;rc5;oHXM+GY>OHqNbV`LN!v`30{E3aMWez|0N3tzH9LVKBezCN^I{ z8RBbd0ll;=zh(YNM0k3~T!u6KQhhTkIs;77_Uxw`03&RhUvRnS=-fdrAM}Dv3Zy7U$YV`^t$*v0U|9rHa=5Z$$N0Nd>PkwgZK~S(-VJTBhR(Z&3l4Jo ztZQxqzSa*`P%?R|pRf3BG}VQreAHon7dB4TVaH?>=0cJ2r3_zP)WD#31zLQNTjtV= zJB2%Gpur-q5nnH%4e+r3$f&eU0LZRfjyVlg@3lUKw~v_w#{x^ylfj%$94p!wK0v5G zFWU;Y9DKSZ|I?y%24;XNt?uBBj(7Pf(UXt=7aiZLsa68Pmxi}S+sCNlhPI-Jq-W;l zfESwsMJNR2*z&QC$WgF`rKYAt!3(sBr!SHz9jn=r0c(nfHz6sJY~;_M%)-LLjBWQT zv;h0RLEu3oTCZ8jj^eFH;%?iXs@f=82Q=`x61z-$3HSndj%9~_zY2C%3-%Zl=1NKy zO3$WfT&lG50sn2R1Yu&MoFM6wq* zsKYZlH1O!SR1|q^NykapJ86ijMe|JYEed3BRy|O8#03sLA=^o2U$UcT53YZI#sR_~62XCp`55xWTC=5gpDA)px|h_{-uXuJyr=$Nqtvo5F=BpQ zeM0w|Mhvv;jm8hD%O&fGJgAHO7m8Q%kqX&M(_6??vaJ$kTUQC_cdlJk7d^Zl&NXnn zPCMJ0iZO#fpJ23g-Gb^DomYgE%jCx0Xj|Bzt)y;Jb3-Xb;{dTYbb)lXH06yBW1ql% zc{vb%?Tx*=4Mq3s%}!=o^UmO;Qx)?9wNHFZTPDW&lNw2S60Jl5$0u__&odjcc=xh2 zL(gZfKFFN=3Uqr|qHbV&8sNJs(bmCQio`u0nmm`~jb%Z;kAejlPi*3UG~(fD88pl_ z8uAvHqq%(aYgZ4Fu+B!&_iXkxpzBFVpf$;$$<tn*$-y`+Etfibzaf;kSa z)RK!wb3%dsUP>!E+;p7BOvca}9s8mQ*^Ra^h9GX2_J=PP6N#w@A#BGvFsOu|Gvdc0 z=sbga{iP$ZlHG!ll)mhGT4hZ|)o;lqN~~UbzP17Ou$ZaRv_J6Q3q)?aS=L zS=pV^%m;5d(6>mj+RJu@?&?$?U5(U0h%m93Ql6yti*Z|wmYl=D+u^W*@tTu| z02pzLc!=E`G>PGN_dN~cmo2dlr%}vs8)J03@ID0n65gPDMY|5M0a}8=HW4QsL%=T^ z;&Une^Yh=!Odm0&OnGQpLFy0=MWX~wt)z3Q+RNh%Yq?Y<)ZC&9!28z-=8l_ z9g0zZA^Xw}^Yj2}f>&N-ci!gpMtO8Uz;iBWY1esWp{N`~OY`B!z}vl{4TKvfkJ(J@ zKxQr23!2s$&>zBEWbUi~j!9`GA={q%!z-Il6UhCkZWM)gBS7`{iYFxqSj4^ zc!*o;-|FA(Xv(zBz;yORk^fpPhOb%imq*fi9>FM4*?gIYJW)8LVS-BB>omc#&@=?u zgBY*Ue4G(Hq28TD9czMNi?WD|BafEWa(^OX@hZK<=gHR8TWeZn=-3H)KcOtaL)5J- zETQK{KB*$)7Zf#u)|?>$?jd7xP7YK1QA4%rR0A~*sNb^im2e~jjkv}l+gkTSqzr1@ zGfMfe>bD!MEP&lZT-4{_Gy1zU-fx8$$uF3omsW-L*M6N?S^$F}v> z?x^l5TB#<`v^*1 z#m4bqho%?|ztgN zH;XVpPT3LUtk!LIp#n$gJB1fT#oh6Elbxg$d#f9CZh09K!0E<}eh>VID$m`rqAedz z78O$Xk{6p!Qm>6=OCD~jgGSg}vM2O}`fudxC=`kFEp29ZA=A#LrnG&x(3y{_m6^1i63-bRxSxpF28&GS-YnRom1usQSjDr2S* zb+HIFcMh^2n}fnHk*5XbCdw?zqynEv&=>ywMiltw*84~myfs2ebmH<>72ryQf%QaB z+ebQhUS5IJx%!=le)SvbCk8uhOpop%^K8_l0IEGXEcxgS2qaLd-e)h-h92a5e_5(Z z$$Nc!tFEE;5tBLBfRmF1?NNElZum8Vq@aK{M$znzwR+&{{|579sY&XNw5Ot?K3n7W zuUN||j%3@aTAA$zed8rYF-U&Y2?f~sBUW;p3ioN~Rs_}xW_?3V7kZTjHKRkF_Md0* zLV%mGK6J~!tJj_S0`T#(YSe=bvgY{Pg!?9d4?fC_6spSyJ|2bnlP~bc_39yo#sB^l z7rNsR7@XvL#^sfeAeK4zJj}X0nU8RO5wel5Ud|_OTxZ5Je6oK5OS#TW79{mK4qW3W z0C8t3d>od7CW-U^zAx9(zpCG2TNJgzrAl_pH8*nTS z4o_4CMDX7#Q&q=)<&*T@npa|zX@i*Yc&p>l!4+i~gBkIkX@y1eZ<>_4a`9pb4C8ps z`)!+%Wr|<1YlRM^u|j!Oy`KpwZc7B1q$b+rEo6Q(VkGoa|2T}f$gChZZmYJ%MaDR- z&N&$NDfS#uN7fK_ob8s|At%RFc9i+tM_Hcg2T8mAkg$ThIQ#%lD@6xSjISV!QCA+P z??X1fswmZyta02g>cb>*p7yL;Z=H_eOT3V)@}0Rv2M4zI*9GgKRsW`Ex}8DB>`$~T zW@sPI3q&n|kA2#1Q>vO$H}hA02W`=*jZX;k@CWpNSEb|AWeoGVx$pmq29R{;tZlc$ zz?Xfn+NT@mdlsQqP;ygKE=bHuoYMG`@Ef;xDKbnzmh4d@!g(e=d^ctp9wt|6!U5dP zCnQXBe$sQP{A!ru^k|+475yuEdQ&5_zxjD(=vs$9Uqy`lPdex_vpzoQq-S%A=%OCI z08LG<7hCzF&6K&{(0Gb(;&dFn3AiI~Yovh4ZB5i>!a?S8i$nHH$*yk`GtJSosw}@J zCe1=nOCI1G!@YduH(oH$pNts(0w1O&u5{xAV8lh0A#XpL@s;{2%#v$7A9$4Iu_Kvy zOLuVS&o%dHSh$07^Lgwr=g#139`N;P?M9nGr&v<(0M*Ln_LXJ?TvbvqC)+4%i#FW! zWk&{L?PiX?3$^0H_F{y%lys^NG)P$lUG=Y+`=cdCz9|zsnVRk$gtms&xl&2|oY8u( z7+HAc&=~Y)f%fQ!)QiCL`c1Z41jRGo{z@0cRg`L~1OjemvflBp8B0v_$jd2gb~o~NWXNJ)w}d%Bt2`V!%M zY}l#f)NQZ%!vB5frjQo&7GG6QEa+mRrG{croaF6()N=bk$jHs~40{o0hCN=Ybz)Au zai#~qXhnL1xZw)+xz^JiYlzXsO>!$gbD0av*Yq(;mFG#yU-7zB_$}FYntaQ5#Rv%J zHcM!Y9tI_05VLZ#NiKNc*&pVwZdty5No|RDKL=m+hu>!(LQk3 z&adAJppNP-_4mo?mRu9&-M6<%p#iSjpUsZ;Q0EzxL_}w?HdHF;$aX~OMP++?J+TU-y=YadQZdkJ|LRaEe36ZJJ8J#b45f3R z+>m)C};(dEDvU)7EHrR$17LW@tcA$nuHQ z-F2Gj$qs(I3mbBi7gfrRc-wG8Ty!!=9-LNz7$z)5cb1IHq9{>5<1NDKmXuI*<|AWF zu<;5|Byo^3lz^TANp>*(v?2|-E(7W0Ew!D$2JHX(1L+BT>=j=56Z|pIG;hHP??bQW z=rBLYi?{CHuGhx{;(m897zlZOCYus|NeDWGFX0%fN@P(J$BjiKK^{7ZryhlRZsJhO zqA+ui%i*{t7_lXzOSgVuw)pqYUI$!WRxhkySV7cRwU(Vev)sGqaYNHjVYU54xu>V8 zON?JewE9-E1Wl=b{&_Irh`3cXz-u$b&2bj9e4CRt5{2{M5d9W;2d1M1v$xWo=$;qibyZ&sHjr-lvN= zrl#fn?-2*|i~51myJ7{LRwBY1mhq)A%b>#>!8pp$OApkwNtF#} zty$MU_mh=?yXiPd0q%NpB^c${+%gO*eq*?Z91<*eV(ahR;Yb^De>Fw7E=q#Am=>N& zh9LwX;myc;Ii~?-dvSiqApD7^Nl^%um0uX3Zprs@zVe4gL`)tM{BLUYp);Zy> zs{yu$ISu^If}ozqd;KHEa|X&>COO>Ef5$nE-|kaBH9t)Mu2GY!tPSATll^+`KCCyLfVw-2R2+1Yz(HBmH@P?S+|9jS*NJ?-0uI; z=7ffr4=N+V_1-2YvcZKu=iOHxrRjd2+X??oMNWa0ag6BCV4{MbBMXen6OzC zdUQtZ@$FiVRhb48vUgYnxD!W8FGu5iBD5NB6q(%cG@ke9jPvNXr8UjI$s_H9U&I3x zIeg=uwwk@R>OdQ5jqswK>TS8u06+qBzV~?PmZSDQ%dY%iwHWt0GKN{m{iVv70rFJX z?x9vPmY1V482l67KLblxov5jCSTjt&%V81$!rr_591}x$zkm6G%_fH$UYc(@`Y@gx zN)nurN>4T?G&bVf)bFc~^OPdp``%2%@>=1gm2PQU^hlo9pS>FI_G2JKN5`>4 zM`uJI-LcjdvUAzq=ztNX3>vjRn@UHCM&Hy{dhMlD!$eP$u0*GaGw+$lW4kEhx~6g%3y$LU$OfhGTpaEND>R z9kwhqcz<+0$1Bwtz%WzqXX(;${co8*sQn=B>UW}um6P1}Fu+S3mM71!4_~@C1OUaP zz5ac}&rJPi zEAZAeX@9x!(4J6L#4c5hJ0%7ydD;XseA=YbpZx5U{*)A#;i>UY4uO;=sJI&T+WL55 zyR0A(3WS9k#>@+q1yO-M`J^Kl!9QN_99kuChAETjDg?7EXgS;|L~6zRGWna*b8r)y zzZ49^Y_RqUI)tYS$4*?(dcDhJt)Pg1FaNeqphu6U!0P=p&izG-uE$#aiTCe}CdIwq z6=nUbsLg`*upS$iMRH9Mp&yVX`_Hvz9bWSzYDxB;y7mot+IZ6me#G`ySbyu5 zFuwVaYF~g?3fxJ;-QQ|$Ywi0nR?8qqVlYW9?SDAjFR5D(RcU@HW2sfCCsE=088^`- zqrnF~iM=@!0}$Bi@*`r}EVE=Qu{rf)%@~t)M_>4G;>SH5V+|*e6IS>wC-yfjMG(>4 zo&!y5iyr42M>qZ6daP_q@H~Sr<@gS@Q0>K*z(Zt;rdn4BrGk$B9hed)P5r7P2bftK zuSS2@DOPq4Jic90JgUx_s0@BrCT|}KUun*x+Fxq&VD1TWGoJJ`mnTx=qAaVSd5oin z0E5nt^(LElK0an9(k3Bp&rVNpYtr2<5pk&dllu;C;Ut-R)5l`De}hXqTe9$~s^aw| z82Bc_qNtjgd9y0*Yod8>C-CrmqH!-ShA@D~yff(V_&Yc21KlcOn9?%vM>pe-SG^@` z`#Xl<>sw6=@$OHmPkD|i32{P?@HGi&RtgPbsO$xN3@sm$P{^gy3ztUQtibO!no|(A zo_l$)&zfQfbn1_}MNT(j6xP#9vu@scGREsW65$i&K@0X-TB?)k<`ebZ>%H^TR$uTv zLmbMYx=#`+U)z5c4!&Ox*np38vavb%v~Wf@ESuHY0~i04_gp^Ui2lJLCwul0H=_Zd zw&?p#8$*snU>h)OY-}H-h_RD%AZdt<0zY)DwRk*GS_GDu>+jWUNCU5ByTukl_ER1$ z!9OPXe9=t#OZ1fW_ViGV0@rNOD+Y6G4frWElZQ!t(eB-|h~A9vH_c3AN2oe3&aAPD zScJ>n9B6Vg4a4Xi^;hadVYkO!S&giWI*RFD35DiHf8Yst`TX7VXL}Yh5wS36{LKl{ z;0Lj^BYvzh5^Ea{l)D_*hEa? zlI*>qB&~1-_D*tQJR=`=)r?>?gJh;<>Ok30XVC{gmwUBk?TL?kWJv=d5;&3A^RDX` z&1JivEys)#@zr$v1ao7fFfp*+1Gt`70=KJB4Ob}{2o+<7v~;;8%9v6nnWtfS7r!RK zcNqzjTQ!*~UkE1oSMKLqkx891d$|{FmR8k3i8Sfv8mqg<-=lykD^=6B6I7Gtv)p$g zK3hYwQo+oWajwWd586ZJNQ!awotn_ID0+>a2ZvgBchK+iA+oS91Q?_g-#d_OJ=&cI z_&ugIlPq|KxNqY}!W{)(=&7~u&?5s1#wl-y=9972oLrVu5Vh1ryY|z#aN~U#IN&I& zXe@*3S=O&=iZ>a;>jW&$pD-o?vW$bRWV936MjiaXt-Dqzm5vDvb^>$`FnKmIhi_Ak zI!4_aejb!_gk>S`Mlx5T-z&yrk&@_rj`%@3t*2kvv~tC{;7Ec6AY+jCt8$K+2by&1 z@PXW-V52j*-f=tQA?;#LpZ$u0NJ;ezC6|v8H^h)f!zfal}Yzy{X|~f}Df5f|B)l?5Po%H%ZvlXVLe(h1ptj&3Q*Itr8{4IfWLZ zXtz;+v%Ql-#WHTo`@Q#rn)D#m(@QtuG9H2g@t_EgrNi0}?9qW!W9af=GoBs$p|gBx ze|xc=xS=DQ!i3vBB_(?$URuzAZinSJyj~Nf|&hB0$ZyBF z)~k(>#+r{#Y7q5^N>%>xD{Z9-`3`ozy}h}QA&-(>I`B!?8>N=HxU8I05cQrR1O_Wy zrV0yRBTexm|HZjG#%DJ~W_azc{Ka^=HJq)AKJ#@gfy6uzITv@JlR>B7(WFIJ^AUnN0e@}kgtX24@p@5>nmFlUqdW>VW z1kq3X!e1so#!U$N4#Au#Lt}Y!^QRVzGKvfgIAIv=@?x2u)i~a-DuRRCmk$npOJ03s z3C5;d|EFu^b+_BQ)-1XqsXx~0d#sF85zJ>gRs)_Y7f4byq{Z39h1N@ zKVd)b$A!M_IvSUx53bZ<120J?t$f&40(I!Lq1z8}f!|EsU9R`kS}dvN{s1cs8~g`q zapzHNYaXC-yyA0BKZHRJhnY zk3Ks`oQY~~tj+(_4NrCu;y{51aM;yKp*1N$2f!CC23gZD*99BCjr4gUFI#V~MQ0tC zlhao#$**R^?N^7Y>%{L*%YBZ$Iv*?)$>WrOg3pw%6G3Fc)mBn*qSO6r8l@X=2O~Ag zZx4%k(1)syucK?;Pa;9LmssmTXA`i-vp+2wyExYNd}@l=OW)HK9b0Ummhf;mx;q%E z7RybIj*llB;&@XD&(|9rFI%dC-pATHY%OD96=xl8+m63-0uRH*{cX){c!C~8t$+7F z@?W1EIiMBfBfz!oKZI2jQASu)S?oFH3we0@*R1O_wUu({;$qq@Jzk$)_demu#kae2 zEQ#{DZZ9`$TpiO+kc!~oB$oLLypP)2Iv+5wPRO5P6gInA(GLhD7cA5X_{%G7P%k`b zc!Cn9_E7V0aZLqRyqb6$WjJJm5I%t9x?vE<5OKr98`1Qlooa9t55j~8AfzIu5Qe;Y&>*hdsPhVtpvHwy!T+qSN!4D>4Up(ggfsR-`k>Y+ zkmzeN`YwcfkYzhC)p9_d0m1xgV7xcCOjIuzzNzPcQ^Nol%sxEH7mW?D&8;D}Za+*=MWV%+et{@s3Ylzn#=Xl0-r z3)e8X=es=GmPMv2h#x;nVYFnuoYZd{teSW-Oi`21^NqX9z+N`-7e&G z9E}BiHj@IBqsylLp4;8`gXLEnTzBu>*{R@6J%mF6&g`?JxJ?v!oj2$A7?@LGeKMJU zCUzx8Nk^)(XJ!|xR&*ju-Z$vg;byi_AHHb+s%vBrv}4w^0!PqTymL?L;;Y~~$^v%U{}J2?a9@`~8C<==DO@?(As0p;hAQRHWi zaqQazP!^oz`T0Mx{!Oo`;#PYC1sDi4417%rKsXthg~jXRRma)ajPlUqbF)tlm+BuL z81>=dkbX{Y)Y=V|^tF7k-WxnA#^eR>cDt(@-P2}CHR zAimqeRDGF!dFW#De;W$A=*n|f7twEe*-IB#^jvVpfoFw-6apT2l+(2 zZcmL|yxx|~<6|8!R%ff^nZ|5*qsd!}ANhV|&2S?%+ks-jj}>ahYmQUh1kRL>dNg_T_Px^a`w%D5 zi_#g>(CQ%Ic}M#SOg_0?g@0UbWA*L<_WlpI^}B+NWDaPHjgCqR4CzF!hFfR`0-F+= zU}{aF4(EV$Vkdj*FEbzUEo3oS5^R{#2*)0BwwHDv4tfeJT-fts9zJHKXbi{Y8>gyU z2HCm&tnf2%tJ@tGla}7(ncx2rVx+&PDCAr@dMDZCE%!#YHm|qq89#s6uZhZW=Ux?A z>LmI}EJeUYmI${XJRSj5x%eTn?@%m&ex+nSoOl;KEB$hj;S@9E%S}WhJv4Mx% zYrnU}t*IpKM;a|%jsO1X++0kKry#a9(Db#{n`Rn2>A2$RA(aN6{l=7+t|c5AelS+b zfjNQ62}O&x$hXnyjmGn$4}Sou(ZJ@3OyCZhIScaV4-iczRNx56REB|C9G^uGdl7h`6O{ZrAol2C0Kqru5=@`MM{H zIJ!z;;N#;+A7#6je@52(oA>r>iv-tS;KNLSUuok;bbk*HPbu$HkM4R4<7*?IYi`K{IwML3 zb>s2_wB6&_WfO5%uoD>sF@0FwuxiC)A@0(VY3)V-z1fteyy&>>#5O@9JT6W zi}T$~+nG^AOTW^~>A8EmgQA-VRzjyxzD`LM_Rc%PI_Lln^&*^k>MEg63~ld2kA48(*t##*|2VyT9Kj zyLpUb==Ab5k@IEd!_`?nc|%ERiClirFLvOT#-j0C&!+!LrKP)J$Ph``vZB|z9=%l6dLYP;j7z~Ef$r9NZc2VyYAV4-$30Wu*YRERvd2r z#fZPBk%0GesYS{pQj}}p>*;xMic^QbB}+@w%QUChbUFl`S#xCmDzBUZYkT<5QF9R1 z1`8bROs{e_t#bC}Hi3Ci@q{^`n{Fbi$)kUH*>n8}MII!@k9b^%->Qlj#=@ms^1KAX zVswlbzCcj*I170FJJ^gRh~1I~A|`Kle*8x&=V(Fp@q4)y$K<%`9yAr#u^e+w&@FSi z?kwPKAg5YvZk{oQRlS@@S8v3~dwb5%lY0YbJf+E&$~)%PH-uKJG$C3;(3jgH;(wc~ zvo0=@oleKzAENLBU88A#RYre$#~YYB262`zf0wWgGi7BK8`Jh3^IN>_ZkIJBIaJuv z;Zv8N|G@xS5!gGhrMRAK#z>VN$U|$^XM0JCPZ!IZ2CpFt9UTztWKeD{X{Yz`j^?yJ zqSx-SJTu>)_JAu1^X_XMU`mEpjgR+#XW;@8YShT22~A=Lny=bX4mOo>p7hqL9XF%R z%lHQ?v&7u9vO;5gL-k?r`h^7h(jmaWmz~P9A8*&)ji()PEPIg~uSaKHSCjaNgeWpD z(=D%|w3HN27Y?gW*RwS>;DRyn=k?4+>m~upvNPx-$lVLdf&N#fc5_i_zI2>xkzK`F zE*@zAK5X=WWCFH4GZM>oL_?r)=nz_B2QA(m0bdD>RvDJlvFo1x8Q#*Ij6r^RHOVDC z*VE1D@bq((c4!wbq#1`)Vkl2dsJT*+D1D@{lBOigXLECo`Hlgvyd}vyj7g41C8J{% z&)fpErUEJK4ixAqqJ6wACH0$u6qNAQx$U2pE|bh)BJyah3A0=wft=>`+xc7`UMOLV zTPfS8*P!e1D-qJ{Ei`FOK|tX!r}gCXc_?qF6Q_sR1u5z2IvJ(!gGjXpzZj&!F>X1r z&1ZLbv(L#m?;8v)+moyMX$FX!NFUKnr@H3*DRtH+|LA_l_@o{7Bc+kl%zS=4o_C|h z`HmRPw{1+*9}__ERB5SSSuQlwJu=BT)zaD8nWbykJc!JL3$P*N)!5$<4)VE=nXS3X z4+M8nLzzIIAC_4;jl?~6)+!Pj#{!j80x()ue}gZg#h=aEfVfv8(1UEkX1icqWzk2u zshjzq!XCRj#xDmW0~dW~Yd&<#{4S@x(~I#_rCqfi1{>x9e1Y|7()-BOz_-&#MyCgt zD_R%0vJjM?W2OzmBELrwBC+9s0Q6wAht=NRWXNwGd6U`u*fk=TqrL(Nr)bm4i{$1F zZwbRB)F2Y-E{+8ZIwz@3tdOVY9ZY_R4BD6cb zywg|`bt;V`Q+e1AD;bn!K&iSM&sCITBQq-$^gl4OqF<^hE{6Hu?^`AdLMCLnYh_#1GLt(XPY+9upx1v|q`@`2*(#wFuWh{NG8E zG+5Zj*_Go}*9S!QCv}Tnsad#lIz3;O?|(J(W`Qf%BS+@vO}MmHmZ5)uQ-#7-Yd+8r zo7zC>qsGp(v`IviVlKSsm~YmBj)NRS+O^@);8m&31qZ9l%tSctz{A`AwasW!THI_~ zMy3y1MDmpwObai^zX^yWadi5oZ>tcj6w6DQ#<<*Ww$3Net=G$<|48ij2(vG&HTn4Y zI6gGsmY(e>SCx3&HNIAn+HSw&lDeeFRnESnEMrX_Ev!#&aeEw{JC7DnrL)`4&Yr7} z=*oL&`oFK$TTV7OndTc@*9X}?6r14>G#(9x2rpnoPY2_t1#(eIjT9pJTC$5pkVjA| z`sC3v%z<%ex!v(< zgO}Gv#3K`ajOD3-vN8LjW;_Nx$5DtxvrU#{=9j4Ca$B)3)djp%7Rax%2arka!Zk8p zsNJikor81Br?j!XOAef7Pfy?bQ`d+XeOsLr@v>UmXmmsX>FDfspE)7t6l55ORf)~W z=g9_~!D-+~H7#}HTlcr6psva7&wS0*fwiyiN5@Io)#)t*VXI7(Zdp`1;D~QvgtrQK<^}FGqe6&lk zAEq=^kK>x#GPm93m)4%5iNV36bP7o4^LO=LeDfGx*Bv8nqhnTv6WePJs324wT}ZCs zh%(#y3t&(y-cfJscYXUfLX!F<^PZyEqB>m=+i`{RaIGeT37teLGYObi`0+?{4QmoD zi%Jf~a*;hTyC!@%ojPcL=47BCe1(NjyGD(Pz#da+XTY*IY!orHUAgeGf`{(wO9yeV zL}tabt{>gHQSN>Fk6AfL*VEyquDLYLm3*DjMb%*CO-2%~V>LI*&&`6oDVzmF+?|7wJ?+=DKzA=a+q3ArsBAnaHUUG;2_( zK55*S*n+}ek6Cx6uP&8#7QR0G$aKg>d^ZP!gYl1Q-6m86g?^nE?vy8c7v3@mdYB9D zL7Np_=_yBZx*vbKRXOPxv&|156)|fdTl8;Ny@-sn#_P>6STQ{Cf{YYCg6nHj9y5Gc3Xt+s*{Q)$}!MnAY zB_jpW>Q>P5QDyrSCX7f_SU4PEN@Xt7Pb3YjsJ{1kDyj_}BhtWwKHUTfU4iDaMf#>L z@s_L`4P&{b5OE-u`0#PAZz0tWvO(9ARXT6aK?)47Po+(b*UrR%uknw#2OY?iKZfW= zCg1@-e<2ke`K1gIhXHGnT!5gR2tIHUyWQGihuZ(AVE^@k_*zJ!ea z)#LwvgMD193=)pEudS1DUtw1!w@ljFDB@WGM^AdKMdegD0LHw0qx-w0FEQmXo$A%Q zU5^swmz&Ru3ydrt@vSV&G^E^33#p+^oc>6Rmud`97UAzw)g->7Af_jmNlSCy5H{an z&6n=YMNp09Vb{P%^bvy==MRST9!3ZrU!wiLCA|1W4!u>&*2<^v7xEGyd_>8p+HbOl z!jHeaHMljXQZZ?vxj=Y;i5ip21*Gt=8$|=GQW_sv#(LhED6_pLOdJJGlfs;sxv>0wf!hfRc{97*8h+rf(hMM$~fi zgOtos7A^%Z2+P*Kd`Bs36?^uHmeQ@rRRqwXXhDs2nob_pFDO^ZTAdGfXG%^|=3@MjLNw{+4};ARu?+0Lt(wZ}&W2RUC&}6@&L2ZV zOn5%D{`(P`EnvS4{gwPfX1KZVFeGuKTS*VaVC!ea5pE@Fuml&=xDt%H#*Vk+?Lf1f zcn-HiNLV^pTEY!`r>IC(pC*i&T{kbEyu!~eoQ_#Jmcz&Pb4a^H^s*+# z4ERez#SBxc#)sF!?HjRCer+iXTLc^Jgh&2Y)}eq{3&AC_eQ~9;hmgM7Bo~Hj0jMfd zLDhkSj4ZdLC@5KlU_OtUL$NXv*9aLD;qOU*7O?J{D>G`s^wvb5G9;-H1``cpN0PF< zm4&|#e|Ts`i$k%Iv5VDJzJ${PqW+=zt8^J|7hu}xNrM;+A_-BNxh~Td+8>?9r!6D8 z^DKD4p9petSHPgx0AY}0yP6G5S{sg7#gu=Ep>a7~mPro%pr`y0Fq~PoFi`OkM0eYj^pn0a zrpR$y`!jpc3M*Dy-1u~hoe-@X0+*gM*!u-5QPcGby&3y2S*BTu})_#j`nQ zq95Eq?`Zl}X842BvGeoN-=_@M7Z=s#VCxB zL`3-DW8GFQvvESzrg~4WtU4(*u+lF80zk61PuT>GagiFXob3s7$KHV;y6mzdJX-2S*WXR<{h~K(K><5e z72Iy-a+M4st}ngA4{h<|o^-t>bv%3*o8i&;pPlRuY_91;alBvE|8GLP*W}PXQHH}# ztb(dgPm6klSD5F;SV$vcOUU#uoLRjrHMR1b^AeKOun21X@n@6BqG8QJfd7E=!9WKK zIRs@PIeuaA5d?=XO=l+YJy^c7qp6V_4vhvlmQ+=Lj;lj~O$39B1pl!?YwAwVYrC0z zqNI2U>bh;5M8xe)QXJS5HHO|MbY95o^j;%SRsQ(fTdwiN(q3P$xaiPbOd3#mObjbv zRH=?L|DeqtrH$Mc7G@`v-fp>~nodT?vQZ=v5p`_-IjoFBRLd+h$S0k|EFhro?EzMy zIkkV)`=QHOj3r%gKNd(G<{Vze@vDkrYg_fv>8=VQF4MsJx*EqwvngCl_we$n`-!@L zpVkEk_&`;3xz+m*boTN$k~f4sdSdEzp+vrS95N0JJlS|{!$OZMhA_TnS35X;d3^7bE$rv@kBa^BK9T&0M;i9zfY5!Lq&xdSWIhf#pPA7K~qSE>_T6EE&?# zJL9E|SFfJyro1A}N)Qpxp>CgFvnL*T$aj82kedru%4JZL4ZIXfn8pL2dQWEG4nTWv zr|2T@j|Z^ZU$*k!x?brt*v3!*-#vcmd%lFey*|7rCNh%%@kJxRp+pPfY>%5{O#;Qu z<%eO8uf(877oL(}a_Z?uTiq|3O^P#eOVYGl98nq32T_r@!eCA^!o%KHPh) zw;jJKdO8V|VyRAojmrZIT)^g@bde%9DjdM`Y^R5Fzm968$f=Hy(>I9ue0P^i( zIQ?y6B;B>~MA-4`w}0aI{{-@d>zVPRoZ&RT z{JP77v5o#?`FIcK9fFd>ngdP3v6KdAHSwT_@O|ZzFH4eAHxv0z%Y>F{I5*i?C(*a+ zZfp)TJQnUwa(7MFxU%%1-H5077O{WtbwVr8LwYd$FT0Yc(Ig<>3a%qWr_`F;V3A4# za4=%|U*!N1KmPg1P^x>mA1XAEmHiH?2HTUNgcsj4Ju?XA_f0sYQ%vr_!GG85i?3f; zY^!vhYmqmj%D(CQ`L!K2_u_YX|0_4ZgIE@*ZUN0e-?IE3Z_kPo{)9f>I?Z^~NX8cQ z3vH|Kju9eadAtf%sR)Jq&h5SIT|3f<_Fe9_-&ET8tRQARfM-MZ}qHJ=F@K(*ac4) zgeNaAb=G+pNO@R08RceudY!C^YyFgXTAj4Ozz544G;=JMwsZ0E^Ya{>K^yeGYH8~> zdstdsK7tpePNwBrkNUWgqRvgn^O~*i_bQ_6PXkW{NOWtf_O2%^gUaSt3?&ASYnk>nx|vf0zr+`kZ|wqGdj9$Dpl>Xj)O(gHelLG zjvG2n!YkED(%>A*x*}}eUPs>GL5iFlSRgU<1 zKext)EKK?MdV4<~4*j^}n4HRpHE@{Xq(+(BcDfUx1|&I?tuz{L@+c=|^it{;(9@V2 zSgs&RDrwS&C;318^`upY6Iwg=ui4kEMO?PgGRW z*8H5dG*ze07Ury2oV?u(b7RNp^^)nLY0bMS*4Jfa5M!x#hZvm#?-}3rHeyTj6~%57 z-pcHJb~?^FFGdZ9)(j(!?t7gAd{jffqoHgH_HsZWzY)<=H8bsatYc{r0H!M(@PH_@ z5e5sTWG%WuVyf17OA*L64v(G|oz`YlEJ`$Dv*nlz+sX&{B$r7`Ly(}krjcu;(c_PN zihv9Cn*FA?r&9i=lPXX+w!Ozq6IYO*)y{G>sbUXg{gyqOw7c{6CFp4otLrJ?q{8@R zCMD>3l|fGzqR7E*m?T7ly17IThas5qYo-coy*1z<%kwYRGKsD2H`nKXO>fTwZD&|= zL050LQ&`svUJt)<=qJwITr^tVj8y4@Q9@8<%C$$UCg(KKd8&*}g8n8^vozR7YcZIL zKg#qZkmbS%!G90oUm2CiDo>TW4}T4{CIoDqQ3bOwhBBd`z^aH4;Ux!dbB60cm*?Ki z=L`R_)6CseDiWTifX^_1t$Ayc&6eo3xWTp>POyA$gQA-o?<_C+K;?8^JaRV8r9L*# z2ROk-P<|d+o{_5}qzlYUj%i!c``5JWR9CM-y1!;@D52|W*FkSO3v>V$ zb&E#c_JGT`Vu}@O)xU4bF}2b1u`z>^b5u`geLC@b1M}9!Jb2h}8Tu-@hM&`uIa11EjRm z2<5D;(g=7VFmqI(G@BHsRzgCewv3BkNX*5{tVVZFDK4xK{ECSwCXHaykI?V_?lZ0= z7=>}LybC3SpuC!IOO?M3sHH_iY+;CnjNrnAE%?4!+tJ6LZM(AhQ6gZplo?_G3tQ%T zU=$3ba2J`*7GzQ6l>Cr!zsNa?+v(p zlA_DaQO5pd%jvqIILi_bqFXglC&qaf5;pZTBXB0ZJHM_%B~#PPBkFz|dL~MWt!%ero zazwp3j^SCF;j8zUJ#}FJBC3(q?sF|C$0Ox&^XEPe)!5Chb?ocaqE#AtpPrf8q_t~i zu~|X4z9+@9|G%0L5@;lJ_4yx&_RNTktgTMhWc)Xo))gaT{$uanZL2mVH7LX${x{0% zykmgs_;9(*cg|Rq1h#RA1vs_KFThO6cD)naRwvdo=Hs<_`{|%G5Jbh znACzO0iT3+Ra8V6PvQ5l>$WY{#IaHDW*s1`-Bfbr}2i^Ju!f)R82Rp)$R59pNthW?RjQ& ze5q=B_sEO)Lw==K$upXE7goO?tZPA1ib{Ws7q@Q_l7Ka3QCTRx3k8FBvo)HAV%T$; z*VMMq{`9rXHIbMo;0KVVg?Zd2kqofp4+^>t%1u#Fc|V`1MAz1wVQlapIbJG~8# zg>A37+${gv&QEZ(MIXTTv)voa^fDIru@lM{nD~7_kj@x0`43q3d7(bS5%V+g@CQVG z$p&2(t&~?dIEiL$Q=j9UHgOxI!d=W4mjTj~xDVmD9U% z933p4@cq?5)bdq!MJ#de3>8F0+O^Rv>)BDq>Gr&BkIk0D!9mNq z(ehE{0mmJ1k5h}9I8vJ0nc4|Mf;<*Rs~3G3=0DvE!s+r%xB|UweD8OL)eWgCGkIvJ zAxf%yjzBjZC23m>n{Poz>M`&rECKmnyf+ZhwKXw#EU2pDkx{WLsF5f)cv-)O)Dx_E zan>gS5aDQPs1X0=Y>2N&eP@CCN6Ex;>o(;ns(EY=KJjc}f93OWIGbeb15eD&;lzxLgkF4 zJny0-qI%q#f!Eg1ULra?l#gW}An^}x?cm40s!`A#jwfs}t)`;Xlxj=OXXoUOldQ}C zbQF~4ov&@4)tzx%t$ag%KUldhh{zn^JpY^2wKZnkm0i3bYv!+LZ{rEjM5XWLckN4c$(iY+p7 z08{F5cuw)pNy`FL7f1RwAe%G~-qPc02s3)j8M)uxkW-G=(R{Co`_!J{Q{L(dHV=MU z)3K}Pj9wOV6`q5l_8c%NPGwmG>GFY_&Q$Bw&r2N(cK(~0J}hIys$$*KV3z+;sXwrl zE~HK^8T>bGV08F=Zd5bAR9|FUlDF)WE?F&!(@?P1*tbgl>wO~q4<-Xe53dqjPV%>E zwVi-6I<(JFr_WiQ8T2DrU4h@68^McC!|(JoGct{Hh&lBy7UC9a4b?}(c5tXr>A2mV zmWQkCiu72W4w4C~4_5yeQ97W|Sjs}M*yGqP8rM%Pmagm6UB21d`}#nJZ3Wy1pJjuS z0F7x$4!d;^vSbv2Fj)$RjZc>C7C6K&0m;yI9gsryp(0e&|U%cISReX?49ai1h z(NR^=!2hcZ=ezS4Jgd`Hq81N3n*sLaEGyaN#}yJgv*=*dzxog+D3gT*VDeAmbg5zq zmSs4Cxi)p3|C77+``u!-gGVqF)SFC(vEbF%G}o{YMvqN3T72BQG;k%&%gT#H{Uw=> zo5OCr(!tKj#_7wqyO@s%+pWZvYk&5ykP&LUG1PdpXNpmc?-%HFf6!OZ@$?bOUWKBM zE`&77Na*C4Ir>`IQm44+D*APBCOe+R$fY!hY3MMk?%6+X(Qluw`mgIT;lxz%E+alX#YfUXw%Zs4&LD4btXcN>@L>wEA;RZFS(bx z$tCrno6AXR9!@aMCnFJhSWn7;uZlA;>vSJ0aoAnG9L`Q3iUdWg+4a4?babq-ODe-- z+v=)%I>NA!Q-p>Uf7vi|J8F5n4?|~9J}7^Q#1Te;`?sbn`U!Rdjy5kUNPmUciDKu59R6ey-aAEett>XARnwf9oA^1WAuG~$(Q|s)h6I;q2{9o0&=Ri-%RH77( zr)=Hq1esHq4|gS3=9$m^#jM-N%iCXPgKPO<?hv?M2~_9%zTNwkI^pXwFoN|fy)55O$zN=(i;P_i zCDYL9;NYEI-TlD7xrF%NyQbhLs6+KhUd~Is%B&O|!e^_orr6`Jes%>c_JsOPNKk=M zN0lblTD+fc1UTb3V)22*_G1iksB*%TJ_=YL>*?^RIxEr`VRNhQfCe-V}hDVS3nTt54Xe z7p9QdEW10acHn5DL&HTVpCg^}JysM*DW0rV8|T6sY;RT?q~P<}zKWCVH(R|tqMG+7 zU_=4sEUb}{3U5Vt%m->nM=94)O`PIfE2rxT#KukLEBqTkdJ z6RN1@nW;;2d~YmvnfvB$=FO39y%*DN`bLYKAK5hIvCJy`{t&gO{?C3H>zLQ z3{R}v9(X!HY4p2K+x#pg;l;@J;&x{^S10iLu+VvKkbG@sydfoW<6#7OQBTz`Xx3@L zrp|gp#O-1@-#EYI?Gek<0b?kp&${#NY`rr!bh0}|mA?*p)R)fD^^%)jYE@vdZ~{)( zjLsg_f33oN0QY3?Z-^M{L!gA{PeqC3t^O~$6*^8|>ij6g=axWUCg10Y-i^9&81yV~ zdej|f_LUmHUSy}N@lBi<+k|bM%u)g~It|qPjQ)YERI@?B$9~{miSNKoc&b9Sq>Ox` z4wsWXqGMaExlBpoI_8a;r{~@WN}23~q`{8pgT-|pAI){LjpycqC(U@7{+6&Pl@Wbn z(!8#^jBK-9Zh8s}fE3re;N#5`pR!=JU10ok)S)b1z4GyFZ;%Yq7zL@X`U6xQ46MTE1;F5F8H z^;3b4X-uYvaHX-J)Ms%IMUa4+CIw%w>STQ>G4W=EiktkWt^=JxU1^u`KUi88aa8{! zg^eSOH4oxZ-j`_`?cbW)I=?x1keW0$W|JgXH^ciYl%hwoMw9%>JhDL zQ=U4Oj!u8(xdS7c|95HA_~IM`5C-C8i{I#UnPeYoAXxNV3t!QJPzF5R6wzv{+F2Xw zrulqsf~4{5Vj@JS-e!d5-#k7}h?D%3=g?)PQ{WIFhnKu_=YgkIgB8K=o#v9_Dq7Yx zdT6LB=@F4-<%r&nicFwdyNwO%Z+BAd-WCj?sq!}_w^oP)W!IU)+@Vscf?JtP{=^Mh|3WCea_F3@rPK+$v$I*xT%&tE_dw#S+E!@9!qGRi1ClGETVlx=Mpd9U^oP>0b}D<@m^6*;#Z=ND4`0jQ zr;ig6sjy4O;~%J{@m<|hVzl+rd5mm+=y*BTQn=8f4rIJ_j$alWx zvSMHJ{}6UQX$Kz9Kz|sDPBVmbL-l`(p(V0K#-#0PFGxk(w*|j?Gp)_H1t@9=>QJP( z3UDZ^D6e%2899C(V%+CgV>Y+8K5E1iS=K9wU{6<>jWS#$LzDf8iik}MOm8s&6T!zG zOSwEA7FUE)zGr1eKp@Q`DN630c!az{#(U>Tb&N!WaVcYn)AwmH4fGpt=8=@5P3g^v zdnWhxBUQ*ne42j#>saAmL_P|LMIjQa3|IfaDj??v zhXQa&{g^LKf@SyFs>IIjQDB}4@_m>{M{^z{9AhAGy5&cyYHr-a5ee;t zy}M22$JR1WuVPwBJr{+63p+(ObXLco)HoN}gSKfuypFD60h0eFNUBx-CY!Gmua3^J z(Yw-*HKy+~Oy&u`-d<#D``Rf!t#_tQl~pF9ZqAe!vvLg**Ov2C5tV6s?xA%n)TC&Q z5pQa7Kj;Yk+*Im>%z zt7HjAx6Bg15V!z()8@)6?<06sI)O9>jr8G48Z3K?W6*HR6_<&$PB>+w7LUgukvpS@ zU+Xd8P~)}clN!;6K-RWTO||vOtWX$sru-eww^{1cW)idphr=V^=cG}kZM9Kp)9D;iF~QHm^lxdetplFsHMSqe{|>Hwcu36!i_m@(rZ-!a{k70 zZ+JdE?iaV+UeyFPtc@0-oHebwy%_DxBRI{L%8IPwZ%SJjhJ#wMPBy4c8%+&eHQYI4 z5p~L0l;cKyOAA93&}Jl_T;y5S@%-(PQZ+Aao!1wq&Fj;`Y*UwrO|k@l z3ehEm&_6QctuCOX~Qq?+P3mB`ZW>3`otiVq(to1nHgAl_EjX~ z%Y?GBr?tM-N8i)Ia8}%c1;!NvyR7;`k-&?~7FM}x0*$x7M+v2j*`@2Pk7uye_hglu zrv5GSP=TR%quR^Uv`6o5ojl`~%gtfUb=0Otfkg&dtNHhatW zEG&cwwrY#1=aHn8P$vQs$|u5&<&7@WA}o)0Q5?~(LdGnqIkmLS{T{P(7#a)`I8x1N z4sM84Ufdekz!W}dX#<$>Z-eg^o@_`keDhN^T{&DUB0LNp$ePb;aYYX>DF+|QO1L)D z!MP^;laUP=$+((0v^243XC~R$Uk>1OK4bF!r{RHeOMupWm;7rvB@n5QX;ccbPj-s!K1Uz%4NdT`>Tf)rnQWG0obYquLVy8&5-W9Za9FeV!iwJzl8Om zgL&53MmF7~;k?{92PM?gokaIPS&lny-Hxp}B7CBAng&0n&UgvUHAI z990km0yu4XmjaH$3zBcwGvSKc%x*mxR-CyMqz1%|wvBFjRaPSq9me^sE=Mc-%|{r} z_NYmgR;117{*hJ`oW=!@iWnhVr8nDFEb8y&>$t>Tf4ro>F|!qETTB$e(W2NC-{Er) zqqAAHQ4kB>i#(C^MIZvY(9CbU{4Cx#NP&Pxs=_xi6xQbBx(FBtsY^D3xYECx{k9M(%_K z<(SKgN&s+6fY)1x09lm3ZBCSL2Td@>UYHdw&N=oyR^UMs<-_5XvMKY=L%1$1LF)<) zJdAQs#;)4OG!>i6>Y2y`ze~ zz0v{hac0QdS@`h{FJ=ANV_aTpv!2^FXXi_g@g9)Fr9~;E)j{=+e*8>()XVoLLwoiP5F1Jf|gmNW5(u=e(Scbz=B1#qpfLb8H@9_44w=|NGM_bm} z71Y{UmAlf2IhR!;+QuVvy@}l9Ks>z@x;S|4E?3*Yp44L6;y9SBka9JfS?n`p8WOR7 zV$kHcqFWLCy?AEy`uxC)b2YP73|676Iqyxg)_RiZpd77+h!RXV#+D+z_+nG^Rh=)F zd)x|b;CROMD+{~IWEC4r4Qy*7%e$L{O~vSwuhm@M&zBX zKD@F~#oy`R@DFM6PF2eezi5jP$2UcKXGJEVV8mkZZVf5t+us)hMTO(;I?;$<`m?N8 z=4ZJ^n=B|L*fhJ=SF=r1Ys`C8x*E9pB(0x>iSz!gCtl9aIW4v7^b4m+P-RTpxC!H> zU&(i~jZ8=j9jS-Gf!IVulIC-5e)8Ln6408q47g4*L}oB^_qU&*`^g;ijxKQ*W= z(lorVBG;#@feW>7fh9TiXDdxr^vCEl*j$YqJo$hSw$Z6oF`u2Cry<#w75&EJjfOf= z@&!#WiLxDg9Orw(R$e42EQWx?;hSt}_RWE`TPk?DwwzpY;fKo+bm^vVeFZ~U6idrc z>^VVfu{p`g<}AGeME{Y~T-CS0wsnr;o8UouJ~GGSm5bHI8$Ge2xgmsts1hQC8D3&H zcjk0z3yg4-f1RzT_2On(fyHlsbhJJ={1~8@mIb87s`<~>t&q<1w@~lS;+ZI6A+=Ka zX?kW~UAXsix#!L|IIUjMg~{3ZrLjdLVsjzX->xr2F(0VcmpV0V*s#+t7kLCWE*r@J z;8XoabjKP)Ri$4n961tzo+FFcl_#sv6bNR8Iyc^ix3iP_q52{6OizZYRRigr*qz9M zR2h*%aAkzn8l^oLu}WRRQrm6^Ii34GPf>G9|} zxasxs#&WHipN`NmuKx*~`2|WUPM*cOK6!uri5;|OU0Do-ihrdkckuaCrS9Upw*W43 z>T-8=-dsrD*^|WYlnF3s=?DS)%72h>geKLd?cszzeF}@hCJx>v;N5PLD1=Tw~v1I#`^^O8-FZ!~dB!5_~N(K#s$tq(l2OU)> z8Y2<2v$BcWTaOcnFZKo#JMpIHzG~;R^YRm7F~yid2S{hpGm#kg6bD12D>JpeZ=H@F z-^XpXc+23{3ySaxXTdF^FqoNYnfU;8f+ZqR0C-Yy&9Si~DEJ%ZICMa{C>{Vnp&w69 zfKHEF^5<|Geeo~3)aTL~1|N(#o!B}lm9>B{G%U1|`1E{jSc|pyyVTxijC6P78hZavU0)d#N7!_` zSnvcVxI=IYL4qtS7Tn!ExVyW%J0UnM!7aGk26qX;-68nhB=2{>dT-V3A2YvZs&?z? zp6=6qPP67`F?MM5KC^Q911Mq8gq5>;HUf>UY*3J0tD~!(p!H<9Bnl ze5$h-J_=12QW|!O-F;ej%7mWHjEzBP(x}r>ccb&EVX4ZU=RZ1YT4Zlo^&ieYzKq^Y zGO~6ycr4r1Gwbqr|BAu)%U)i27@M;@Iu388bUXb0vmwf^!;wkFk^3m3AdAx(MO>DJ zU4zxO0wg}lGA5Jj_w?ixL>J0wVwxgp{>8~lm;ddQsp=ay!4C6>NBP}#9*6rgJZYjB zGgjj1n-k)Nrxl3%P;zBR#D2wT=S7LRggTxMS-#5j>=fTb+Uq?OSUA?p8^a{R+kU#; zejRZqomUu>*8?#*8<$jD-c;xPKI{bBJgu&ZbL1!G zTY8XJ1}~!wLRjTi1)WSLdVWD{xTFVDt2?|TW@rN4@o|!1GHcN^lizazEaS2ipmOW88MwgkKo_=;3sv>H{@CVVLfzY*_ z1QmX~m{;DZRu4}@VJ8|SHn9}LR-aH)SR21LvpH}4cpf|@ZfU7Kvb(qBq1yoy=Qc#W zp8L?iJwM;)v@1s}c%J08({KDT`>ea+dl~!w{J1P?2g>reM19KOv}=E97rJ{MPF$K^ zSKcM+@Gv`~WeoVCuRX7)Kb?p)N{*30s+LrC(A0O<0d7WttL*cnf}w~gr^Ahq`n2>w zi#69DRmuIXOWqxU;Uj{$hT^(LdkT`tmexT1#_dVd3E z^z15@ey>}Z|LtQ*n88E!n8A#ZO5}R;2IZLM8wW>{$7jwXc^o(?ZLaK`T>N~zj^=BT zRb$&`s}U*L!xteLZ5hiq+imi*!>(}o3jGSl%aa5T!H>yhsi6(kShxqzv`FmAo<7D{JN)w}#Hd?9~ zr$>oFA%(hhznazt(x|EHHyRl4_(KsW+<8eYYHu)8kB~~+Ybw2tX???o^ zye@uiA=cfm)Z2cz5}0c9%csvoK^SROqKuRl@jXNa(4v*q28%{Ag&bsNWui8;IHyY& z`@gKE)1sGkJfr>Go?cLn|(j~L)eEM zvcE8AGKWORXA}JR_Ku5Wsm^P&Yrr6A;?2>Dr>_=0Q{0Z)K^<@XO1O|AXGbELke5T_ zUMfl01Bl3Nzr#S6atvmn*RN{hNh_IDB`jszM~4dom>-u^M^+&wbd6g{sMK9vA@DpV zP`P}Ot27`ln1guhcq-6`s9GKN$NnlKpl))IJ2DT}a3*#(mI$Osp_BOe-6x*=z9aa! zpv-#sljp9eX!~(Wi6RRsDmT#V9fcy?$;rh&%$%*wVCn=*QY>Zmg}24QDW^aacW_HY z6aL_EiTjGXKRP}-_Um0Cy@yV%lQeZCLYOIv4A%7J{NB|?elX2DmK{744V`yweVbPn79Rk{!O!PQ9ds}^3~+p;v+NY!40aq_L*vQZ|Q)L zeF&mWauvE&x$9-To8}yi>Q?wlv8sC6XLd!GspLzWR%D=Sw=4XDtv$^g;lFcsBk*IZ z5PMkclkiS+I76*hzj_xY*Z>C{!#GUZ(1pjUc0CS z!z-~26;^YEgw~Gs+GKeVEs-8ezZXSod1tfw67A|{S?fQ>OkYrZ|4et=2&u$zQuAn4 zP%AZI*W?kKcj#)leGs@xg9>M=wwQ&F35qK`e+knmNqjN$y1PO{d(yBcpTZAx7+3O`r0EhZqWMQ{z#a1hoE2u3Od#i@fFoB}PEB zEb%bp%4mL`mjl6j7&6o7Vn#@`)r+m1TQ?v1G2W}dZ=qzM+X$4kzE(oZ8;A({JV(Zl zvB+yb;i{{mqB#p4B{x+~rABW&mJ0XHLWB(+@uv^%w7pE-8;E%gWo?$Le1*lr#AFu* zuHp)MvDm#QWd7LXa%!PWkZ7IW?OzaS$zO^U{{F^$L+F8(dEO-+wfIhk(|{v`0zi>u z!nxSGxu2Q)gsAJN_^a0Jw=4)#6b%z3tKF)sE6bE$f#Ud8Qhg9;6(n0usz5V9uhzCd z39qa;>5Pm_GmI~NO%~}-S(z<(wW&;|=do$_tLgdD&ee5BT;^vy5%0ytJ{6t*cW2wu zN&S;!RYT@tJdJPcOBwDTbQ?+36&jN9$pfV$2`12#OG>D8o3%>|{44!|{o!ub%Znz< z@Wr3QmzL(9V;*#taRV8|dV+x_GH=oaS0#qtg5+tT>IVOlWS&am0m#YeXxos$QRO%m z7K?XBTRn_!Yn?7zbR|J}75np7_CxsR4@Qpmo3W5q`<#Q;z_)2vK%PaMSZ(EuL}sTP zb}<#lZnaqoOcW7L=nTbFGqmkVkRSB!*cW(I3l+bnFk%zU?2+us7Axs2j>$l zYIAV;oA_$%EdV)2Rmfd`OMiCN{TE+OvxBa0IvNa>(QUqYpEDI}-E9wc#w#SM!&&jMp92wmngY$aW3MQHhuxfa#Q+@ zpNGDxD;Z*9@GunXQwkY0SR!-$j0BIC#}38A06xhezuNL=l~lOCHm!Ji3)3u5k=JGE z$ZQYJ6hs)C1yyE22bU?>e-5SEOoSJ1M8R{BNr|l zs``>2g1Tqflq&D1C;^h?aTUcKt!UvZ6X?47hu^3fJK_U}G#VV=Z`K~5R``!mVA`Sd zzj~U=VWf-u5hDgCh$Clv4p|9ISy)hBPezlfNT{DJH3WZZB~*;?x6tLcoDD}I5Rqgj z2X--hu+JV2r6&OTM;9pI%)STstJQH;IMg@0_N;O3{AtboYtD5_D*}d)crn;E033Of z=aTDND=Ww6WZ%7xycJF@j;dp3=f4h4U!ppGVVR3RKr28;6IL~$`Zd4srOl!Z<&C6H zC%3<@8$5zP_EKN~#utl^u{4sA;!npmliF(U7Zb~^KFg4^i{Mj3uERIp2oK<e%A{tkONnK@S&vap+4js$^%GAf)HY^)=HJ42^gZS`~YwLU0y-?S=lB8X@Y?oJ~?n8QF4m#U<~+_i^9rs`UIqSe@Vdk2tTT7GO0q* z#I9!u3Oq28`m03*e%j56Xb zvj?0#Q(iN%7Ozj157%>*JVLT1NTXmD)%hsp5kN z()HE#buFqY+(9ij7^Kq5j;SZlY&a||Ow}k()h#Yn{jz55RkzGrdu*?1%Z?RsUEr z89@W$ucbh_S#@Q}nf5u7!$VvGl;mFegW{NeEct`|NNDbPzHaCo$LXXca z`0L)gtkj@{VAMcFxNF2*AK!IOuOxXliPbhTT5N`WF`g$=K&)W|Q~k?5@BDd2poQFiG%D61l>%D1-Z!^M%n20H(I%=o@o)*7HO2(k_el=!4Ek(@hAulHpr%tJQ+O9Fx!X8t zdvP44MKC13C}(-*jhRXUZwbSP<~jotsePu3_5A*RQ2%xO){EYjiW6AY7zAHFbgAkkoHu*oU6Rlxk}rEk-wZwN z2NI}R;K{kiL~VRlR7^m&3$-qOS|M#=JWI`?61xrM>Oy z{FsM-W7D}bA)x9_+Qr##7m0;fn{5=l^2|yrLZnxcJv3hI+V)b7Skb|_;ynx|b#-@N z-f7MD6Kg7plqDA+?ci||AmW0!WYGgKk>;84IbOrq_fI%O(#Z`|MrpdCJ)V?LXaUxS ztSn%hG!9iN)d473Il!Q6m;3DwR4(3{eSBA$+IRgP69#Fy0X3vYU{1S;y40-I1#E%0P=mb-@{7UXWzRy# zIDPomb>!pRSI=X=;ncM?#=%9Fl}w zQ?@_=1OI3z7Itb1ctx6(^TJV}sHjMDEXGe1a`G+W7HUHpWX#}0EDG|?6nJTJtVRsL z5P`WQ7z4Zsn*acaL^vh$fC*7O+#jpnQ>%)+RA|*G^+a}?Q*S22tMCa@R#iJ5(DeQ7 z>iuWpnA*`$wE_IlW~o|tP^_hU+p;e1^0bqu7vjLob-QLZ>nCV0taimFU>_YvQd+Ga zqcsYs+35B-kAdTB zD=w_3;&5J=piIT9!9#eWD(2GXTHnnFF!@Gv4?W*IhfgUqkMIIa@Ty;s4Q9^{cCoWX zMX4E*xKo_WfO#zHnBPaB<>NKxS*E1rH{h5RGSnBVJDfO2*=F*?!rgm^#}@ z6jXpB)p@3RWX%ck?=Sw#TOlQVlha(a14e11#(=W??WK3*WOj-*G?>hC{qOOsn8 z&DGh9wfj7O=zUbU@v&KO?D=_iVzz0IDnN)#liY`#rIe6Pwtump236uUncdW*OPFgS z!*pglAt2$9r)X^EXAz^hyiRT-3QJmyLaFKIjjTWi#7wqalxW?J|I6%xr{Usa|8N#Q z1Ug>eVviNR0`$r6IGk9kvf(O7hYX{N{E<+A8dS*xYJ(s|%0OMHe3g)=`_=fy-u&Tx zZ-;>b(^%d;q=Hq~_YiEiOXgRT7GC~J<(8L&U9aYf7AvsS^1I4#sA;sSK)F9AG6j5P zCJ%cfWH2Ha19$LrL{O9KHGy!-P&GRZA$Esb*h#)mVO%K_DUj7 zpLiU>cM~{|EkGf^^1oj8=YSjj%FW@%aMM+UEYKMI?D;i*cb+8V>0_~AyI^nd07;c> z&+8Vj+J3O<+AqX)eB0G7x)yo4WcgI_(4Jl~Cx=E*<>3z30u=ENl+12HyNs5~o+Buw zfI2;`JKN$!%j`Nq1YP>KR9cC#7WGs*TjKWChR@nM+;={qZk!THtOZK@_5Miu4v=QJ`w0^)jx^7OL7Xtl#@` z;f#+o(l=2`kYV$SK&RR22iOAta>-~+n1B?07L(MpQSdP=naKB4 z#ht*p>;Zy&sOpPU0t8~Op0*JcOofHBi^$4j{ye>ZF;i93ZgR5 zfgcdSo{Y;CFQZObKr=wWt(M+q@B7W*I;4$z=AF{b(qbWj2ujLo%8UDqj!^$8%$hhe67E> zs=8jjQ^NB7W^Gv8e1{5Mms$4Rh!`WM^Wy~pqKm1WS0AQ^vt+XerSwWuHUm<;f~1t; z#@zvoeOX20)^M!0-|Z&QE?&>Rnlp03x~7!6wkZ! z_{g4NQ`@|DXPd{RGjHTnyb?8(h#m!?pk+olcW6VF0589O^Rf4Bv2eIyMofGYb zYOWgFcr~69Ss)e3BKyZ1`tCr^?r!x3*a?n&oPQ+gyMGOs9_MDs;kkI>y)f)6u>)HP z*YNQ1{@#dbVfNAY^Y)v6_SGNxseZb{5)C~yGam$A#&fHQm(qPUtJ2nex33-sS#9LS zL|iuR811}o7fg(J&imB!mRAUC>NdI8pDsH)d{r~mEZZ!7T7jduTTDUPrS;eqAI3!i z!GYv$Y>vkl8{BKeW4of=(P6#Ir1CS|#VSfB`mG;SEl|FDZEX#Sy(9p>f=SxnljKO- ztjC|t-*qu>rAn~q^15!sC>LrD?KM1Iw|{gk=`G7Yx<>qi(f?zc{PBMi1Fj-mjeZ7( zw^P~&UdcTo9_L3HhtmR+>GJG2@ZUI5QIiUzcqf;1rspQ{W;I@0Wg0QpMKsCb(-OWq z9^mt$r$ppCIB*r5TwY&}zX=#aaFmVe^LqVg{%~WrzK%DsI)1Glb_m`QFR69PAew9&xyC+ zV{d+UX*0i)aDoZYL z=3*vFSfE*bL3Q={z;Vs+c}7TRfR76o9CYYVoH(G_C{$UCT#r#l%t2(XUL%+9@qXg$ zEVONLjU|Xcj}ZL7CF&nv5P?S-g=KlHxjB~43_4wXK3jdcvX!*Z0_lG3K8209A1&H0 zn6%=YyI?ldgp$J+tz|-u4Totr0;7m|=K)(%Qmj1TeLTv%QnO3IY>Fg?!x|){SP|)v z{;9935Hz?=lz_f~Fl;mJ_58n2XndnCA#Uf_p#GF;8~laB3O3&Qn>o!;IR^&-11RYqZm{TT>&Z82 z(n)}Xs1hpqGdVkiVxE0+@G;!;v!}|wUP0l-E~+Xf6|X? zrj$p+PFBJh1b`|2@xEa#b4VdQ=MHqQ#$WqG6#L`4qAO7GPo|2!9j7rzE}A*bUTOVh z$K8dY?Fv@Em!OHXr3RJ50rVKB>Fxd+qBM{!3_OLDh*^PiQtW54a;$*E)Dhc&A-!>J zmr+|@^E6`na{Brnif<&LreTZapXaPso66oF%Aw^Fa#%U~#&FgnynB|U2EXe4*{We5 zA50Ux*$O0PxKUyOfWD#JML0>&svmv9k`krN=54tv2FXOApPXFvdr`;=Tm4j7S*d1Rl|YzVi%*??3Lep6j3D$EJTyg zz?lJEU^>zaC`02cBac|yg3DRgNW=bJ@`?4Kq02djgRaE}ko+rSCI&n)OhPz3Mm#lB z6OYFeWW44hFFmm|=eLWD$DD}!T!|)9z6la`PIZY;79B#(bAimY$Du;`nb1r#>2(2@ z&6R}Fhg-s7M|;Ln@a^pxXsMh7e7Wa?4lr0 z!-@cT?J}76O(c|8Y7pLtPTO1)al2BZ$-;@k+lP=w-x0QEB|RtS!J%X+M2Q=d$m)*Q zI5SlS9~cX&+2PgVx#>_+hLPiadOtTiJ1>q~A8zGZTHyw=Qs*lNu)&*j36qm2X;4BG zf&y)}nOSr=L~2qc^cR|%?92;o4QweklarTDNFLm5tgWLSX6@V8&1dMG*S?i?&`#tU zA*bU2I6W}r5=tHp-2^YU;dI-tg_T7_uBiV7sln=g`|$AZcHMsxYbRJ_Sa?HaUrX1r zW|h>QhJAnVezqi3AEBnd<&L05kO2LC@LRlM30kwTl2j7>aG<|Ru!5D9u9tG3UdFfy zs%bY>!)IMpTyprPW}YNnh{;u}LRa|R+xQe{U8V)urtxFKko+wxY{LAydhGRTh6@TF zWm{qk3A$@tmpciyyBh~&YxTa>qBY@T}iP-2~??BE)ZvR;*h(z z@R=}aV*Ce$1;U)RWuVLdbpelVltFiKmHv|i4RoZB1u!lV?hqaKuU4ZAg83%Lg&<@d%`GZ%=yxq=S5bQ{tm8t zNojA1ahA$IABuAOeN!oasT7*wTi^0xrUj5|-Lj|($%uB@w}WtCurMk8da>=bgb7^teRXVcaCZZ zJ57~^wsHRj+CP-s^}zo`pue}l-dOd^wf`j5|CKuYg8`t|KN!(}*}n?+|Gs5V;Q6K4 zD0&juWbp(50BD@WG@MNgolW_S9ZjJ(00$e#duBEsW;QMr_V;{jTzs6IjBIRtY;1G_ i7H$9afQ_BWXETrg{{w0U6Nu0U0H4I - {% csrf_token %} - {{ form.as_p }} - - - ``` - - - **`{{ form.as_p }}`**: Renders the form fields as paragraphs (`

` tags). Other methods include `{{ form.as_ul }}` (unordered list) and `{{ form.as_table }}` (HTML table). - -### 4. **Handling Form Submission** - -When a form is submitted, Django handles the submitted data in views. Views validate the form data, process it, and decide what action to take (e.g., saving to the database, redirecting): - -- **Handling Form Submission in Views**: - - ```python title="views.py" - from django.shortcuts import render, redirect - from .forms import ContactForm - - def contact_view(request): - if request.method == 'POST': - form = ContactForm(request.POST) - if form.is_valid(): - # Process form data - name = form.cleaned_data['name'] - email = form.cleaned_data['email'] - message = form.cleaned_data['message'] - # Additional processing (e.g., sending email) - return redirect('success_page') - else: - form = ContactForm() - - return render(request, 'contact.html', {'form': form}) - ``` - - - **`form.is_valid()`**: Checks if the submitted data is valid according to the form’s field validations (e.g., required fields, email format). - - **`form.cleaned_data`**: Contains cleaned and validated data after calling `is_valid()`, accessible as Python dictionaries. - -### 5. **Form Validation** - -Django provides built-in form validation to ensure that data entered by users is correct and meets specified criteria (e.g., required fields, email format): - -- **Validation Rules**: Defined in form field definitions (e.g., `required=True`, `max_length=100`, `min_value=0`). - -### 6. **Customizing Forms** - -You can customize forms by: -- **Adding Custom Validation**: Implementing `clean_()` methods in form classes to perform additional validation. -- **Customizing Form Widgets**: Specifying widgets (e.g., `forms.Textarea`, `forms.Select`) to control how data is displayed and collected in HTML. - -### 7. **Formsets and Inline Formsets** - -Django supports formsets and inline formsets for handling multiple forms on the same page or managing related objects (e.g., adding multiple instances of related objects): - -- **Formsets**: Handle multiple instances of a form (e.g., multiple products in an order form). -- **Inline Formsets**: Edit related objects inline within a single form (e.g., order items in an order form). - -### 8. **Testing Forms** - -Django provides testing tools (`unittest` or `pytest` frameworks) for writing and executing tests to validate form behavior, ensuring that forms validate correctly and handle data as expected. - -Forms in Django are integral to creating interactive web applications that collect and process user input efficiently. They provide a structured way to handle data validation and interaction with models, enhancing the security and usability of Django-powered websites. diff --git a/docs/Django/Introduction.md b/docs/Django/Introduction.md deleted file mode 100644 index 5729d9d0b..000000000 --- a/docs/Django/Introduction.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: django-introduction -title: Django Introduction -sidebar_label: Introduction -sidebar_position: 1 -tags: [python,Django Introduction,Framework] -description: Django Introduction. ---- - -Django is a high-level Python web framework that allows developers to create robust web applications quickly. It follows the Model-View-Controller (MVC) architectural pattern, but in Django's case, it's more accurately described as Model-View-Template (MVT). Here's a breakdown of some key concepts and explanations you'll encounter when learning Django: - -1. **Models**: Models in Django are Python classes that define the structure of your data. Each model class corresponds to a database table, and attributes of the class represent fields of the table. Django provides an Object-Relational Mapping (ORM) layer that lets you interact with your database using Python code, without writing SQL queries directly. - -2. **Views**: Views are Python functions or classes that receive web requests and return web responses. They contain the business logic of your application and determine what content is displayed to the user. Views typically interact with models to retrieve data and templates to render HTML. - -3. **Templates**: Templates are HTML files that contain the presentation layer of your application. They are used to generate dynamic HTML content by combining static HTML with Django template language (DTL). Templates can include variables, tags, and filters provided by DTL to render data passed from views. - -4. **URL Dispatcher**: Django uses a URL dispatcher to map URL patterns to views. It allows you to define URL patterns in a central location (usually in `urls.py` files) and specify which view function or class should handle each pattern. - -5. **Admin Interface**: Django provides a built-in admin interface that allows administrators to manage site content without writing any views or templates. It's automatically generated from your models and can be extensively customized to suit your application's needs. - -6. **Forms**: Django forms allow you to create HTML forms that can validate user input and handle form submission. They simplify the process of collecting and processing user data, and they can be used in views to create, update, or delete objects in the database. - -7. **Middleware**: Middleware is a framework of hooks into Django’s request/response processing. It’s a lightweight, low-level plugin system for globally altering Django’s input or output. - -8. **Sessions and Authentication**: Django provides built-in support for user authentication, sessions, and authorization. It includes a flexible authentication system that allows you to manage user accounts and permissions easily. - -9. **Static files**: Django allows you to manage static files (e.g., CSS, JavaScript, images) using its built-in `staticfiles` app. It provides tools to collect, store, and serve static files during development and deployment. - -10. **Settings**: Django settings are configuration parameters that control the behavior of your Django application. Settings are typically stored in a `settings.py` file and include things like database configuration, static files settings, middleware configuration, etc. \ No newline at end of file diff --git a/docs/Django/Middleware.md b/docs/Django/Middleware.md deleted file mode 100644 index 5c18335f4..000000000 --- a/docs/Django/Middleware.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -id: middleware-introduction -title: Middleware -sidebar_label: Important of Middleware -sidebar_position: 8 -tags: [python,Django Introduction,Middleware,Framework] -description: Middleware. ---- - - -Middleware in Django is a fundamental concept that allows you to process requests and responses globally before they reach the view layer or after the view layer has processed them. Middleware sits between the request and the view, providing a way to modify incoming requests or outgoing responses, handle exceptions, authenticate users, perform content filtering, and more. Here’s a detailed explanation of middleware in Django: - -### How Middleware Works - -1. **Order of Execution**: - - Middleware components are executed in the order they are defined in the `MIDDLEWARE` setting in your Django project’s settings file (`settings.py`). - - Each middleware component can process requests before passing them to the next middleware or view, and can process responses after they are generated by the view but before they are sent to the client. - -2. **Middleware Components**: - - Middleware components are Python classes or functions that implement at least one of the following methods: - - `process_request(request)`: Executes before the view is called; can modify the `request` object or return an `HttpResponse` object to shortcut the processing. - - `process_view(request, view_func, view_args, view_kwargs)`: Called before calling the view function; receives the view function and its arguments. - - `process_response(request, response)`: Executes just before Django sends the response to the client; can modify the `response` object. - - `process_exception(request, exception)`: Called when a view raises an exception; handles exceptions and returns an `HttpResponse` object or `None`. - -3. **Built-in Middleware**: - - Django includes several built-in middleware components for common tasks, such as: - - `django.middleware.security.SecurityMiddleware`: Adds security enhancements to HTTP headers. - - `django.middleware.common.CommonMiddleware`: Provides various HTTP-related helpers. - - `django.middleware.csrf.CsrfViewMiddleware`: Adds CSRF protection to forms. - - `django.contrib.sessions.middleware.SessionMiddleware`: Manages sessions across requests. - - `django.contrib.auth.middleware.AuthenticationMiddleware`: Handles user authentication. - - `django.contrib.messages.middleware.MessageMiddleware`: Enables the passing of messages between views. - - These middleware components are included by default in the `MIDDLEWARE` setting. - -4. **Custom Middleware**: - - You can create custom middleware classes to implement application-specific logic. - - To create a custom middleware, define a class with methods that correspond to the desired middleware behavior, then add the middleware class to the `MIDDLEWARE` setting. - - ```python title="myapp/middleware.py" - class MyCustomMiddleware: - def __init__(self, get_response): - self.get_response = get_response - - def __call__(self, request): - # Code to be executed for each request before the view (process_request) - response = self.get_response(request) - # Code to be executed for each response after the view (process_response) - return response - ``` - - ```python title="settings.py" - MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.auth.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'myapp.middleware.MyCustomMiddleware', # Custom middleware - ] - ``` - -5. **Middleware Execution Flow**: - - When a request comes into Django, it passes through each middleware component in the order defined. - - Middleware can modify request attributes (like adding data to the request object) or decide to shortcut further processing by returning a response directly. - - After the view processes the request and generates a response, the response passes back through the middleware in reverse order. Each middleware can then modify or inspect the response before it is sent to the client. - -6. **Debugging Middleware**: - - Middleware can be instrumental in debugging and profiling applications by logging requests, inspecting headers, or capturing errors. - - It’s essential to ensure that middleware components are efficient and do not introduce unnecessary overhead that could affect performance. - -Middleware in Django provides a flexible mechanism for intercepting and processing requests and responses at various stages of the request-response cycle. Understanding how to leverage middleware effectively allows you to add cross-cutting concerns, security features, and custom behavior to your Django applications seamlessly. diff --git a/docs/Django/Models.md b/docs/Django/Models.md deleted file mode 100644 index ea6173256..000000000 --- a/docs/Django/Models.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -id: models-in-django -title: Models In Django -sidebar_label: Models In Django -sidebar_position: 2 -tags: [python,Django Introduction,Models In Django,Framework] -description: Models In Django. ---- - -In Django, models are at the heart of your application's data structure. They define the entities (or tables) in your database and encapsulate the fields and behaviors of those entities. Here's a detailed explanation of the key aspects of models in Django: - -### 1. **Defining Models** - - **Model Class**: A Django model is typically defined as a Python class that subclasses `django.db.models.Model`. This class represents a database table, and each instance of the class corresponds to a row in that table. - - **Fields**: Class attributes of the model represent fields in the database table. Django provides various field types (`CharField`, `IntegerField`, `DateTimeField`, etc.) to define the type of data each field can store. - - ```python - from django.db import models - - class Product(models.Model): - name = models.CharField(max_length=100) - price = models.DecimalField(max_digits=10, decimal_places=2) - description = models.TextField() - created_at = models.DateTimeField(auto_now_add=True) - ``` - -### 2. **ORM (Object-Relational Mapping)** - - Django's ORM translates Python code into SQL queries, allowing you to interact with your database using Python without writing raw SQL. - - You can perform database operations (create, read, update, delete) using methods provided by model instances or managers (`objects`). - - ```python - # Creating a new instance of the model - product = Product(name='Laptop', price=999.99, description='Powerful laptop') - product.save() # Saves the instance to the database - - # Querying data - products = Product.objects.all() # Retrieves all Product objects - ``` - -### 3. **Fields and Options** - - **Field Options**: Fields can have various options (`max_length`, `default`, `null`, `blank`, etc.) that control how they behave and how data is stored in the database. - - **Meta Options**: The `Meta` class inside a model allows you to specify metadata such as ordering, database table name, and unique constraints. - - ```python - class Meta: - ordering = ['name'] - verbose_name_plural = 'Products' - ``` - -### 4. **Relationships** - - **ForeignKey and Many-to-One**: Represents a many-to-one relationship where each instance of a model can be associated with one instance of another model. - - **ManyToManyField**: Represents a many-to-many relationship where each instance of a model can be associated with multiple instances of another model. - - ```python - class Order(models.Model): - customer = models.ForeignKey(Customer, on_delete=models.CASCADE) - products = models.ManyToManyField(Product) - ``` - -### 5. **Database Schema Migration** - - Django's migration system (`manage.py makemigrations` and `manage.py migrate`) manages changes to your models over time, keeping your database schema up-to-date with your model definitions. - -### 6. **Admin Interface** - - Django automatically generates an admin interface based on your models. It allows you to perform CRUD operations on your data without writing custom views or forms. - -Models in Django provide a powerful way to define and manage your application's data structure, abstracting away much of the complexity of database interactions and allowing for rapid development of database-driven web applications. Understanding models is crucial for effective Django development, as they form the basis for interacting with and manipulating data in your application. \ No newline at end of file diff --git a/docs/Django/SessionsAndAuthentication.md b/docs/Django/SessionsAndAuthentication.md deleted file mode 100644 index 5809f7a75..000000000 --- a/docs/Django/SessionsAndAuthentication.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -id: session-and-authentication -title: Sessions And Authentication -sidebar_label: Sessions And Authentication -sidebar_position: 9 -tags: [python,Django Introduction,Sessions And Authentication,Framework] -description: Sessions And Authentication. ---- - -Sessions and authentication are critical components in web development, and Django provides robust built-in tools to manage user authentication and handle session management efficiently. Here’s a detailed explanation of sessions and authentication in Django: - -### Sessions in Django - -Sessions in Django allow you to store and retrieve arbitrary data per visitor across multiple page requests. They enable stateful behavior in otherwise stateless HTTP protocol. Here’s how sessions work in Django: - -1. **Session Framework**: - - Django uses a session framework (`django.contrib.sessions`) to manage sessions. - - Sessions are implemented using cookies, and by default, Django stores session data in a database table (`django_session`) but can also use other storage backends like cache or files. - -2. **Enabling Sessions**: - - Sessions are enabled by default in Django projects. To use sessions, ensure that `django.contrib.sessions.middleware.SessionMiddleware` is included in the `MIDDLEWARE` setting. - - ```python title="settings.py" - MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - # Other middleware - ] - ``` - -3. **Using Sessions**: - - Sessions are accessed through the `request.session` attribute, which acts like a dictionary. - - You can store data in the session, retrieve it later, and delete items from the session. - - ```python title="views.py" - def my_view(request): - # Set session data - request.session['username'] = 'john_doe' - - # Get session data - username = request.session.get('username', 'Guest') - - # Delete session data - del request.session['username'] - ``` - -4. **Session Configuration**: - - Configure session settings in `settings.py`, such as session expiration, cookie attributes, and storage backend. - - ```python title="settings.py" - SESSION_EXPIRE_AT_BROWSER_CLOSE = True # Session expires when the browser is closed - SESSION_COOKIE_AGE = 3600 # Session cookie expires in 1 hour (in seconds) - ``` - -5. **Session Security**: - - Ensure that sensitive data stored in sessions is protected. - - Use HTTPS to secure session cookies in transit. - -### Authentication in Django - -Authentication in Django manages user authentication and authorization using built-in components provided by `django.contrib.auth`. It includes user authentication, permissions, groups, and integration with session management. Here’s how authentication works in Django: - -1. **User Authentication**: - - Django provides a user authentication system (`django.contrib.auth.models.User`) that handles user registration, login, logout, and password management. - -2. **Authentication Middleware**: - - Include `django.contrib.auth.middleware.AuthenticationMiddleware` in the `MIDDLEWARE` setting to manage user authentication across requests. - - ```python title="settings.py" - MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - ] - ``` - -3. **Login and Logout Views**: - - Django provides built-in views (`django.contrib.auth.views.LoginView`, `django.contrib.auth.views.LogoutView`) for handling user login and logout. - - ```python title="urls.py" - from django.urls import path - from django.contrib.auth import views as auth_views - - urlpatterns = [ - path('login/', auth_views.LoginView.as_view(), name='login'), - path('logout/', auth_views.LogoutView.as_view(), name='logout'), - ] - ``` - -4. **User Permissions and Groups**: - - Django allows you to define permissions and assign users to groups (`django.contrib.auth.models.Group`) to manage access control. - - ```python title="views.py" - from django.contrib.auth.decorators import login_required, permission_required - - @login_required - def my_view(request): - # Authenticated user - ... - - @permission_required('myapp.can_publish') - def publish_article(request): - # User with specific permission - ... - ``` - -5. **Custom User Models**: - - Customize the user model (`AUTH_USER_MODEL`) to extend or modify user fields as per project requirements. - - ```python title="settings.py" - AUTH_USER_MODEL = 'myapp.CustomUser' - ``` - -6. **Authentication Backends**: - - Customize authentication behavior by defining custom authentication backends (`AUTHENTICATION_BACKENDS`) to authenticate users against different sources (e.g., LDAP, OAuth). - - ```python title="settings.py" - AUTHENTICATION_BACKENDS = [ - 'myapp.backends.MyCustomAuthBackend', - 'django.contrib.auth.backends.ModelBackend', - ] - ``` - -Authentication and sessions are fundamental to building secure and user-friendly web applications with Django. They provide mechanisms to handle user identity, manage user sessions, and control access to application resources effectively. Understanding how to configure and use these components is essential for developing robust Django applications. diff --git a/docs/Django/Settings.md b/docs/Django/Settings.md deleted file mode 100644 index 75f6c61c1..000000000 --- a/docs/Django/Settings.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -id: settings-in-django -title: Settings In Django -sidebar_label: Settings -sidebar_position: 11 -tags: [python,Django Introduction,Settings in Django,Framework] -description: Settings In Django. ---- - -In Django, settings play a crucial role in configuring and controlling the behavior of your web application. The `settings.py` file in your Django project contains all the configuration settings that Django uses to operate. Here’s a comprehensive overview of the `settings.py` file and the key settings you should be familiar with: - -### Structure of `settings.py` - -The `settings.py` file is typically located in the main project directory (`project_name/settings.py`). It contains Python code that configures Django's settings. Here’s a simplified structure of a `settings.py` file: - -```python -# project_name/settings.py - -import os - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'your_secret_key_here' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [] - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'myapp', # Replace with your app name -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -] - -ROOT_URLCONF = 'project_name.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - }, - }, -] - -WSGI_APPLICATION = 'project_name.wsgi.application' - -# Database -# https://docs.djangoproject.com/en/4.0/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': BASE_DIR / 'db.sqlite3', - } -} - -# Password validation -# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators - -AUTH_PASSWORD_VALIDATORS = [ - { - 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', - }, - { - 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', - }, -] - -# Internationalization -# https://docs.djangoproject.com/en/4.0/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -TIME_ZONE = 'UTC' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/4.0/howto/static-files/ - -STATIC_URL = '/static/' - -# Default primary key field type -# https://docs.djangoproject.com/en/4.0/ref/settings/#std:setting-DEFAULT_AUTO_FIELD - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -``` - -### Key Settings Explained - -1. **Secret Key (`SECRET_KEY`)**: - - A secret cryptographic key used for hashing, signing cookies, and other security-related mechanisms. Keep this value secret and never share it publicly. - -2. **Debug Mode (`DEBUG`)**: - - Controls whether Django runs in debug mode (`True` for development, `False` for production). Enable debug mode during development to display detailed error pages and debug information. - -3. **Allowed Hosts (`ALLOWED_HOSTS`)**: - - A list of strings representing the host/domain names that this Django site can serve. Set this to your domain names in production. - -4. **Installed Apps (`INSTALLED_APPS`)**: - - A list of strings representing all Django applications installed and enabled for use in the project. - -5. **Middleware (`MIDDLEWARE`)**: - - A list of middleware classes that process requests and responses. Middlewares are applied in the order they are listed. - -6. **Database Configuration (`DATABASES`)**: - - Specifies the database connection details. By default, Django uses SQLite for development (`'sqlite3'`), but you can configure other databases like MySQL, PostgreSQL, etc. - -7. **Templates (`TEMPLATES`)**: - - Configuration for template engines used in Django. By default, it uses Django’s built-in template engine (`'django.template.backends.django.DjangoTemplates'`). - -8. **Static Files (`STATIC_URL`)**: - - URL prefix for serving static files during development (`'/static/'` by default). Static files are served by Django’s development server. - -9. **Internationalization and Localization (`LANGUAGE_CODE`, `TIME_ZONE`, etc.)**: - - Settings related to language translation (`LANGUAGE_CODE`), timezone (`TIME_ZONE`), and other internationalization features. - -10. **Password Validation (`AUTH_PASSWORD_VALIDATORS`)**: - - A list of validators that validate the strength of user passwords. - -11. **Default Primary Key (`DEFAULT_AUTO_FIELD`)**: - - The type of auto-incrementing primary key used for models created without specifying a primary key type (`'django.db.models.BigAutoField'` by default). - -### Additional Settings - -- **Logging Configuration**: Configure logging to capture and manage application logs. -- **Email Configuration**: Configure SMTP email settings for sending emails from Django. -- **Security Settings**: Configure security-related settings such as CSRF protection, session security, etc. -- **Cache Settings**: Configure caching backends for caching data to improve performance. - -### Customizing Settings - -- You can override default settings or define custom settings as per your project requirements. Ensure to follow Django's documentation and best practices when modifying settings to maintain application stability and security. - -Understanding and configuring `settings.py` correctly is essential for building and deploying Django applications effectively. It provides the foundational configuration needed to run your Django project in various environments, from development to production. \ No newline at end of file diff --git a/docs/Django/StaticFiles.md b/docs/Django/StaticFiles.md deleted file mode 100644 index 6ca5032d4..000000000 --- a/docs/Django/StaticFiles.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -id: static-files -title: Static Files -sidebar_label: Important of Static Files -sidebar_position: 10 -tags: [python,Django Introduction,Important of Static Files,Framework] -description: Important of Static Files. ---- - -Static files in Django refer to files like CSS, JavaScript, images, and other assets that are served directly to clients without any processing by Django’s backend. Handling static files efficiently is crucial for building responsive and visually appealing web applications. Here’s a comprehensive guide to working with static files in Django: - -### 1. **Configuring Static Files** - -1. **Directory Structure**: - - Create a directory named `static` in each Django app where you store static files specific to that app. - - Additionally, create a project-level `static` directory to store static files shared across multiple apps. - - ``` - project/ - ├── manage.py - ├── project/ - │ ├── settings.py - │ ├── urls.py - │ ├── wsgi.py - ├── myapp/ - │ ├── static/ - │ │ ├── myapp/ - │ │ │ ├── css/ - │ │ │ │ └── style.css - │ │ │ ├── js/ - │ │ │ ├── img/ - │ │ ├── other_app_static/ - │ │ │ └── ... - ├── static/ - │ ├── admin/ - │ │ └── ... - │ ├── css/ - │ ├── js/ - │ ├── img/ - │ └── ... - ``` - -2. **Configuring Settings**: - - Define the `STATIC_URL` and `STATICFILES_DIRS` settings in `settings.py`. - - ```python title="settings.py" - STATIC_URL = '/static/' - - STATICFILES_DIRS = [ - os.path.join(BASE_DIR, 'static'), - ] - ``` - - - `STATIC_URL`: URL prefix for serving static files during development (`/static/` by default). - - `STATICFILES_DIRS`: List of directories where Django looks for static files. - -3. **Collecting Static Files for Deployment**: - - In production, run `collectstatic` to gather all static files from individual apps and the project’s `static` directory into a single location (`STATIC_ROOT`). - - ```bash - python manage.py collectstatic - ``` - - - `STATIC_ROOT`: Directory where `collectstatic` collects static files for deployment. - - ```python title="settings.py" - STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') - ``` - -### 2. **Using Static Files in Templates** - -1. **Load Static Files**: - - Load static files in templates using the `{% static %}` template tag. - - ```html title="template.html" - - - - - My Page - - - - Logo - - - - ``` - - - `{% static 'path/to/static/file' %}`: Generates the URL for the static file based on `STATIC_URL`. - -### 3. **Using Static Files in Views** - -1. **Accessing Static Files in Views**: - - In views or any Python code, use `django.templatetags.static.static()` to generate URLs for static files. - - ```python - from django.templatetags.static import static - - def my_view(request): - css_url = static('css/style.css') - js_url = static('js/script.js') - # Use URLs as needed - ... - ``` - -### 4. **Static Files in Development vs. Production** - -1. **Development**: - - Django serves static files automatically from the `STATICFILES_DIRS` during development when `DEBUG=True`. - -2. **Production**: - - In production, serve static files using a web server like Nginx or Apache for better performance. - - Set up `STATIC_ROOT` and run `collectstatic` to gather all static files into a single directory for deployment. - -### 5. **Static File Caching and Compression** - -1. **Caching**: - - Use cache headers (`Cache-Control`, `Expires`) to control caching behavior for static files in production. - - ```python title="settings.py" - STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' - ``` - -2. **Compression**: - - Django supports automatic compression of static files (CSS, JavaScript) using tools like `django-compressor` or `whitenoise` for serving compressed files efficiently. - -### Summary - -Handling static files in Django involves configuring settings, organizing directories, using template tags, and managing static files across development and production environments. Proper management ensures efficient delivery of assets and enhances the performance and aesthetics of Django applications. diff --git a/docs/Django/Template.md b/docs/Django/Template.md deleted file mode 100644 index c85991b5c..000000000 --- a/docs/Django/Template.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -id: template-in-django -title: Template In Django -sidebar_label: Template In Django -sidebar_position: 4 -tags: [python,Django Introduction,Template In Django,Framework] -description: Template In Django. ---- - -In Django, templates are used to generate dynamic HTML content by combining static HTML with Django Template Language (DTL) syntax. Templates provide a way to separate the design (HTML structure) from the logic (Python code in views) of your web application. Here’s a comprehensive overview of templates in Django: - -### 1. **Template Structure** - -Django templates are HTML files that can include special syntax and tags provided by DTL. They are typically stored in the `templates` directory within each Django app or in a project-level `templates` directory. - -Example template (`product_list.html`): - -```html - - - - - Product List - - -

Products

-
    - {% for product in products %} -
  • {{ product.name }} - ${{ product.price }}
  • - {% endfor %} -
- - -``` - -### 2. **Django Template Language (DTL)** - -DTL is a lightweight template language provided by Django for rendering templates dynamically. It includes variables, tags, and filters that allow you to manipulate and display data from views. - -- **Variables**: Enclosed in double curly braces (`{{ variable }}`), used to output values passed from views to templates. - - ```html -

Welcome, {{ user.username }}!

- ``` - -- **Tags**: Enclosed in curly braces with percent signs (`{% tag %}`), control the logic flow and processing within templates (e.g., `for` loops, `if` statements). - - ```html - {% for product in products %} -
  • {{ product.name }} - ${{ product.price }}
  • - {% endfor %} - ``` - -- **Filters**: Modify the output of variables before they are displayed (e.g., date formatting, string manipulation). - - ```html - {{ product.created_at | date:'F j, Y' }} - ``` - -### 3. **Template Inheritance** - -Django supports template inheritance, allowing you to create base templates that define the common structure and layout of your pages. Child templates can then override specific blocks or extend the base template. - -- **Base Template (`base.html`)**: - - ```html - - - - - {% block title %}My Site{% endblock %} - - -
    -

    {% block header %}Welcome to My Site{% endblock %}

    -
    -
    - {% block content %} - {% endblock %} -
    -
    - © {{ year }} My Site -
    - - - ``` - -- **Child Template**: - - ```html - {% extends 'base.html' %} - - {% block title %}Product List{% endblock %} - - {% block content %} -

    Products

    -
      - {% for product in products %} -
    • {{ product.name }} - ${{ product.price }}
    • - {% endfor %} -
    - {% endblock %} - ``` - -### 4. **Including Templates** - -You can include one template within another using the `{% include %}` tag, allowing you to reuse common HTML snippets across multiple templates. - -```html -{% include 'includes/header.html' %} -

    Content goes here

    -{% include 'includes/footer.html' %} -``` - -### 5. **Static Files** - -Templates can reference static files (CSS, JavaScript, images) using the `{% static %}` tag, which generates the URL to the static file as defined in your `STATIC_URL` setting. - -```html - -``` - -### 6. **Template Loading** - -Django automatically searches for templates within each app’s `templates` directory and the project-level `templates` directory. You can customize template loading by configuring the `TEMPLATES` setting in your Django project settings. - -### 7. **Testing Templates** - -Django provides testing tools to ensure templates render correctly and display expected content. Tests can verify the presence of specific HTML elements or content in rendered templates. - -Templates in Django play a crucial role in separating presentation logic from application logic, promoting code reusability, and enhancing maintainability. Understanding how to structure and utilize templates effectively is essential for building scalable and responsive web applications with Django. \ No newline at end of file diff --git a/docs/Django/UrlDispatcher.md b/docs/Django/UrlDispatcher.md deleted file mode 100644 index 70de62bbc..000000000 --- a/docs/Django/UrlDispatcher.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -id: url-dispatcher-introduction -title: Django URL Dispatcher -sidebar_label: Django URL Dispatcher -sidebar_position: 5 -tags: [python,Django Introduction,Django URL Dispatcher,Framework] -description: Django URL Dispatcher. ---- - -In Django, the URL dispatcher is a core component that maps URL patterns to views. It determines which view function or class-based view should handle an incoming HTTP request based on the requested URL. Here's a detailed explanation of how the URL dispatcher works and how you can configure it: - -### 1. **URL Patterns** - -URL patterns are defined in Django using regular expressions (regex) or simple strings to match specific URL patterns. These patterns are typically configured in the `urls.py` files within your Django apps or project. - -#### Example of `urls.py` in an App: - -```python title="urls.py" -from django.urls import path -from . import views - -urlpatterns = [ - path('', views.index, name='index'), - path('about/', views.about, name='about'), - path('products//', views.product_detail, name='product_detail'), -] -``` - -- **`path()` Function**: Defines a URL pattern along with the corresponding view function (`views.index`, `views.about`, etc.) that will handle the request. -- **Named URL Patterns**: Each URL pattern can have a name (`name='index'`, `name='about'`, etc.), which allows you to refer to them in templates or in other parts of your code without hardcoding URLs. - -### 2. **Regular Expressions in URL Patterns** - -You can use regular expressions to capture dynamic parts of URLs, such as numeric IDs or slugs, and pass them as parameters to your view functions. - -```python -from django.urls import path -from . import views - -urlpatterns = [ - path('products//', views.product_detail, name='product_detail'), - path('blog//', views.blog_post_detail, name='blog_post_detail'), -] -``` - -- **``**: Matches a numeric integer (`product_id`) and passes it as an argument to the `product_detail` view. -- **``**: Matches a slug (typically a URL-friendly string) and passes it as an argument to the `blog_post_detail` view. - -### 3. **Include() Function** - -The `include()` function allows you to modularize your URL configuration by including patterns from other `urls.py` modules. This helps organize your URL patterns into smaller, manageable units. - -#### Example of Including URLs: - -```python -from django.urls import path, include - -urlpatterns = [ - path('admin/', admin.site.urls), - path('accounts/', include('accounts.urls')), # Include URLs from 'accounts' app - path('products/', include('products.urls')), # Include URLs from 'products' app -] -``` - -### 4. **Namespace** - -You can define a namespace for your URL patterns using the `namespace` parameter in the `include()` function or in the app's `urls.py`. This helps differentiate URL patterns from different apps that might have the same URL names. - -#### Example of Namespace: - -```python title="accounts/urls.py" -from django.urls import path -from . import views - -app_name = 'accounts' -urlpatterns = [ - path('login/', views.login, name='login'), - path('logout/', views.logout, name='logout'), -] - -# project/urls.py -from django.urls import path, include - -urlpatterns = [ - path('accounts/', include('accounts.urls', namespace='accounts')), -] -``` - -### 5. **URL Reverse** - -Django provides a `reverse()` function and `{% url %}` template tag to generate URLs based on their name and optional parameters defined in your URL configuration. This avoids hardcoding URLs in your codebase and makes it easier to update URL patterns later. - -#### Example of URL Reverse in Views: - -```python -from django.shortcuts import reverse, redirect - -def redirect_to_index(request): - return redirect(reverse('index')) -``` - -#### Example of URL Reverse in Templates: - -```html -
    Home -``` - -### 6. **Testing URLs** - -Django provides testing utilities to verify that URL patterns resolve correctly to the expected views. This ensures that all defined URLs in your application are correctly configured and accessible. - -### 7. **Middleware** - -URL patterns are processed by Django's middleware framework, which intercepts incoming requests and determines which view should handle them based on the configured URL patterns. - -Understanding and effectively using the URL dispatcher in Django is crucial for designing clean and maintainable URL structures in your web applications. It helps organize your codebase, facilitate URL navigation, and promote code reuse through modularization. diff --git a/docs/Django/Views.md b/docs/Django/Views.md deleted file mode 100644 index 6aa6f4755..000000000 --- a/docs/Django/Views.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -id: views-in-django -title: Views In Django -sidebar_label: Views In Django -sidebar_position: 3 -tags: [python,Django Introduction, Views In Django,Framework] -description: Views In Django. ---- - -In Django, views are Python functions or classes that receive web requests and return web responses. They contain the logic that processes the user's request, retrieves data from the database using models, and renders HTML content using templates. Here's a comprehensive explanation of views in Django: - -### 1. **Function-Based Views** - -Function-based views are defined as Python functions that accept an `HttpRequest` object as the first argument and return an `HttpResponse` object or a subclass of `HttpResponse`. - -```python -from django.shortcuts import render -from django.http import HttpResponse -from .models import Product - -def product_list(request): - products = Product.objects.all() - context = {'products': products} - return render(request, 'products/product_list.html', context) -``` - -- **HttpRequest**: Represents an incoming HTTP request from the user's browser. It contains metadata about the request (e.g., headers, method, user session). -- **HttpResponse**: Represents the HTTP response that will be sent back to the user's browser. It typically contains rendered HTML content or redirects. - -### 2. **Class-Based Views (CBVs)** - -Class-based views are Django classes that inherit from Django's `View` class or one of its subclasses. They provide an object-oriented way to organize view code and encapsulate related behavior into reusable components. - -```python -from django.views import View -from django.shortcuts import render -from .models import Product - -class ProductListView(View): - def get(self, request): - products = Product.objects.all() - context = {'products': products} - return render(request, 'products/product_list.html', context) -``` - -- **HTTP Methods**: Class-based views define methods (`get`, `post`, `put`, `delete`, etc.) corresponding to HTTP methods. The appropriate method is called based on the type of request received. - -### 3. **Rendering Templates** - -Views typically render HTML templates to generate dynamic content that is sent back to the user's browser. The `render` function is commonly used to render templates with context data. - -```python -from django.shortcuts import render - -def product_list(request): - products = Product.objects.all() - context = {'products': products} - return render(request, 'products/product_list.html', context) -``` - -- **Context**: Data passed to the template for rendering. It can include objects retrieved from the database, form data, or any other information needed to generate the HTML content. - -### 4. **Handling Forms and Data** - -Views are responsible for processing form submissions, validating input, and saving data to the database. Django provides form handling mechanisms (`forms.ModelForm`, `forms.Form`) that integrate seamlessly with views. - -```python -from django.shortcuts import render, redirect -from .forms import ProductForm - -def add_product(request): - if request.method == 'POST': - form = ProductForm(request.POST) - if form.is_valid(): - form.save() - return redirect('product_list') - else: - form = ProductForm() - - return render(request, 'products/add_product.html', {'form': form}) -``` - -- **Redirects**: After processing a request (e.g., form submission), views often redirect users to another URL or view to prevent resubmission of form data and maintain clean URL patterns. - -### 5. **Context Data** - -Views can pass data to templates using context dictionaries. This data is used to dynamically generate HTML content based on the current state of the application or user input. - -```python -def product_detail(request, product_id): - product = Product.objects.get(id=product_id) - context = {'product': product} - return render(request, 'products/product_detail.html', context) -``` - -- **Dynamic URLs**: Views can accept parameters from the URL (e.g., `product_id` in the example above) to fetch specific data from the database and render it in the template. - -### 6. **Middleware and Decorators** - -Views can be enhanced with middleware (functions that run before or after a view is executed) and decorators (functions that modify the behavior of views). These mechanisms provide additional functionality such as authentication, caching, or logging. - -```python -from django.contrib.auth.decorators import login_required -from django.utils.decorators import method_decorator - -@method_decorator(login_required, name='dispatch') -class MyProtectedView(View): - def get(self, request): - return HttpResponse('This is a protected view.') -``` - -- **Authentication**: Django provides built-in decorators like `login_required` to restrict access to views based on user authentication status. - -### 7. **Testing Views** - -Django includes testing tools (`unittest` or `pytest` frameworks) for writing and executing tests that verify the behavior of views. Tests can simulate HTTP requests and verify the correctness of view responses. - -Views in Django play a central role in handling user interactions, processing data, and generating HTML content. Understanding how to create and organize views effectively is essential for building robust and maintainable web applications with Django. \ No newline at end of file diff --git a/docs/Django/_category_.json b/docs/Django/_category_.json deleted file mode 100644 index 65887a6f4..000000000 --- a/docs/Django/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Django", - "position": 7, - "link": { - "type": "generated-index", - "description": "Django is a high-level Python web framework that allows developers to create robust web applications quickly." - } -} \ No newline at end of file diff --git a/docs/Flask/01-Introduction.md b/docs/Flask/01-Introduction.md deleted file mode 100644 index 94558b420..000000000 --- a/docs/Flask/01-Introduction.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: introduction-to-flask -title: Introduction to Flask -sidebar_label: Introduction to Flask -sidebar_position: 1 -tags: [flask, python, web development] -description: In this tutorial, you will learn about Flask, a lightweight WSGI web application framework written in Python. ---- - -Flask is a lightweight WSGI web application framework written in Python. It is widely used for building web applications and APIs due to its simplicity and flexibility. Flask is designed to make getting started quick and easy, with the ability to scale up to complex applications. This tutorial will guide you through the basics of Flask, helping you get started with building web applications. - -### Key Features of Flask - -1. **Lightweight and Modular:** Flask is easy to set up and use, providing the essentials for web development while allowing you to add extensions as needed. - -2. **Flexible:** Flask provides a simple interface for routing, templating, and handling requests, giving you the flexibility to customize your application. - -3. **Extensible:** Flask supports a wide range of extensions for database integration, form handling, authentication, and more. - - -### Conclusion - -Flask is a powerful and flexible framework for building web applications and APIs. Its simplicity and ease of use make it a popular choice among developers. Understanding the basics of Flask is the first step towards creating robust and scalable web applications. \ No newline at end of file diff --git a/docs/Flask/02-Installing.md b/docs/Flask/02-Installing.md deleted file mode 100644 index 90e6de48a..000000000 --- a/docs/Flask/02-Installing.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -id: installing-flask -title: Installing Flask -sidebar_label: Installing Flask -sidebar_position: 2 -tags: [flask, python, installation] -description: In this tutorial, you will learn how to install Flask, a lightweight WSGI web application framework written in Python. ---- - -To start using Flask, you need to install it on your system. Flask can be installed using Python's package manager, pip. - -### Prerequisites -**Python:** Ensure you have Python installed on your system. You can download it from the official website. - -### Installing Flask -1. **Using pip:** -Open your terminal or command prompt and run the following command: -``` -pip install Flask -``` -2. **Verifying Installation:** -To verify that Flask is installed correctly, you can run: -``` -python -m flask --version -``` - -### Conclusion - -Installing Flask is a straightforward process using pip. Once installed, you can start building your web applications and exploring the various features and functionalities that Flask offers. \ No newline at end of file diff --git a/docs/Flask/03-SettingUp-newProject.md b/docs/Flask/03-SettingUp-newProject.md deleted file mode 100644 index 80884bad8..000000000 --- a/docs/Flask/03-SettingUp-newProject.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: setting-up-a-new-flask-project -title: Setting up a New Flask Project -sidebar_label: Setting up a New Flask Project -sidebar_position: 3 -tags: [flask, python, project setup] -description: In this tutorial, you will learn how to set up a new Flask project. ---- - -Setting up a new Flask project involves creating a basic project structure and initializing the Flask application. - -### Project Structure - -1. **Create a Project Directory:** -mkdir my_flask_app -cd my_flask_app - -2. **Create a Virtual Environment:** -python -m venv venv -source venv/bin/activate # On Windows, use `venv\Scripts\activate` - -3. **Install Flask:** -pip install Flask - -### Initializing the Flask Application - -**Create `app.py`:** -```python -from flask import Flask - -app = Flask(__name__) - -@app.route('/') -def home(): - return "Hello, Flask!" - -if __name__ == '__main__': - app.run(debug=True) -``` - -### Conclusion - -Flask is a powerful and flexible framework for building web applications and APIs. Its simplicity and ease of use make it a popular choice among developers. Understanding the basics of Flask is the first step towards creating robust and scalable web applications. \ No newline at end of file diff --git a/docs/Flask/04-Routing.md b/docs/Flask/04-Routing.md deleted file mode 100644 index e453bb628..000000000 --- a/docs/Flask/04-Routing.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: flask-routing-and-request-handling -title: Flask Routing and Request Handling -sidebar_label: Flask Routing and Request Handling -sidebar_position: 4 -tags: [flask, python, routing, request handling] -description: In this tutorial, you will learn about routing and request handling in Flask. ---- - -Routing in Flask is used to map URLs to functions (views). Each view function is responsible for handling requests to a specific URL. - -### Defining Routes -Routes are defined using the `@app.route` decorator. Here's a simple example: -```python -from flask import Flask - -app = Flask(__name__) - -@app.route('/') -def home(): - return "Hello, Flask!" - -@app.route('/about') -def about(): - return "About Page" - -if __name__ == '__main__': - app.run(debug=True) -``` - -### Handling Requests -Flask provides support for handling different types of HTTP requests. By default, routes handle `GET` requests, but you can specify other methods like `POST`, `PUT`, `DELETE`, etc. -```python -from flask import Flask, request - -app = Flask(__name__) - -@app.route('/submit', methods=['POST']) -def submit(): - data = request.form['data'] - return f"Received: {data}" - -if __name__ == '__main__': - app.run(debug=True) -``` - -### Conclusion - -Understanding routing and request handling in Flask is crucial for creating dynamic web applications. By defining routes and handling different types of requests, you can build responsive and interactive web applications. - diff --git a/docs/Flask/05-Templates.md b/docs/Flask/05-Templates.md deleted file mode 100644 index f18b37971..000000000 --- a/docs/Flask/05-Templates.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: using-templates-with-jinja2 -title: Using Templates with Jinja2 -sidebar_label: Using Templates with Jinja2 -sidebar_position: 5 -tags: [flask, python, templates, jinja2] -description: In this tutorial, you will learn about using templates with Jinja2 in Flask. ---- - -Flask uses the Jinja2 templating engine to render HTML templates. This allows you to create dynamic web pages by embedding Python code within HTML. - -### Creating a Template -1. **Create a Templates Directory:** -mkdir templates - -2. **Create `index.html`:** - -```html - - - - - Flask App - - -

    {{ title }}

    -

    {{ message }}

    - - -``` - -### Rendering the Template -**Update `app.py:`** -```python -from flask import Flask, render_template - -app = Flask(__name__) - -@app.route('/') -def home(): - return render_template('index.html', title="Welcome to Flask", message="This is a dynamic web page.") - -if __name__ == '__main__': - app.run(debug=True) -``` - -### Conclusion - -Using templates with Jinja2 in Flask allows you to create dynamic and reusable web pages. By rendering templates, you can pass data from your Flask application to the HTML templates, making your web application more interactive and efficient. - diff --git a/docs/Flask/06-HandlingForms.md b/docs/Flask/06-HandlingForms.md deleted file mode 100644 index fc14f036b..000000000 --- a/docs/Flask/06-HandlingForms.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -id: handling-forms-and-user-input -title: Handling Forms and User Input -sidebar_label: Handling Forms and User Input -sidebar_position: 6 -tags: [flask, python, forms, user input] -description: In this tutorial, you will learn how to handle forms and user input in Flask. ---- - -Flask is a lightweight WSGI web application framework written in Python. It is widely used for building web applications and APIs due to its simplicity and flexibility. Flask is designed to make getting started quick and easy, with the ability to scale up to complex applications. This tutorial will guide you through the basics of Flask, helping you get started with building web applications. - -### Handling forms and user input is a common requirement in web applications. Flask-WTF is an extension that integrates Flask with WTForms to provide form handling and validation. - -### Installing Flask-WTF -First, you need to install Flask-WTF: - -pip install Flask-WTF - -### Creating a Simple Form -1. **Create `forms.py`:** - -```python -from flask_wtf import FlaskForm -from wtforms import StringField, SubmitField -from wtforms.validators import DataRequired - -class MyForm(FlaskForm): - name = StringField('Name', validators=[DataRequired()]) - submit = SubmitField('Submit') -``` - -2. **Update `app.py`:** -```python -from flask import Flask, render_template, redirect, url_for -from forms import MyForm - -app = Flask(__name__) -app.config['SECRET_KEY'] = 'your_secret_key' - -@app.route('/', methods=['GET', 'POST']) -def index(): - form = MyForm() - if form.validate_on_submit(): - name = form.name.data - return redirect(url_for('success', name=name)) - return render_template('index.html', form=form) - -@app.route('/success/') -def success(name): - return f"Hello, {name}!" - -if __name__ == '__main__': - app.run(debug=True) -``` - -3. **Create `templates/index.html`:** -```html - - - - - Flask Form - - -
    - {{ form.hidden_tag() }} - {{ form.name.label }} {{ form.name }} - {{ form.submit }} -
    - - -``` - -### Conclusion - -Handling forms and user input in Flask is straightforward with Flask-WTF. This integration allows you to create forms, validate user input, and process form data efficiently. \ No newline at end of file diff --git a/docs/Flask/07-Database.md b/docs/Flask/07-Database.md deleted file mode 100644 index 7b651f5b3..000000000 --- a/docs/Flask/07-Database.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -id: working-with-databases -title: Working with Databases (SQLAlchemy) -sidebar_label: Working with Databases (SQLAlchemy) -sidebar_position: 7 -tags: [flask, python, databases, sqlalchemy] -description: In this tutorial, you will learn how to work with databases using SQLAlchemy in Flask. ---- - -Flask-SQLAlchemy is an extension that simplifies database interactions in Flask applications. It provides an ORM (Object Relational Mapper) for managing database records as Python objects. - -### Installing Flask-SQLAlchemy -First, install Flask-SQLAlchemy: -```sh -pip install Flask-SQLAlchemy -``` - -### Setting Up the Database -1. **Update `app.py:`** - -```python -from flask import Flask -from flask_sqlalchemy import SQLAlchemy - -app = Flask(__name__) -app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' -db = SQLAlchemy(app) - -class User(db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(150), nullable=False, unique=True) - - def __repr__(self): - return f"User('{self.username}')" - -@app.route('/') -def index(): - return "Welcome to Flask-SQLAlchemy" - -if __name__ == '__main__': - app.run(debug=True) -``` - -2. **Creating the Database:** -```python ->>> from app import db ->>> db.create_all() -``` - -### Performing CRUD Operations - -1. **Adding Records:** - -```python -from app import db, User -user1 = User(username='john_doe') -db.session.add(user1) -db.session.commit() -``` - -2. **Querying Records:** - -```python -users = User.query.all() -print(users) -``` - -### Conclusion - -Working with databases in Flask is made easy with Flask-SQLAlchemy. It provides an ORM to interact with the database using Python objects, allowing for efficient and organized database management. \ No newline at end of file diff --git a/docs/Flask/08-Blueprints.md b/docs/Flask/08-Blueprints.md deleted file mode 100644 index a62a1f467..000000000 --- a/docs/Flask/08-Blueprints.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -id: flask-blueprints-and-application-structure -title: Flask Blueprints and Application Structure -sidebar_label: Flask Blueprints and Application Structure -sidebar_position: 8 -tags: [flask, python, blueprints, application structure] -description: In this tutorial, you will learn about Flask Blueprints and how to structure your application. ---- - -Flask Blueprints allow you to organize your application into smaller, reusable components. This is especially useful for larger applications. - -### Setting Up Blueprints - -1. **Create a Blueprint:** - -```python -# myapp/blueprints/main.py -from flask import Blueprint, render_template - -main = Blueprint('main', __name__) - -@main.route('/') -def home(): - return render_template('index.html') -``` - -2. **Register the Blueprint:** - -```python -from flask import Flask -from blueprints.main import main - -app = Flask(__name__) -app.register_blueprint(main) - -if __name__ == '__main__': - app.run(debug=True) -``` - -### Project Structure - -myapp/ -├── app.py -├── blueprints/ -│ └── main.py -├── templates/ -│ └── index.html -└── static/ - -### Conclusion - -Using Flask Blueprints helps in organizing your application into modular components, making the application structure more manageable and reusable. diff --git a/docs/Flask/09-Error-and-Debugging.md b/docs/Flask/09-Error-and-Debugging.md deleted file mode 100644 index aab24ffcf..000000000 --- a/docs/Flask/09-Error-and-Debugging.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: error-handling-and-debugging -title: Error Handling and Debugging -sidebar_label: Error Handling and Debugging -sidebar_position: 9 -tags: [flask, python, error handling, debugging] -description: In this tutorial, you will learn about error handling and debugging in Flask. ---- - -Handling errors gracefully and debugging effectively are crucial for developing robust Flask applications. - -### Handling Errors -1. **Custom Error Pages:** - -```python -from flask import Flask, render_template - -app = Flask(__name__) - -@app.errorhandler(404) -def page_not_found(e): - return render_template('404.html'), 404 - -if __name__ == '__main__': - app.run(debug=True) -``` - -2. **Creating `404.html`:** - -```html - - - - - Page Not Found - - -

    404 - Page Not Found

    -

    The page you are looking for does not exist.

    - - -``` - -### Debugging -1. **Using the Debugger:** -Set debug=True in your app.run() to enable the debugger: - -```python -if __name__ == '__main__': - app.run(debug=True) -``` - -2. **Logging Errors:** -```python -import logging -from logging.handlers import RotatingFileHandler - -if not app.debug: - handler = RotatingFileHandler('error.log', maxBytes=10000, backupCount=1) - handler.setLevel(logging.ERROR) - app.logger.addHandler(handler) -``` - -### Conclusion - -Flask is a powerful and flexible framework for building web applications and APIs. Its simplicity and ease of use make it a popular choice among developers. Understanding the basics of Flask is the first step towards creating robust and scalable web applications. \ No newline at end of file diff --git a/docs/Flask/10.Deployment.md b/docs/Flask/10.Deployment.md deleted file mode 100644 index 67ddbd749..000000000 --- a/docs/Flask/10.Deployment.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -id: deployment-options-and-best-practices -title: Deployment Options and Best Practices -sidebar_label: Deployment Options and Best Practices -sidebar_position: 10 -tags: [flask, python, deployment, best practices] -description: In this tutorial, you will learn about deployment options and best practices for Flask applications. ---- - -Deploying Flask applications to production requires careful planning and following best practices to ensure reliability and scalability. - - -### Deployment Options -1. **Using WSGI Servers:** - -- **Gunicorn:** -Gunicorn is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model, which means it forks multiple worker processes to handle requests. -```sh -pip install gunicorn -gunicorn -w 4 app:app -``` - -- **uWSGI:** -uWSGI is a versatile WSGI server with lots of features. It is capable of serving Python web applications through the WSGI interface. -```sh -pip install uwsgi -uwsgi --http :5000 --wsgi-file app.py --callable app -``` - -2. **Platform as a Service (PaaS):** - -- **Heroku:** -Heroku is a cloud platform that lets companies build, deliver, monitor, and scale apps. It's the fastest way to go from idea to URL, bypassing all those infrastructure headaches. -```sh -heroku create -git push heroku main -heroku open -``` - -3. **Containerization:** - -- **Docker:** -Docker is a tool designed to make it easier to create, deploy, and run applications by using containers. Containers allow a developer to package up an application with all parts it needs, such as libraries and other dependencies, and ship it all out as one package. - -```dockerfile -FROM python:3.8-slim -WORKDIR /app -COPY . /app -RUN pip install -r requirements.txt -CMD ["gunicorn", "-w", "4", "app:app"] -``` - -### Best Practices -1. **Use Environment Variables:** -Store configuration and secrets in environment variables rather than hardcoding them in your code. - -```python -import os -SECRET_KEY = os.getenv('SECRET_KEY', 'default_secret_key') -``` - -2. **Enable Logging:** -Proper logging is essential for monitoring and troubleshooting your application. - -```python -import logging -from logging.handlers import RotatingFileHandler - -if not app.debug: - handler = RotatingFileHandler('error.log', maxBytes=10000, backupCount=1) - handler.setLevel(logging.ERROR) - app.logger.addHandler(handler) -``` - -3. **Use a Reverse Proxy:** -Use a reverse proxy server (e.g., Nginx) in front of your Flask application to handle client requests and serve static files efficiently. - -``` -server { - listen 80; - server_name example.com; - - location / { - proxy_pass http://127.0.0.1:8000; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } -} -``` -4. **Automate Deployments:** -Use CI/CD pipelines to automate the deployment process, ensuring consistency and reducing the potential for human error. - -5. **Security Considerations:** - -- Always use HTTPS to encrypt data between the client and server. -- Regularly update your dependencies to patch security vulnerabilities. -- Implement proper input validation and sanitization to prevent common attacks like SQL injection and XSS. - -### Conclusion - -Deploying Flask applications requires careful consideration of various deployment options and best practices. By using WSGI servers, PaaS platforms, or containerization, and following best practices such as using environment variables, enabling logging, using a reverse proxy, automating deployments, and prioritizing security, you can ensure your Flask application is robust, scalable, and secure. \ No newline at end of file diff --git a/docs/Flask/11-Flask app on Heroku.md b/docs/Flask/11-Flask app on Heroku.md deleted file mode 100644 index 930016f58..000000000 --- a/docs/Flask/11-Flask app on Heroku.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: Deploy Python Flask App on Heroku -title: how to deploy a flask app on Heroku -sidebar_label: Flask App on Heroku -sidebar_position: 11 -tags: [flask, python, heroku ] -description: In this tutorial, you will learn about deployment offlask app on Heroku. ---- - - Flask is based on the Werkzeug WSGI toolkit and Jinja2 template engine. Both are Pocco projects. This article revolves around how to deploy a flask app on Heroku. To demonstrate this, we are first going to create a sample application for a better understanding of the process. - -The Prerequisites are- -1.Python -2.pip -3.Heroku CLI -4.Git - -### Deploying Flask App on Heroku - -Let’s create a simple flask application first and then it can be deployed to heroku. Create a folder named “eflask” and open the command line and cd inside the “eflask” directory. Follow the following steps to create the sample application for this tutorial. - - # STEP 1 : - Create a virtual environment with pipenv and install Flask and Gunicorn . - - # STEP 2 : - Create a “Procfile” and write the following code. - - # STEP 3 : - Create “runtime.txt” and write the following code. - - # STEP 4 : - Create a folder named “app” and enter the folder - - # STEP 5 : - Create a python file, “main.py” and enter the sample code. - - # STEP 6 : - Get back to the previous directory “eflask”.Create a file“wsgi.py” and insert the following code. - - # STEP 7 : - Run the virtual environment. - -# STEP 8 : - Initialize an empty repo, add the files in the repo and commit all the changes. - -# STEP 9 : -Login to heroku CLI - -# STEP 10 : -Push your code from local to the heroku remote. diff --git a/docs/Flask/_category_.json b/docs/Flask/_category_.json deleted file mode 100644 index da6dd51c5..000000000 --- a/docs/Flask/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Flask", - "position": 29, - "link": { - "type": "generated-index", - "description": " In this tutorial, you'll learn about Flask, a lightweight and flexible web application framework in Python, and understand its core concepts and features." - } -} \ No newline at end of file diff --git a/docs/Flutter/_category_.json b/docs/Flutter/_category_.json deleted file mode 100644 index 76e372b33..000000000 --- a/docs/Flutter/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Flutter", - "position": 9, - "link": { - "type": "generated-index", - "description": "Flutter is an open-source UI framework developed by Google for building natively compiled applications for mobile, web, and desktop using a single codebase." - } -} \ No newline at end of file diff --git a/docs/Flutter/flutter-architecture.md b/docs/Flutter/flutter-architecture.md deleted file mode 100644 index 7909af7d3..000000000 --- a/docs/Flutter/flutter-architecture.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: flutter-architecture -title: Flutter Architecture -sidebar_label: Flutter Architecture -sidebar_position: 3 -tags: [introduction, Flutter, App development] -description: Flutter Architecture ---- - -In this chapter, we will discuss the architecture of the Flutter framework. - -Widgets -The core concept of Flutter is that everything is a widget. Widgets are the building blocks of the user interface in Flutter. - -In Flutter, the application itself is a widget. The application is the top-level widget and its UI is created using one or more children widgets. This composability feature allows us to create user interfaces of any complexity. - -For example, the widget hierarchy of the hello world application (created in the previous chapter) is as follows: - -- MyApp is the user-created widget, built using the Flutter native widget, MaterialApp. -- MaterialApp has a home property that specifies the user interface of the home page, which is another user-created widget, MyHomePage. -- MyHomePage is built using another Flutter native widget, Scaffold. -- Scaffold has two properties - body and appBar. -- The body property is used to specify the main user interface, and the appBar property is used to specify the header user interface. -- The header UI is built using the Flutter native widget, AppBar, and the body UI is built using the Center widget. -- The Center widget has a child property that refers to the actual content, which is built using the Text widget. - -Gestures -Flutter widgets support interaction through the GestureDetector widget. GestureDetector is an invisible widget that can capture user interactions such as tapping and dragging. Many native widgets in Flutter support interaction through the use of GestureDetector. We can also add interactive features to existing widgets by composing them with the GestureDetector widget. We will cover gestures in more detail in upcoming chapters. - -State Concept -Flutter widgets support state maintenance through the use of the StatefulWidget widget. Widgets need to be derived from the StatefulWidget widget to support state maintenance, and all other widgets should be derived from StatefulWidget. Flutter widgets are reactive, similar to ReactJS, and the StatefulWidget will be automatically re-rendered whenever its internal state changes. The re-rendering process is optimized by only rendering the necessary changes between the old and new widget UI. - -Layers -The most important concept in the Flutter framework is that it is organized into layers of decreasing complexity. Each layer is built using the layer immediately below it. The topmost layer is specific to Android and iOS, followed by the Flutter native widgets layer. The next layer is the Rendering layer, which is a low-level renderer component that renders everything in the Flutter app. These layers go down to the core platform-specific code. - -Here is a general overview of the layers in Flutter: - -- Flutter follows a widget-based architecture, where complex widgets are composed of existing widgets. -- Interactive features can be added using the GestureDetector widget. -- State can be maintained using the StatefulWidget widget. -- Flutter offers a layered design approach, allowing different layers to be programmed based on the complexity of the task. - -We will discuss these concepts in more detail in the upcoming chapters. diff --git a/docs/Flutter/flutter-installation.md b/docs/Flutter/flutter-installation.md deleted file mode 100644 index 35c0d60d0..000000000 --- a/docs/Flutter/flutter-installation.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: flutter-installation -title: Flutter Installation -sidebar_label: Flutter Installation -sidebar_position: 2 -tags: [introduction,Flutter,App development] -description: Flutter Installation ---- - -This chapter provides a detailed guide on how to install Flutter on your local computer. - -## Installation in Windows - -To install Flutter SDK and its requirements on a Windows system, follow these steps: - -1. Go to [https://flutter.dev/docs/get-started/install/windows](https://flutter.dev/docs/get-started/install/windows) and download the latest Flutter SDK (version 1.2.1 as of April 2019) from the provided URL. - -2. Unzip the downloaded zip archive into a folder, for example, `C:\flutter\`. - -3. Update the system path to include the Flutter bin directory. - -4. Run the command `flutter doctor` to check if all the requirements for Flutter development are met. The command will analyze the system and provide a report. - -5. If the report shows any issues, such as a missing Android SDK or Android Studio, follow the instructions to install the required components. - -6. Connect an Android device through USB or start an Android emulator to resolve the "No devices available" issue. - -7. Install the latest Android SDK and Android Studio if reported by `flutter doctor`. - -8. Install the Flutter and Dart plugin for Android Studio by following these steps: - - Open Android Studio. - - Click on File → Settings → Plugins. - - Select the Flutter plugin and click Install. - - Click Yes when prompted to install the Dart plugin. - - Restart Android Studio. - -## Installation in MacOS - -To install Flutter on MacOS, follow these steps: - -1. Go to [https://flutter.dev/docs/get-started/install/macos](https://flutter.dev/docs/get-started/install/macos) and download the latest Flutter SDK (version 1.2.1 as of April 2019) from the provided URL. - -2. Unzip the downloaded zip archive into a folder, for example, `/path/to/flutter`. - -3. Update the system path to include the Flutter bin directory by adding the following line to the `~/.bashrc` file: - ``` - export PATH="$PATH:/path/to/flutter/bin" - ``` - -4. Enable the updated path in the current session by running the following commands: - ``` - source ~/.bashrc - source $HOME/.bash_profile - echo $PATH - ``` - -5. Run the command `flutter doctor` to check if all the requirements for Flutter development are met. - -6. If the report shows any issues, such as a missing XCode or Android SDK, follow the instructions to install the required components. - -7. Start an Android emulator or connect a real Android device to the system for Android application development. - -8. Open the iOS simulator or connect a real iPhone device to the system for iOS application development. - -9. Install the Flutter and Dart plugin for Android Studio by following these steps: - - Open Android Studio. - - Click on Preferences → Plugins. - - Select the Flutter plugin and click Install. - - Click Yes when prompted to install the Dart plugin. - - Restart Android Studio. - diff --git a/docs/Flutter/flutter-introduction.md b/docs/Flutter/flutter-introduction.md deleted file mode 100644 index 91b226ed3..000000000 --- a/docs/Flutter/flutter-introduction.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: flutter-introduction -title: Flutter Introduction -sidebar_label: Flutter Introduction -sidebar_position: 1 -tags: [introduction,Flutter,App development] -description: Flutter Introduction ---- - - -![Flutter introduction](image.png) - - -Flutter is an open-source UI software development kit created by Google. It allows developers to build beautiful and fast native applications for mobile, web, and desktop platforms using a single codebase. With Flutter, you can write code once and deploy it on multiple platforms, saving time and effort. - -One of the key features of Flutter is its use of a reactive framework, which enables developers to create highly responsive and interactive user interfaces. Flutter uses a widget-based architecture, where everything is a widget, from buttons and text fields to entire screens. This makes it easy to build complex UI layouts and customize the look and feel of your app. - -Flutter also comes with a rich set of pre-designed widgets, called the Flutter Material Design and Cupertino libraries, which provide a consistent and native-like experience across different platforms. These widgets are highly customizable and can be easily styled to match your app's branding. - -Another advantage of Flutter is its performance. Flutter apps are compiled to native code, which allows them to run directly on the device's hardware, resulting in fast and smooth animations and transitions. Additionally, Flutter uses a hot reload feature, which allows developers to see the changes they make to the code in real-time, without having to restart the app. - -Flutter has a strong and active community, with a wide range of packages and plugins available through its package manager, called Pub. These packages provide additional functionality and can be easily integrated into your app, saving development time. - -In conclusion, Flutter is a powerful and versatile framework for building cross-platform applications. Its reactive framework, extensive widget library, performance optimizations, and active community make it a popular choice among developers. Whether you are a beginner or an experienced developer, Flutter provides the tools and resources you need to create stunning and high-performing apps. - - - -## Advantages of Flutter - -1. **Single Codebase**: Flutter allows developers to write code once and deploy it on multiple platforms, including mobile, web, and desktop. This significantly reduces development time and effort. - -2. **Fast Development**: Flutter's hot reload feature enables developers to see the changes they make to the code in real-time, without having to restart the app. This speeds up the development process and enhances productivity. - -3. **Reactive Framework**: Flutter uses a reactive framework, which enables developers to create highly responsive and interactive user interfaces. This ensures a smooth and engaging user experience. - -4. **Rich Widget Library**: Flutter comes with a rich set of pre-designed widgets, such as the Flutter Material Design and Cupertino libraries. These widgets provide a consistent and native-like experience across different platforms and can be easily customized to match your app's branding. - -5. **Performance Optimization**: Flutter apps are compiled to native code, allowing them to run directly on the device's hardware. This results in fast and smooth animations and transitions, providing a high-performance user experience. - -6. **Active Community**: Flutter has a strong and active community, with a wide range of packages and plugins available through its package manager, Pub. These packages provide additional functionality and can be easily integrated into your app, saving development time. - -## Disadvantages of Flutter - -1. **Learning Curve**: Flutter has its own programming language called Dart, which developers need to learn in order to build Flutter apps. This may require some initial time and effort to become proficient in Dart. - -2. **Limited Native Functionality**: Although Flutter provides a rich set of pre-designed widgets, there may be cases where you need to access native platform features that are not readily available in Flutter. In such cases, you may need to write platform-specific code or use third-party plugins. - -3. **App Size**: Flutter apps tend to have a larger file size compared to native apps, as they include the Flutter engine and framework. This may result in longer download and installation times for users. - -## Applications of Flutter - -1. **Mobile App Development**: Flutter is widely used for developing mobile applications for both Android and iOS platforms. Its ability to create a single codebase that runs on multiple platforms makes it a popular choice for mobile app development. - -2. **Web Development**: Flutter can also be used for building web applications. With the introduction of Flutter for web, developers can leverage their existing Flutter knowledge to create responsive and visually appealing web interfaces. - -3. **Desktop App Development**: Flutter's support for desktop platforms, such as Windows, macOS, and Linux, allows developers to build cross-platform desktop applications using Flutter's single codebase approach. - -4. **UI Prototyping**: Flutter's hot reload feature and extensive widget library make it an excellent choice for rapid prototyping of user interfaces. It allows designers and developers to quickly iterate and experiment with different UI designs. - -5. **Game Development**: Flutter's performance optimizations and support for animations make it suitable for developing simple games and interactive experiences. - -In summary, Flutter offers advantages such as a single codebase, fast development, reactive framework, rich widget library, performance optimization, and an active community. However, it also has disadvantages like a learning curve, limited native functionality, and larger app size. Flutter finds applications in mobile app development, web development, desktop app development, UI prototyping, and game development. \ No newline at end of file diff --git a/docs/Flutter/image.png b/docs/Flutter/image.png deleted file mode 100644 index 9e2423e8dfbdce5c444e5fd7d9025a7c6f0dc62f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43675 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 Y{r@hYVekVDS>TDRl%iz0xPkxw0{~B The default branch used to be master, but it is now called main. There is nothing special about main, it is just a convention. - -## Creating a New Branch - -To create a new branch, you can use the following command: - -```bash -git branch -git branch bug-fix -git switch bug-fix -git log -git switch master -git switch -c dark-mode -git checkout orange-mode -``` - -Some points to note: - -- `git branch` - This command lists all the branches in the current repository. -- `git branch bug-fix` - This command creates a new branch called `bug-fix`. -- `git switch bug-fix` - This command switches to the `bug-fix` branch. -- `git log` - This command shows the commit history for the current branch. -- `git switch master` - This command switches to the `master` branch. -- `git switch -c dark-mode` - This command creates and switches to a new branch called `dark-mode`. The `-c` flag is used to create a new branch. -- `git checkout orange-mode` - This command switches to the `orange-mode` branch. - -> - Commit before switching to a branch -> - Go to the .git folder and check the HEAD file - -## Rename a Branch - -You can rename a branch using the following command: - -```bash -git branch -m -``` - -## Delete a Branch - -You can delete a branch using the following command: - -```bash -git branch -d -``` - -## Checkout a Branch - -You can checkout a branch using the following command: - -```bash -git checkout -``` - -Checkout a branch means that you are going to work on that branch. You can checkout any branch you want. - -## List All Branches - -You can list all branches using the following command: - -```bash -git branch -``` - -Listing all branches means that you are going to see all the branches in your repository. - - -[Author: @root-0101](https://github.com/root-0101) diff --git a/docs/Git-Github/Getting-started-with-Github.md b/docs/Git-Github/Getting-started-with-Github.md deleted file mode 100644 index 643786f97..000000000 --- a/docs/Git-Github/Getting-started-with-Github.md +++ /dev/null @@ -1,180 +0,0 @@ -# Getting Started with GitHub - -## What is GitHub? - -GitHub is a web-based Git repository hosting service. It is a popular platform for developers to collaborate on projects and share code. GitHub provides a user-friendly interface for managing and tracking changes to your code, as well as a platform for hosting and sharing your projects with others. - -Some other alternatives to GitHub are: - -- GitLab -- Bitbucket -- Azure Repos -- Gitea - -But the mainstream popular tool these days is GitHub. - -## GitHub Account - -Creating a GitHub account is free and easy. You can create an account by visiting the [GitHub website](https://github.com/) and clicking on the "Sign up" button. You will be prompted to enter your email address and password, and then you will be redirected to the GitHub homepage. - -Once you have created an account, you can start using GitHub to host and collaborate on your projects. GitHub provides a variety of features and tools that make it easy to manage and track your code, including issues, pull requests, and code reviews. - -## Configure Your Config File - -If you haven't done it already, you need to configure your git config file. You can do this by running the following command: - -```bash -git config --global user.email "your-email@example.com" -git config --global user.name "Your Name" -``` - -This will set your email and name as your global settings. You can change these settings later by running the following command: - -```bash -git config --global user.email "your-email@example.com" -git config --global user.name "Your Name" -``` - -Now you can check your config settings: - -```bash -git config --list -``` - -This will show you all the settings that you have changed. - -## Setup SSH Key and Add to GitHub - -If you haven't done it already, you need to set up an SSH key and add it to your GitHub account. You can do this by following the instructions on the [GitHub website](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent). - -You can find the exact steps on the website for both Windows and macOS. The steps are the same for both; only Apple users need to add the SSH key to their keychain. - -### Step 1: Generate a New SSH Key - -To generate a new SSH key, open the terminal and run the following command: - -```bash -ssh-keygen -t ed25519 -C "your-email@code.com" -``` - -Here, `ed25519` is the type of key that you are generating. This creates a new SSH key, using the provided email as a label. - -### Save the Key - -After generating the key, you need to save it to your computer. You can do this by running the following command: - -> Enter a file in which to save the key (/Users/YOU/.ssh/id_ALGORITHM): [Press enter] - -At the prompt, you can enter a passphrase for the key or leave it blank. If you leave it blank, the key will be saved without a passphrase. - -### Add Key to Your SSH-Agent - -After saving the key, you need to add it to your SSH-agent. You can do this by running the following command: - -Here it is best to refer to the above link for more information, as GitHub has a lot of information on this. There is no point in repeating it here. - -### Add Key to GitHub - -Use the web UI to add the key to your GitHub account. You can do this by following the instructions on the [GitHub website](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account?tool=webui). - -## Adding Code to Remote Repository - -Now that you have set up your SSH key and added it to your GitHub account, you can start pushing your code to the remote repository. - -Create a new repository on your system first, add some code, and commit it. - -```bash -git init -git add -git commit -m "commit message" -``` - -### Check Remote URL Setting - -You can check the remote URL setting by running the following command: - -```bash -git remote -v -``` - -This will show you the remote URL of your repository. - -### Add Remote Repository - -You can add a remote repository by running the following command: - -```bash -git remote add origin -``` - -Here, `` is the URL of the remote repository that you want to add, and `origin` is the name of the remote repository. This origin is used to refer to the remote repository in the future. - -```bash -git remote add origin https://github.com/username/something.git -``` - -### Push Code to Remote Repository - -```bash -git push origin main -``` - -Here, `origin` is the name of the remote repository that you want to push to, and `main` is the name of the branch that you want to push. - -### Setup an Upstream Remote - -Setting up an upstream remote is useful when you want to keep your local repository up to date with the remote repository. It allows you to fetch and merge changes from the remote repository into your local repository. - -To set up an upstream remote, you can use the following command: - -```bash -git remote add upstream -``` - -or you can use the shorthand: - -```bash -git remote add -u -``` - -You can do this at the time of pushing your code to the remote repository. - -```bash -git push -u origin main -``` - -This will set up an upstream remote and push your code to the remote repository. This will allow you to run future commands like `git pull` and `git push` without specifying the remote name. - -## Get Code from Remote Repository - -There are two ways to get code from a remote repository: - -- Fetch the code -- Pull the code - -Fetching the code means that you are going to download the code from the remote repository to your local repository. Pulling the code means that you are going to download the code from the remote repository and merge it with your local repository. - -![Git and GitHub](https://docs.chaicode.com/_astro/pullfetch.Oeq0Q8Tl_Z17HYnP.svg) - -### Fetch Code - -To fetch code from a remote repository, you can use the following command: - -```bash -git fetch -``` - -Here, `` is the name of the remote repository that you want to fetch from. - -### Pull Code - -To pull code from a remote repository, you can use the following command: - -```bash -git pull -git pull origin main -``` - -Here, `` is the name of the remote repository that you want to pull from, and `` is the name of the branch that you want to pull. - -[Author: @root-0101](https://github.com/root-0101) \ No newline at end of file diff --git a/docs/Git-Github/Terminology.md b/docs/Git-Github/Terminology.md deleted file mode 100644 index 4e4be4cf0..000000000 --- a/docs/Git-Github/Terminology.md +++ /dev/null @@ -1,87 +0,0 @@ -# Terminology - -# Repository - -A repository is a collection of files and directories that are stored together. It is a way to store and manage your code. A repository is like a folder on your computer, but it is more than just a folder. It can contain other files, folders, and even other repositories. You can think of a repository as a container that holds all your code. - -There is a difference between software on your system and tracking a particular folder on your system. At any point, you can run the following command to see the current state of your repository: - -```bash -git status -``` - -## Your Config Settings - -GitHub has a lot of settings that you can change. You can change your username, email, and other settings. Whenever you checkpoint your changes, Git will add some information about you, such as your username and email, to the commit. There is a git config file that stores all the settings that you have changed. You can make settings like what editor you would like to use, etc. There are some global settings and some repository-specific settings. - -Let's set up your email and username in this config file. I would recommend you create an account on GitHub and then use the email and username that you have created. - -```bash -git config --global user.email "your-email@example.com" -git config --global user.name "Your Name" -``` - -Now you can check your config settings: - -```bash -git config --list -``` - -This will show you all the settings that you have changed. - -## Creating a Repository - -Creating a repository is a process of creating a new folder on your system and initializing it as a Git repository. It's just a regular folder to code your project; you are just asking Git to track it. To create a repository, you can use the following command: - -```bash -git status -git init -``` - -The `git status` command will show you the current state of your repository. The `git init` command will create a new folder on your system and initialize it as a Git repository. This adds a hidden `.git` folder to your project. - -## Commit - -A commit is a way to save your changes to your repository. It is a way to record your changes and make them permanent. You can think of a commit as a snapshot of your code at a particular point in time. When you commit your changes, you are telling Git to save them in a permanent way. This way, you can always go back to that point in time and see what you changed. - -## Stage - -Staging is a way to tell Git to track a particular file or folder. You can use the following command to stage a file: - -```bash -git add -git status -``` - -Here we are initializing the repository and adding a file to the repository. Then we can see that the file is now being tracked by Git. Currently, our files are in the staging area; this means that we have not yet committed the changes but are ready to be committed. - -## Commit - -```bash -git commit -m "commit message" -git status -``` - -Here we are committing the changes to the repository. We can see that the changes are now committed to the repository. The `-m` flag is used to add a message to the commit. This message is a short description of the changes that were made. You can use this message to remember what the changes were. Missing the `-m` flag will result in an action that opens your default settings editor, which is usually VIM. We will change this to VSCode in the next section. - -## Logs - -```bash -git log -``` - -This command will show you the history of your repository. It will show you all the commits that were made to the repository. You can use the `--oneline` flag to show only the commit message. This will make the output more compact and easier to read. - -## gitignore - -`.gitignore` is a file that tells Git which files and folders to ignore. It is a way to prevent Git from tracking certain files or folders. You can create a `.gitignore` file and add a list of files and folders to ignore by using the following example: - -Example `.gitignore` file: - -``` -node_modules -.env -.vscode -``` - -[Author: @root-0101](https://github.com/root-0101) diff --git a/docs/Git-Github/_category_.json b/docs/Git-Github/_category_.json deleted file mode 100644 index bc03ea8ba..000000000 --- a/docs/Git-Github/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Git and Github", - "position": 14, - "link": { - "type": "generated-index", - "description": "git and github" - } -} \ No newline at end of file diff --git a/docs/Git-Github/git-github-basic.md b/docs/Git-Github/git-github-basic.md deleted file mode 100644 index e3981909b..000000000 --- a/docs/Git-Github/git-github-basic.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: git-github-basic -title: Introduction to git and github -sidebar_label: Basics of git and github -sidebar_position: 9 -tags: [git, github] -description: "Learn Basics of git and github" ---- - - -# Git and GitHub - -Let's start with the basics. Git is a version control system that allows you to track changes to your files and collaborate with others. It is used to manage the history of your code and to merge changes from different branches. Terms like version control, branches, and merges might be unfamiliar now, but don't worry—we will learn them in this tutorial. - -## Git and GitHub are Different - -Git is a version control system used to track changes to your files. It is free, open-source software available for Windows, macOS, and Linux. Remember, Git is software that can be installed on your computer. - -GitHub is a web-based hosting service for Git repositories. It is an online platform that allows you to store and share your code with others. It is popular for developers to collaborate on projects and share code. While GitHub is one of the most popular providers of Git repositories, it is not the only one. - -## A Little on Version Control Systems - -Version control systems manage the history of your code. They allow you to track changes to your files and collaborate with others. Version control systems are essential for software development. Consider version control as a checkpoint in a game: you can move to any time in the game and always go back to a previous checkpoint. This is the same concept in software development. - -Before Git became mainstream, developers used version control systems to manage their code. These were called SCCS (Source Code Control System). SCCS was proprietary software used to manage the history of code. It was expensive and not very user-friendly. Git was created to replace SCCS and make version control more accessible and user-friendly. Some common version control systems are Subversion (SVN), CVS, and Perforce. - -[Author: @root-0101](https://github.com/root-0101) \ No newline at end of file diff --git a/docs/Go/Concurrency.md b/docs/Go/Concurrency.md deleted file mode 100644 index 7cf8b7c90..000000000 --- a/docs/Go/Concurrency.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: go-concurrency -title: Go Concurrency -sidebar_label: Go concurrency -sidebar_position: 2 -tags: [introduction,Go,concurrency,open-source,programming language] -description: Go Concept of Concurrency ---- - -Concurrency in Go is one of its standout features, designed to make it easier to write programs that effectively utilize multicore processors and handle large numbers of simultaneous tasks. Here's a detailed explanation of concurrency in Go: - -### Goroutines - -Goroutines are lightweight, independently executing functions managed by the Go runtime. They are analogous to threads but are more efficient in terms of memory usage and management by the operating system. Goroutines enable concurrent execution of functions without the overhead typically associated with threads. - -To create a goroutine, you simply prefix a function call with the `go` keyword: - -```go -package main - -import ( - "fmt" - "time" -) - -func sayHello() { - for i := 0; i < 5; i++ { - fmt.Println("Hello") - time.Sleep(100 * time.Millisecond) - } -} - -func main() { - go sayHello() // Start a new goroutine - time.Sleep(500 * time.Millisecond) // Give the goroutine some time to execute - fmt.Println("Main function") -} -``` - -In this example, `sayHello` is executed concurrently as a goroutine while the `main` function continues to execute independently. The `time.Sleep` functions are used to demonstrate the concurrent execution. - -### Channels - -Channels are a core mechanism in Go for communication and synchronization between goroutines. They allow goroutines to send and receive values to and from each other. Channels are typed, meaning they carry a specific type of data. - -Here's an example of using channels to synchronize goroutines: - -```go -package main - -import ( - "fmt" - "time" -) - -func sendMessages(ch chan string) { - messages := []string{"message1", "message2", "message3"} - for _, msg := range messages { - ch <- msg // Send a message to the channel - time.Sleep(1 * time.Second) - } - close(ch) // Close the channel when done sending messages -} - -func main() { - ch := make(chan string) // Create a channel of strings - go sendMessages(ch) // Start sending messages concurrently - - // Receive messages from the channel - for msg := range ch { - fmt.Println("Received:", msg) - } -} -``` - -In this example: -- `sendMessages` sends messages to the channel `ch` with a delay between each message. -- The `main` function receives messages from the channel `ch` using a `for` loop that ranges over the channel until it's closed. - -### Benefits of Concurrency in Go - -1. **Efficient Use of Resources:** Goroutines are lightweight and use less memory compared to traditional threads, making it feasible to create thousands of them in a single application. - -2. **Simplified Synchronization:** Channels provide a clear and safe way to synchronize data access between goroutines without the pitfalls of traditional shared memory concurrency. - -3. **Scalability:** Go's concurrency model is designed to scale well with multicore processors, allowing applications to take full advantage of modern hardware. - -4. **Cleaner Code:** Goroutines and channels promote a clear and structured approach to concurrent programming, reducing the complexity of managing concurrency manually. - \ No newline at end of file diff --git a/docs/Go/ErrorHandling.md b/docs/Go/ErrorHandling.md deleted file mode 100644 index cbfc1625c..000000000 --- a/docs/Go/ErrorHandling.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -id: go-error-handling -title: Error Handling -sidebar_label: Error Handling -sidebar_position: 7 -tags: [introduction,Go,Garbage Collection,Packages and Imports,Error Handling,open-source,Types and Interfaces,programming language] -description: Go concept of Error Handling. ---- - -Error handling in Go is designed to be explicit and straightforward, emphasizing the importance of handling errors directly where they occur rather than relying on exceptions or runtime errors. Here's a detailed explanation of how error handling works in Go: - -### Returning Errors - -In Go, functions that can produce an error typically return an error as the last return value (often of type `error`). It's a common practice to return `nil` (indicating no error) when the function succeeds, and a non-nil `error` when it fails. - -```go -package main - -import ( - "errors" - "fmt" -) - -func divide(x, y float64) (float64, error) { - if y == 0 { - return 0, errors.New("division by zero") - } - return x / y, nil -} - -func main() { - result, err := divide(10, 2) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Println("Result:", result) - } - - result, err = divide(10, 0) - if err != nil { - fmt.Println("Error:", err) - } else { - fmt.Println("Result:", result) - } -} -``` - -In this example: -- The `divide` function returns a `float64` result and an `error`. It checks if `y` is zero and returns an error if true. -- In `main`, we call `divide` twice with different arguments. We check if `err` is `nil` to determine if an error occurred. - -### Error Handling Patterns - -1. **Check Errors Immediately:** Always check errors immediately after calling a function that can return an error. This ensures errors are handled promptly. - -2. **Error Propagation:** Functions can propagate errors up the call stack by returning them to the caller. Each layer of the call stack can add context or handle the error accordingly. - -3. **Error Wrapping:** Go supports error wrapping using `fmt.Errorf` or `errors.Wrap` from the `errors` package to add context to errors while preserving the original error information. - -```go -package main - -import ( - "errors" - "fmt" - "github.com/pkg/errors" -) - -func openFile(filename string) error { - _, err := os.Open(filename) - if err != nil { - return errors.Wrap(err, "failed to open file") - } - return nil -} - -func main() { - err := openFile("nonexistent.txt") - if err != nil { - fmt.Println("Error:", err) - // Extract the underlying error message - fmt.Println("Underlying error:", errors.Unwrap(err)) - } -} -``` - -### Error Handling Best Practices - -- **Avoid Panic:** In Go, panicking should be reserved for unrecoverable errors, like out-of-memory conditions or unrecoverable state. - -- **Contextual Error Messages:** Provide clear and meaningful error messages that help developers understand the cause of the error. - -- **Handle Errors Appropriately:** Decide whether to handle an error locally or propagate it to the caller based on the application's needs and the context in which the error occurred. - \ No newline at end of file diff --git a/docs/Go/FunctionsAsFirst-ClassCitizens.md b/docs/Go/FunctionsAsFirst-ClassCitizens.md deleted file mode 100644 index b9efbef2a..000000000 --- a/docs/Go/FunctionsAsFirst-ClassCitizens.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -id: functions-as-first-class-citizens -title: Functions as First-Class Citizens -sidebar_label: Functions as First-Class Citizens -sidebar_position: 4 -tags: [introduction,Go,open-source,programming language] -description: Go Concept of Functions as First-Class Citizens. ---- - -In Go (or Golang), functions are treated as first-class citizens, which means they can be treated like any other variable. This includes passing functions as arguments to other functions, returning functions as values from other functions, assigning functions to variables, and storing functions in data structures. - -Here are a few ways functions are treated as first-class citizens in Go: - -### 1. Assigning Functions to Variables - -In Go, you can assign functions to variables just like you would assign integers, strings, or any other data type. - -```go -package main - -import "fmt" - -func add(a, b int) int { - return a + b -} - -func main() { - var sumFunc func(int, int) int // Declare a variable of function type - sumFunc = add // Assign the add function to sumFunc - - result := sumFunc(3, 5) // Call the function using the variable - fmt.Println("Sum:", result) -} -``` - -### 2. Passing Functions as Arguments - -Functions can be passed as arguments to other functions in Go, allowing for powerful abstractions and higher-order functions. - -```go -package main - -import "fmt" - -func apply(f func(int, int) int, a, b int) int { - return f(a, b) -} - -func add(a, b int) int { - return a + b -} - -func multiply(a, b int) int { - return a * b -} - -func main() { - result1 := apply(add, 3, 5) // Pass add function as an argument - result2 := apply(multiply, 3, 5) // Pass multiply function as an argument - - fmt.Println("Addition result:", result1) - fmt.Println("Multiplication result:", result2) -} -``` - -### 3. Returning Functions from Functions - -Functions can also return other functions as values, allowing for functional programming techniques such as closures. - -```go -package main - -import "fmt" - -func makeGreeter(greeting string) func(string) string { - return func(name string) string { - return fmt.Sprintf("%s, %s!", greeting, name) - } -} - -func main() { - englishGreeter := makeGreeter("Hello") - spanishGreeter := makeGreeter("Hola") - - fmt.Println(englishGreeter("Alice")) - fmt.Println(spanishGreeter("Carlos")) -} -``` - -In this example, `makeGreeter` returns a function that takes a `name` argument and returns a greeting string. This demonstrates how functions can be used to encapsulate behavior and create reusable components. - -### 4. Functions in Data Structures - -You can store functions in data structures such as slices, maps, or structs. - -```go -package main - -import "fmt" - -type mathFunc func(int, int) int - -func add(a, b int) int { - return a + b -} - -func multiply(a, b int) int { - return a * b -} - -func main() { - mathFuncs := map[string]mathFunc{ - "add": add, - "multiply": multiply, - } - - result1 := mathFuncs["add"](3, 5) - result2 := mathFuncs["multiply"](3, 5) - - fmt.Println("Addition result:", result1) - fmt.Println("Multiplication result:", result2) -} -``` - -Here, `mathFunc` is a type that represents functions with a specific signature. Functions `add` and `multiply` are stored in a map and called based on their keys. - -### Benefits of First-Class Functions in Go - -- **Higher-order functions**: Functions that can accept functions as arguments or return functions enable flexible and expressive programming. -- **Closures**: Functions can access variables defined in their lexical scope, allowing for powerful encapsulation of state. -- **Modularity**: Functions can be easily composed and reused, enhancing code maintainability and readability. diff --git a/docs/Go/GarbageCollection.md b/docs/Go/GarbageCollection.md deleted file mode 100644 index 26939e45e..000000000 --- a/docs/Go/GarbageCollection.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: go-garbage-collection -title: Garbage Collection -sidebar_label: Garbage Collection -sidebar_position: 5 -tags: [introduction,Go,Garbage Collection,open-source,Types and Interfaces,programming language] -description: Go concept of Garbage Collection. ---- - -Garbage collection (GC) is an essential aspect of memory management in modern programming languages, including Go (Golang). Here’s an explanation of what garbage collection is, why it’s important, and how it works in Go: - -### What is Garbage Collection? - -Garbage collection is an automatic memory management technique where the programming language runtime system automatically deallocates memory that is no longer in use by the program. The primary goal of garbage collection is to free up memory occupied by objects that are no longer reachable or needed by the program, thus preventing memory leaks and ensuring efficient use of memory. - -### Why is Garbage Collection Important? - -Manual memory management, where developers explicitly allocate and deallocate memory, can lead to several issues such as: - -- **Memory leaks**: Memory that is allocated but never deallocated, leading to wasted resources and potential program crashes. -- **Dangling pointers**: Pointers that reference memory locations that have been deallocated, resulting in undefined behavior. -- **Complexity**: Manual memory management adds complexity to the code, making it harder to maintain and debug. - -Garbage collection automates memory management, relieving developers from the burden of managing memory explicitly and reducing the likelihood of memory-related bugs. - -### Garbage Collection in Go (Golang) - -Go uses a concurrent, tri-color mark-and-sweep garbage collector. Here are the key features and aspects of garbage collection in Go: - -1. **Concurrency**: Go's garbage collector runs concurrently with the application's goroutines (lightweight threads), which means it can reclaim memory while the program is still executing. - -2. **Tri-Color Mark-and-Sweep Algorithm**: - - **Mark Phase**: The garbage collector traverses the object graph starting from known root objects (e.g., global variables, stacks of goroutines) and marks all reachable objects as alive. - - **Sweep Phase**: It sweeps through the entire heap, freeing memory for objects that are not marked (i.e., not reachable) and reclaiming that memory for reuse. - -3. **Generational**: Go's garbage collector is generational, meaning it categorizes objects by their age (how long they have been allocated). Younger objects (recently allocated) are collected more frequently than older objects. - -4. **Memory Heaps**: Go manages memory in heaps, which are divided into small fixed-size segments called spans. Spans can be either used for allocating objects or reserved for specific types of objects (e.g., large objects). - -### Controlling Garbage Collection in Go - -While Go's garbage collector is designed to work efficiently without manual intervention, there are a few mechanisms available to control its behavior: - -- **`runtime.GC()`**: This function can be used to trigger garbage collection manually, although it's generally not recommended for normal application use. - -- **Environment Variables**: Go provides environment variables like `GOGC` which allows tuning of garbage collection behavior. For example, setting `GOGC=100` may increase the aggressiveness of garbage collection. - \ No newline at end of file diff --git a/docs/Go/Introduction.md b/docs/Go/Introduction.md deleted file mode 100644 index 70a786c73..000000000 --- a/docs/Go/Introduction.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: intro-go -title: Introduction of GO Language -sidebar_label: Introduction of GO Language -sidebar_position: 1 -tags: [introduction,Go,open-source,programming language] -description: Go is an open-source programming language created by Google in 2007 and released to the public in 2009. ---- - -**Go Language Overview:** -Go is an open-source programming language created by Google in 2007 and released to the public in 2009. It was designed by Robert Griesemer, Rob Pike, and Ken Thompson and aims to be simple, efficient, and reliable. Go is statically typed and has a syntax that is similar to C, but it also includes features from other languages like Python and JavaScript. It's known for its strong support for concurrent programming and its garbage collection capabilities. - -### Key Concepts in Go: - -1. **Concurrency:** Go has built-in support for concurrency using goroutines and channels. Goroutines are lightweight threads managed by the Go runtime, allowing concurrent execution of functions. Channels facilitate communication and synchronization between goroutines, making it easier to write concurrent programs. - -2. **Types and Interfaces:** Go is statically typed, meaning variables always have a specific type which is known at compile time. It supports user-defined types and interfaces, allowing abstraction and polymorphism. - -3. **Functions as First-Class Citizens:** Functions in Go are first-class citizens, meaning they can be assigned to variables, passed as arguments to other functions, and returned as values from functions. - -4. **Garbage Collection:** Go has a garbage collector that automatically manages memory allocation and deallocation, reducing the burden on developers to manage memory manually. - -5. **Packages and Imports:** Go programs are organized into packages, which are collections of Go source files that together provide a set of related functionalities. Packages can be imported and reused in other programs using the `import` keyword. - -6. **Error Handling:** Go encourages explicit error handling. Functions can return multiple values, allowing functions to return both results and error indicators. This helps developers handle errors effectively without resorting to exceptions. - -7. **Structs and Methods:** Go supports struct types, which are collections of fields. Methods can be associated with structs, providing an object-oriented way to define behaviors for types. - -8. **Tooling:** Go comes with a comprehensive set of tools, including a powerful build system (`go build`), package management (`go mod`), testing (`go test`), and profiling (`go profile`). - -### Example of a Simple Go Program: - -```go -package main - -import "fmt" - -func main() { - fmt.Println("Hello, World!") -} -``` - -In this example: -- `package main`: Indicates that this Go file belongs to the `main` package, which is required for executable commands. -- `import "fmt"`: Imports the `fmt` package, which contains functions for formatting input and output. -- `func main() {...}`: Defines the `main` function, which is the entry point of the program. It calls `fmt.Println` to print "Hello, World!" to the console. - -### Why Use Go? - -- **Simplicity**: Go has a simple and clean syntax that is easy to learn and read. -- **Concurrency**: Goroutines and channels make it easy to write concurrent programs. -- **Performance**: Go compiles to machine code, providing performance comparable to statically-typed languages like C and C++. -- **Scalability**: Go is designed for scalability, making it suitable for building large-scale systems. -- **Community and Support**: Being backed by Google and having a growing community ensures good support and continuous improvement. - \ No newline at end of file diff --git a/docs/Go/PackagesAndImports.md b/docs/Go/PackagesAndImports.md deleted file mode 100644 index bdd65daa6..000000000 --- a/docs/Go/PackagesAndImports.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: go-packages-and-imports -title: Packages and Imports -sidebar_label: Packages and Imports -sidebar_position: 6 -tags: [introduction,Go,Garbage Collection,Packages and Imports,open-source,Types and Interfaces,programming language] -description: Go concept of Packages and Imports. ---- - -In Go (Golang), packages and imports play crucial roles in organizing and reusing code. Here’s a comprehensive explanation of packages, imports, and their usage in Go: - -### Packages - -A package in Go is a collection of Go source files that reside in the same directory and have the same package declaration at the top of each file. Packages provide modularity and namespace separation, allowing code to be organized into manageable units. Key points about packages include: - -- **Package Declaration**: Every Go file starts with a `package` declaration, specifying the name of the package to which the file belongs. For example, `package main` indicates that the file belongs to the `main` package, which is required for executable programs. - -- **Package Naming**: By convention, packages are named after the last element of their import path. For example, the package `fmt` is imported with `import "fmt"`, where `"fmt"` is the import path and `fmt` is the package name. - -- **Visibility**: Go uses capitalized names to indicate whether an identifier (function, variable, etc.) is exported (public) or unexported (private) from a package. Exported identifiers are visible and accessible from outside the package, while unexported identifiers are restricted to the package they are defined in. - -### Imports - -Imports in Go allow you to use code defined in other packages. They enable code reuse and dependency management. Key points about imports include: - -- **Import Declaration**: Imports are declared using the `import` keyword followed by the package path in double quotes (`"`). For example, `import "fmt"` imports the `fmt` package. - -- **Alias**: You can optionally specify an alias for an imported package using the `import` keyword followed by a dot (`.`) and the alias name. For example, `import fm "fmt"` imports the `fmt` package and allows you to refer to it as `fm` within your code. - -- **Blank Identifier**: If you import a package solely for its side effects (such as initialization), you can use the blank identifier (`_`) to discard the package name. For example, `import _ "database/sql"` imports the `database/sql` package without explicitly using it. - -### Example Usage - -Here’s a simple example demonstrating how packages and imports work together in Go: - -```go -// File: main.go -package main - -import ( - "fmt" - "math/rand" -) - -func main() { - fmt.Println("Random number:", rand.Intn(100)) // Using function from the rand package -} -``` - -In this example: -- `main.go` belongs to the `main` package. -- `import "fmt"` imports the `fmt` package for formatted I/O operations. -- `import "math/rand"` imports the `rand` package for generating random numbers. - -### Organizing Packages - -Go encourages organizing code into packages based on functionality and purpose. Common practices include: -- **Single Responsibility**: Each package should have a clear and specific responsibility. -- **Separation of Concerns**: Packages should be designed to minimize dependencies between different parts of the codebase. -- **Clear Interfaces**: Define clear interfaces between packages to promote reusability and maintainability. - \ No newline at end of file diff --git a/docs/Go/StructsAndMethods.md b/docs/Go/StructsAndMethods.md deleted file mode 100644 index 3b537da4a..000000000 --- a/docs/Go/StructsAndMethods.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -id: go-structs-and-methods -title: Structs and Methods -sidebar_label: Structs and Methods -sidebar_position: 8 -tags: [introduction,Go,open-source,Structs and Methods,programming language] -description: Go Concept of Structs and Methods ---- - -In Go (Golang), structs and methods are fundamental concepts used to define custom data types and associated behaviors. Let's delve into structs and methods, their definitions, usage, and examples. - -### Structs - -A struct is a composite data type that groups together zero or more named fields of possibly different types into a single unit. Structs are used to create complex data structures that can represent real-world entities in a program. Key points about structs include: - -- **Definition**: Structs are defined using the `type` and `struct` keywords followed by a list of fields inside curly braces `{}`. -- **Fields**: Each field in a struct has a name and a type. -- **Initialization**: Structs can be initialized with field values using a struct literal. - -#### Example of Structs: - -```go -package main - -import "fmt" - -// Define a struct type -type Person struct { - FirstName string - LastName string - Age int -} - -func main() { - // Create a new instance of Person struct - person := Person{ - FirstName: "John", - LastName: "Doe", - Age: 30, - } - - // Accessing struct fields - fmt.Println("First Name:", person.FirstName) - fmt.Println("Last Name:", person.LastName) - fmt.Println("Age:", person.Age) -} -``` - -In this example: -- `Person` is a struct type with three fields: `FirstName`, `LastName`, and `Age`. -- An instance `person` of type `Person` is created using a struct literal with initial values. - -### Methods - -Methods in Go are functions that are associated with a particular type. They allow you to define behavior (functions) for your custom types (structs or any other types). Methods can either be associated with a struct type (`receiver`) or a non-struct type. - -#### Receiver Syntax: - -- **Pointer Receiver (`*T`)**: Modifies the value pointed to by the receiver. Changes are visible to the caller. -- **Value Receiver (`T`)**: Operates on a copy of the receiver. Changes are not visible to the caller unless the receiver is a struct or array and is not defined as a pointer. - -#### Example of Methods: - -```go -package main - -import "fmt" - -// Define a struct type -type Rectangle struct { - Width float64 - Height float64 -} - -// Method with value receiver -func (r Rectangle) Area() float64 { - return r.Width * r.Height -} - -// Method with pointer receiver -func (r *Rectangle) Scale(factor float64) { - r.Width *= factor - r.Height *= factor -} - -func main() { - // Create a new instance of Rectangle struct - rectangle := Rectangle{ - Width: 10.0, - Height: 5.0, - } - - // Call methods - fmt.Println("Area:", rectangle.Area()) // Calling method with value receiver - rectangle.Scale(2.0) // Calling method with pointer receiver - fmt.Println("Scaled Width:", rectangle.Width) - fmt.Println("Scaled Height:", rectangle.Height) -} -``` - -In this example: -- `Rectangle` is a struct type with `Width` and `Height` fields. -- `Area()` is a method with a value receiver `Rectangle`. It calculates and returns the area of the rectangle. -- `Scale()` is a method with a pointer receiver `*Rectangle`. It scales the dimensions of the rectangle by a given factor. - -### When to Use Methods vs Functions - -- **Methods** are used to associate behavior with a specific type (struct or non-struct). They enhance code readability and maintainability by keeping related operations grouped together with the data they operate on. - -- **Functions** are used for generic computations or operations that don't necessarily need to be associated with a specific type. - \ No newline at end of file diff --git a/docs/Go/Tooling.md b/docs/Go/Tooling.md deleted file mode 100644 index 6d2a14aae..000000000 --- a/docs/Go/Tooling.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -id: go-tooling -title: Tooling -sidebar_label: Tooling -sidebar_position: 9 -tags: [introduction,Go,open-source,Structs and Methods,Tooling,programming language] -description: Go Concept of Tooling ---- - -In the context of Go (Golang), tooling refers to the set of software tools and utilities that aid in various aspects of Go development, including writing, testing, managing dependencies, and deploying applications. Here’s an overview of some essential tools and utilities commonly used in Go development: - -### 1. **go command** -The `go` command is the official tool for managing Go source code. It provides functionalities such as compiling, testing, installing packages, and managing dependencies. Common subcommands include: -- `go build`: Compiles packages and dependencies. -- `go run`: Compiles and runs a Go program. -- `go test`: Runs tests associated with a package. -- `go get`: Downloads and installs packages and dependencies. - -### 2. **go mod** -`go mod` is the Go module system introduced in Go 1.11 to manage dependencies. It allows for versioned dependency management outside of the traditional `$GOPATH` structure. - -- `go mod init`: Initializes a new module (creates a `go.mod` file). -- `go mod tidy`: Ensures that `go.mod` and `go.sum` reflect the correct set of dependencies. -- `go mod vendor`: Copies dependencies into a local `vendor` directory. -- `go mod download`: Downloads modules needed to build and test packages. - -### 3. **gofmt** -`gofmt` is a tool that formats Go source code according to Go's style guidelines (`gofmt` stands for "Go format"). It ensures consistent formatting across different codebases and helps maintain readability. - -- `gofmt -w file.go`: Formats a single file and overwrites it with the formatted version. -- `gofmt -l .`: Lists files whose formatting differs from `gofmt`'s style. - -### 4. **golint** -`golint` is a linter for Go code that provides suggestions for improving Go code quality based on the official Go style guide and best practices. - -- Install: `go install golang.org/x/lint/golint` -- Usage: `golint path/to/package` to lint a specific package. - -### 5. **go vet** -`go vet` is a tool for analyzing Go source code for suspicious constructs and potential errors that `gofmt` and `golint` might miss. - -- Usage: `go vet path/to/package` to analyze a specific package. - -### 6. **godoc** -`godoc` is a tool for displaying Go package documentation. It serves as a web server that presents Go package documentation as HTML pages. - -- `godoc -http=:6060`: Starts a local web server serving Go documentation at `http://localhost:6060`. - -### 7. **Testing Tools** -Go has built-in support for testing with the `go test` command. Testing tools include: -- **Testing Package (`testing`)**: Standard package for writing unit tests in Go. -- **Benchmarking (`testing.B`)**: Allows measuring performance of code. -- **Coverage (`go test -cover`)**: Measures test coverage of packages. - -### 8. **Third-party Tools** -Besides built-in tools, many third-party tools and libraries enhance Go development, including: -- **Dependency Managers**: `dep`, `godep`, `vgo`, and now the built-in `go mod`. -- **IDEs and Editors**: VS Code, IntelliJ IDEA with Go plugin, Atom with Go-Plus package, etc. -- **Code Editors**: Vim with plugins like vim-go, Emacs with go-mode, etc. \ No newline at end of file diff --git a/docs/Go/TypesandInterfaces.md b/docs/Go/TypesandInterfaces.md deleted file mode 100644 index 4aae50170..000000000 --- a/docs/Go/TypesandInterfaces.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -id: go-types-and-interfaces -title: Types and Interfaces -sidebar_label: Types and Interfaces -sidebar_position: 3 -tags: [introduction,Go,open-source,Types and Interfaces,programming language] -description: Go concept of Types and Interfaces. ---- - -In Go (Golang), types and interfaces are fundamental concepts that facilitate robust and flexible code design. Let's explore each of these concepts in detail: - -### Types - -In Go, a type defines the blueprint for a set of values. It specifies the representation of data and the operations that can be performed on that data. Types in Go include basic types (like `int`, `float64`, `string`), composite types (like `struct`, `array`, `slice`, `map`), and user-defined types (created using `type` keyword). - -#### Example of Types: - -```go -package main - -import "fmt" - -// Define a new type using type alias -type Celsius float64 - -// Define a struct type -type Person struct { - Name string - Age int -} - -func main() { - // Using basic types - var age int = 30 - var temperature Celsius = 20.5 - - // Using composite types - var john Person - john.Name = "John Doe" - john.Age = 40 - - fmt.Printf("Age: %d\n", age) - fmt.Printf("Temperature: %.1f°C\n", temperature) - fmt.Printf("Person: %+v\n", john) -} -``` - -In this example: -- `Celsius` is a user-defined type alias for `float64`. -- `Person` is a struct type with fields `Name` and `Age`. -- Instances of these types (`age`, `temperature`, `john`) demonstrate different uses of types in Go. - -### Interfaces - -Interfaces in Go provide a way to specify behavior—what a type can do—without specifying how it does it. An interface is a collection of method signatures that a type can implement. Unlike some languages, interfaces in Go are implicit; a type automatically satisfies an interface if it implements all the methods defined by that interface. - -#### Example of Interfaces: - -```go -package main - -import "fmt" - -// Define an interface -type Shape interface { - Area() float64 -} - -// Define a struct type implementing the Shape interface -type Rectangle struct { - Width float64 - Height float64 -} - -// Method to calculate area of Rectangle -func (r Rectangle) Area() float64 { - return r.Width * r.Height -} - -func main() { - // Create an instance of Rectangle - rectangle := Rectangle{Width: 10, Height: 5} - - // The Rectangle type satisfies the Shape interface - var shape Shape - shape = rectangle - - // Call Area method via Shape interface - fmt.Printf("Area of rectangle: %.2f square units\n", shape.Area()) -} -``` - -In this example: -- `Shape` is an interface with a single method `Area()` that returns a `float64`. -- `Rectangle` struct implements the `Shape` interface by defining its `Area()` method. -- The `rectangle` instance of type `Rectangle` is assigned to `shape` of type `Shape`, demonstrating interface assignment and method invocation. - -### Key Points and Benefits - -- **Type Safety**: Go's type system ensures compile-time type checking, reducing runtime errors. -- **Abstraction and Flexibility**: Interfaces allow decoupling of code by specifying behavior rather than implementation details, promoting code reusability and modularity. -- **Polymorphism**: Interfaces enable polymorphic behavior where different types can be used interchangeably based on shared methods. - \ No newline at end of file diff --git a/docs/Go/_category_.json b/docs/Go/_category_.json deleted file mode 100644 index 7f5ca38b9..000000000 --- a/docs/Go/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "GO", - "position": 21, - "link": { - "type": "generated-index", - "description": "Go is an open-source programming language." - } - } \ No newline at end of file diff --git a/docs/Jekyll/01-Introduction.md b/docs/Jekyll/01-Introduction.md deleted file mode 100644 index b61ffdc76..000000000 --- a/docs/Jekyll/01-Introduction.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: introduction-to-jekyll -title: Introduction to Jekyll -sidebar_label: Introduction to Jekyll -sidebar_position: 1 -tags: [jekyll, static site generator] -description: Learn about Jekyll, a static site generator used for creating fast and secure websites with ease. ---- - -Jekyll is a static site generator written in Ruby. It takes a directory of templates, content files, and configuration, and produces a static website. Jekyll is commonly used for blogs and project websites because of its simplicity and efficiency. - -### Key Features of Flask - -1. **Static Site Generation:** Jekyll generates static HTML pages, which are fast to load and secure. - -2. **Markdown Support:** Write content in Markdown, and Jekyll will convert it to HTML. - -3. **Template System:** Use Liquid templates to create dynamic content. - -4. **Plugins:** Extend Jekyll's functionality with plugins. - - -### Conclusion - -Jekyll is an excellent choice for creating simple, fast, and secure static websites. Its features make it suitable for personal blogs, project documentation, and more. Whether you're a developer looking to build a portfolio or a content creator needing a reliable blogging platform, Jekyll offers the tools and flexibility needed to create a professional and efficient website. \ No newline at end of file diff --git a/docs/Jekyll/02-Installation.md b/docs/Jekyll/02-Installation.md deleted file mode 100644 index 5a62a783d..000000000 --- a/docs/Jekyll/02-Installation.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: installing-jekyll -title: Installing Jekyll -sidebar_label: Installing Jekyll -sidebar_position: 2 -tags: [jekyll, installation] -description: Learn how to install Jekyll on your local machine and get started quickly. ---- - -Installing Jekyll is straightforward, especially if you have Ruby installed on your system. Jekyll requires a few dependencies and can be set up with simple commands. - -### Prerequisites -**Ruby:** Ensure you have Ruby installed. You can check by running `ruby -v` in your terminal. - -**RubyGems:** This is usually installed with Ruby. Check with `gem -v`. - -### Installation Steps - -1. **Install Jekyll and Bundler:** -```sh -gem install jekyll bundler -``` - -2. **Verify the Installation:** -```sh -jekyll -v -``` -### Conclusion - -By following these steps, you should have Jekyll installed on your system, ready to create and manage static websites. With Jekyll and Bundler set up, you can efficiently handle dependencies and ensure your site builds consistently across different environments. \ No newline at end of file diff --git a/docs/Jekyll/03-Setting-Up.md b/docs/Jekyll/03-Setting-Up.md deleted file mode 100644 index 87a044946..000000000 --- a/docs/Jekyll/03-Setting-Up.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -id: setting-up-a-new-jekyll-site -title: Setting up a new Jekyll site -sidebar_label: Setting up a new Jekyll site -sidebar_position: 3 -tags: [jekyll, setup, new site] -description: Learn how to set up a new Jekyll site from scratch, including creating and structuring your project. ---- - -Setting up a new Jekyll site is simple and quick, allowing you to get started with your static website in no time. Jekyll provides a default structure that you can easily customize. - -### Steps - -1. **Create a New Jekyll Site:** -```sh -jekyll new my-awesome-site -cd my-awesome-site -``` - -2. **Build the Site and Serve Locally:** -```sh -bundle exec jekyll serve -``` -Visit `http://localhost:4000` to see your new site. - -### Conclusion - -With these steps, you've created a new Jekyll site and served it locally, ready for customization and content addition. Jekyll's default structure includes folders for posts, pages, assets, and configuration, making it easy to organize and manage your site effectively. \ No newline at end of file diff --git a/docs/Jekyll/04-Configuration.md b/docs/Jekyll/04-Configuration.md deleted file mode 100644 index 837670eb2..000000000 --- a/docs/Jekyll/04-Configuration.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -id: jekyll-configuration -title: Jekyll Configuration -sidebar_label: Jekyll Configuration -sidebar_position: 4 -tags: [jekyll, configuration] -description: Learn how to configure your Jekyll site using the `_config.yml` file to customize settings and behavior. ---- - -Jekyll uses a `_config.yml` file for configuration, where you can set various options for your site. This file is essential for customizing your site's behavior, appearance, and functionality. - -### Key Configuration Options - -1. **Site Settings:** -``yaml -title: My Awesome Site -description: >- # this means to ignore newlines until "baseurl:" - This is my awesome website built with Jekyll. -baseurl: "" # the subpath of your site, e.g. /blog -url: "http://example.com" # the base hostname & protocol for your site -``` - -2. **Build Settings:** -```yaml -markdown: kramdown -theme: minima -plugins: - - jekyll-feed -``` - -### Conclusion - -The `_config.yml` file is crucial for customizing your Jekyll site. By modifying this file, you can easily change the behavior and appearance of your site. Whether you need to update the site title, add plugins, or adjust markdown settings,` _config.yml` provides a centralized location for these configurations, simplifying site management and customization. \ No newline at end of file diff --git a/docs/Jekyll/05-Pages-and-Post.md b/docs/Jekyll/05-Pages-and-Post.md deleted file mode 100644 index 6e695d925..000000000 --- a/docs/Jekyll/05-Pages-and-Post.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: creating-pages-and-posts -title: Creating Pages and Posts -sidebar_label: Creating Pages and Posts -sidebar_position: 5 -tags: [jekyll, pages, posts] -description: Learn how to create pages and posts in Jekyll to add content to your site. ---- - -Creating content in Jekyll involves creating pages and posts. Pages are used for static content, while posts are typically used for blog entries. - -### Creating Pages - -1. **Create a New Page:** -```sh -touch about.md -``` -- Add the following front matter to the page: - -markdown ---- -layout: page -title: About -permalink: /about/ ---- - - -2. **Add Content:** - -markdown -# About Me -This is the about page of my Jekyll site. - - -### Creating Posts - -1. **Create a New Post:** -```sh -touch _posts/2024-07-20-my-first-post.md -``` - -- Add the following front matter to the post: - -```markdown ---- -layout: post -title: "My First Post" -date: 2024-07-20 12:00:00 -0400 -categories: blog ---- -``` - -2. **Add Content:** - -```markdown -# Welcome -This is my first blog post on my new Jekyll site. -``` - -### Conclusion - -Creating pages and posts in Jekyll is straightforward. By using the appropriate front matter, you can easily add and organize content on your site. Whether you're building a blog, a portfolio, or a documentation site, Jekyll's simple file-based structure makes content management intuitive and efficient. \ No newline at end of file diff --git a/docs/Jekyll/06-Themes.md b/docs/Jekyll/06-Themes.md deleted file mode 100644 index 6e8f59535..000000000 --- a/docs/Jekyll/06-Themes.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: using-themes -title: Using Themes -sidebar_label: Using Themes -sidebar_position: 6 -tags: [jekyll, themes] -description: Learn how to use and customize themes in Jekyll to enhance the look and feel of your site. ---- - -Jekyll themes allow you to quickly change the appearance of your site without having to design it from scratch. Themes provide a consistent look and feel across all pages and posts. - -### Steps to Use a Theme - -1. **Choose a Theme:** Browse themes on Jekyll Themes or GitHub. - -2. **Add the Theme to Your Site:** - -```yaml -# _config.yml -theme: jekyll-theme-minimal -``` - -3. **Install the Theme:** -```sh -bundle install -``` - -### Customizing a Theme - -To customize a theme, you can override theme files by copying them into your site’s directory. For example, to customize the `_layouts/default.html` layout, copy it from the theme's gem to your local `_layouts` directory. - -### Conclusion - -Using themes in Jekyll simplifies the process of styling your site. You can quickly implement a professional design and further customize it to meet your needs, ensuring your site looks unique and polished. \ No newline at end of file diff --git a/docs/Jekyll/07-Layouts-and-Includes.md b/docs/Jekyll/07-Layouts-and-Includes.md deleted file mode 100644 index 457cc86bc..000000000 --- a/docs/Jekyll/07-Layouts-and-Includes.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: working-with-layouts-and-includes -title: Working with Layouts and Includes -sidebar_label: Working with Layouts and Includes -sidebar_position: 7 -tags: [jekyll, layouts, includes] -description: Learn how to use layouts and includes in Jekyll to structure your site efficiently. ---- - -Layouts and includes in Jekyll help you manage the structure and reuse components across your site. They enable you to maintain a consistent design and avoid redundancy. - -### Using Layouts - -1. **Define a Layout:** - -```html - - - - - - {{ page.title }} - - - {{ content }} - - -``` - -2. **Apply the Layout:** -```yaml ---- -layout: default -title: My Page ---- -``` - -### Using Includes - -1. **Create an Include:** - -```html -
    -

    Welcome to My Site

    -
    -``` - -2. **Use the Include:** - -```html - - - - - {{ page.title }} - - - {% include header.html %} - {{ content }} - - -``` - -### Conclusion - -Layouts and includes are powerful tools in Jekyll for creating a maintainable and scalable site structure. They help you keep your code DRY (Don't Repeat Yourself) and ensure a consistent layout across your site. \ No newline at end of file diff --git a/docs/Jekyll/08-Plugins.md b/docs/Jekyll/08-Plugins.md deleted file mode 100644 index cabadd4eb..000000000 --- a/docs/Jekyll/08-Plugins.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: jekyll-plugins -title: Jekyll Plugins -sidebar_label: Jekyll Plugins -sidebar_position: 8 -tags: [jekyll, plugins] -description: Discover how to extend your Jekyll site’s functionality using plugins. ---- - -Jekyll plugins allow you to extend the functionality of your site beyond the built-in features. Plugins can handle tasks such as generating sitemaps, managing assets, and more. - -### Installing Plugins - -1. **Add the Plugin to Your `Gemfile`:** -```ruby -gem "jekyll-sitemap" -``` - -2. **Update Your Bundle:** -```sh -bundle install -``` - -3. **Enable the Plugin in `_config.yml:`** -```yaml -plugins: - - jekyll-sitemap -``` - -### Popular Plugins -1. **jekyll-seo-tag:** Adds SEO tags to your site. -2. **jekyll-paginate:** Provides pagination for posts. -3. **jekyll-feed:** Generates an RSS feed for your posts - -### Conclusion - -Jekyll plugins are a great way to enhance your site with additional features. By leveraging plugins, you can save time and effort while adding powerful capabilities to your static site. \ No newline at end of file diff --git a/docs/Jekyll/09-Deployments.md b/docs/Jekyll/09-Deployments.md deleted file mode 100644 index 7fc7259b9..000000000 --- a/docs/Jekyll/09-Deployments.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -id: deployment -title: Deployment -sidebar_label: Deployment -sidebar_position: 9 -tags: [jekyll, deployment] -description: Learn how to deploy your Jekyll site to different hosting platforms. ---- - -Deploying your Jekyll site involves moving your static files to a server where they can be accessed by visitors. Various hosting platforms support Jekyll sites, making deployment straightforward. - -### Popular Deployment Options - -**GitHub Pages:** - -- Steps: -1. Push your site to a GitHub repository. -2. Configure the repository settings to enable GitHub Pages. -- Advantages: Free hosting with easy integration. - -**Netlify:** - -- Steps: -1. Connect your GitHub repository to Netlify. -2. Netlify will build and deploy your site automatically. -- Advantages: Continuous deployment, custom domains, and SSL. - -**Amazon S3:** - -- Steps: -1. Upload your site files to an S3 bucket. -2. Configure the bucket to serve static content. -- Advantages: Scalable and reliable hosting. - -### Conclusion - -Deploying your Jekyll site can be done easily using various platforms like GitHub Pages, Netlify, and Amazon S3. Each option offers different features and advantages, allowing you to choose the best solution for your needs. \ No newline at end of file diff --git a/docs/Jekyll/10-Troubleshooting.md b/docs/Jekyll/10-Troubleshooting.md deleted file mode 100644 index baaa64e1d..000000000 --- a/docs/Jekyll/10-Troubleshooting.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -id: best-practices-and-troubleshooting -title: Best Practices and Troubleshooting -sidebar_label: Best Practices and Troubleshooting -sidebar_position: 10 -tags: [jekyll, best practices, troubleshooting] -description: Learn best practices for developing Jekyll sites and how to troubleshoot common issues. ---- - -Building a Jekyll site involves more than just writing code. Following best practices and knowing how to troubleshoot issues can save you time and improve your site's quality. - -### Best Practices - -1. **Use Source Control:** Keep your project in a version control system like Git. -2. **Keep Dependencies Updated:** Regularly update your gems and plugins to the latest versions. -3. **Optimize for Performance:** Minimize and compress assets for faster load times. -4. **Backup Your Site:** Regularly backup your site data and configurations. - -### Troubleshooting Common Issues - -1. **Build Errors:** -- Solution: Check the error message and review your _config.yml and front matter for typos or missing values. - -2. **Missing Styles or Scripts:** -- Solution: Verify that your asset paths are correct and that the files are properly linked. - -3. **Deployment Issues:** -- Solution: Ensure your deployment settings are correctly configured and that your hosting platform supports static sites. - -### Conclusion - -Adhering to best practices and being prepared to troubleshoot common issues will make your Jekyll development process smoother and more efficient. By following these guidelines, you can build robust, maintainable, and high-performing static sites. \ No newline at end of file diff --git a/docs/Jekyll/_category_.json b/docs/Jekyll/_category_.json deleted file mode 100644 index 909145eb8..000000000 --- a/docs/Jekyll/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Jekyll", - "position": 30, - "link": { - "type": "generated-index", - "description": "Jekyll is a static site generator that simplifies the creation of websites. In this tutorial, you will learn how to efficiently build and customize static websites using Markdown, Liquid templates, and YAML front matter." - } -} \ No newline at end of file diff --git a/docs/Julia/Basicop.md b/docs/Julia/Basicop.md deleted file mode 100644 index c744d6357..000000000 --- a/docs/Julia/Basicop.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -id: operator-julia -title: Operator -sidebar_label: Julia Operator -sidebar_position: 3 -tags: [Julia, Operator, Datatype,Scope] ---- - -Operators are special symbols or keywords that are used to perform operations on variables and values. Julia supports a variety of operators, including arithmetic, comparison, logical, bitwise, and more. Here’s a detailed overview of the different types of operators available in Julia: - -### 1. Arithmetic Operators - -These operators are used to perform basic mathematical operations. - -- **Addition (`+`)**: Adds two operands. - ```julia - a + b - ``` -- **Subtraction (`-`)**: Subtracts the second operand from the first. - ```julia - a - b - ``` -- **Multiplication (`*`)**: Multiplies two operands. - ```julia - a * b - ``` -- **Division (`/`)**: Divides the numerator by the denominator. - ```julia - a / b - ``` -- **Integer Division (`÷`)**: Divides and returns the integer quotient. - ```julia - a ÷ b - ``` -- **Remainder (`%`)**: Returns the remainder of the division. - ```julia - a % b - ``` -- **Power (`^`)**: Raises the first operand to the power of the second. - ```julia - a ^ b - ``` -- **Negation (`-`)**: Negates the value. - ```julia - -a - ``` - -### 2. Comparison Operators - -These operators compare two values and return a Boolean value. - -- **Equal (`==`)**: Checks if two operands are equal. - ```julia - a == b - ``` -- **Not Equal (`!=` or `≠`)**: Checks if two operands are not equal. - ```julia - a != b - ``` -- **Greater Than (`>`)**: Checks if the first operand is greater than the second. - ```julia - a > b - ``` -- **Less Than (`<`)**: Checks if the first operand is less than the second. - ```julia - a < b - ``` -- **Greater Than or Equal To (`>=`)**: Checks if the first operand is greater than or equal to the second. - ```julia - a >= b - ``` -- **Less Than or Equal To (`<=`)**: Checks if the first operand is less than or equal to the second. - ```julia - a <= b - ``` - -### 3. Logical Operators - -These operators are used to perform logical operations and return a Boolean value. - -- **Logical AND (`&&`)**: Returns true if both operands are true. - ```julia - a && b - ``` -- **Logical OR (`||`)**: Returns true if either operand is true. - ```julia - a || b - ``` -- **Logical NOT (`!`)**: Negates the Boolean value. - ```julia - !a - ``` - -### 4. Bitwise Operators - -These operators perform bitwise operations on integer operands. - -- **Bitwise AND (`&`)**: Performs a bitwise AND operation. - ```julia - a & b - ``` -- **Bitwise OR (`|`)**: Performs a bitwise OR operation. - ```julia - a | b - ``` -- **Bitwise XOR (`⊻`)**: Performs a bitwise XOR operation. - ```julia - a ⊻ b - ``` -- **Bitwise NOT (`~`)**: Performs a bitwise NOT operation. - ```julia - ~a - ``` -- **Left Shift (`<<`)**: Shifts the bits of the first operand left by the number of positions specified by the second operand. - ```julia - a << b - ``` -- **Right Shift (`>>`)**: Shifts the bits of the first operand right by the number of positions specified by the second operand. - ```julia - a >> b - ``` - -### 5. Element-wise Operators - -These operators perform element-wise operations on arrays. - -- **Element-wise Addition (`.+`)**: Adds corresponding elements of two arrays. - ```julia - A .+ B - ``` -- **Element-wise Subtraction (`.-`)**: Subtracts corresponding elements of two arrays. - ```julia - A .- B - ``` -- **Element-wise Multiplication (`.*`)**: Multiplies corresponding elements of two arrays. - ```julia - A .* B - ``` -- **Element-wise Division (`./`)**: Divides corresponding elements of two arrays. - ```julia - A ./ B - ``` -- **Element-wise Power (`.^`)**: Raises each element of the first array to the power of the corresponding element in the second array. - ```julia - A .^ B - ``` - -### 6. Assignment Operators - -These operators are used to assign values to variables. - -- **Assignment (`=`)**: Assigns the right-hand side value to the left-hand side variable. - ```julia - a = b - ``` -- **Addition Assignment (`+=`)**: Adds the right-hand side value to the left-hand side variable and assigns the result to the left-hand side variable. - ```julia - a += b - ``` -- **Subtraction Assignment (`-=`)**: Subtracts the right-hand side value from the left-hand side variable and assigns the result to the left-hand side variable. - ```julia - a -= b - ``` -- **Multiplication Assignment (`*=`)**: Multiplies the left-hand side variable by the right-hand side value and assigns the result to the left-hand side variable. - ```julia - a *= b - ``` -- **Division Assignment (`/=`)**: Divides the left-hand side variable by the right-hand side value and assigns the result to the left-hand side variable. - ```julia - a /= b - ``` - -### 7. Special Operators - -- **Range (`:`)**: Creates a range of numbers. - ```julia - 1:10 - ``` -- **Concatenation (`vcat`, `hcat`, `cat`)**: Concatenates arrays vertically or horizontally. - ```julia - vcat(A, B) - hcat(A, B) - ``` - -### Custom Operators - -Julia also allows you to define your own operators. This is done by defining a function using a custom operator symbol. - -```julia -import Base: + # Import the Base operator - -# Define a custom addition operator for a custom type -+(a::MyType, b::MyType) = MyType(a.value + b.value) -``` - -### Conclusion - -Understanding and using operators effectively is crucial for writing efficient and readable Julia code. Each type of operator has its own set of rules and use cases, and mastering them can greatly enhance your programming skills in Julia. \ No newline at end of file diff --git a/docs/Julia/Intro.md b/docs/Julia/Intro.md deleted file mode 100644 index 9971ae415..000000000 --- a/docs/Julia/Intro.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -id: intro-julia -title: Introduction to JULIA -sidebar_label: Introduction to Julia -sidebar_position: 1 -tags: [Julia, Feature, Uses] ---- - -Julia is a relatively new, open-source programming language gaining popularity for its unique blend of features. - -## Basic Overview - -- **Developed in 2012**: Designed by a team at MIT, aiming to bridge the gap between ease of use (like Python) and speed (like C/C++). -- **High-Level and Dynamic**: Similar to Python, Julia allows for interactive coding and dynamic typing (variable types determined at runtime). -- **Just-in-Time (JIT) Compiled**: Improves performance by compiling code into machine code at runtime, approaching the speed of compiled languages like C. -- **Multiple Dispatch**: Functions can have different implementations based on argument types, leading to concise and efficient code. - -## Features - -- **Rich Standard Library**: Julia includes built-in functionality for linear algebra, differential equations, scientific computing, and more. -- **Powerful Metaprogramming**: Allows for creating custom functions and manipulating code structure at runtime. -- **Excellent Package Ecosystem**: A rapidly growing collection of community-developed packages for various domains like machine learning, data science, and web development. -- **Focus on Performance**: Designed for efficiency, making it ideal for computationally intensive tasks often found in scientific computing and data analysis. - -## Uses and Applications - -- **Scientific Computing**: Widely used for numerical simulations, modeling, and data analysis in physics, chemistry, biology, and other scientific fields. -- **Machine Learning** :Growing popularity for implementing machine learning algorithms, building deep learning models, and conducting research in this area. -- **Data Science** : Useful for data manipulation, cleaning, visualization, and statistical analysis, especially for large datasets. -- **High-Performance Computing** : Leveraged for tasks requiring high computational power, such as financial modeling, weather forecasting, and climate simulations. -- **Web Development** : While not its primary focus, Julia can be used for web development with frameworks like Genie.jl and web server integration tools. - -## Benefits - -- **Fast and Efficient** : Can handle complex calculations significantly faster than interpreted languages like Python. -- **Easy to Learn and Use** : Syntax is similar to other popular languages, making it accessible for programmers with experience in Python, R, or MATLAB. -- **Productive and Flexible** : Allows for rapid prototyping and efficient coding due to its features and rich ecosystem. -- **Open-Source and Community-Driven** : Constant development and a growing community ensure continuous improvement and support. - -Overall, Julia is a powerful and versatile language well-suited for scientific computing, data science, machine learning, and other computationally intensive tasks. Its focus on performance, combined with its ease of use and rich ecosystem, makes it a valuable tool for researchers, scientists, and developers alike. \ No newline at end of file diff --git a/docs/Julia/_category_.json b/docs/Julia/_category_.json deleted file mode 100644 index b8d76b172..000000000 --- a/docs/Julia/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Julia", - "position": 12, - "link": { - "type": "generated-index", - "description": "Julia is a powerful and versatile programming language gaining popularity for its focus on scientific computing, data science, and machine learning" - } -} \ No newline at end of file diff --git a/docs/Julia/dicti.md b/docs/Julia/dicti.md deleted file mode 100644 index 8349a0456..000000000 --- a/docs/Julia/dicti.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -id: dictionary-julia -title: Dictionary -sidebar_label: Julia Dictionary -sidebar_position: 8 -tags: [Julia,Dictionary] - ---- -Dictionary is a built-in data structure that allows you to associate keys with corresponding values. It is similar to a hash table or hash map in other programming languages. Dictionaries are particularly useful when you need to store and retrieve data quickly based on some unique identifier (the key). - -### Creating a Dictionary - -You can create a dictionary in Julia using curly braces `{}` and specifying key-value pairs separated by `=>` (called a pair constructor). Here’s how you can create a dictionary: - -```julia -# Creating a dictionary with city names as keys and their populations as values -city_populations = Dict("New York" => 8336817, "Los Angeles" => 3979576, "Chicago" => 2693976) -``` -Certainly! Here's an additional important note about dictionaries in Julia: - -### Dictionary Keys and Types - -In Julia, keys in a dictionary must be of a type that is both **hashable** and **immutable**. This requirement ensures that dictionaries can efficiently manage and retrieve values based on their keys. - -#### Hashable and Immutable Keys: - -1. **Hashable**: This means that the type of the key must have a stable and consistent way to compute its hash value. Most built-in types in Julia, such as `Int`, `String`, `Symbol`, and `Tuple` (if their elements are hashable), are hashable by default. - - Example of hashable types: - - `Int` - - `String` - - `Symbol` - - `Tuple` (if elements are hashable) - -2. **Immutable**: Once a key is placed in a dictionary, its value should not be able to change. This ensures that the hash value remains consistent. Immutable types in Julia include basic types like `Int`, `Float64`, `String`, and `Tuple`. - - Example of immutable types: - - `Int` - - `Float64` - - `String` - - `Tuple` - -#### Example - -Some types in Julia are mutable or do not have a stable hash computation, making them unsuitable as dictionary keys: - -- `Array`: Arrays are mutable and can change their contents, so they cannot be used as dictionary keys. -- `Dict`: Dictionaries themselves cannot be keys in other dictionaries due to mutability. -- Custom mutable types: If you define a custom type that is mutable, you need to ensure it implements proper hashing methods (`hash()` function) for it to be used as a dictionary key. - -#### Example - -Here’s an example illustrating the use of types as dictionary keys: - -```julia -# Valid keys -dict_valid = Dict(1 => "One", "two" => 2.0, (3, "three") => "Tuple key") - -# Invalid keys (will throw an error) -dict_invalid = Dict([1, 2, 3] => "Array key") -``` - -In this example: -- `1`, `"two"`, and `(3, "three")` are valid keys because they are of types that are hashable and immutable. -- `[1, 2, 3]` is an invalid key because arrays are mutable in Julia. - -### Accessing Values in a Dictionary - -To access a value in the dictionary, you use square brackets `[]` with the key: - -```julia -println(city_populations["New York"]) # Output: 8336817 -``` - -If the key doesn't exist in the dictionary, Julia will throw a `KeyError`. - -### Adding and Modifying Entries - -You can add new entries or modify existing ones in a dictionary using the same square bracket notation: - -```julia -city_populations["Houston"] = 2320268 # Adding a new entry -city_populations["Chicago"] = 2716000 # Modifying an existing entry -``` - -### Removing Entries - -To remove an entry from a dictionary, use the `delete!()` function: - -```julia -delete!(city_populations, "Los Angeles") -``` - -### Checking Key Existence - -You can check if a key exists in a dictionary using the `haskey()` function: - -```julia -if haskey(city_populations, "New York") - println("New York is in the dictionary.") -end -``` - -### Iterating Over a Dictionary - -You can iterate over all key-value pairs in a dictionary using a `for` loop: - -```julia -for (city, population) in city_populations - println("$city has a population of $population") -end -``` - -### Dictionary Methods - -Julia provides several useful functions to work with dictionaries: - -- `keys(dict)`: Returns an iterator over the keys of the dictionary. -- `values(dict)`: Returns an iterator over the values of the dictionary. -- `isempty(dict)`: Returns `true` if the dictionary is empty, `false` otherwise. -- `merge!(dict1, dict2)`: Merges `dict2` into `dict1`, modifying `dict1`. - -### Example Code and Output - -Here’s a complete example demonstrating the use of dictionaries in Julia: - -```julia -# Creating a dictionary -city_populations = Dict("New York" => 8336817, "Los Angeles" => 3979576, "Chicago" => 2693976) - -# Accessing a value -println(city_populations["New York"]) # Output: 8336817 - -# Adding a new entry -city_populations["Houston"] = 2320268 - -# Modifying an existing entry -city_populations["Chicago"] = 2716000 - -# Removing an entry -delete!(city_populations, "Los Angeles") - -# Iterating over the dictionary -for (city, population) in city_populations - println("$city has a population of $population") -end - -# Checking key existence -if haskey(city_populations, "New York") - println("New York is in the dictionary.") -end -``` - -#### Output: -``` -New York has a population of 8336817 -Chicago has a population of 2716000 -Houston has a population of 2320268 -New York is in the dictionary. -``` - -### Conclusion - Dictionary data structure in Julia offers a powerful mechanism for associating keys with corresponding values, akin to hash maps or associative arrays in other languages. It allows for efficient storage and retrieval of data pairs, accommodating keys of any immutable type and values of any type. Operations like insertion, deletion, and updating of entries are straightforward and optimized for performance. Iteration over keys and values, along with methods for checking existence and merging dictionaries, further enhance its utility. Overall, Dictionary in Julia is indispensable for managing and manipulating structured data, providing flexibility and efficiency in various programming contexts. Its versatility makes it well-suited for tasks ranging from simple data mappings to complex data aggregation and manipulation operations. \ No newline at end of file diff --git a/docs/Julia/functi.md b/docs/Julia/functi.md deleted file mode 100644 index 9232d18f8..000000000 --- a/docs/Julia/functi.md +++ /dev/null @@ -1,166 +0,0 @@ ---- -id: function-julia -title: Function -sidebar_label: Julia Function -sidebar_position: 9 -tags: [Julia,Function] - ---- - -In Julia, functions are first-class citizens, meaning they can be assigned to variables, passed as arguments, and returned from other functions. Functions can be defined using the `function` keyword or using the shorter, anonymous function syntax. - -### Syntax - -#### Defining a function with the `function` keyword: - -```julia -function function_name(arguments) - # function body -end -``` - -#### Defining a function using the shorter syntax: - -```julia -function_name(arguments) = expression -``` - -### Example -```julia -# Using the function keyword -function factorial(n::Int) - if n == 0 - return 1 - else - return n * factorial(n - 1) - end -end - -# Using the shorter syntax -factorial_short(n::Int) = n == 0 ? 1 : n * factorial_short(n - 1) -``` - -### Calling the Function - -```julia -println(factorial(5)) # Output: 120 -println(factorial_short(5)) # Output: 120 -``` - - -1. **Function Definition**: - - The `factorial` function is defined using the `function` keyword. It takes an integer `n` as an argument and returns the factorial of `n`. - - The `factorial_short` function does the same but is defined using the shorter syntax. - -2. **Base Case**: - - Both functions check if `n` is 0. If true, they return 1, as the factorial of 0 is 1. - -3. **Recursive Case**: - - If `n` is not 0, the functions call themselves with `n-1` and multiply the result by `n`. - -4. **Calling the Function**: - - We call the `factorial` and `factorial_short` functions with the argument `5` and print the results. Both functions return `120`, which is the factorial of 5. - -### Output -```julia -120 -120 -``` - -### **Important Notes** - -1. Multiple Dispatch - - Julia supports multiple dispatch, which means that you can define multiple methods for the same function name, each with different argument types. The appropriate method is selected based on the types of the arguments passed. - - ```julia - function greet(name::String) - println("Hello, $name!") - end - - function greet(age::Int) - println("You are $age years old.") - end - - greet("Alice") # Output: Hello, Alice! - greet(30) # Output: You are 30 years old. - ``` - -2. Type Annotations - - While type annotations for function arguments are optional, they can be used to restrict the types of inputs a function can accept, and to provide better performance through type stability. - - ```julia - function add(x::Int, y::Int)::Int - return x + y - end - - println(add(2, 3)) # Output: 5 - ``` - -3. Varargs - - Julia functions can accept a variable number of arguments using the `...` syntax. - - ```julia - function sum_all(args...) - sum = 0 - for arg in args - sum += arg - end - return sum - end - - println(sum_all(1, 2, 3, 4, 5)) # Output: 15 - ``` - -4. Anonymous Functions - - Functions can be defined anonymously using the `->` syntax. These are useful for short, throwaway functions. - - ```julia - add = (x, y) -> x + y - println(add(5, 7)) # Output: 12 - ``` - -5. Higher-Order Functions - - Functions in Julia can take other functions as arguments or return functions. This makes Julia a powerful language for functional programming. - - ```julia - function apply_twice(f, x) - return f(f(x)) - end - - double(x) = 2 * x - println(apply_twice(double, 3)) # Output: 12 - ``` - -6. Performance Considerations - - Julia is designed for high performance, and writing type-stable functions (where the types of variables are predictable) can help the Julia compiler generate optimized code. - - Use the `@inline` and `@noinline` macros to give the compiler hints about inlining functions, which can sometimes improve performance. - - ```julia - @inline function fast_add(x, y) - return x + y - end - ``` - -7. Documentation - - Functions can be documented using triple-quoted strings. This documentation can be accessed via the REPL using the `?` help mode. - - ```julia - """ - Compute the factorial of a number. - - # Arguments - - `n::Int`: The number to compute the factorial of. - - # Returns - - `Int`: The factorial of `n`. - """ - function factorial(n::Int) - if n == 0 - return 1 - else - return n * factorial(n - 1) - end - end - ``` -## Conclusion -Julia is a high-performance, high-level programming language designed for technical and scientific computing. Its unique feature set, including multiple dispatch, type annotations, and a focus on type stability, allows for writing clear and efficient code. Julia's syntax is simple and expressive, making it easy for beginners to learn, while its powerful features like metaprogramming and parallel computing cater to advanced users. The language's ability to call C and Python libraries seamlessly enhances its versatility. Overall, Julia strikes a balance between the ease of dynamic languages and the performance of compiled languages, making it an excellent choice for a wide range of applications, from data science and machine learning to computational biology and physics. \ No newline at end of file diff --git a/docs/Julia/int.md b/docs/Julia/int.md deleted file mode 100644 index 14fcbf71e..000000000 --- a/docs/Julia/int.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -id: floting-and-integer-number -title: Integers and Floating Point Numbers -sidebar_label: Integers and Floating Point Numbers -sidebar_position: 11 -tags: [Julia,Integers Point Number,Floating Point Number] ---- - -In Julia, integers and floating-point numbers are fundamental data types used for numerical computations. - -### Integers - -Integers in Julia are used to represent whole numbers. They can be signed (positive, negative, or zero) or unsigned (non-negative integers). Julia supports various sizes of integers based on the system architecture: - -- **Signed Integers**: These can represent both positive and negative numbers. - - `Int8`: 8-bit signed integer (-128 to 127) - - `Int16`: 16-bit signed integer (-32,768 to 32,767) - - `Int32`: 32-bit signed integer (-2,147,483,648 to 2,147,483,647) - - `Int64`: 64-bit signed integer (-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807) - - `Int128`: 128-bit signed integer - - -**Example** - -Signed integers in Julia can represent both positive and negative numbers. -- **Signed Integers**: `a`, `b`, and `c` are defined as signed integers (`Int64` by default for `a` and `b`, explicitly `Int16` for `c`). Arithmetic operations like addition (`+`), subtraction (`-`), and multiplication (`*`) are demonstrated. - -```julia -# Signed integers -a = 10 # Int64 by default -b = -3 # Int64 by default -c::Int16 = 5 # Explicitly define as Int16 - -println("Signed Integers:") -println("a = ", a, ", typeof(a) = ", typeof(a)) -println("b = ", b, ", typeof(b) = ", typeof(b)) -println("c = ", c, ", typeof(c) = ", typeof(c)) - -# Arithmetic operations -println("a + b = ", a + b) -println("a - b = ", a - b) -println("a * c = ", a * c) -``` - -- **Unsigned Integers**: These represent non-negative numbers only. - - `UInt8`: 8-bit unsigned integer (0 to 255) - - `UInt16`: 16-bit unsigned integer (0 to 65,535) - - `UInt32`: 32-bit unsigned integer (0 to 4,294,967,295) - - `UInt64`: 64-bit unsigned integer (0 to 18,446,744,073,709,551,615) - - `UInt128`: 128-bit unsigned integer - -**Example** - -Unsigned integers in Julia represent non-negative numbers. -- **Unsigned Integers**: `x` and `y` are defined as unsigned integers (`UInt8` and `UInt32`, respectively). Unsigned integers can only represent non-negative numbers, and arithmetic operations behave accordingly. Note that subtraction between unsigned integers that would result in a negative number will throw an error. - -```julia -# Unsigned integers -x::UInt8 = 200 # Define as UInt8 (0 to 255) -y::UInt32 = 500 # Define as UInt32 (0 to 4,294,967,295) - -println("\nUnsigned Integers:") -println("x = ", x, ", typeof(x) = ", typeof(x)) -println("y = ", y, ", typeof(y) = ", typeof(y)) - -# Arithmetic operations (note: cannot have negative results) -println("x + y = ", x + y) -println("x - y = ", x - y) # This will give an error since result would be negative -println("x * y = ", x * y) -``` - -### Floating-Point Numbers - -Floating-point numbers in Julia are used to represent real numbers with a fractional component. Julia supports two main types of floating-point numbers: - -- **Float16**: 16-bit floating-point number (half precision). -- **Float32**: 32-bit floating-point number (single precision). -- **Float64**: 64-bit floating-point number (double precision), which is the default and most commonly used for numerical calculations in Julia. - -### Numeric Operations - -Julia supports standard arithmetic operations (`+`, `-`, `*`, `/`) for both integers and floating-point numbers. - -```julia -# Integers -a = 10 -b = 3 -println(a + b) # Addition -println(a - b) # Subtraction -println(a * b) # Multiplication -println(a ÷ b) # Integer division -println(a % b) # Modulus (remainder) - -# Floating-point numbers -x = 3.5 -y = 2.0 -println(x + y) # Addition -println(x - y) # Subtraction -println(x * y) # Multiplication -println(x / y) # Division -``` - -### Type Conversion - -Julia allows for type conversion between integers and floating-point numbers using type constructors. - -```julia -# Convert integer to float -x = 10 -y = Float64(x) -println(y) - -# Convert float to integer (truncating decimal part) -z = Int64(3.7) -println(z) -``` - -### Numerical Constants - -Julia provides built-in constants for common numeric values: - -- `π` (pi): The mathematical constant pi (approximately 3.14159). -- `e`: The base of the natural logarithm (approximately 2.71828). - -```julia -println(π) -println(e) -``` - -### Numeric Values - -Julia supports special values like `Inf` (infinity), `-Inf` (negative infinity), and `NaN` (Not a Number) for handling exceptional cases in computations. - -```julia -println(1 / 0) # Infinity -println(-1 / 0) # Negative Infinity -println(0 / 0) # NaN (Not a Number) -``` - -### Division errors - -#### Integer Division Error - -When performing division between integers, especially when trying to divide by zero, you might encounter specific errors. - -```julia -a = 10 -b = 0 - -# Attempting division -result = a / b # This will result in a `DivideError` in Julia -``` - -In Julia, dividing by zero (`0`) with integers will raise a `DivideError`. To avoid this error, you can use error handling techniques like `try-catch` blocks. - -```julia -try - result = a / b -catch ex - println("Error occurred: ", ex) -end -``` - -#### Floating-Point Division - -When working with floating-point numbers (`Float64` in Julia by default), dividing by zero results in a special floating-point value. - -```julia -x = 3.0 -y = 0.0 - -result = x / y # This will result in `Inf` (infinity) or `-Inf` (negative infinity) -``` - -In this case, the result will be `Inf` (infinity) if dividing a positive number by zero, or `-Inf` (negative infinity) if dividing a negative number by zero. If you need to handle such cases differently, you can check for infinity using `isinf()` function. - -```julia -if isinf(result) - println("Result is infinite") -else - println("Result is ", result) -end -``` - -#### Division by Nearly Zero - -Sometimes, divisions involving very small numbers can result in `Inf` or `-Inf` due to floating-point precision limitations. - -```julia -z = 1e-100 -result = 1.0 / z # This may result in `Inf` due to precision limits -``` - -In such cases, it's important to understand the numerical precision of your calculations and ensure your code handles these edge cases appropriately. - - -### Conclusion - -Understanding how Julia handles integers and floating-point numbers is crucial for writing efficient and accurate numerical computations. Julia's flexible type system and high-performance capabilities make it well-suited for scientific computing and data analysis tasks. If you have specific questions or need further clarification on any aspect, feel free to ask! \ No newline at end of file diff --git a/docs/Julia/loop.md b/docs/Julia/loop.md deleted file mode 100644 index b0ff86abe..000000000 --- a/docs/Julia/loop.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -id: flow_control-julia -title: Flow Control -sidebar_label: Julia Flow Control -sidebar_position: 10 -tags: [Julia,Flow control] ---- - -Julia provides a range of flow control constructs, including standard conditional statements (`if`, `else`, `elseif`) and loops (`for`, `while`). It supports short-circuit evaluation with `&&` and `||` operators, and offers powerful iteration tools such as comprehensions and the `@inbounds` macro for optimizing loop performance. These constructs enable the writing of clear and efficient control flows in programs. - -### Julia Flow Control with Examples and Output - -#### Conditional Statements - -**if, elseif, else** -We can also use if, elseif, and else for conditions execution. The only condition is that all the conditional construction should finish with end. -```julia -function check_number(x) - if x > 0 - return "Positive" - elseif x < 0 - return "Negative" - else - return "Zero" - end -end - -println(check_number(10)) # Output: Positive -println(check_number(-5)) # Output: Negative -println(check_number(0)) # Output: Zero -``` - -#### Loops - -**for Loop** -Some of the common example of iteration are − -- working through a list or -- set of values or -- from a start value to a finish value. -We can iterate through various types of objects like arrays, sets, dictionaries, and strings by using “for” loop (for…end construction). -```julia -function print_numbers(n) - for i in 1:n - println(i) - end -end - -print_numbers(5) # Output: 1 2 3 4 5 (each number on a new line) -``` - -**while Loop** -We use while loops to repeat some expressions while a condition is true. The construction is like while…end. -```julia -function countdown(n) - while n > 0 - println(n) - n -= 1 - end - println("Blast off!") -end - -countdown(5) # Output: 5 4 3 2 1 Blast off! (each number on a new line) -``` - -#### Short-Circuit Evaluation - -**&& and || Operators** -If this operator is used in the Boolean switching expression, the second expression will be evaluated if the first condition is true. If the first condition is false, the expression will not be evaluated and only the condition will be returned - -If this operator is used in the Boolean switching expression, the second expression will be evaluated only if the first condition is false. If the first condition is true, then there is no need to evaluate the second expression. -```julia -function short_circuit_example(a, b) - if a > 0 && b > 0 - return "Both are positive" - elseif a > 0 || b > 0 - return "At least one is positive" - else - return "Neither is positive" - end -end - -println(short_circuit_example(1, 2)) # Output: Both are positive -println(short_circuit_example(1, -1)) # Output: At least one is positive -println(short_circuit_example(-1, -2)) # Output: Neither is positive -``` - -#### Comprehensions -Generating and collecting items something like [n for n in 1:5] is called array comprehensions. It is sometimes called list comprehensions too. -**Array Comprehension** - -```julia -squares = [x^2 for x in 1:5] -println(squares) # Output: [1, 4, 9, 16, 25] -``` - -#### @inbounds Macro - -**Optimizing Loop Performance** - -```julia -function sum_array(arr) - s = 0 - @inbounds for i in 1:length(arr) - s += arr[i] - end - return s -end - -println(sum_array([1, 2, 3, 4, 5])) # Output: 15 -``` - -### Important Note - -Julia's flow control constructs, such as conditional statements (`if`, `elseif`, `else`), loops (`for`, `while`), and short-circuit evaluation (`&&`, `||`), are essential for structuring program logic efficiently. It's crucial to leverage Julia's array comprehensions and the `@inbounds` macro for optimizing performance, especially in numerical and scientific computing tasks where performance is critical. Understanding these constructs and their optimal use can significantly enhance code readability and execution speed in Julia programs. - -### Conclusion -Mastering Julia's robust flow control constructs is pivotal for writing efficient and readable code. Whether using conditional statements for decision-making, loops for iterative tasks, or leveraging short-circuit evaluation and array comprehensions for streamlined operations, Julia provides powerful tools to handle diverse programming challenges effectively. Optimizing performance with tools like the `@inbounds` macro further enhances Julia's capability to tackle complex computations seamlessly. Overall, proficiency in Julia's flow control empowers developers to achieve both clarity and efficiency in their code, making it a versatile choice for scientific computing and beyond. - diff --git a/docs/Julia/math.md b/docs/Julia/math.md deleted file mode 100644 index b16040c64..000000000 --- a/docs/Julia/math.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -id: math-julia -title: Baic Maths Operations -sidebar_label: Baic Maths Operations -sidebar_position: 5 -tags: [Julia,Baic Maths Operations,constant] - ---- -Julia is a high-level, high-performance programming language known for its speed and simplicity in numerical and scientific computing. Let's delve into some basic mathematical functions in Julia . - -### Basic Arithmetic Operations - -Julia supports all basic arithmetic operations: addition, subtraction, multiplication, and division. Here’s how you can use them: - -```julia -# Addition -result_add = 10 + 5 -println("Addition:", result_add) # Output: Addition: 15 - -# Subtraction -result_sub = 10 - 5 -println("Subtraction:", result_sub) # Output: Subtraction: 5 - -# Multiplication -result_mul = 10 * 5 -println("Multiplication:", result_mul) # Output: Multiplication: 50 - -# Division -result_div = 10 / 5 -println("Division:", result_div) # Output: Division: 2.0 -``` - -### Exponentiation and Square Root - -Julia provides functions for exponentiation (`^`) and square root (`sqrt()`): - -```julia -# Exponentiation -result_exp = 2 ^ 3 -println("Exponentiation:", result_exp) # Output: Exponentiation: 8 - -# Square root -result_sqrt = sqrt(9) -println("Square Root:", result_sqrt) # Output: Square Root: 3.0 -``` - -### Trigonometric Functions - -Julia includes standard trigonometric functions like `sin()`, `cos()`, and `tan()`. These functions expect arguments in radians: - -```julia -# Trigonometric functions (radians) -angle_rad = π / 4 # π (pi) is a predefined constant in Julia -sin_value = sin(angle_rad) -cos_value = cos(angle_rad) -tan_value = tan(angle_rad) - -println("Sine:", sin_value) # Output: Sine: 0.7071067811865476 -println("Cosine:", cos_value) # Output: Cosine: 0.7071067811865476 -println("Tangent:", tan_value) # Output: Tangent: 0.9999999999999999 -``` - -### Logarithmic Functions - -Julia supports natural logarithm (`log()`) and base-10 logarithm (`log10()`): - -```julia -# Logarithmic functions -log_value = log(10) -log10_value = log10(100) - -println("Natural Logarithm:", log_value) # Output: Natural Logarithm: 2.302585092994046 -println("Base-10 Logarithm:", log10_value) # Output: Base-10 Logarithm: 2.0 -``` - -### Constants - -Julia provides constants like `π` (pi) and `e` (Euler's number): - -```julia -println("π (pi):", π) # Output: π (pi): 3.1415926535897... -println("e (Euler's number):", ℯ) # Output: e (Euler's number): 2.7182818284590... -``` - -### Example - -```julia -# Compute the area of a circle with radius 5 -radius = 5 -area = π * radius^2 - -println("Radius:", radius) -println("Area of the circle:", area) # Output: Area of the circle: 78.53981633974483 -``` - -These examples demonstrate some of the basic mathematical functions available in Julia. Julia’s simplicity and performance make it an excellent choice for scientific computing and numerical analysis tasks. \ No newline at end of file diff --git a/docs/Julia/rational.md b/docs/Julia/rational.md deleted file mode 100644 index 556d76564..000000000 --- a/docs/Julia/rational.md +++ /dev/null @@ -1,219 +0,0 @@ ---- -id: rational-and-complex-numbers -title: Rational and Complex Numbers -sidebar_label: Rational and Complex Numbers -sidebar_position: 12 -tags: [Julia,Rational Numbers,Complex Numbers] ---- - - -## Rational Numbers -In Julia, rational numbers are represented using the `Rational` type, which allows for exact representation of fractions. This is particularly useful in situations where precise fractional calculations are necessary to avoid the potential rounding errors inherent in floating-point arithmetic. - -### Creating Rational Numbers - -You can create a `Rational` number in Julia using the `//` operator, which constructs a fraction from two integers. - -```julia -# Create a rational number -r = 2 // 3 - -# Display the rational number -println(r) # Output: 2//3 -``` - -In this example, `2 // 3` creates a `Rational` number representing \( \frac{2}{3} \). - -### Operations with Rational Numbers - -Rational numbers support standard arithmetic operations (`+`, `-`, `*`, `/`, `^` for exponentiation) as well as comparison operations (`==`, `<`, `>`, `<=`, `>=`). - -```julia -# Define two rational numbers -r1 = 1 // 2 -r2 = 3 // 4 - -# Arithmetic operations -println(r1 + r2) # Output: 5//4 (1 + 3/4) -println(r1 * r2) # Output: 3//8 (1/2 * 3/4) -println(r1 ^ 3) # Output: 1//8 (1/2)^3 - -# Comparison -println(r1 < r2) # Output: true (1/2 < 3/4) -``` - -### Conversion to Floating-Point - -You can convert a `Rational` number to a floating-point number (`Float64` by default) using the `float()` function. - -```julia -r = 2 // 3 -f = float(r) - -println(f) # Output: 0.6666666666666666 -``` - -### Operations Mixing Rational and Floating-Point - -When performing operations between rational and floating-point numbers, Julia automatically promotes the rational number to a floating-point number to ensure consistent types throughout the calculation. - -```julia -r = 1 // 2 -x = 3.0 - -println(r + x) # Output: 3.5 (1/2 + 3.0) -println(r * x) # Output: 1.5 (1/2 * 3.0) -``` - -## Complex Numbers -In Julia, complex numbers are represented using the `Complex` type. Complex numbers consist of a real part and an imaginary part, both of which are floating-point numbers. Here’s how you can work with complex numbers in Julia: - -### Creating Complex Numbers - -You can create a complex number in Julia using the `Complex` constructor or by using the `im` constant for the imaginary unit (`im`). - -```julia -# Using the Complex constructor -z1 = Complex(1.0, 2.0) # 1.0 + 2.0im - -# Using the im constant -z2 = 3.0 + 4.0im # 3.0 + 4.0im - -# Display the complex numbers -println(z1) -println(z2) -``` - -### Operations with Complex Numbers - -Julia supports standard arithmetic operations (`+`, `-`, `*`, `/`, `^` for exponentiation) for complex numbers. - -```julia -z1 = 1.0 + 2.0im -z2 = 3.0 - 4.0im - -# Arithmetic operations -println(z1 + z2) # Output: 4.0 - 2.0im -println(z1 * z2) # Output: 11.0 - 2.0im -println(z1 / z2) # Output: -0.2 + 0.4im - -# Exponentiation -println(z1^2) # Output: -3.0 + 4.0im (squares z1) -``` - -### Accessing Real and Imaginary Parts - -You can access the real and imaginary parts of a complex number using the `real` and `imag` functions. - -```julia -z = 1.0 + 2.0im - -println(real(z)) # Output: 1.0 -println(imag(z)) # Output: 2.0 -``` - -### Conjugate and Absolute Value - -Julia provides functions to compute the conjugate (`conj`) and absolute value (`abs`) of a complex number. - -```julia -z = 3.0 - 4.0im - -println(conj(z)) # Output: 3.0 + 4.0im (conjugate of z) -println(abs(z)) # Output: 5.0 (absolute value of z) -``` - -### Conversion to Other Types - -You can convert a complex number to its components (real and imaginary parts) or convert it to a string representation using `string()` function. - -```julia -z = 1.0 + 2.0im - -println(real(z)) # Output: 1.0 -println(imag(z)) # Output: 2.0 - -println(string(z)) # Output: "1.0 + 2.0im" -``` - -## Imporatnt Note -### Rational Numbers (`Rational` Type) - -1. **Exact Representation**: Rational numbers in Julia (`Rational` type) provide an exact representation of fractions. This is particularly useful in situations where precision is critical, such as in financial calculations or when working with exact mathematical expressions. - -2. **Construction**: Rational numbers are constructed using the `//` operator, where `numerator // denominator` creates a `Rational` number. - - ```julia - r = 2 // 3 - ``` - -3. **Arithmetic**: Arithmetic operations on rational numbers preserve their exactness. Operations like addition, subtraction, multiplication, and division among rational numbers yield results that are also rational unless the operation introduces a non-rational number (like division by a non-divisible number). - - ```julia - r1 = 1 // 2 - r2 = 3 // 4 - - println(r1 + r2) # Output: 5//4 (1 + 3/4) - println(r1 * r2) # Output: 3//8 (1/2 * 3/4) - ``` - -4. **Conversion**: Rational numbers can be converted to floating-point numbers (`Float64` by default) using the `float()` function. This conversion may introduce rounding or precision issues. - - ```julia - r = 2 // 3 - f = float(r) - ``` - -### Complex Numbers (`Complex` Type) - -1. **Representation**: Complex numbers in Julia (`Complex` type) consist of a real part and an imaginary part (`real + imaginary * im`). They are used to represent numbers in the form `a + bi`, where `a` and `b` are real numbers, and `i` (or `im` in Julia) is the imaginary unit. - - ```julia - z = 1.0 + 2.0im - ``` - -2. **Arithmetic**: Arithmetic operations on complex numbers in Julia are performed naturally and respect the algebraic rules for complex arithmetic. - - ```julia - z1 = 1.0 + 2.0im - z2 = 3.0 - 4.0im - - println(z1 + z2) # Output: 4.0 - 2.0im - println(z1 * z2) # Output: 11.0 - 2.0im - ``` - -3. **Conjugate and Absolute Value**: Julia provides functions to compute the conjugate (`conj`) and absolute value (`abs`) of a complex number. - - ```julia - z = 3.0 - 4.0im - - println(conj(z)) # Output: 3.0 + 4.0im (conjugate of z) - println(abs(z)) # Output: 5.0 (absolute value of z) - ``` - -4. **Conversion**: Complex numbers can be converted to their real and imaginary parts using `real()` and `imag()` functions, respectively. They can also be converted to string representations using `string()`. - - ```julia - z = 1.0 + 2.0im - - println(real(z)) # Output: 1.0 - println(imag(z)) # Output: 2.0 - println(string(z)) # Output: "1.0 + 2.0im" - ``` - -### Use Cases - -- **Rational Numbers**: Use `Rational` numbers when exact fractional representation is needed, such as in financial calculations, precise mathematical expressions, or when avoiding floating-point rounding errors. - -- **Complex Numbers**: Use `Complex` numbers for computations involving imaginary numbers, such as in signal processing, quantum mechanics, and electrical engineering. - -### Considerations - -- **Performance**: While `Rational` numbers provide exactness, they may not be as performant as floating-point numbers (`Float64`) for large-scale computations due to the overhead of maintaining exact fractions. - -- **Complexity**: Complex numbers add complexity to computations, especially when dealing with algorithms that involve square roots, logarithms, or other non-linear functions. - - -## Conclusion - -Using `Rational` numbers in Julia provides precise representation for fractions and avoids the potential rounding errors associated with floating-point arithmetic. This is particularly useful in fields such as mathematics, finance, and any application requiring exact fractional calculations. Julia's support for complex numbers makes it suitable for scientific and engineering computations that involve complex arithmetic, such as signal processing, control systems, and quantum computing simulations. \ No newline at end of file diff --git a/docs/Julia/set.md b/docs/Julia/set.md deleted file mode 100644 index 99cf93e1d..000000000 --- a/docs/Julia/set.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -id: set-julia -title: Set -sidebar_label: Julia Set -sidebar_position: 7 -tags: [Julia, Set, Methods of Set] ---- - -In Julia, a `Set` is a collection of unique elements where each element can only appear once within the set. Sets are useful when you need to store a collection of items without duplicates and perform operations such as membership testing and set operations (like union, intersection, etc.). - -### Creating Sets - -You can create a set in Julia using curly braces `{}` and separating elements with commas. Let's create a set with some integers and strings: - -```julia -# Creating a set of integers -int_set = Set([1, 2, 3, 4, 5, 2, 3]) # Duplicate elements are automatically removed -println("Integer Set: ", int_set) - -# Creating a set of strings -str_set = Set(["apple", "banana", "orange", "banana"]) # Duplicate "banana" is removed -println("String Set: ", str_set) -``` - -**Output:** -```julia -Integer Set: Set([4, 2, 3, 5, 1]) -String Set: Set(["orange", "apple", "banana"]) -``` - -### Operations on Sets - -#### Membership Testing -You can check if an element is present in a set using the `in` operator: - -```julia -fruit_set = Set(["apple", "banana", "orange"]) - -println("Is 'apple' in fruit_set? ", "apple" in fruit_set) -println("Is 'grape' in fruit_set? ", "grape" in fruit_set) -``` - -**Output:** -```julia -Is 'apple' in fruit_set? true -Is 'grape' in fruit_set? false -``` - - -In Julia, a `Set` is a collection type that stores unique elements, where each element can only appear once within the set. Sets are useful when you need to ensure uniqueness of elements and perform operations like membership testing, union, intersection, and difference efficiently. - -### Methods and Functions for Sets in Julia - -#### 1. **Adding and Removing Elements** - -Sets in Julia are mutable, which means you can modify them by adding or removing elements. - -- **Adding elements**: Use the `push!()` function to add an element to a set. - -```julia -fruits = Set(["apple", "banana", "orange"]) -push!(fruits, "grape") -``` - -- **Removing elements**: Use the `pop!()` function to remove an element from a set. - -```julia -pop!(fruits, "banana") -``` - -#### 2. **Set Operations** - -Julia provides various functions for set operations. These functions can be called directly on sets or by using the infix operators `∪`, `∩`, and `-`. - -- **Union**: Combines elements from two sets, removing duplicates. - -```julia -set1 = Set([1, 2, 3]) -set2 = Set([3, 4, 5]) - -union_set = union(set1, set2) -``` - -Alternatively, using infix operator: - -```julia -union_set = set1 ∪ set2 -``` - -- **Intersection**: Finds common elements between two sets. - -```julia -intersection_set = intersect(set1, set2) -``` - -Alternatively, using infix operator: - -```julia -intersection_set = set1 ∩ set2 -``` - -- **Difference**: Finds elements in one set but not in another. - -```julia -difference_set = setdiff(set1, set2) -``` - -#### 3. **Membership Testing** - -You can check if an element is present in a set using the `in` keyword or the `in()` function. - -```julia -fruits = Set(["apple", "banana", "orange"]) - -if "apple" in fruits - println("Apple is in the set!") -end -``` - -#### 4. **Set Comparisons** - -You can compare sets using `==` and `isequal()` functions to check if two sets contain the same elements. - -```julia -set1 = Set([1, 2, 3]) -set2 = Set([3, 2, 1]) - -println(set1 == set2) # true -println(isequal(set1, set2)) # true -``` - -#### 5. **Set Size and Emptiness** - -You can get the number of elements in a set using `length()` function and check if a set is empty using `isempty()` function. - -```julia -println(length(set1)) -println(isempty(set1)) -``` - -### Example - -```julia -set1 = Set([1, 2, 3, 4]) -set2 = Set([3, 4, 5, 6]) - -println("Set 1: ", set1) -println("Set 2: ", set2) - -union_set = set1 ∪ set2 -println("Union: ", union_set) - -intersection_set = set1 ∩ set2 -println("Intersection: ", intersection_set) - -difference_set = setdiff(set1, set2) -println("Difference (Set 1 - Set 2): ", difference_set) - -push!(set1, 5) -println("After adding 5 to Set 1: ", set1) - -pop!(set2, 4) -println("After removing 4 from Set 2: ", set2) - -println("Is 3 in Set 1? ", 3 in set1) -println("Is 7 in Set 2? ", 7 in set2) - -println("Length of Set 1: ", length(set1)) -println("Is Set 2 empty? ", isempty(set2)) -``` - -**Output:** -```julia -Set 1: Set([4, 2, 3, 1]) -Set 2: Set([4, 3, 5, 6]) -Union: Set([4, 2, 3, 5, 6, 1]) -Intersection: Set([4, 3]) -Difference (Set 1 - Set 2): Set([2, 1]) -After adding 5 to Set 1: Set([4, 2, 3, 5, 1]) -After removing 4 from Set 2: Set([3, 5, 6]) -Is 3 in Set 1? true -Is 7 in Set 2? false -Length of Set 1: 5 -Is Set 2 empty? false -``` - - -### Conclusion - -Sets in Julia are versatile data structures for managing unique collections of elements. They offer efficient membership testing and set operations, making them suitable for various computational tasks where uniqueness and set operations are key requirements. \ No newline at end of file diff --git a/docs/Julia/str.md b/docs/Julia/str.md deleted file mode 100644 index 5984f9b52..000000000 --- a/docs/Julia/str.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -id: string-julia -title: String -sidebar_label: Julia String -sidebar_position: 4 -tags: [Julia, String,Raw Strings] ---- - - Julia is a high-level, high-performance dynamic programming language for technical computing. It is known for its speed, simplicity, and strong support for numerical computation and data science. Strings in Julia are sequences of characters enclosed in double quotes (`" "`). - -Here’s a more detailed explanation of strings in Julia with examples: - -### Creating Strings - -You can create a string in Julia using double quotes (`"`): - -```julia -str1 = "Hello, Julia!" -str2 = "12345" -str3 = "Unicode characters: β, √, ©" -``` - -### String Interpolation - -String interpolation allows you to embed Julia expressions directly into strings using `$`: - -```julia -name = "Alice" -age = 30 -message = "Hello, my name is $name and I am $age years old." -println(message) -``` - -Output: -``` -Hello, my name is Alice and I am 30 years old. -``` - -### String Concatenation - -You can concatenate strings using the `*` operator or the `string` function: - -```julia -str1 = "Hello" -str2 = "World" -str3 = str1 * ", " * str2 * "!" -println(str3) -``` - -Output: -``` -Hello, World! -``` - -### String Length - -To get the length of a string, use the `length` function: - -```julia -str = "Julia" -len = length(str) -println("Length of '$str' is $len") -``` - -Output: -``` -Length of 'Julia' is 5 -``` - -### Indexing and Slicing - -You can access individual characters of a string using indexing (1-based): - -```julia -str = "Julia" -first_char = str[1] # 'J' -println("First character: $first_char") -``` - -You can also slice strings to extract substrings: - -```julia -substring = str[2:4] # "uli" -println("Substring: $substring") -``` - -### String Functions - -Julia provides various functions to manipulate strings, such as `uppercase`, `lowercase`, `startswith`, `endswith`, `replace`, `strip`, etc. For example: - -```julia -str = " JuliaLang " -trimmed_str = strip(str) # "JuliaLang" -println("Trimmed: $trimmed_str") -``` - -### String Comparison - -You can compare strings using the standard comparison operators (`==`, `!=`, `<`, `>`, `<=`, `>=`): - -```julia -str1 = "apple" -str2 = "banana" -if str1 < str2 - println("$str1 comes before $str2") -else - println("$str1 comes after $str2") -end -``` - -Output: -``` -apple comes before banana -``` - -### Unicode Support - -Julia fully supports Unicode characters in strings, allowing you to work with international text and symbols seamlessly. - -### Raw Strings - -Julia also supports raw strings (verbatim strings) using triple quotes (`""" """`), which can span multiple lines and include escape sequences literally: - -```julia -raw_str = """This is a raw string. -It can include \n newlines and other escape sequences.""" -println(raw_str) -``` - -Output: -``` -This is a raw string. -It can include \n newlines and other escape sequences. -``` - -### Conclusion - -Strings in Julia are versatile and powerful, offering a wide range of functionalities for string manipulation, interpolation, slicing, and more. They are essential for handling text data in various computational tasks, from simple scripts to complex data analysis and processing algorithms. \ No newline at end of file diff --git a/docs/Julia/tuple.md b/docs/Julia/tuple.md deleted file mode 100644 index dd122aa9b..000000000 --- a/docs/Julia/tuple.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -id: tuple-julia -title: Tuple -sidebar_label: Julia Tuple -sidebar_position: 6 -tags: [Julia, Tuple, Operations] - ---- -In Julia, a tuple is an ordered collection of elements that can be of different types. Tuples are immutable, meaning once created, their elements cannot be changed. Tuples are useful for grouping a fixed number of elements together. - -### Creating a Tuple - -Here is an example of creating a tuple in Julia: - -```julia -# Creating a tuple with different types of elements -my_tuple = (1, "apple", 3.14, true) -``` - -### Accessing Elements - -You can access elements in a tuple using indexing, starting from 1: - -```julia -# Accessing elements in the tuple -first_element = my_tuple[1] -second_element = my_tuple[2] -``` - -### Example - -Let's look at a complete example with its output: - -```julia -# Creating a tuple -my_tuple = (1, "apple", 3.14, true) - -# Accessing elements -first_element = my_tuple[1] -second_element = my_tuple[2] -third_element = my_tuple[3] -fourth_element = my_tuple[4] - -# Printing elements -println("First element: ", first_element) -println("Second element: ", second_element) -println("Third element: ", third_element) -println("Fourth element: ", fourth_element) -``` - -#### Output - -``` -First element: 1 -Second element: apple -Third element: 3.14 -Fourth element: true -``` -### Additional Operations - -#### Tuple Length - -To get the length of a tuple: - -```julia -tuple_length = length(my_tuple) -println("Length of the tuple: ", tuple_length) -``` - -#### Output - -``` -Length of the tuple: 4 -``` - -#### Iterating Over a Tuple - -You can iterate over a tuple using a loop: - -```julia -for element in my_tuple - println(element) -end -``` - -#### Output - -``` -1 -apple -3.14 -true -``` -### Conclusion - -Tuples in Julia are useful for grouping different types of data into a single entity while maintaining the order of elements. They are immutable, which ensures the data integrity after the tuple is created. Tuples are particularly helpful when you need a lightweight structure to pass around a fixed collection of items without the overhead of an array or custom type. diff --git a/docs/Julia/vari.md b/docs/Julia/vari.md deleted file mode 100644 index cd05f9a57..000000000 --- a/docs/Julia/vari.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: variable-julia -title: Variable -sidebar_label: Julia Variable -sidebar_position: 2 -tags: [Julia, Variable, Datatype,Scope] ---- - -In the Julia programming language, variables are used to store data that can be referenced and manipulated throughout a program. Here's a detailed overview of how variables work in Julia: - -### Declaring and Assigning Variables - -In Julia, variables are created the moment you assign a value to them. You do not need to explicitly declare a variable's type; Julia's type system is dynamic, meaning the type is inferred from the value assigned. - -```julia -x = 10 # Assigning an integer -y = 3.14 # Assigning a float -name = "Julia" # Assigning a string -``` - -### Variable Naming Rules - -- Variable names must start with a letter (A-Z or a-z) or an underscore (_). -- Subsequent characters can be letters, underscores, or digits (0-9). -- Julia is case-sensitive, meaning `variable` and `Variable` are distinct variables. -- It's common practice to use descriptive names for variables to make code more readable. - -### Data Types - -Julia supports a variety of data types, and variables can hold values of any type. Some common data types include: - -- Integers (`Int64`, `UInt8`, etc.) -- Floating-point numbers (`Float64`, `Float32`) -- Strings (`String`) -- Booleans (`Bool`) - -Julia uses dynamic typing, but you can also specify types explicitly if needed: - -```julia -x::Int = 42 # x is explicitly an integer -y::Float64 = 2.718 # y is explicitly a double-precision float -``` - -### Type Inference and Conversion - -Julia automatically infers the type of a variable from the assigned value. However, you can convert between types if necessary: - -```julia -x = 42 -y = Float64(x) # Convert integer x to a floating-point number -``` - -### Immutable and Mutable Types - -In Julia, some types are immutable (cannot be changed after creation), while others are mutable (can be modified). For example: - -- Immutable: `Int`, `Float64`, `String` -- Mutable: `Array`, `Dict` - -```julia -arr = [1, 2, 3] # Mutable array -arr[1] = 10 # Changing the first element of the array -``` - -### Constants - -Constants are variables whose values do not change once assigned. You can declare a constant using the `const` keyword: - -```julia -const PI = 3.14159 -``` - -### Scope - -Variables in Julia have different scopes, such as global and local. The scope determines where a variable can be accessed: - -- **Global Scope**: Variables defined outside any function or block. -- **Local Scope**: Variables defined inside functions or blocks. - -```julia -x = 10 # Global scope - -function example() - y = 20 # Local scope - println(x) # Access global variable - println(y) # Access local variable -end - -example() -println(y) # Error: y is not defined in global scope -``` - -### Multiple Assignment - -Julia allows multiple variables to be assigned values simultaneously: - -```julia -a, b, c = 1, 2, 3 -``` - -### Variable Interpolation - -You can use variables inside strings using interpolation: - -```julia -name = "Julia" -println("Hello, $name!") # Output: Hello, Julia! -``` - -### Performance Considerations - -While Julia is dynamically typed, using explicit types can improve performance, especially in computationally intensive tasks. This is because the Julia compiler can generate more efficient machine code when it knows the types of variables in advance. - -```julia -function sum_array(arr::Vector{Int}) - total::Int = 0 - for i in arr - total += i - end - return total -end -``` - -### Conclusion - -Variables in Julia are versatile and easy to use. They support a wide range of data types, automatic type inference, and can be manipulated within different scopes. Understanding how to effectively use variables and their types can significantly impact the performance and readability of your Julia code. \ No newline at end of file diff --git a/docs/MATLAB/Advance MATLAB/Poly.md b/docs/MATLAB/Advance MATLAB/Poly.md deleted file mode 100644 index e6f0d5c4a..000000000 --- a/docs/MATLAB/Advance MATLAB/Poly.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -id: matlab-polynomials -title: Polynomials -sidebar_label: MATLAB Polynomials -sidebar_position: 2 -tags: [MATLAB, Polynomials] -description: In this tutorial, you will learn about Polynomials in MATLAB. ---- - -### Creating Polynomials - -1. **Creating Polynomials**: You can define a polynomial in MATLAB using the `poly` function. For instance, let's create a polynomial \( p(x) = 3x^3 - 2x^2 + 5x - 7 \). - -```matlab -% Define coefficients of the polynomial -coefficients = [3, -2, 5, -7]; - -% Create the polynomial using polyval -p = poly2sym(coefficients); - -% Display the polynomial -disp('Polynomial p(x):'); -disp(p); -``` - -Output: -``` -Polynomial p(x): - - 3 2 -3 x - 2 x + 5 x - 7 -``` - -### Evaluating Polynomials - -2. **Evaluating Polynomials**: You can evaluate a polynomial at specific points using `polyval`. Let's evaluate \( p(x) \) at \( x = 2 \). - -```matlab -% Evaluate polynomial p(x) at x = 2 -x = 2; -p_value = polyval(coefficients, x); - -% Display the result -disp(['p(', num2str(x), ') = ', num2str(p_value)]); -``` - -Output: -``` -p(2) = 21 -``` - -### Polynomial Roots - -3. **Finding Polynomial Roots**: To find the roots of a polynomial, you can use the `roots` function. Let's find the roots of \( p(x) \). - -```matlab -% Find roots of the polynomial -roots_p = roots(coefficients); - -% Display the roots -disp('Roots of the polynomial:'); -disp(roots_p); -``` - -Output: -``` -Roots of the polynomial: - 1.0000 + 0.0000i - -1.0000 + 1.4142i - -1.0000 - 1.4142i -``` - -### Polynomial Addition and Subtraction - -4. **Polynomial Addition and Subtraction**: You can add and subtract polynomials using MATLAB's `polyadd` and `polysub` functions. Let's add two polynomials \( p(x) = 3x^2 + 2x - 1 \) and \( q(x) = 4x^3 - x^2 + 5x + 3 \). - -```matlab -% Define coefficients of p(x) and q(x) -coeff_p = [3, 2, -1]; -coeff_q = [4, -1, 5, 3]; - -% Add polynomials p(x) + q(x) -sum_coeffs = polyadd(coeff_p, coeff_q); - -% Subtract polynomials p(x) - q(x) -diff_coeffs = polysub(coeff_p, coeff_q); - -% Display the results -disp('Sum of polynomials:'); -disp(sum_coeffs); - -disp('Difference of polynomials:'); -disp(diff_coeffs); -``` - -Output: -``` -Sum of polynomials: - 4 1 4 2 - -Difference of polynomials: - -4 3 -6 -4 4 -``` - -### Polynomial Multiplication - -5. **Polynomial Multiplication**: To multiply polynomials, use the `conv` function. Let's multiply \( p(x) = 3x^2 + 2x - 1 \) and \( q(x) = 4x^3 - x^2 + 5x + 3 \). - -```matlab -% Multiply polynomials p(x) and q(x) -prod_coeffs = conv(coeff_p, coeff_q); - -% Display the result -disp('Product of polynomials:'); -disp(prod_coeffs); -``` - -Output: -``` -Product of polynomials: - 12 5 -7 11 -13 -2 -3 -``` - -### Polynomial Division - -6. **Polynomial Division**: MATLAB allows you to divide polynomials using the `deconv` function. Let's divide \( p(x) = 12x^4 + 5x^3 - 7x^2 + 11x - 13 \) by \( q(x) = 4x^3 - x^2 + 5x + 3 \). - -```matlab -% Define coefficients of p(x) and q(x) -coeff_p_div = [12, 5, -7, 11, -13]; -coeff_q_div = [4, -1, 5, 3]; - -% Perform polynomial division -[quotient, remainder] = deconv(coeff_p_div, coeff_q_div); - -% Display the quotient and remainder -disp('Quotient of polynomials:'); -disp(quotient); - -disp('Remainder of polynomials:'); -disp(remainder); -``` - -Output: -``` -Quotient of polynomials: - 3 4 -4 3 - -Remainder of polynomials: - 1 -``` - -### Plotting Polynomials - -7. **Plotting Polynomials**: You can plot polynomials using `plot` in MATLAB. For instance, let's plot \( p(x) = 3x^3 - 2x^2 + 5x - 7 \) over the interval \([-3, 3]\). - -```matlab -% Define the polynomial and the interval -p_plot = @(x) polyval(coefficients, x); -x_vals = linspace(-3, 3, 100); -y_vals = p_plot(x_vals); - -% Plot the polynomial -figure; -plot(x_vals, y_vals, 'b-', 'LineWidth', 2); -grid on; -xlabel('x'); -ylabel('p(x)'); -title('Plot of Polynomial p(x)'); -``` -This code will generate a plot of the polynomial \( p(x) \). - - -### Polynomial Curve Fitting - -MATLAB provides functions to fit polynomials to data points using `polyfit` and `polyval`. Here's an example: - -```matlab -% Generate some data points -x_data = 1:10; -y_data = sin(x_data) + 0.5*randn(size(x_data)); - -% Fit a polynomial of degree 3 to the data -degree = 3; -coefficients_fit = polyfit(x_data, y_data, degree); - -% Evaluate the fitted polynomial -x_values = linspace(1, 10, 100); % 100 points from 1 to 10 -y_fit = polyval(coefficients_fit, x_values); - -% Plot the original data and the fitted polynomial -figure; -plot(x_data, y_data, 'o', x_values, y_fit, '-') -xlabel('x') -ylabel('y') -legend('Data', 'Fitted Polynomial') -title('Polynomial Curve Fitting') -``` - -### Symbolic Polynomial Manipulation - -MATLAB's Symbolic Math Toolbox allows symbolic manipulation of polynomials using `sym` and `solve` functions. Here’s an example: - -```matlab -% Symbolic variables -syms x - -% Define a symbolic polynomial -p_sym = x^3 - 4*x^2 + 5*x - 2; - -% Find the roots symbolically -roots_sym = solve(p_sym == 0, x); - -% Display roots -disp('Symbolic roots of the polynomial:') -disp(roots_sym) - -% Differentiate the polynomial -dp_dx = diff(p_sym, x); -disp('Differentiated polynomial:') -disp(dp_dx) - -% Integrate the polynomial -integral_p = int(p_sym, x); -disp('Integral of the polynomial:') -disp(integral_p) -``` -### Output: -For the polynomial curve fitting example, the output would include a plot showing the original data points (`o`) and the fitted polynomial (`-`). This plot visually demonstrates how well the polynomial fits the data. - -### Conclusion - -MATLAB provides comprehensive support for working with polynomials, offering functions for creation, evaluation, manipulation (addition, subtraction, multiplication, division), finding roots, and plotting. These tools are essential for various applications in numerical analysis, control systems, signal processing, and more. diff --git a/docs/MATLAB/Advance MATLAB/_category_.json b/docs/MATLAB/Advance MATLAB/_category_.json deleted file mode 100644 index a3f242af6..000000000 --- a/docs/MATLAB/Advance MATLAB/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Advance MATLAB ", - "position": 12, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about Advance MATLAB. " - } -} \ No newline at end of file diff --git a/docs/MATLAB/Advance MATLAB/alg.md b/docs/MATLAB/Advance MATLAB/alg.md deleted file mode 100644 index bb020f94a..000000000 --- a/docs/MATLAB/Advance MATLAB/alg.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -id: matlab-algebra -title: MATLAB Algebra -sidebar_label: MATLAB Algebra -sidebar_position: 1 -tags: [MATLAB, Algebra] -description: In this tutorial, you will learn about Algebra in MATLAB. ---- - -### Basic Algebraic Operations in MATLAB - -#### 1. **Scalar Operations** - -```matlab -% Scalar operations example -a = 5; -b = 3; - -% Addition -addition_result = a + b; - -% Subtraction -subtraction_result = a - b; - -% Multiplication -multiplication_result = a * b; - -% Division -division_result = a / b; - -% Display results -disp(['Addition result: ', num2str(addition_result)]); -disp(['Subtraction result: ', num2str(subtraction_result)]); -disp(['Multiplication result: ', num2str(multiplication_result)]); -disp(['Division result: ', num2str(division_result)]); -``` - -**Output:** -``` -Addition result: 8 -Subtraction result: 2 -Multiplication result: 15 -Division result: 1.6667 -``` - -#### 2. **Matrix Operations** - -```matlab -% Matrix operations example -A = [1 2; 3 4]; -B = [5 6; 7 8]; - -% Matrix addition -addition_matrix = A + B; - -% Matrix multiplication -multiplication_matrix = A * B; - -% Display results -disp('Matrix Addition:'); -disp(addition_matrix); - -disp('Matrix Multiplication:'); -disp(multiplication_matrix); -``` - -**Output:** -``` -Matrix Addition: - 6 8 - 10 12 - -Matrix Multiplication: - 19 22 - 43 50 -``` - -### Advanced Algebraic Concepts in MATLAB - -#### 1. **Symbolic Math Toolbox** - -MATLAB's Symbolic Math Toolbox allows working with symbolic expressions and performing algebraic manipulations symbolically. - -```matlab -syms x y; - -% Solve equations symbolically -eqn1 = x + y == 5; -eqn2 = x - y == 1; -solution = solve([eqn1, eqn2], [x, y]); - -% Display solution -disp('Solution:'); -disp(solution); -``` - -**Output:** -``` -Solution: -x: 3 -y: 2 -``` - -#### 2. **Linear Algebra: Solving Systems of Equations** - -```matlab -% Linear algebra example: solving a system of equations -A = [3 2 -1; 1 -1 1; 2 1 1]; -b = [8; 1; 5]; - -% Solve AX = b -x = A \ b; - -% Display solution -disp('Solution vector x:'); -disp(x); -``` - -**Output:** -``` -Solution vector x: - 2.0000 - 1.0000 - 3.0000 -``` - -#### 3. **Eigenvalues and Eigenvectors** - -```matlab -% Eigenvalues and eigenvectors example -M = [4 1; 2 3]; - -% Calculate eigenvalues and eigenvectors -[eigenvec, eigenval] = eig(M); - -% Display results -disp('Eigenvalues:'); -disp(eigenval); - -disp('Eigenvectors:'); -disp(eigenvec); -``` - -**Output:** -``` -Eigenvalues: - 2.5000 0 - 0 4.5000 - -Eigenvectors: - -0.7071 0.3162 - 0.7071 0.9487 -``` - -These examples cover both basic algebraic operations and advanced concepts using MATLAB. MATLAB's rich set of functionalities makes it suitable for a wide range of algebraic computations, from elementary arithmetic to solving complex systems of equations and analyzing matrices. diff --git a/docs/MATLAB/Command.md b/docs/MATLAB/Command.md deleted file mode 100644 index 739482179..000000000 --- a/docs/MATLAB/Command.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -id: matlab-command -title: Command -sidebar_label: MATLAB Command -tags: [MATLAB, Command] -description: In this tutorial, you will learn about Command in MATLAB.COMMAND in MATLAB is a keyword used in the creation and manipulation of command line interfaces (CLI) within MATLAB. ---- - -COMMAND in MATLAB is a keyword used in the creation and manipulation of command line interfaces (CLI) within MATLAB. This keyword allows users to create interactive command windows where commands can be entered, executed, and their results displayed. Here’s a comprehensive guide on the use of COMMAND in MATLAB: - -### Basics of COMMAND in MATLAB - -#### 1. Command Window - -The Command Window in MATLAB is the primary interface where users can execute commands, run scripts, and interact with the MATLAB environment. To enter commands in the Command Window, simply type the command and press Enter. - -Example: -```matlab ->> a = 5; % This assigns the value 5 to the variable 'a' ->> b = a^2; % This calculates the square of 'a' and assigns it to 'b' ->> disp(b); % This displays the value of 'b' -25 -``` - -#### 2. Creating Command Line Interfaces - -MATLAB allows for the creation of custom command line interfaces using scripts and functions. Users can create prompts, accept user input, and process commands. - -Example: -```matlab -% A simple CLI script -disp('Welcome to the simple CLI'); -name = input('Enter your name: ', 's'); -disp(['Hello, ' name '!']); -age = input('Enter your age: '); -disp(['You are ' num2str(age) ' years old.']); -``` - -#### 3. Interactive User Inputs - -MATLAB provides several functions to accept user input from the Command Window. The most commonly used functions are `input`, `menu`, and `listdlg`. - -- `input` function: Used to get user input. -```matlab -x = input('Enter a number: '); -``` - -- `menu` function: Displays a menu of choices and returns the number of the selected item. -```matlab -choice = menu('Choose an option:', 'Option 1', 'Option 2', 'Option 3'); -``` - -- `listdlg` function: Creates a dialog box for multiple selections. -```matlab -[list, ok] = listdlg('PromptString', 'Select items:', 'SelectionMode', 'multiple', 'ListString', {'Item 1', 'Item 2', 'Item 3'}); -``` - -### Advanced Usage - -#### 1. Command History - -MATLAB keeps a record of the commands entered in the Command Window. Users can navigate through the command history using the up and down arrow keys. - -#### 2. Custom Functions - -Users can define custom functions to encapsulate repetitive tasks and improve the functionality of their command line interfaces. - -Example: -```matlab -function greetUser(name) - disp(['Hello, ' name '! Welcome back.']); -end - -% Using the function -name = input('Enter your name: ', 's'); -greetUser(name); -``` - -#### 3. Error Handling - -Error handling in command line interfaces can be managed using the `try` and `catch` blocks to ensure the CLI remains robust and user-friendly. - -Example: -```matlab -try - x = input('Enter a number: '); - y = 10 / x; - disp(['Result: ' num2str(y)]); -catch - disp('Error: Division by zero is not allowed.'); -end -``` - -### Best Practices - -1. **Clear and User-friendly Prompts:** Always provide clear instructions to users for the expected inputs. -2. **Input Validation:** Validate user inputs to handle unexpected or invalid data gracefully. -3. **Error Messages:** Provide meaningful error messages to guide users on how to correct their inputs. -4. **Modular Code:** Use functions to organize your code and make it reusable. -5. **Comments:** Comment your code to explain the logic and flow, especially in complex scripts. - -### Conslusion - -The `COMMAND` functionality in MATLAB is essential for creating interactive applications and scripts. By leveraging user inputs, custom functions, and error handling, users can build robust and user-friendly command line interfaces to enhance their workflows. With practice and adherence to best practices, the power of MATLAB's command line can be fully harnessed to solve complex problems efficiently. diff --git a/docs/MATLAB/Introduction.md b/docs/MATLAB/Introduction.md deleted file mode 100644 index 72b7886af..000000000 --- a/docs/MATLAB/Introduction.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: intro-matlab -title: Introduction to MATLAB -sidebar_label: An Introduction to MATLAB -sidebar_position: 1 -tags: [MATLAB, Feature, Uses] -description: "Learn Basics of MATLAB.MATLAB (Matrix Laboratory) is a high-performance language for technical computing. It integrates computation, visualization, and programming in an easy-to-use environment where problems and solutions are expressed in familiar mathematical notation" ---- - -MATLAB (Matrix Laboratory) is a high-performance language for technical computing. It integrates computation, visualization, and programming in an easy-to-use environment where problems and solutions are expressed in familiar mathematical notation. MATLAB is used in a wide range of applications, including signal processing and communications, image and video processing, control systems, test and measurement, financial modeling, and computational biology. - -MATLAB has a rich ecosystem of resources to help you learn and master the language. Below are categorized links to some of the most valuable resources available for learning MATLAB. - -## Features of MATLAB -- It is a high-level language for numerical computation, visualization and application development. - -- It also provides an interactive environment for iterative exploration, design and problem solving. - -- It provides vast library of mathematical functions for linear algebra, statistics, Fourier analysis, filtering, optimization, numerical integration and solving ordinary differential equations. - -- It provides built-in graphics for visualizing data and tools for creating custom plots. - -- MATLAB's programming interface gives development tools for improving code quality maintainability and maximizing performance. - -- It provides tools for building applications with custom graphical interfaces. - -- It provides functions for integrating MATLAB based algorithms with external applications and languages such as C, Java, .NET and Microsoft Excel. - -## Uses of MATLAB -- Signal Processing and Communications -- Image and Video Processing -- Control Systems -- Test and Measurement -- Computational Finance -- Computational Biology diff --git a/docs/MATLAB/Syntax.md b/docs/MATLAB/Syntax.md deleted file mode 100644 index 58f6b0b49..000000000 --- a/docs/MATLAB/Syntax.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: matlab-syntax -title: Syntax -sidebar_label: MATLAB Syntax -sidebar_position: 2 -tags: [MATLAB, Syntax] -description: In this tutorial, you will learn about Syntax in MATLAB. ---- - - -MATLAB environment behaves like a super-complex calculator. You can enter commands at the >> command prompt. - ->7/0 % Divide by zero - -Output ->ans = Inf -warning: division by zero - -**NOTES**: MATLAB provides some special expressions for some mathematical symbols, like pi for π, Inf for ∞, i (and j) for √-1 etc. Nan stands for 'not a number' - -### Use of Semicolon -Semicolon (;) indicates end of statement. However, if you want to suppress and hide the MATLAB output for an expression, add a semicolon after the expression. - -Example -```matlab -x = 3; -y = x + 5 -``` -Output -``` -y = 8 -``` - -### Adding Comments -The percent symbol (%) is used for indicating a comment line. - -Example ->x = 9 % assign the value 9 to x - -### Commonly used Operators and Special Characters -MATLAB supports the following commonly used operators and special characters - -| Operator | Purpose | -|:--------: |:----------------------------------------------------------------------------------: | -| + | Plus; addition operator. | -| - | Minus; subtraction operator. | -| * | Scalar and matrix multiplication operator. | -| .* | Array multiplication operator. | -| ^ | Scalar and matrix exponentiation operator. | -| .^ | Array exponentiation operator. | -| \ | Left-division operator. | -| / | Right-division operator. | -| .\ | Array left-division operator. | -| ./ | Array right-division operator. | -| : | Colon; generates regularly spaced elements and represents an entire row or column. | -| ( ) | Parentheses; encloses function arguments and array indices; overrides precedence. | -| [ ] | Brackets; enclosures array elements. | -| . | Decimal point. | -| … | Ellipsis; line-continuation operator | -| , | Comma; separates statements and elements in a row | -| ; | Semicolon; separates columns and suppresses display. | -| % | Percent sign; designates a comment and specifies formatting. | -| _ | Quote sign and transpose operator. | -| ._ | Nonconjugated transpose operator. | -| = | Assignment operator. | - -### Saving Your Work -The save command is used for saving all the variables in the workspace, as a file with .mat extension, in the current directory. - -Example -```matlab -save myfile -``` -You can reload the file anytime later using the load command. -``` -load myfile -``` diff --git a/docs/MATLAB/Variable.md b/docs/MATLAB/Variable.md deleted file mode 100644 index 8f2b2c06e..000000000 --- a/docs/MATLAB/Variable.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -id: matlab-variable -title: Variable -sidebar_label: MATLAB Variable -sidebar_position: 3 -tags: [MATLAB, Variable] -description: In this tutorial, you will learn about Variable in MATLAB.Variables in MATLAB are used to store data values that can be referenced and manipulated in a program. ---- - -## MATLAB Variables -Variables in MATLAB are used to store data values that can be referenced and manipulated in a program. - -## Creating Variables -Variables in MATLAB are created by simply assigning a value to a variable name. The assignment operator in MATLAB is the equal sign (=). - -``` -x = 10; % Assigning the value 10 to the variable x -y = 3.14; % Assigning the value 3.14 to the variable y -z = 'Hello'; % Assigning the string 'Hello' to the variable -``` - -## Variable Naming Rules -1. **Start with a letter**: Variable names must start with a letter. -2. **Can contain letters, digits, and underscores**: After the first letter, variable names can include letters, digits, and underscores. -3. **Case-sensitive**: MATLAB variable names are case-sensitive (Var and var are different variables). -4. **Reserved keywords**: Avoid using MATLAB keywords as variable names (e.g., if, end, function). - -### Multiple Assignments - -You can have multiple assignments on the same line. - -Example -``` -a = 2; b = 7; c = a * b -Output -``` -``` -c = 14 -``` -### Workspace and Managing Variables -The MATLAB workspace stores all variables created during a session. You can manage variables using various commands: - --who: Lists all variables in the workspace --whos: Provides detailed information about each variable --clear: Removes variables from the workspace --clearvars: Removes specific variables from the workspace -``` -who % List all variables -whos % List all variables with details -clear x % Clear variable x -clearvars a b % Clear variables a and b -``` - -### The format Command -The *format long* command displays 16 digits after decimal. -Example -``` -format long -x = 7 + 10/3 + 5 ^ 1.2 -``` -Output -``` -x = 17.2319816406394 -``` - -The *format short e* command allows displaying in exponential form with four decimal places plus the exponent. -Example -``` -format short e -4.678 * 4.9 -``` -Output -``` -ans = 2.2922e+01 -``` - -The *format rat* command gives the closest rational expression resulting from a calculation -Example -``` -format rat -4.678 * 4.9 -``` -Output -``` -ans = 34177/1491 -``` - -### Saving and Loading Variables -Variables can be saved to and loaded from .mat files using the save and load commands. - -``` -save('myfile.mat', 'x', 'y'); % Save variables x and y to myfile.mat -load('myfile.mat'); % Load variables from myfile.mat into the workspace -``` - -### Conclusion -Understanding how to create, use, and manage variables in MATLAB is essential for effective programming and data manipulation. With this knowledge, you can perform a wide range of tasks, from simple calculations to complex data analysis and visualization. diff --git a/docs/MATLAB/_category_.json b/docs/MATLAB/_category_.json deleted file mode 100644 index 0a35fca38..000000000 --- a/docs/MATLAB/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "MATLAB", - "position": 15, - "link": { - "type": "generated-index", - "description": "MATLAB (Matrix Laboratory) is a high-performance language for technical computing. It integrates computation, visualization, and programming in an easy-to-use environment where problems and solutions are expressed in familiar mathematical notation" - } -} \ No newline at end of file diff --git a/docs/MATLAB/array.md b/docs/MATLAB/array.md deleted file mode 100644 index a70e36ca3..000000000 --- a/docs/MATLAB/array.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: matlab-array -title: Array -sidebar_label: MATLAB Array -sidebar_position: 11 -tags: [MATLAB, Array] -description: In this tutorial, you will learn about array in MATLAB. Array is a fundamental data type that allows you to store multiple elements of the same type in a single variable ---- -## MATLAB Arrays -In MATLAB, an array is a fundamental data type that allows you to store multiple elements of the same type in a single variable. Arrays can be of different dimensions: vectors (1-dimensional arrays), matrices (2-dimensional arrays), or even multidimensional arrays. - -### Creating Arrays - -#### 1. **Creating Vectors (1-dimensional arrays)** - -You can create vectors in MATLAB using square brackets `[]` or the `linspace` and `logspace` functions. - -```matlab -% Using square brackets [] -vec1 = [1, 2, 3, 4, 5]; - -% Using linspace (linearly spaced values) -vec2 = linspace(1, 5, 5); % Creates [1, 2, 3, 4, 5] - -% Using logspace (logarithmically spaced values) -vec3 = logspace(0, 2, 5); % Creates [1, 10, 100, 1000, 10000] -``` - -#### 2. **Creating Matrices (2-dimensional arrays)** - -Matrices are created using semicolons `;` to separate rows or with functions like `zeros`, `ones`, or `rand`. - -```matlab -% Using square brackets [] -mat1 = [1, 2, 3; 4, 5, 6; 7, 8, 9]; - -% Using zeros and ones functions -mat2 = zeros(3, 3); % Creates a 3x3 matrix of zeros -mat3 = ones(2, 4); % Creates a 2x4 matrix of ones - -% Using rand function (random values between 0 and 1) -mat4 = rand(3, 2); % Creates a 3x2 matrix of random numbers -``` - -### Accessing and Manipulating Arrays - -#### 1. **Accessing Elements** - -You can access elements of an array using indexing. MATLAB uses 1-based indexing. - -```matlab -% Accessing elements -vec = [1, 2, 3, 4, 5]; -element1 = vec(1); % Accesses the first element (element1 = 1) -element3 = vec(3); % Accesses the third element (element3 = 3) - -% Accessing elements in a matrix -mat = [1, 2, 3; 4, 5, 6; 7, 8, 9]; -element_mat = mat(2, 3); % Accesses the element in the second row, third column (element_mat = 6) -``` - -#### 2. **Manipulating Arrays** - -MATLAB provides various functions for manipulating arrays, such as `reshape`, `transpose`, and array operations like `+`, `-`, `*`, and `.` for element-wise operations. - -```matlab -% Reshape an array -vec = [1, 2, 3, 4, 5, 6]; -reshaped_vec = reshape(vec, [2, 3]); % Reshapes vec into a 2x3 matrix - -% Transpose an array -mat = [1, 2, 3; 4, 5, 6]; -transposed_mat = mat'; % Transposes mat (interchanges rows and columns) - -% Element-wise operations -A = [1, 2; 3, 4]; -B = [5, 6; 7, 8]; -C = A + B; % Element-wise addition -D = A .* B; % Element-wise multiplication -``` - -### Example and Output - -Let's put together an example that demonstrates creating arrays, accessing elements, and performing operations: - -```matlab -% Example: Creating a matrix, accessing elements, and performing operations -A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; - -% Accessing elements -element = A(2, 3); % Accessing the element in the second row, third column - -% Performing operations -B = A'; % Transpose of A -C = A * 2; % Scalar multiplication of A by 2 - -% Displaying results -disp('Original Matrix A:'); -disp(A); -disp('Element at (2, 3):'); -disp(element); -disp('Transpose of A (B):'); -disp(B); -disp('Scalar multiplication of A by 2 (C):'); -disp(C); -``` - -**Output:** -``` -Original Matrix A: - 1 2 3 - 4 5 6 - 7 8 9 - -Element at (2, 3): - 6 - -Transpose of A (B): - 1 4 7 - 2 5 8 - 3 6 9 - -Scalar multiplication of A by 2 (C): - 2 4 6 - 8 10 12 - 14 16 18 -``` - -This example demonstrates the basic concepts of creating arrays (vectors and matrices), accessing elements, and performing operations in MATLAB. Arrays are versatile and form the basis for many computations in MATLAB, making them essential for data manipulation and analysis. diff --git a/docs/MATLAB/datatype.md b/docs/MATLAB/datatype.md deleted file mode 100644 index 9cd46f62d..000000000 --- a/docs/MATLAB/datatype.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -id: matlab-datatypes -title: Datatypes -sidebar_label: MATLAB Datatypes -sidebar_position: 4 -tags: [MATLAB, Datatypes] -description: In this tutorial, you will learn about Datatypes in MATLAB. MATLAB, a high-level language and interactive environment for numerical computation, visualization, and programming, supports various data types ---- -## MATLAB Data Types -MATLAB, a high-level language and interactive environment for numerical computation, visualization, and programming, supports various data types. Here’s a comprehensive overview of the most common data types in MATLAB: - -1. Numeric Types - ### Data Types in MATLAB - -MATLAB (Matrix Laboratory) is a powerful computing environment and programming language designed for numerical and technical computing. One of the core aspects of MATLAB is its support for various data types. Understanding these data types is crucial for efficient programming and data manipulation in MATLAB. Here’s an overview of the key data types in MATLAB: - -#### 1. **Numeric Types** - - **Double Precision (default)**: The most common data type for numeric values. It stores data as double-precision floating-point numbers. - ```matlab - x = 3.14; - ``` - - **Single Precision**: Used for single-precision floating-point numbers. It requires less memory but has less precision than double. - ```matlab - y = single(3.14); - ``` - - **Integer Types**: MATLAB supports signed and unsigned integers of various sizes: int8, int16, int32, int64, uint8, uint16, uint32, uint64. - ```matlab - a = int32(10); - b = uint8(255); - ``` - -#### 2. **Character and String Types** - - **Character Arrays**: Used for storing text data. - ```matlab - str = 'Hello, MATLAB!'; - ``` - - **String Arrays**: Introduced in MATLAB R2016b, it provides more flexibility and functions for string manipulation. - ```matlab - str = "Hello, MATLAB!"; - ``` - -#### 3. **Logical Type** - - **Logical Arrays**: Used for storing true (1) and false (0) values. - ```matlab - flag = true; - isValid = false; - ``` - -#### 4. **Cell Arrays** - - Cell arrays can store data of varying types and sizes. Each element of a cell array is a cell, which can contain any type of data. - ```matlab - C = {1, 2, 'text'; rand(3), {11, 22}}; - ``` - -#### 5. **Structure Arrays** - - Structure arrays are used to group related data using data containers called fields. Each field can contain any type of data. - ```matlab - student.name = 'John Doe'; - student.age = 21; - student.scores = [95, 88, 92]; - ``` - -#### 6. **Tables** - - Tables are a type of container for storing column-oriented or tabular data. They are useful for data analysis and are introduced in MATLAB R2013b. - ```matlab - T = table([1; 2; 3], ['A'; 'B'; 'C'], {'one'; 'two'; 'three'}, ... - 'VariableNames', {'Number', 'Letter', 'Word'}); - ``` - -#### 7. **Timetables** - - Similar to tables but specifically designed for time-stamped data. Introduced in MATLAB R2016b. - ```matlab - Time = datetime('now') + caldays(0:2)'; - Temperature = [45; 47; 46]; - TT = timetable(Time, Temperature); - ``` - -#### 8. **Categorical Arrays** - - Categorical arrays are used for storing data with a fixed set of categories. They are useful for data analysis and visualization. - ```matlab - animals = categorical({'dog', 'cat', 'bird', 'dog', 'cat'}); - ``` - -#### 9. **Function Handles** - - Function handles are used to pass functions as arguments to other functions. They are created using the `@` operator. - ```matlab - f = @sin; - result = f(pi/2); - ``` - -#### 10. **Datetime, Duration, and CalendarDuration** - - **Datetime**: Represents points in time. - ```matlab - dt = datetime('now'); - ``` - - **Duration**: Represents lengths of time. - ```matlab - du = hours(5) + minutes(30); - ``` - - **CalendarDuration**: Represents lengths of time in calendar units (e.g., months, years). - ```matlab - cd = calmonths(3) + caldays(15); - ``` - -### Common Operations with Data Types - -#### Type Conversion -MATLAB allows you to convert between data types using functions like `double`, `single`, `int32`, `char`, `string`, etc. -```matlab -num = 42; -str = num2str(num); -``` - -#### Type Checking -You can check the data type of a variable using functions like `isa`, `isnumeric`, `ischar`, `isstring`, `iscell`, `isstruct`, etc. -```matlab -isNum = isnumeric(num); -isStr = ischar(str); -``` - -#### Arrays and Matrix Operations -MATLAB is designed to work efficiently with arrays and matrices, supporting various operations like addition, subtraction, multiplication, division, and more. -```matlab -A = [1, 2; 3, 4]; -B = [5, 6; 7, 8]; -C = A + B; -D = A * B; -``` - -Understanding these data types and their associated operations is fundamental for effective programming in MATLAB. Each type is suited for specific tasks and can greatly influence the performance and readability of your code. diff --git a/docs/MATLAB/loop.md b/docs/MATLAB/loop.md deleted file mode 100644 index 5867ccf84..000000000 --- a/docs/MATLAB/loop.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -id: matlab-loops -title: Loops -sidebar_label: MATLAB Loops -sidebar_position: 8 -tags: [MATLAB, Loops] -description: In this tutorial, you will learn about Loops in MATLAB.Loops are used to execute a group of statements repeatedly based on a condition ---- -## MATLAB Loops -In MATLAB, loops are used to execute a group of statements repeatedly based on a condition. MATLAB supports two main types of loops: for loops and while loops. Let's explore each of these with examples. - -## `for` Loops in MATLAB - -A `for` loop in MATLAB iterates over a range of values. The general syntax is: - -```matlab -for index = values - % Loop body -end -``` - -- `index` is a loop variable that takes each value from `values` in succession. -- `values` can be a vector, array, or other iterable objects. - -#### Example : Sum of Squares Using a `for` Loop - -```matlab -% Example: Calculate the sum of squares of numbers from 1 to 5 - -sum_squares = 0; -for i = 1:5 - sum_squares = sum_squares + i^2; -end - -disp(['The sum of squares from 1 to 5 is: ', num2str(sum_squares)]); -``` - -**Output:** - -``` -The sum of squares from 1 to 5 is: 55 -``` - -## `while` Loops in MATLAB - -A `while` loop continues to execute as long as the specified condition is true. The general syntax is: - -```matlab -while condition - % Loop body -end -``` - -- `condition` is a logical expression that controls the loop execution. - -#### Example : Factorial Calculation Using a `while` Loop - -```matlab -% Example: Calculate factorial of a number using a while loop - -n = 5; -factorial_value = 1; -while n > 1 - factorial_value = factorial_value * n; - n = n - 1; -end - -disp(['The factorial of 5 is: ', num2str(factorial_value)]); -``` - -**Output:** - -``` -The factorial of 5 is: 120 -``` - -### Notes -- **Vectorization**: MATLAB is optimized for vector and matrix operations. Whenever possible, use vectorized operations instead of loops for better performance. -- **Preallocation**: For `for` loops that modify arrays or matrices, preallocate memory to improve efficiency. -- **Break and Continue**: MATLAB supports `break` and `continue` statements to exit or skip iterations within loops, similar to other programming languages. - -### Conclusion - -Loops are essential for repetitive tasks in MATLAB, allowing you to automate calculations and processes efficiently. Understanding how to use `for` and `while` loops effectively can greatly enhance your ability to work with data and perform complex computations. diff --git a/docs/MATLAB/matrix.md b/docs/MATLAB/matrix.md deleted file mode 100644 index 3b7b6d4bc..000000000 --- a/docs/MATLAB/matrix.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -id: matlab-matrices -title: Matrices -sidebar_label: MATLAB Matrices -sidebar_position: 10 -tags: [MATLAB, Matrices] -description: In this tutorial, you will learn about Matrices in MATLAB. MATLAB is a powerful tool for working with matrices due to its efficient handling of matrix operations and built-in functions ---- -## MATLAB Matrices -MATLAB is a powerful tool for working with matrices due to its efficient handling of matrix operations and built-in functions. Let's explore some basic operations and functions related to matrices in MATLAB, along with examples .. -### Creating Matrices - -Matrices in MATLAB are created using square brackets `[ ]`. Here are a few ways to create matrices: - -1. **Creating a Matrix Directly:** - -```matlab -A = [1 2 3; 4 5 6; 7 8 9]; -``` - -This creates a 3x3 matrix `A`: - -``` -A = - 1 2 3 - 4 5 6 - 7 8 9 -``` - -2. **Using functions like `zeros`, `ones`, or `eye`:** - -```matlab -B = zeros(2, 3); -``` - -This creates a 2x3 matrix `B` filled with zeros: - -``` matlab -B = - 0 0 0 - 0 0 0 -``` - -```matlab -C = ones(3, 2); -``` - -This creates a 3x2 matrix `C` filled with ones: - -``` -C = - 1 1 - 1 1 - 1 1 -``` - -```matlab -D = eye(4); -``` - -This creates a 4x4 identity matrix `D`: - -``` -D = - 1 0 0 0 - 0 1 0 0 - 0 0 1 0 - 0 0 0 1 -``` - -### Accessing Matrix Elements - -You can access individual elements or slices of matrices using indexing. MATLAB uses 1-based indexing. - -```matlab -A = [1 2 3; 4 5 6; 7 8 9]; - -% Accessing elements -element = A(2, 3); % Retrieves the element at row 2, column 3 -disp(element); % Output: 6 - -% Accessing rows and columns -row2 = A(2, :); % Retrieves all elements from row 2 -disp(row2); % Output: 4 5 6 - -col3 = A(:, 3); % Retrieves all elements from column 3 -disp(col3'); % Output: 3 6 9 -``` - -### Matrix Operations - -MATLAB supports various matrix operations, such as addition, subtraction, multiplication, and division. Here are examples of basic operations: - -```matlab -% Matrix addition -A = [1 2; 3 4]; -B = [5 6; 7 8]; -C = A + B; - -disp(C); - -% Output: -% 6 8 -% 10 12 - -% Matrix multiplication -D = A * B; - -disp(D); - -% Output: -% 19 22 -% 43 50 -``` - -### Transpose of a Matrix - -To transpose a matrix, use the `'` operator: - -```matlab -A = [1 2 3; 4 5 6]; -A_transpose = A'; - -disp(A_transpose); - -% Output: -% 1 4 -% 2 5 -% 3 6 -``` - -### Determinant and Inverse - -MATLAB provides functions to compute the determinant (`det`) and inverse (`inv`) of matrices: - -```matlab -A = [1 2; 3 4]; -det_A = det(A); -inv_A = inv(A); - -disp(det_A); % Output: -2 -disp(inv_A); - -% Output: -% -2.0000 1.0000 -% 1.5000 -0.5000 -``` - -These are some basic operations and concepts related to matrices in MATLAB. MATLAB offers extensive functionalities for linear algebra and matrix computations, making it a powerful tool for numerical computing tasks involving matrices. diff --git a/docs/MATLAB/operator.md b/docs/MATLAB/operator.md deleted file mode 100644 index 3e72876c2..000000000 --- a/docs/MATLAB/operator.md +++ /dev/null @@ -1,131 +0,0 @@ ---- -id: matlab-operator -title: Operator -sidebar_label: MATLAB Operator -sidebar_position: 7 -tags: [MATLAB, Operator] -description: In this tutorial, you will learn about Operator in MATLAB.MATLAB, a high-performance language for technical computing, includes a variety of operators to handle different types of operations. ---- -## MATLAB Operator -MATLAB, a high-performance language for technical computing, includes a variety of operators to handle different types of operations. Here's an overview of some of the main operators in MATLAB: - -### 1. Arithmetic Operators -Arithmetic operators perform mathematical operations such as addition, subtraction, multiplication, division, and exponentiation. - -- `+` : Addition -- `-` : Subtraction -- `*` : Multiplication -- `/` : Right division (division of one number by another) -- `\` : Left division (division of one number by another) -- `.^` : Element-wise power (each element of the array is raised to the corresponding power) - -**Example:** -```matlab -a = 10; -b = 5; -c = a + b; % Addition -d = a - b; % Subtraction -e = a * b; % Multiplication -f = a / b; % Division -g = a \ b; % Left division -h = a .^ b; % Element-wise power -``` - -### 2. Relational Operators -Relational operators compare two values or arrays and return logical values (true or false). - -- `==` : Equal to -- `~=` : Not equal to -- `>` : Greater than -- `>=` : Greater than or equal to -- `<` : Less than -- `<=` : Less than or equal to - -**Example:** -```matlab -a = 10; -b = 5; -isEqual = (a == b); % False -isNotEqual = (a ~= b); % True -isGreater = (a > b); % True -isGreaterOrEqual = (a >= b); % True -isLess = (a < b); % False -isLessOrEqual = (a <= b); % False -``` - -### 3. Logical Operators -Logical operators perform element-wise logical operations. - -- `&` : Logical AND -- `|` : Logical OR -- `~` : Logical NOT -- `xor` : Logical exclusive OR - -**Example:** -```matlab -a = true; -b = false; -andResult = a & b; % Logical AND (False) -orResult = a | b; % Logical OR (True) -notResult = ~a; % Logical NOT (False) -xorResult = xor(a, b); % Logical XOR (True) -``` - -### 4. Bitwise Operators -Bitwise operators perform operations on the binary representations of numbers. - -- `bitand` : Bitwise AND -- `bitor` : Bitwise OR -- `bitxor` : Bitwise XOR -- `bitcmp` : Bitwise complement -- `bitshift` : Shift bits left or right - -**Example:** -```matlab -a = uint8(10); % 00001010 in binary -b = uint8(5); % 00000101 in binary -andResult = bitand(a, b); % 00000000 in binary (0 in decimal) -orResult = bitor(a, b); % 00001111 in binary (15 in decimal) -xorResult = bitxor(a, b); % 00001111 in binary (15 in decimal) -cmpResult = bitcmp(a); % 11110101 in binary (245 in decimal) -shiftResult = bitshift(a, 1); % 00010100 in binary (20 in decimal) -``` - -### 5. Matrix Operators -Matrix operators perform matrix calculations, including multiplication and exponentiation. - -- `*` : Matrix multiplication -- `^` : Matrix power -- `\` : Matrix left division -- `/` : Matrix right division - -**Example:** -```matlab -A = [1 2; 3 4]; -B = [5 6; 7 8]; -C = A * B; % Matrix multiplication -D = A ^ 2; % Matrix power -E = A \ B; % Matrix left division -F = A / B; % Matrix right division -``` - -### 6. Special Operators -MATLAB also includes special operators for specific purposes. - -- `:` : Colon operator (used for creating vectors, array subscripting, and loop iteration) -- `.` : Element-wise operations - -**Example:** -```matlab -% Colon operator -x = 1:5; % Creates vector [1 2 3 4 5] - -% Element-wise operations -A = [1 2 3]; -B = [4 5 6]; -C = A .* B; % Element-wise multiplication -D = A .^ 2; % Element-wise power -``` - -### Conclusion -MATLAB's operators allow for a wide range of mathematical and logical operations. Understanding these operators is fundamental for effectively using MATLAB in various computational tasks. Whether working with scalars, vectors, matrices, or logical conditions, MATLAB's operators provide the necessary tools to perform complex calculations efficiently. diff --git a/docs/MATLAB/string.md b/docs/MATLAB/string.md deleted file mode 100644 index 56b6be2fb..000000000 --- a/docs/MATLAB/string.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -id: matlab-string -title: String -sidebar_label: MATLAB String -sidebar_position: 6 -tags: [MATLAB, String] -description: In this tutorial, you will learn about String in MATLAB. Strings are arrays of characters enclosed in single quotes (`'`). Starting from MATLAB R2016b, strings are also supported as a data type (`string`). - ---- -## MATLAB Strings - -### Creating and Manipulating Strings - -In MATLAB, strings are arrays of characters enclosed in single quotes (`'`). Starting from MATLAB R2016b, strings are also supported as a data type (`string`). - -#### Example 1: Creating and Displaying Strings - -```matlab -% Creating strings -str1 = 'Hello, '; -str2 = 'MATLAB!'; - -% Concatenating strings -fullStr = [str1 str2]; - -% Displaying the concatenated string -disp(fullStr); -``` - -**Output:** -``` -Hello, MATLAB! -``` - -#### Example 2: String Operations - -```matlab -% Extracting a substring -sentence = 'The quick brown fox jumps over the lazy dog'; -substr = extractBetween(sentence, 5, 9); - -% Converting to uppercase -upperSentence = upper(sentence); - -% Finding the position of a substring -pos = strfind(sentence, 'brown'); - -% Displaying results -disp(substr); -disp(upperSentence); -disp(pos); -``` - -**Output:** -``` -quick -THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG -10 -``` - -### String Functions in MATLAB - -MATLAB provides a variety of functions for working with strings. Here are a few commonly used ones: - -- `strcat`: Concatenates strings. -- `strcmp`: Compares strings. -- `strsplit`: Splits strings based on delimiter. -- `sprintf` or `fprintf`: Formats strings like in C programming. - -#### Example : Using `sprintf` for Formatting - -```matlab -% Formatting strings -name = 'Alice'; -age = 30; -height = 1.75; - -% Creating a formatted string -str = sprintf('Name: %s, Age: %d, Height: %.2f meters', name, age, height); - -% Displaying formatted string -disp(str); -``` - -**Output:** -``` -Name: Alice, Age: 30, Height: 1.75 meters -``` - -### String Arrays (Introduced in R2016b) - -Starting from MATLAB R2016b, strings can be stored in string arrays, which are more flexible for handling multiple strings. - -#### Example : String Arrays - -```matlab -% Creating a string array -names = ["Alice", "Bob", "Charlie", "David"]; - -% Accessing elements -disp(names(2)); % Accessing the second element - -% Concatenating string arrays -fullNames = strcat(names, " Johnson"); - -% Displaying results -disp(fullNames); -``` - -**Output:** -``` -Bob - "Alice Johnson" - "Bob Johnson" - "Charlie Johnson" - "David Johnson" -``` - -### Conclusion - -MATLAB provides robust support for working with strings, whether as character arrays or as string objects. Understanding these fundamentals allows for effective manipulation and analysis of textual data within MATLAB programs. diff --git a/docs/MATLAB/vector.md b/docs/MATLAB/vector.md deleted file mode 100644 index 3057d79f4..000000000 --- a/docs/MATLAB/vector.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -id: matlab-vector -title: Vector -sidebar_label: MATLAB Vector -sidebar_position: 9 -tags: [MATLAB, Vector] -description: In this tutorial, you will learn about Vector in MATLAB .Vectors in MATLAB are fundamental data structures that represent arrays of numbers. Vectors can be either row vectors or column vectors. MATLAB provides various functions to create and manipulate vectors efficiently. ---- - -## MATLAB Vector -Vectors in MATLAB are fundamental data structures that represent arrays of numbers. Vectors can be either row vectors or column vectors. MATLAB provides various functions to create and manipulate vectors efficiently. - -### Creating Vectors - -#### Row Vector -A row vector is created using square brackets, separating the elements with spaces or commas. -```matlab -row_vector = [1 2 3 4 5] -``` -**Output:** -```matlab -row_vector = - - 1 2 3 4 5 -``` - -#### Column Vector -A column vector is created by separating the elements with semicolons or using the transpose operator (`'`). -```matlab -column_vector = [1; 2; 3; 4; 5] -% Or using transpose -column_vector_transpose = [1 2 3 4 5]' -``` -**Output:** -```matlab -column_vector = - - 1 - 2 - 3 - 4 - 5 -``` -```matlab -column_vector_transpose = - - 1 - 2 - 3 - 4 - 5 -``` - -### Vector Operations - -#### Addition and Subtraction -```matlab -A = [1 2 3]; -B = [4 5 6]; - -C = A + B -D = A - B -``` -**Output:** -```matlab -C = - - 5 7 9 - -D = - - -3 -3 -3 -``` - -#### Scalar Multiplication and Division -```matlab -A = [1 2 3]; - -B = A * 2 -C = A / 2 -``` -**Output:** -```matlab -B = - - 2 4 6 - -C = - - 0.5000 1.0000 1.5000 -``` - -#### Element-wise Multiplication and Division -```matlab -A = [1 2 3]; -B = [4 5 6]; - -C = A .* B -D = A ./ B -``` -**Output:** -```matlab -C = - - 4 10 18 - -D = - - 0.2500 0.4000 0.5000 -``` - -### Built-in Functions for Vectors - -#### Sum and Product -```matlab -A = [1 2 3 4 5]; - -sum_A = sum(A) -prod_A = prod(A) -``` -**Output:** -```matlab -sum_A = - - 15 - -prod_A = - - 120 -``` - -#### Minimum and Maximum -```matlab -A = [1 2 3 4 5]; - -min_A = min(A) -max_A = max(A) -``` -**Output:** -```matlab -min_A = - - 1 - -max_A = - - 5 -``` - -#### Mean and Median -```matlab -A = [1 2 3 4 5]; - -mean_A = mean(A) -median_A = median(A) -``` -**Output:** -```matlab -mean_A = - - 3 - -median_A = - - 3 -``` - -### Example: Creating and Manipulating a Vector - -```matlab -% Create a row vector -A = [10 20 30 40 50]; - -% Add 5 to each element -B = A + 5 - -% Multiply each element by 2 -C = A * 2 - -% Calculate the sum of all elements -sum_A = sum(A) - -% Find the maximum value -max_A = max(A) -``` -**Output:** -```matlab -B = - - 15 25 35 45 55 - -C = - - 20 40 60 80 100 - -sum_A = - - 150 - -max_A = - - 50 -``` - -This covers the basics of working with vectors in MATLAB. You can create vectors, perform arithmetic operations, and use built-in functions to analyze and manipulate vector data. diff --git a/docs/Machine Learning/AdaBoost model.md b/docs/Machine Learning/AdaBoost model.md deleted file mode 100644 index 1e1b4c2c4..000000000 --- a/docs/Machine Learning/AdaBoost model.md +++ /dev/null @@ -1,157 +0,0 @@ ---- - -id: adaboost -title: AdaBoost -sidebar_label: Introduction to AdaBoost -sidebar_position: 1 -tags: [AdaBoost, boosting algorithm, machine learning, data analysis, data science, ensemble learning, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about AdaBoost, its importance, what AdaBoost is, why learn AdaBoost, how to use AdaBoost, steps to start using AdaBoost, and more. - ---- - -### Introduction to AdaBoost -AdaBoost, short for Adaptive Boosting, is a powerful ensemble learning technique used for both classification and regression tasks. By combining multiple weak learners, AdaBoost creates a strong predictive model that improves accuracy and reduces overfitting. This algorithm is widely used for its simplicity and effectiveness in various machine learning applications. - -### What is AdaBoost? -AdaBoost works by sequentially training a series of weak learners, typically decision stumps, and adjusting their weights based on the errors of previous learners. The final model is a weighted sum of these weak learners, making accurate predictions by focusing more on the difficult cases. - -- **Weak Learners**: Simple models, often decision stumps, that perform slightly better than random guessing. -- **Boosting**: The process of sequentially training weak learners, adjusting their weights to focus on misclassified samples, and combining them to form a strong learner. - -:::info -**Learning Rate**: A parameter that controls the contribution of each weak learner to the final model. Lower values slow down learning, while higher values speed it up. - -**Iteration**: Each cycle of training a new weak learner and updating weights is called an iteration. -::: - -### Example: -Consider AdaBoost for email spam detection. Initially, a weak learner classifies emails with some errors. AdaBoost increases the weights of misclassified emails and trains a new weak learner to correct these errors. This process repeats, resulting in a strong model that accurately distinguishes between spam and non-spam emails. - -### Advantages of AdaBoost -AdaBoost offers several advantages: - -- **Improved Accuracy**: By combining multiple weak learners, AdaBoost achieves higher accuracy than individual models. -- **Flexibility**: Can be used with various base learners and adapted for different types of data. -- **Robustness to Overfitting**: AdaBoost reduces the risk of overfitting by focusing on hard-to-classify samples and using regularization techniques. - -### Example: -In a fraud detection system, AdaBoost can identify fraudulent transactions by combining multiple weak classifiers, each focusing on different aspects of the data, resulting in a robust and accurate model. - -### Disadvantages of AdaBoost -Despite its advantages, AdaBoost has limitations: - -- **Sensitivity to Noisy Data**: AdaBoost can be sensitive to noisy data and outliers, as it tries to correct every error, potentially leading to overfitting. -- **Computational Cost**: The sequential training process can be computationally expensive, especially with large datasets. - -### Example: -In a medical diagnosis application, the presence of noisy data or outliers can affect AdaBoost's performance, requiring careful preprocessing and handling of outliers to achieve optimal results. - -### Practical Tips for Using AdaBoost -To maximize the effectiveness of AdaBoost: - -- **Data Preprocessing**: Clean and preprocess data to minimize noise and outliers. -- **Hyperparameter Tuning**: Adjust parameters such as the number of estimators and learning rate to balance model complexity and performance. -- **Cross-Validation**: Use cross-validation to assess model performance and avoid overfitting. - -### Example: -In customer churn prediction, preprocessing data to handle missing values and scaling features ensures that AdaBoost performs effectively, providing accurate predictions of customer churn. - -### Real-World Examples - -#### Image Classification -AdaBoost is used in image classification tasks, such as facial recognition, by combining weak classifiers that focus on different features of the images. This results in a model that can accurately identify faces in various conditions. - -#### Credit Scoring -In the financial industry, AdaBoost is applied to credit scoring models, assessing the risk of lending to applicants by combining multiple weak learners that evaluate different financial indicators. - -### Difference Between AdaBoost and Random Forest - -| Feature | AdaBoost | Random Forest | -|---------------------------------|--------------------------------------------|--------------------------------------------| -| Ensemble Type | Boosting (sequential learning) | Bagging (parallel learning) | -| Base Learners | Typically weak learners (e.g., decision stumps) | Decision trees (usually strong learners) | -| Focus | Correcting errors of previous learners | Reducing variance by averaging predictions | -| Sensitivity to Noise | More sensitive to noise and outliers | Less sensitive due to averaging | -| Complexity | Sequential and computationally intensive | Parallel and more computationally efficient| - -### Implementation -To implement and train an AdaBoost model, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and train an AdaBoost model. - -#### Libraries to Download - -- `scikit-learn`: Essential for machine learning tasks, including AdaBoost implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training an AdaBoost Model -Here’s a step-by-step guide to training an AdaBoost model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.ensemble import AdaBoostClassifier -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the AdaBoost Model:** - -```python -# Initialize the AdaBoost model -ada = AdaBoostClassifier(n_estimators=100, learning_rate=1.0) - -# Train the model -ada.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -# Predict on test data -y_pred = ada.predict(X_test) - -# Evaluate performance -accuracy = accuracy_score(y_test, y_pred) -print(f'Accuracy: {accuracy:.2f}') -``` - -This example demonstrates loading data, preparing features, training an AdaBoost model, and evaluating its performance using scikit-learn. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Learning Rate and Estimators**: Balancing the number of estimators and learning rate can improve both the performance and efficiency of AdaBoost. -- **Data Size**: Preprocessing and reducing the size of the data, if possible, can help manage computational costs. - -### Example: -In marketing analytics, AdaBoost helps in predicting customer responses to campaigns. Balancing the model parameters ensures that predictions are both accurate and computationally efficient, enabling timely insights for marketing strategies. - -### Conclusion -AdaBoost is a versatile and powerful ensemble learning algorithm that enhances the performance of weak learners by combining them into a strong predictive model. By understanding its principles, advantages, and practical implementation steps, practitioners can effectively leverage AdaBoost for a variety of machine learning tasks in data science and predictive modeling projects. - diff --git a/docs/Machine Learning/AlexNet.md b/docs/Machine Learning/AlexNet.md deleted file mode 100644 index bab1a3e85..000000000 --- a/docs/Machine Learning/AlexNet.md +++ /dev/null @@ -1,228 +0,0 @@ -# AlexNet - -AlexNet is a deep learning model that was introduced by Alex Krizhevsky, Ilya Sutskever, and Geoffrey Hinton in 2012. It won the ImageNet Large Scale Visual Recognition Challenge (ILSVRC) in 2012 with a top-5 error of 15.3%, more than 10.8% lower than that of the runner up. This success demonstrated the effectiveness of deep convolutional neural networks (CNNs) in image recognition tasks, leading to widespread adoption of deep learning techniques. - -AlexNet consists of 8 layer - 5 convolutional layers and 3 fully connected layers. Additonally it employs ReLU activation function, max-pooling layers and dropout to enhance its efficiency. - -## Architecture - -### Input layer -It accepts an image of size 227x227x3 (height, width, RGB channels). - -### 1st Convolutional Layer -It applies 96 filters of size 11x11 with a stride length of 4. This layer extracts low-level features such as edges and textures. It outputs a feature map of size 55x55x96. - -**Example:** -Suppose: -- Image size = 224x224x3 -- Filter size = 11x11 -- Stride = 4 - -Hence, output feature map size = $\dfrac{227-11}{4}+1$ = $\dfrac{216}{4}+1$ = $55$ = 55x55x96 - -### 1st Max-pooling Layer -It performs max-pooling with 96, 3x3 filters and a stride length of 2. It reduces the spatial dimensions to 27x27x96, retaining the most prominent features while reducing computational load. - -**Example:** -Suppose: -- Input feature map size = 55x55x96 -- Filter size = 3x3 -- Stride = 2 - -Hence, output feature map size = $\dfrac{55-3}{2}+1$ = $\dfrac{52}{2}+1$ = $27$ = 27x27x96 - -### 2nd Convolutional Layer -It applies 256 filters of size 5x5 with a stride length of 1 and padding of 2. This layer extracts more complex patterns and outputs a feature map of size 27x27x256. - -**Example:** -Suppose: -- Input feature map size = 27x27x96 -- Filter size = 5x5 -- Stride = 1 -- Padding = 2 - -Hence, output feature map size = $\dfrac{27-5+2*2}{1}+1$ = $\dfrac{26}{1}+1$ = $27$ = 27x27x256 - -### 2nd Max-Pooling Layer -It performs max-pooling with 256, 3x3 filters and a stride of 2 and reduces spatial dimensions to 13x13x256. - -**Example:** -Suppose: -- Input feature map size = 27x27x256 -- Filter size = 3x3 -- Stride = 2 - -Hence, output feature map size = $\dfrac{27-3}{2}+1$ = $\dfrac{12}{2}+1$ = $13$ = 13x13x256 - -### 3rd Convolutional Layer -This layer applies 384 filters of size 3x3 with a stride of 1 and padding of 1. It captures finer details in the features and outputs a feature map of size 13x13x384. - -**Example:** -Suppose: -- Input feature map size = 13x13x256 -- Filter size = 3x3 -- Stride = 1 -- Padding = 1 - -Hence, output feature map size = $\dfrac{13-3+2*1}{1}+1$ = $\dfrac{12}{1}+1$ = $13$ = 13x13x384 - -### 4th Convolutional Layer -It applies 384 filters of size 3x3 with a stride of 1 and padding of 1. It further refines the features and outputs a feature map of size 13x13x384. - -**Example:** -Suppose: -- Input feature map size = 13x13x256 -- Filter size = 3x3 -- Stride = 1 -- Padding = 1 - -Hence, output feature map size = $\dfrac{13-3+2*1}{1}+1$ = $\dfrac{12}{1}+1$ = $13$ = 13x13x384 - -### 5th Convolutional Layer -It applies 256 filters of size 3x3 with a stride of 1 and padding of 1. This is the final convolutional layer before the fully connected layers. It outputs a feature map of size 13x13x256. - -**Example:** -Suppose: -- Input feature map size = 13x13x384 -- Filter size = 3x3 -- Stride = 1 -- Padding = 1 - -Hence, output feature map size = $\dfrac{13-3+2*1}{1}+1$ = $\dfrac{12}{1}+1$ = $13$ = 13x13x256 - -### 3rd Max-Pooling Layer -This layer performs max-pooling with 256, 3x3 filter and a stride of 2. It reduces spatial dimensions to 6x6x256. - -**Example:** -Suppose: -- Input feature map size = 13x13x256 -- Filter size = 3x3 -- Stride = 2 - -Hence, output feature map size = $\dfrac{13-3}{2}+1$ = $\dfrac{10}{2}+1$ = $6$ = 6x6x256 - -### 1st Fully Connected Layer -It flattens the feature maps and applies a dense layer with 4096 neurons. It introduces a dropout rate of 0.5 to prevent overfitting and uses ReLU activation function. - -**Example:** -Suppose, the input is of size 6x6x256 - -- The input feature map of size 6x6x256 is flattened to a vector of length 9216. -- After flattening, assume that the input feature vector (x) is [0.5, -0.2,..., 0.1] and is of length 9216. -- Weights ($W_1$) and biases ($b_1$) are two vectors of length 9216 whose values are initialized randomly. -- The pre-activation vector, $z_1$ is calculated using the formula: $z_1 = W_1⋅x+b_1$. $z_1$ is a vector of length 4096. Assume that it has the values [1.2,-0.5,...,2.3]. -- ReLU activation function is applied to $z_1$ using the formula: $ReLU(x)$ = $max(0,x)$. Hence, all the negative values will be replaced by 0. -- The post-activation vector, $a_1$ will be of length 4096 and will have the values [1.2,0,...3.3]. -- In the dropout layer, a binary mask $m_1$ is generated. Assume $m_1$ is [1,0,1,..1]. -- The binary mask $m_1$ is multiplied with each element of $a_1$. Hence, the final vector, $a_1'$ wil be [1.2,0,...,3.3] and will be of length 4096. - -### 2nd Fully Connected Layer -This layer introduces another dense layer with 4096 neurons. It uses dropout and ReLU activation for regularization and non-linearity. - -**Example:** -The input will be $a_1'$ which is a vector of length 4096. - -- The same process is repeated as in the first fully connected layer. -- However, here the weight matrix, $W_2$ is 4096x4096 and the bias matrix, $b_2$ has 4096 elements. -- This layer will give $a_2'$ as output which is a vector of length 4096. - -### 3rd Fully Connected Layer -This is the final dense layer with 1000 neurons, corresponding to the number of classes in the ImageNet dataset. It outputs the class probabilities using the softmax activation function. The neurons in the last layer correspond to the number of classes in the dataset. If the dataset has 10 classes, the last layer would also have 10 neurons. - -**Example:** -The input would be $a_2'$ which is a vector of length 4096. - -- Here, the weight matrix will have dimensions 1000x4096 and the bias vector will have 1000 elements. -- Pre-activation is performed in this layer to get the vector $z_3$ which will be of length 1000. -- Softmax activation function is then applied to $z_3$ producing a vector of length 1000. -- This vector consists of the probabilities for each class. The class with the highest probability is given as the output. - - -## Layer Summary - -| Layers | Input Size | No. of Filters | Size of Filters | Stride Length | Padding | Output Feature Map Size | -| :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | :--------: | -| Input Layer | 224x224x3 | -| 1st Convolutional Layer | 224x224x3 | 96 | 11x11 | 4 | 2 | 55x55x96 | -| 1st Max-Pooling Layer | 55x55x96 | 96 | 3x3 | 2 | - | 27x27x96 | -| 2nd Convolutional Layer | 27x27x96 | 256 | 5x5 | 1 | 2 | 27x27x256 | -| 2nd Max-Pooling Layer | 27x27x256 | 256 | 3x3 | 2 | - | 13x13x256 | -| 3rd Convolutional Layer | 27x27x256 | 384 | 3x3 | 1 | 1 | 13x13x384 | -| 4th Convolutional Layer | 13x13x384 | 384 | 3x3 | 1 | 1 | 13x13x384 | -| 5th Convolutional Layer | 13x13x384 | 256 | 3x3 | 1 | 1 | 13x13x256 | -| 3rd Max-Pooling Layer | 13x13x256 | 256 | 3x3 | 2 | - | 6x6x256 | -| 1st Fully Connected Layer | -| 2nd Fully Connected Layer | -| 3rd Fully Connected Layer | - -## Implementation - -```python -# Loading the libraries - -import tensorflow as tf -from tensorflow.keras.models import Sequential -from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout -from tensorflow.keras.optimizers import Adam -from tensorflow.keras.preprocessing.image import ImageDataGenerator -from tensorflow.keras.datasets import cifar10 -from tensorflow.keras.utils import to_categorical - - -# Loading and pre-processing the CIFAR-10 dataset - -(x_train, y_train), (x_test, y_test) = cifar10.load_data() -x_train = x_train.astype('float32') / 255.0 -x_test = x_test.astype('float32') / 255.0 -y_train = to_categorical(y_train, 10) -y_test = to_categorical(y_test, 10) - -# Defining the AlexNet model - -def alexnet_model(input_shape=(32, 32, 3), num_classes=10): - model = Sequential() - model.add(Conv2D(filters=96, input_shape=input_shape, kernel_size=(11, 11), strides=(4, 4), padding='same', activation='relu')) - model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')) - model.add(Conv2D(filters=256, kernel_size=(5, 5), strides=(1, 1), padding='same', activation='relu')) - model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')) - model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) - model.add(Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) - model.add(Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1), padding='same', activation='relu')) - model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2), padding='same')) - model.add(Flatten()) - model.add(Dense(4096, activation='relu')) - model.add(Dropout(0.5)) - model.add(Dense(4096, activation='relu')) - model.add(Dropout(0.5)) - model.add(Dense(num_classes, activation='softmax')) - return model - -model = alexnet_model() -model.compile(optimizer=Adam(), loss='categorical_crossentropy', metrics=['accuracy']) - - -# Training the model - -datagen = ImageDataGenerator( - rotation_range=15, - width_shift_range=0.1, - height_shift_range=0.1, - horizontal_flip=True, -) -datagen.fit(x_train) - -history = model.fit( - datagen.flow(x_train, y_train, batch_size=64), - epochs=50, - validation_data=(x_test, y_test), - steps_per_epoch=x_train.shape[0] // 64 -) - -# Test accuracy and loss - -score = model.evaluate(x_test, y_test, verbose=0) -print('Test loss:', score[0]) -print('Test accuracy:', score[1]) -``` - -**NOTE:** The CIFAR-10 dataset has 10 classes. So, the last layer has 10 neurons in it. diff --git a/docs/Machine Learning/An-Introduction -to-Machine-Learning.md b/docs/Machine Learning/An-Introduction -to-Machine-Learning.md deleted file mode 100644 index 99a77a3c1..000000000 --- a/docs/Machine Learning/An-Introduction -to-Machine-Learning.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: machine-learning -title: Introduction to Machine Learning -sidebar_label: An Introduction to Machine Learning -sidebar_position: 8 -tags: [ML, Type of Ml, Libraries] -description: "Learn Basics of ML." ---- - -**Machine Learning (ML)** is a subset of artificial intelligence (AI) that focuses on developing systems that can learn from and make decisions based on data. Unlike traditional programming, where specific rules and instructions are coded, machine learning enables systems to learn patterns and make decisions with minimal human intervention. - -#### Key Concepts in Machine Learning - -1. **Data**: The foundational component of machine learning. It includes structured data (like databases) and unstructured data (like text, images, videos). -2. **Algorithms**: Set of rules and statistical techniques used to learn patterns from data. Popular algorithms include linear regression, decision trees, and neural networks. -3. **Models**: The output of the machine learning process. A model is trained on data and can make predictions or decisions based on new data. -4. **Training**: The process of feeding data into a machine learning algorithm to learn patterns. This involves adjusting the algorithm's parameters to minimize errors. -5. **Testing**: Evaluating the performance of a trained model on new, unseen data to ensure it generalizes well. - -#### Types of Machine Learning - -1. **Supervised Learning**: - - - **Definition**: Learning from labeled data, where the outcome is known. - - **Examples**: Spam detection, image classification, and medical diagnosis. - - **Algorithms**: Linear regression, logistic regression, support vector machines, neural networks. - -2. **Unsupervised Learning**: - - - **Definition**: Learning from unlabeled data, where the system tries to find hidden patterns. - - **Examples**: Customer segmentation, anomaly detection, and clustering. - - **Algorithms**: K-means clustering, hierarchical clustering, association rules. - -3. **Semi-supervised Learning**: - - **Definition**: A mix of supervised and unsupervised learning. It uses a small amount of labeled data and a large amount of unlabeled data. - - **Examples**: Web content classification, speech analysis. -4. **Reinforcement Learning**: - - **Definition**: Learning by interacting with an environment. The system takes actions and learns from the feedback (rewards or punishments). - - **Examples**: Game playing (like AlphaGo), robotics, resource management. - - **Algorithms**: Q-learning, deep Q networks, policy gradients. - -#### Key Steps in Machine Learning Workflow - -1. **Data Collection**: Gathering relevant data from various sources. -2. **Data Preparation**: Cleaning and preprocessing data to make it suitable for modeling. This includes handling missing values, normalizing data, and feature selection. -3. **Choosing a Model**: Selecting an appropriate algorithm based on the problem and data. -4. **Training the Model**: Feeding data into the algorithm to learn patterns. -5. **Evaluating the Model**: Using metrics like accuracy, precision, recall, F1-score, and confusion matrix to assess the model's performance. -6. **Hyperparameter Tuning**: Adjusting the algorithm's parameters to improve performance. -7. **Prediction**: Using the trained model to make predictions on new data. -8. **Deployment**: Integrating the model into a real-world application for use. - -#### Popular Tools and Libraries - -- **Programming Languages**: Python, R, Julia. -- **Libraries**: - - **Python**: scikit-learn, TensorFlow, Keras, PyTorch, XGBoost. - - **R**: caret, randomForest, nnet. - -#### Applications of Machine Learning - -1. **Healthcare**: Disease prediction, personalized treatment plans. -2. **Finance**: Fraud detection, algorithmic trading. -3. **Marketing**: Customer segmentation, recommendation systems. -4. **Manufacturing**: Predictive maintenance, quality control. -5. **Transportation**: Self-driving cars, route optimization. -6. **Entertainment**: Content recommendation, sentiment analysis. - -### Conclusion - -Machine learning is a rapidly evolving field with vast applications across various industries. By enabling systems to learn from data and make informed decisions, it is transforming how we interact with technology and solving complex problems more efficiently. diff --git a/docs/Machine Learning/Autoencoders.md b/docs/Machine Learning/Autoencoders.md deleted file mode 100644 index 63baffd35..000000000 --- a/docs/Machine Learning/Autoencoders.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -id: autoencoders -title: Autoencoders -sidebar_label: Introduction to Autoencoders -sidebar_position: 1 -tags: [Autoencoders, neural networks, unsupervised learning, machine learning, data science, dimensionality reduction, anomaly detection, image reconstruction] -description: In this tutorial, you will learn about Autoencoders, their importance, what Autoencoders are, why learn Autoencoders, how to use Autoencoders, steps to start using Autoencoders, and more. - ---- - -### Introduction to Autoencoders -Autoencoders are a type of artificial neural network used for unsupervised learning tasks. They are designed to learn efficient representations of data, typically for the purposes of dimensionality reduction or feature learning. Autoencoders have a symmetrical structure consisting of an encoder and a decoder, making them powerful tools for tasks such as anomaly detection, image denoising, and data compression. - -### What are Autoencoders? -**Autoencoders** consist of two main components: - -- **Encoder**: This part of the network compresses the input data into a latent-space representation, often called the "bottleneck." The goal is to capture the most informative features in a lower-dimensional space. -- **Decoder**: This part reconstructs the data from the latent representation, aiming to produce an output as close to the original input as possible. - -The network is trained to minimize the difference between the input and the reconstructed output, effectively learning to encode and decode the data. - -:::info -**Encoder**: Maps the input data to a lower-dimensional latent space. It can be a series of convolutional or dense layers. - -**Decoder**: Maps the latent representation back to the original data space. It mirrors the encoder's structure. -::: - -### Example: -Consider using an autoencoder for image reconstruction. The encoder compresses an image into a lower-dimensional representation, and the decoder reconstructs the image from this representation. The network learns to capture the essential features of the image while discarding noise. - -### Advantages of Autoencoders -Autoencoders offer several advantages: - -- **Dimensionality Reduction**: Autoencoders can learn low-dimensional representations of high-dimensional data, similar to techniques like PCA but with non-linear mappings. -- **Anomaly Detection**: By learning to reconstruct normal data, autoencoders can identify anomalies as instances with high reconstruction error. -- **Data Denoising**: Autoencoders can be trained to remove noise from data by learning to reconstruct the clean version from noisy inputs. - -### Example: -In fraud detection, autoencoders can be trained on normal transaction data. Transactions with high reconstruction errors can be flagged as potential fraud. - -### Disadvantages of Autoencoders -Despite their advantages, autoencoders have limitations: - -- **Training Complexity**: Training autoencoders can be complex and require careful tuning of hyperparameters and network architecture. -- **Overfitting**: Autoencoders can overfit the training data, especially if the network is too complex or the training data is not diverse enough. - -### Example: -In image compression, if the autoencoder is too complex, it might memorize the training images instead of learning generalizable features, leading to poor performance on new images. - -### Practical Tips for Using Autoencoders -To maximize the effectiveness of autoencoders: - -- **Network Architecture**: Start with simple architectures and gradually increase complexity. Use convolutional layers for image data. -- **Regularization**: Apply techniques like dropout, L2 regularization, and early stopping to prevent overfitting. -- **Hyperparameter Tuning**: Experiment with different learning rates, batch sizes, and latent space dimensions. - -### Example: -In medical imaging, using convolutional layers in the encoder and decoder can improve the autoencoder's ability to capture spatial hierarchies and details in the images. - -### Real-World Examples - -#### Image Denoising -Autoencoders are widely used for image denoising tasks. By training on pairs of noisy and clean images, the autoencoder learns to remove noise and reconstruct clean images, improving image quality. - -#### Anomaly Detection -In industrial applications, autoencoders can be used to detect anomalies in sensor data. The network is trained on normal operating conditions, and deviations from normal patterns can be identified as anomalies. - -### Difference Between Autoencoders and Principal Component Analysis (PCA) - -| Feature | Autoencoders | PCA | -|----------------------------|-----------------------------------------------|---------------------------------------| -| Approach | Learn non-linear mappings through neural networks | Linear transformation of data | -| Flexibility | Capable of learning complex representations | Limited to linear relationships | -| Dimensionality Reduction | Provides non-linear dimensionality reduction | Provides linear dimensionality reduction | -| Reconstruction Accuracy | Higher accuracy for non-linear data structures | Lower accuracy for non-linear data structures | -| Use Cases | Image denoising, anomaly detection, data compression | Data visualization, feature extraction | - -### Implementation -To implement and train an autoencoder, you can use libraries such as TensorFlow or PyTorch in Python. Below are the steps to install the necessary libraries and train an autoencoder model. - -#### Libraries to Download - -- `TensorFlow` or `PyTorch`: Essential for building and training autoencoders. -- `numpy`: Useful for numerical operations. -- `matplotlib`: Useful for visualizing input and reconstructed data. - -You can install these libraries using pip: - -```bash -pip install tensorflow numpy matplotlib -``` - -#### Training an Autoencoder Model -Here’s a step-by-step guide to training an autoencoder model using TensorFlow: - -**Import Libraries:** - -```python -import numpy as np -import matplotlib.pyplot as plt -import tensorflow as tf -from tensorflow.keras.layers import Input, Dense, Flatten, Reshape, Conv2D, Conv2DTranspose -from tensorflow.keras.models import Model -from tensorflow.keras.datasets import mnist -``` - -**Load and Preprocess Data:** - -```python -# Load MNIST dataset -(x_train, _), (x_test, _) = mnist.load_data() -x_train = x_train.astype('float32') / 255.0 -x_test = x_test.astype('float32') / 255.0 -x_train = np.expand_dims(x_train, axis=-1) -x_test = np.expand_dims(x_test, axis=-1) -``` - -**Define Encoder and Decoder:** - -```python -# Encoder -input_img = Input(shape=(28, 28, 1)) -x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img) -x = Conv2D(64, (3, 3), activation='relu', padding='same')(x) -shape_before_flattening = tf.keras.backend.int_shape(x) -x = Flatten()(x) -latent = Dense(128, activation='relu')(x) - -# Decoder -x = Dense(np.prod(shape_before_flattening[1:]), activation='relu')(latent) -x = Reshape(shape_before_flattening[1:])(x) -x = Conv2DTranspose(64, (3, 3), activation='relu', padding='same')(x) -x = Conv2DTranspose(32, (3, 3), activation='relu', padding='same')(x) -decoded = Conv2DTranspose(1, (3, 3), activation='sigmoid', padding='same')(x) - -# Autoencoder Model -autoencoder = Model(input_img, decoded) -autoencoder.compile(optimizer='adam', loss='binary_crossentropy') -``` - -**Train the Autoencoder:** - -```python -autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, validation_data=(x_test, x_test)) -``` - -**Visualize Reconstructed Images:** - -```python -def plot_reconstructed_images(model, x_test, n=10): - decoded_imgs = model.predict(x_test[:n]) - plt.figure(figsize=(20, 4)) - for i in range(n): - ax = plt.subplot(2, n, i + 1) - plt.imshow(x_test[i].reshape(28, 28), cmap='gray') - plt.title("Original") - plt.axis('off') - - ax = plt.subplot(2, n, i + 1 + n) - plt.imshow(decoded_imgs[i].reshape(28, 28), cmap='gray') - plt.title("Reconstructed") - plt.axis('off') - plt.show() - -plot_reconstructed_images(autoencoder, x_test) -``` - -This example demonstrates how to define, compile, and train an autoencoder using TensorFlow. The encoder compresses the input images, and the decoder reconstructs them. Adjust the network architecture, hyperparameters, and dataset as needed for your specific use case. - -### Performance Considerations - -#### Training Stability -- **Techniques for Stabilizing Training**: Use techniques like batch normalization and gradient clipping to stabilize training and improve convergence. -- **Overfitting Prevention**: Apply regularization techniques such as dropout and early stopping to prevent overfitting. - -### Example: -In image denoising tasks, applying batch normalization and dropout can help the autoencoder generalize better, producing cleaner reconstructed images. - -### Conclusion -Autoencoders are versatile neural networks capable of learning efficient representations of data for various tasks, including dimensionality reduction, anomaly detection, and data denoising. By understanding their principles, advantages, and practical implementation steps, practitioners can effectively leverage autoencoders to solve complex machine learning problems and enhance their data processing workflows. diff --git a/docs/Machine Learning/Bayesian Optimization.md b/docs/Machine Learning/Bayesian Optimization.md deleted file mode 100644 index d2e70b9fe..000000000 --- a/docs/Machine Learning/Bayesian Optimization.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -id: bayesian-optimization -title: Bayesian Optimization -sidebar_label: Introduction to Bayesian Optimization -sidebar_position: 1 -tags: [Bayesian Optimization, optimization, machine learning, hyperparameter tuning, data science, probabilistic models, surrogate models, Gaussian processes, expected improvement] -description: In this tutorial, you will learn about Bayesian Optimization, its importance, what Bayesian Optimization is, why learn Bayesian Optimization, how to use Bayesian Optimization, steps to start using Bayesian Optimization, and more. - ---- - -### Introduction to Bayesian Optimization -Bayesian Optimization is a powerful technique for optimizing expensive and noisy functions. It is particularly useful for hyperparameter tuning in machine learning models, where evaluations of the objective function are costly and time-consuming. Bayesian Optimization builds a probabilistic model of the objective function and uses it to select the most promising points to evaluate, balancing exploration and exploitation. - -### What is Bayesian Optimization? -**Bayesian Optimization** involves the following key components: - -- **Surrogate Model**: A probabilistic model, often a Gaussian Process, that approximates the objective function. It provides a measure of uncertainty in its predictions. -- **Acquisition Function**: A function that uses the surrogate model to determine the next point to evaluate. It balances exploration (searching new areas) and exploitation (refining known good areas). - -The process iteratively updates the surrogate model with new evaluations, improving its accuracy and guiding the search for the optimal solution. - -:::info -**Surrogate Model**: Approximates the objective function and provides uncertainty estimates. Common choices include Gaussian Processes, Random Forests, and Bayesian Neural Networks. - -**Acquisition Function**: Guides the search for the optimum by selecting points that maximize expected improvement, probability of improvement, or other criteria. -::: - -### Example: -Consider using Bayesian Optimization to tune hyperparameters of a machine learning model. The surrogate model predicts the model's performance for different hyperparameter settings, and the acquisition function suggests new settings to evaluate, aiming to find the best configuration efficiently. - -### Advantages of Bayesian Optimization -Bayesian Optimization offers several advantages: - -- **Efficient Optimization**: Requires fewer evaluations of the objective function compared to grid or random search. -- **Handling Noisy Functions**: Effective for optimizing functions with noise and uncertainty. -- **Global Optimization**: Capable of finding global optima even with complex and multimodal objective functions. - -### Example: -In hyperparameter tuning for deep learning models, Bayesian Optimization can efficiently search the hyperparameter space, reducing the time and computational resources needed to find the best model configuration. - -### Disadvantages of Bayesian Optimization -Despite its advantages, Bayesian Optimization has limitations: - -- **Computational Overhead**: The surrogate model can be computationally expensive to update, especially for high-dimensional problems. -- **Scalability**: May struggle with very high-dimensional spaces or large datasets due to the complexity of the surrogate model. - -### Example: -In optimizing hyperparameters for a complex neural network with many parameters, the computational overhead of updating the surrogate model might become a bottleneck, affecting the optimization process. - -### Practical Tips for Using Bayesian Optimization -To maximize the effectiveness of Bayesian Optimization: - -- **Choice of Surrogate Model**: Use Gaussian Processes for small to medium-sized problems, and consider alternatives like Random Forests for larger problems. -- **Acquisition Function**: Experiment with different acquisition functions (e.g., Expected Improvement, Upper Confidence Bound) to find the best balance between exploration and exploitation. -- **Initialization**: Start with a diverse set of initial points to improve the surrogate model's accuracy from the beginning. - -### Example: -In optimizing hyperparameters for a machine learning model, using a Gaussian Process as the surrogate model and Expected Improvement as the acquisition function can lead to efficient and effective optimization results. - -### Real-World Examples - -#### Hyperparameter Tuning -Bayesian Optimization is widely used for tuning hyperparameters of machine learning models, such as neural networks, support vector machines, and ensemble methods. It helps in finding the optimal configuration that maximizes model performance. - -#### Experimental Design -In scientific research and engineering, Bayesian Optimization is used to design experiments by selecting the most informative settings to test, reducing the number of experiments needed to achieve desired outcomes. - -### Difference Between Bayesian Optimization and Grid Search - -| Feature | Bayesian Optimization | Grid Search | -|-----------------------------|--------------------------------------------|----------------------------------------| -| Efficiency | Efficient, fewer evaluations needed | Inefficient, exhaustive search | -| Handling Noisy Functions | Effective for noisy and uncertain functions| Struggles with noisy functions | -| Search Strategy | Probabilistic model, balances exploration and exploitation | Deterministic, no balance of exploration and exploitation | -| Global Optimization | Capable of finding global optima | Limited to predefined grid points | - -### Implementation -To implement Bayesian Optimization, you can use libraries such as `scikit-optimize` (skopt) or `hyperopt` in Python. Below are the steps to install the necessary libraries and perform Bayesian Optimization. - -#### Libraries to Download - -- `scikit-optimize` (skopt): Provides tools for Bayesian Optimization. -- `numpy`: Useful for numerical operations. -- `scikit-learn`: Useful for machine learning models and datasets. - -You can install these libraries using pip: - -```bash -pip install scikit-optimize numpy scikit-learn -``` - -#### Performing Bayesian Optimization -Here’s a step-by-step guide to performing Bayesian Optimization using `scikit-optimize`: - -**Import Libraries:** - -```python -import numpy as np -from skopt import gp_minimize -from skopt.space import Real, Integer -from skopt.utils import use_named_args -from sklearn.datasets import load_iris -from sklearn.model_selection import cross_val_score -from sklearn.svm import SVC -``` - -**Define Objective Function:** - -```python -# Load dataset -data = load_iris() -X, y = data.data, data.target - -# Define hyperparameter space -space = [Real(1e-6, 1e+1, prior='log-uniform', name='C'), - Real(1e-6, 1e+1, prior='log-uniform', name='gamma')] - -# Define objective function -@use_named_args(space) -def objective(**params): - model = SVC(**params) - return -np.mean(cross_val_score(model, X, y, cv=5, n_jobs=-1, scoring='accuracy')) -``` - -**Perform Bayesian Optimization:** - -```python -res = gp_minimize(objective, space, n_calls=50, random_state=42) - -print(f"Best parameters: {res.x}") -print(f"Best accuracy: {-res.fun}") -``` - -**Visualize Optimization Process:** - -```python -from skopt.plots import plot_convergence - -plot_convergence(res) -``` - -This example demonstrates how to define the hyperparameter space, the objective function, and perform Bayesian Optimization using `scikit-optimize`. Adjust the hyperparameters, model, and dataset as needed for your specific use case. - -### Performance Considerations - -#### Scalability -- **Dimensionality**: Consider using dimensionality reduction techniques if the hyperparameter space is very high-dimensional. -- **Parallel Evaluations**: Leverage parallel computing to perform multiple evaluations simultaneously, speeding up the optimization process. - -### Example: -In optimizing hyperparameters for a large-scale machine learning model, using parallel evaluations can significantly reduce the time required to find the best configuration. - -### Conclusion -Bayesian Optimization is a powerful and efficient method for optimizing expensive and noisy functions, particularly in the context of hyperparameter tuning. By understanding its principles, advantages, and practical implementation steps, practitioners can effectively leverage Bayesian Optimization to improve the performance of machine learning models and other complex systems. diff --git a/docs/Machine Learning/CatBoost.md b/docs/Machine Learning/CatBoost.md deleted file mode 100644 index fdb14031b..000000000 --- a/docs/Machine Learning/CatBoost.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -id: catboost -title: CatBoost -sidebar_label: Introduction to CatBoost -sidebar_position: 1 -tags: [CatBoost, gradient boosting, machine learning, classification algorithm, regression, data analysis, data science, boosting, ensemble learning, decision trees, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about CatBoost, its importance, what CatBoost is, why learn CatBoost, how to use CatBoost, steps to start using CatBoost, and more. ---- - -### Introduction to CatBoost -CatBoost is a high-performance gradient boosting algorithm that handles categorical data effectively. Developed by Yandex, CatBoost stands for Categorical Boosting, and it is widely used for classification and regression tasks in data science and machine learning due to its ability to provide state-of-the-art results with minimal parameter tuning. - -### What is CatBoost? -**CatBoost** is an implementation of gradient boosting on decision trees that is designed to handle categorical features naturally. Unlike other gradient boosting algorithms, CatBoost uses a novel technique to convert categorical features into numerical values internally, ensuring that the algorithm can utilize categorical information efficiently without the need for extensive preprocessing. - -- **Gradient Boosting**: An ensemble technique that combines the predictions of multiple weak learners (e.g., decision trees) to create a strong learner. Boosting iteratively adjusts the weights of incorrectly predicted instances, ensuring subsequent trees focus more on difficult cases. - -- **Categorical Feature Handling**: CatBoost automatically handles categorical variables by applying a process called 'order-based encoding,' which helps in reducing overfitting and improving model accuracy. - -**Decision Trees**: Simple models that split data based on feature values to make predictions. CatBoost uses symmetric trees, where the splits are chosen in a way to reduce computation time and improve the efficiency of the algorithm. - -**Loss Function**: Measures the difference between the predicted and actual values. CatBoost minimizes the loss function to improve model accuracy. - -### Example: -Consider CatBoost for predicting customer churn. The algorithm processes historical customer data, including categorical features like customer type and region, learning patterns and trends to accurately predict which customers are likely to leave. - -### Advantages of CatBoost -CatBoost offers several advantages: - -- **Handling Categorical Data**: Naturally handles categorical features, reducing the need for extensive preprocessing. -- **High Performance**: Provides state-of-the-art results with minimal parameter tuning and efficient training. -- **Robustness to Overfitting**: Includes mechanisms to reduce overfitting, such as ordered boosting and categorical feature support. -- **Ease of Use**: Requires fewer hyperparameter adjustments compared to other boosting algorithms. - -### Example: -In fraud detection, CatBoost can accurately identify fraudulent transactions by analyzing transaction patterns and utilizing categorical features like transaction type and location. - -### Disadvantages of CatBoost -Despite its advantages, CatBoost has limitations: - -- **Computationally Intensive**: Training CatBoost models can be time-consuming and require significant computational resources. -- **Complexity**: Although easier to use compared to some algorithms, it still requires understanding of boosting and tree-based models. -- **Less Control Over Categorical Encoding**: Limited flexibility in handling categorical features compared to manual preprocessing techniques. - -### Example: -In healthcare predictive analytics, CatBoost might require significant computational resources to handle large datasets with many categorical features, potentially impacting model training time. - -### Practical Tips for Using CatBoost -To maximize the effectiveness of CatBoost: - -- **Hyperparameter Tuning**: Although CatBoost requires fewer adjustments, tuning hyperparameters such as learning rate and depth of trees can still improve performance. -- **Data Preparation**: Ensure data quality by handling missing values and outliers before training the model. -- **Feature Engineering**: Create meaningful features and perform feature selection to enhance model performance. - -### Example: -In marketing analytics, CatBoost can predict customer churn by analyzing customer behavior data, including categorical features like purchase type. Ensuring high-quality data and tuning hyperparameters can lead to accurate and reliable predictions. - -### Real-World Examples - -#### Sales Forecasting -CatBoost is applied in retail to predict future sales based on historical data, seasonal trends, and market conditions. This helps businesses optimize inventory and plan marketing strategies. - -#### Customer Segmentation -In marketing analytics, CatBoost clusters customers based on purchasing behavior and demographic data, allowing businesses to target marketing campaigns effectively and improve customer retention. - -### Difference Between CatBoost and XGBoost -| Feature | CatBoost | XGBoost | -|---------------------------------|--------------------------------------|--------------------------------------| -| Handling Categorical Data | Naturally handles categorical features | Requires manual encoding of categorical features | -| Training Speed | Efficient with automatic handling | Fast, but requires preprocessing | -| Hyperparameter Tuning | Minimal tuning required | Requires careful tuning | - -### Implementation -To implement and train a CatBoost model, you can use the CatBoost library in Python. Below are the steps to install the necessary library and train a CatBoost model. - -#### Libraries to Download - -- `catboost`: Essential for CatBoost implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install catboost pandas numpy -``` - -#### Training a CatBoost Model -Here’s a step-by-step guide to training a CatBoost model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from catboost import CatBoostClassifier -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score, classification_report -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Identify Categorical Features:** - -```python -# List of categorical features -categorical_features = ['categorical_feature_1', 'categorical_feature_2'] # Replace with your categorical feature names -``` - -**Initialize and Train the CatBoost Model:** - -```python -model = CatBoostClassifier(iterations=1000, learning_rate=0.1, depth=6, cat_features=categorical_features, verbose=0) -model.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -y_pred = model.predict(X_test) - -accuracy = accuracy_score(y_test, y_pred) -print(f'Accuracy: {accuracy:.2f}') -print(classification_report(y_test, y_pred)) -``` - -This example demonstrates loading data, preparing features, training a CatBoost model, and evaluating its performance using the CatBoost library. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: CatBoost can handle high-dimensional data efficiently. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In e-commerce, CatBoost helps in predicting customer purchase behavior by analyzing browsing history and purchase data, including categorical features like product categories. - -### Conclusion -CatBoost is a versatile and powerful algorithm for classification and regression tasks. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage CatBoost for a variety of predictive modeling tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Decision-Trees.md b/docs/Machine Learning/Decision-Trees.md deleted file mode 100644 index f9f6cd389..000000000 --- a/docs/Machine Learning/Decision-Trees.md +++ /dev/null @@ -1,87 +0,0 @@ -# Decision Trees - -## Introduction to Decision Trees - -Decision trees are a versatile and powerful algorithm in the field of machine learning. They are used for both classification and regression tasks and are particularly valued for their interpretability and ability to handle complex datasets. This document provides a comprehensive overview of decision trees, including their structure, advantages, disadvantages, and practical tips for using them effectively. - -## Overview of Decision Tree Structure - -A decision tree is structured as follows: - -- **Nodes:** Each node represents a decision point where the data is split based on a feature attribute. -- **Edges (Branches):** Branches emanating from nodes represent the possible outcomes of the decision based on the feature. -- **Leaves:** Terminal nodes represent the final decision or prediction made by the tree. - -### Example: - -Consider a decision tree for predicting customer churn in a telecom company. The tree might start by splitting customers based on their contract type, then further split based on usage patterns and customer demographics, ultimately predicting whether a customer is likely to churn or not. - -## Advantages of Decision Trees - -Decision trees offer several advantages: - -- **Interpretability:** Decision trees provide a clear and interpretable model. Each decision path from the root to a leaf node can be easily understood and visualized. - -- **Non-parametric:** Decision trees make no assumptions about the underlying data distribution, making them suitable for data with complex relationships. - -- **Handling of Mixed Data Types:** They can handle both numerical and categorical data without requiring extensive preprocessing. - -### Example: - -In a healthcare setting, decision trees can help predict patient outcomes based on a mix of medical history, demographics, and treatment options, providing interpretable insights for clinicians. - -## Disadvantages of Decision Trees - -Despite their advantages, decision trees have limitations: - -- **Overfitting:** Decision trees can create overly complex models that fit the training data well but generalize poorly to new data. - -- **Instability:** Small variations in the data can lead to different tree structures, impacting model stability. - -- **Difficulty with Learning XOR-type Problems:** Decision trees struggle with problems where predictors have complex interactions, such as the XOR problem. - -### Example: - -In financial markets, predicting stock prices using decision trees may lead to erratic predictions due to high volatility and nonlinear relationships between market factors. - -## Practical Tips for Using Decision Trees - -To maximize the effectiveness of decision trees: - -- **Pruning:** Use pruning techniques like cost-complexity pruning to simplify the tree and reduce overfitting. - -- **Ensemble Methods:** Combine multiple decision trees (e.g., Random Forests, Gradient Boosting Machines) to improve predictive performance and robustness. - -- **Feature Selection:** Use feature importance scores to identify the most influential features for decision-making. - -### Example: - -In e-commerce, decision trees can enhance personalized product recommendations by analyzing customer behavior and purchase history, improving user satisfaction and sales. - -## Real-World Examples - -### Customer Segmentation in Retail - -Decision trees are extensively used in retail for customer segmentation. By analyzing customer demographics, purchase history, and behavior, retailers can create targeted marketing campaigns and personalize customer experiences. - -### Medical Diagnosis - -In healthcare, decision trees assist in medical diagnosis by analyzing patient symptoms, medical history, and test results to classify diseases or conditions, aiding healthcare professionals in making informed decisions. - -## Performance Considerations - -### Scalability and Computational Efficiency - -- **Large Datasets:** Decision trees can become computationally expensive with large datasets, as they require evaluating multiple features and potential splits at each node. - -- **Algorithmic Complexity:** Techniques like tree pruning and limiting tree depth can mitigate complexity and improve scalability. - -### Example: - -In financial analytics, decision trees are used to analyze market trends and predict stock movements. Optimizing decision tree algorithms for large-scale data processing ensures timely and accurate predictions, critical for financial decision-making. - -## Conclusion - -Decision trees are a valuable tool in machine learning, offering a balance of interpretability and predictive power. Understanding their structure, strengths, and weaknesses is essential for effectively applying them to diverse real-world problems. - - diff --git a/docs/Machine Learning/Dimensionality Reduction Techniques.md b/docs/Machine Learning/Dimensionality Reduction Techniques.md deleted file mode 100644 index bac2b0d1f..000000000 --- a/docs/Machine Learning/Dimensionality Reduction Techniques.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -id: dimensionality-reduction-techniques -title: Dimensionality Reduction Techniques -sidebar_label: Introduction to Dimensionality Reduction Techniques -sidebar_position: 4 -tags: [dimensionality reduction, feature selection, machine learning, data analysis, data science, PCA, LDA, t-SNE, UMAP, feature engineering] -description: In this tutorial, you will learn about dimensionality reduction techniques, their importance, the main methods used for dimensionality reduction, and how to apply them effectively in data analysis and machine learning. ---- - -### Introduction to Dimensionality Reduction Techniques -Dimensionality reduction techniques are essential in data analysis and machine learning for simplifying complex datasets, improving model performance, and visualizing high-dimensional data. These techniques aim to reduce the number of features while preserving important information and relationships within the data. - -### Importance of Dimensionality Reduction -- **Improves Model Performance**: Reduces overfitting by decreasing the number of features, leading to better generalization on unseen data. -- **Reduces Computational Cost**: Lessens the computational burden by working with fewer features, making algorithms faster and more efficient. -- **Enhances Visualization**: Facilitates the visualization of high-dimensional data in lower-dimensional spaces (e.g., 2D or 3D). -- **Removes Noise**: Eliminates redundant or irrelevant features, which can improve the quality of the data. - -### Common Dimensionality Reduction Techniques - -#### Principal Component Analysis (PCA) -- **Objective**: Transform data into a set of orthogonal components (principal components) that capture the maximum variance. -- **Method**: Linear transformation to project data onto a lower-dimensional space. -- **Usage**: Suitable for capturing the global structure and variance in data. - -**Example**: Reducing the dimensions of gene expression data to visualize the main patterns and relationships between genes. - -#### Linear Discriminant Analysis (LDA) -- **Objective**: Find linear combinations of features that best separate different classes. -- **Method**: Projects data onto a lower-dimensional space where class separability is maximized. -- **Usage**: Suitable for classification tasks with well-defined class labels. - -**Example**: Classifying handwritten digits by reducing the feature space while preserving class differences. - -#### t-Distributed Stochastic Neighbor Embedding (t-SNE) -- **Objective**: Visualize high-dimensional data by preserving local similarities in a lower-dimensional space. -- **Method**: Non-linear dimensionality reduction using probability distributions to capture data point similarities. -- **Usage**: Effective for visualizing clusters and patterns in high-dimensional data. - -**Example**: Visualizing clusters of similar images in an image dataset. - -#### Uniform Manifold Approximation and Projection (UMAP) -- **Objective**: Preserve both local and global structure of data while reducing dimensionality. -- **Method**: Non-linear dimensionality reduction based on manifold learning and topological data analysis. -- **Usage**: Useful for preserving both local and global structures, often faster than t-SNE. - -**Example**: Reducing the dimensionality of complex text data to explore semantic relationships between documents. - -#### Autoencoders -- **Objective**: Learn an efficient encoding of data by training a neural network to reconstruct the input. -- **Method**: Neural network-based approach that encodes data into a lower-dimensional representation. -- **Usage**: Suitable for complex non-linear dimensionality reduction and feature learning. - -**Example**: Reducing the dimensionality of image data while preserving important features for image reconstruction or classification. - -### Choosing the Right Technique -- **Nature of Data**: Linear methods (PCA, LDA) work well with linearly separable data, while non-linear methods (t-SNE, UMAP, Autoencoders) are better for capturing complex structures. -- **Computational Resources**: PCA is computationally efficient, while t-SNE and UMAP may require more resources for large datasets. -- **Visualization Needs**: For visualization, t-SNE and UMAP are effective in 2D or 3D spaces, while PCA provides a simpler linear reduction. - -### Practical Tips for Dimensionality Reduction -- **Preprocessing**: Normalize and scale features before applying dimensionality reduction techniques. -- **Parameter Tuning**: Experiment with hyperparameters (e.g., number of components, perplexity) to optimize results. -- **Combine Methods**: Use a combination of techniques (e.g., PCA followed by t-SNE) to capture different aspects of data. - -### Example Workflows - -#### Workflow 1: Reducing Features for Classification -1. **Apply PCA** to reduce dimensionality and capture the most variance. -2. **Train a classifier** (e.g., SVM, Random Forest) on the reduced feature set. -3. **Evaluate performance** and adjust the number of principal components as needed. - -#### Workflow 2: Visualizing High-Dimensional Data -1. **Apply UMAP** to preserve both local and global structures in a lower-dimensional space. -2. **Visualize** the data using scatter plots to identify clusters and patterns. -3. **Adjust parameters** to refine the visualization and better capture data relationships. - -### Conclusion -Dimensionality reduction techniques play a crucial role in data analysis and machine learning by simplifying datasets, enhancing model performance, and enabling effective visualization. By understanding and applying these techniques appropriately, practitioners can manage high-dimensional data more effectively and gain valuable insights from their analyses. diff --git a/docs/Machine Learning/Ensemble Learning.md b/docs/Machine Learning/Ensemble Learning.md deleted file mode 100644 index e4fee26ef..000000000 --- a/docs/Machine Learning/Ensemble Learning.md +++ /dev/null @@ -1,170 +0,0 @@ ---- -id: ensemble-learning -title: Ensemble Learning -sidebar_label: Introduction to Ensemble Learning -sidebar_position: 1 -tags: [Ensemble Learning, machine learning, data science, model performance, boosting, bagging, stacking] -description: In this tutorial, you will learn about Ensemble Learning, its importance, what Ensemble Learning is, why learn Ensemble Learning, how to use Ensemble Learning, steps to start using Ensemble Learning, and more. - ---- - -### Introduction to Ensemble Learning -Ensemble Learning is a powerful technique in machine learning that combines multiple models to produce a single superior model. The idea is that by aggregating the predictions of several models, the ensemble model can achieve better performance and robustness than any individual model. This approach is widely used in both classification and regression tasks to enhance accuracy, reduce overfitting, and improve generalization. - -### What is Ensemble Learning? -**Ensemble Learning** involves creating a collection of models and combining their predictions to make a final decision. There are several methods to create ensembles: - -- **Bagging**: Builds multiple models independently using different subsets of the training data and averages their predictions. Random Forest is a popular bagging method. -- **Boosting**: Builds models sequentially, each trying to correct the errors of the previous ones. Gradient Boosting, AdaBoost, and XGBoost are popular boosting methods. -- **Stacking**: Trains multiple models (base learners) and combines their predictions using another model (meta-learner) to make the final prediction. - -:::info -**Bagging**: Reduces variance by averaging predictions from different models trained on different subsets of data. - -**Boosting**: Reduces bias by sequentially training models to correct the errors of their predecessors. - -**Stacking**: Combines multiple models and uses a meta-learner to improve predictions. -::: - -### Example: -Consider using ensemble learning for a classification task. A Random Forest model, which is an ensemble of decision trees, can improve accuracy and robustness by averaging the predictions of multiple trees trained on different subsets of the data. - -### Advantages of Ensemble Learning -Ensemble Learning offers several advantages: - -- **Improved Accuracy**: Combining multiple models can lead to better performance than any single model. -- **Robustness**: Ensembles are less likely to overfit the training data, leading to better generalization. -- **Flexibility**: Different ensemble methods can be tailored to various types of data and problems. - -### Example: -In a Kaggle competition, ensemble methods are often used to achieve top performance by combining the strengths of different models, such as decision trees, neural networks, and support vector machines. - -### Disadvantages of Ensemble Learning -Despite its advantages, Ensemble Learning has limitations: - -- **Complexity**: Building and maintaining multiple models can be computationally expensive and time-consuming. -- **Interpretability**: Ensembles can be less interpretable than individual models, making it harder to understand how predictions are made. - -### Example: -In financial applications, while ensemble models can provide accurate predictions, their complexity can make it difficult to explain the decision-making process to stakeholders. - -### Practical Tips for Using Ensemble Learning -To maximize the effectiveness of Ensemble Learning: - -- **Diversity**: Ensure that the base models are diverse to maximize the benefits of combining them. -- **Hyperparameter Tuning**: Carefully tune the hyperparameters of each model and the ensemble method to achieve optimal performance. -- **Cross-Validation**: Use cross-validation to evaluate the ensemble's performance and avoid overfitting. - -### Example: -In a healthcare application, using a combination of logistic regression, decision trees, and neural networks in an ensemble can improve diagnostic accuracy by leveraging the strengths of each model. - -### Real-World Examples - -#### Fraud Detection -Ensemble Learning is widely used in fraud detection systems. By combining multiple models, financial institutions can improve the accuracy of detecting fraudulent transactions while reducing false positives. - -#### Predictive Maintenance -In industrial applications, ensemble models are used for predictive maintenance to forecast equipment failures. Combining different models helps capture various aspects of the data, leading to more reliable predictions. - -### Difference Between Ensemble Learning and Single Model Learning - -| Feature | Ensemble Learning | Single Model Learning | -|----------------------------------|-------------------------------------------|------------------------------------------| -| Performance | Generally higher due to model combination | Depends on the model and data quality | -| Overfitting | Less prone to overfitting | Can be more prone to overfitting | -| Complexity | More complex, combining multiple models | Simpler, involves only one model | -| Interpretability | Less interpretable due to model aggregation | More interpretable, especially for simple models | - -### Implementation -To implement Ensemble Learning, you can use libraries such as scikit-learn, XGBoost, or LightGBM in Python. Below are the steps to install the necessary libraries and apply Ensemble Learning. - -#### Libraries to Download - -- `scikit-learn`: Provides various ensemble methods like Random Forest, Gradient Boosting, and more. -- `xgboost` or `lightgbm`: Specialized libraries for gradient boosting techniques. -- `numpy`: Useful for numerical operations. -- `matplotlib`: Useful for visualizing model performance. - -You can install these libraries using pip: - -```bash -pip install scikit-learn xgboost lightgbm numpy matplotlib -``` - -#### Applying Ensemble Learning -Here’s a step-by-step guide to applying Ensemble Learning using scikit-learn: - -**Import Libraries:** - -```python -import numpy as np -import matplotlib.pyplot as plt -from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score -from sklearn.datasets import load_iris -``` - -**Load and Prepare Data:** - -```python -# Load dataset -data = load_iris() -X, y = data.data, data.target - -# Split into training and testing sets -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Define and Train Models:** - -```python -# Define ensemble models -rf_model = RandomForestClassifier(n_estimators=100, random_state=42) -gb_model = GradientBoostingClassifier(n_estimators=100, random_state=42) - -# Train models -rf_model.fit(X_train, y_train) -gb_model.fit(X_train, y_train) -``` - -**Evaluate Models:** - -```python -# Make predictions -rf_preds = rf_model.predict(X_test) -gb_preds = gb_model.predict(X_test) - -# Evaluate models -rf_accuracy = accuracy_score(y_test, rf_preds) -gb_accuracy = accuracy_score(y_test, gb_preds) - -print(f"Random Forest Accuracy: {rf_accuracy}") -print(f"Gradient Boosting Accuracy: {gb_accuracy}") -``` - -**Combine Predictions:** - -```python -# Combine predictions (simple majority voting) -combined_preds = np.round((rf_preds + gb_preds) / 2).astype(int) - -# Evaluate combined predictions -combined_accuracy = accuracy_score(y_test, combined_preds) - -print(f"Combined Model Accuracy: {combined_accuracy}") -``` - -This example demonstrates how to define, train, and evaluate ensemble models using scikit-learn. Adjust the model parameters, ensemble method, and dataset as needed for your specific use case. - -### Performance Considerations - -#### Model Diversity -- **Base Learners**: Use diverse base learners (e.g., decision trees, neural networks, SVMs) to maximize the benefits of ensemble learning. -- **Combining Methods**: Experiment with different combining methods such as voting, averaging, or using a meta-learner for stacking. - -### Example: -In weather forecasting, combining diverse models such as decision trees, neural networks, and support vector machines can improve prediction accuracy by capturing different patterns in the data. - -### Conclusion -Ensemble Learning is a robust technique that combines multiple models to improve performance and generalization. By understanding the principles, advantages, and practical implementation steps, practitioners can effectively apply Ensemble Learning to various machine learning tasks, enhancing their models' accuracy and robustness. diff --git a/docs/Machine Learning/Extreme Gradient Boosting.md b/docs/Machine Learning/Extreme Gradient Boosting.md deleted file mode 100644 index a102fdaba..000000000 --- a/docs/Machine Learning/Extreme Gradient Boosting.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -id: xgboost -title: Extreme Gradient Boosting (XGBoost) -sidebar_label: Introduction to XGBoost -sidebar_position: 1 -tags: [XGBoost, gradient boosting, machine learning, classification algorithm, regression, data analysis, data science, boosting, ensemble learning, decision trees, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about Extreme Gradient Boosting (XGBoost), its importance, what XGBoost is, why learn XGBoost, how to use XGBoost, steps to start using XGBoost, and more. ---- - -### Introduction to Extreme Gradient Boosting (XGBoost) -Extreme Gradient Boosting (XGBoost) is a powerful and efficient gradient boosting framework widely used in data science and machine learning for classification and regression tasks. Known for its speed and performance, XGBoost is an optimized distributed gradient boosting library designed to be highly efficient, flexible, and portable. - -### What is Extreme Gradient Boosting (XGBoost)? -**Extreme Gradient Boosting (XGBoost)** is an implementation of gradient boosting decision tree (GBDT) algorithms optimized for speed and performance. XGBoost builds decision trees sequentially, where each tree attempts to correct the errors of its predecessor. It uses a variety of algorithmic optimizations to enhance training speed and model performance. - -- **Gradient Boosting**: An ensemble technique that combines the predictions of multiple weak learners (e.g., decision trees) to create a strong learner. Boosting iteratively adjusts the weights of incorrectly predicted instances, ensuring subsequent trees focus more on difficult cases. - -- **Algorithmic Optimizations**: Techniques such as tree pruning, parallel processing, and out-of-core computation are used to enhance the speed and performance of XGBoost. - -**Decision Trees**: Simple models that split data based on feature values to make predictions. XGBoost uses level-wise (breadth-first) tree growth, which helps prevent overfitting. - -**Loss Function**: Measures the difference between the predicted and actual values. XGBoost minimizes the loss function to improve model accuracy. - -### Example: -Consider XGBoost for predicting customer churn. The algorithm processes historical customer data, learning patterns and trends to accurately predict which customers are likely to leave. - -### Advantages of Extreme Gradient Boosting (XGBoost) -XGBoost offers several advantages: - -- **High Speed and Performance**: Significantly faster training and prediction times compared to traditional gradient boosting methods. -- **Scalability**: Can handle large datasets and high-dimensional data efficiently. -- **Accuracy**: Produces highly accurate models with robust performance. -- **Feature Importance**: Provides insights into the importance of different features in making predictions. - -### Example: -In fraud detection, XGBoost can quickly and accurately identify fraudulent transactions by analyzing transaction patterns and flagging anomalies. - -### Disadvantages of Extreme Gradient Boosting (XGBoost) -Despite its advantages, XGBoost has limitations: - -- **Complexity**: Proper tuning of hyperparameters is essential to achieve optimal performance. -- **Prone to Overfitting**: If not properly tuned, XGBoost can overfit the training data, especially with too many trees or features. -- **Sensitivity to Noisy Data**: May be sensitive to noisy data, requiring careful preprocessing. - -### Example: -In healthcare predictive analytics, XGBoost might overfit if the dataset contains a lot of noise, leading to less reliable predictions on new patient data. - -### Practical Tips for Using Extreme Gradient Boosting (XGBoost) -To maximize the effectiveness of XGBoost: - -- **Hyperparameter Tuning**: Carefully tune hyperparameters such as learning rate, number of trees, and tree depth to prevent overfitting and improve performance. -- **Regularization**: Use techniques like L1/L2 regularization and feature subsampling to stabilize the model and reduce overfitting. -- **Feature Engineering**: Create meaningful features and perform feature selection to enhance model performance. - -### Example: -In marketing analytics, XGBoost can predict customer churn by analyzing customer behavior data. Tuning hyperparameters and performing feature engineering ensures accurate and reliable predictions. - -### Real-World Examples - -#### Sales Forecasting -XGBoost is applied in retail to predict future sales based on historical data, seasonal trends, and market conditions. This helps businesses optimize inventory and plan marketing strategies. - -#### Customer Segmentation -In marketing analytics, XGBoost clusters customers based on purchasing behavior and demographic data, allowing businesses to target marketing campaigns effectively and improve customer retention. - -### Difference Between XGBoost and LightGBM -| Feature | XGBoost | LightGBM | -|---------------------------------|--------------------------------------|---------------------------------------| -| Speed | Fast, but slower compared to LightGBM | Faster due to histogram-based algorithms | -| Memory Usage | Higher memory usage | Lower memory usage | -| Tree Growth | Level-wise (breadth-first) growth | Leaf-wise (best-first) growth | - -### Implementation -To implement and train an XGBoost model, you can use the XGBoost library in Python. Below are the steps to install the necessary library and train an XGBoost model. - -#### Libraries to Download - -- `xgboost`: Essential for XGBoost implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install xgboost pandas numpy -``` - -#### Training an Extreme Gradient Boosting (XGBoost) Model -Here’s a step-by-step guide to training an XGBoost model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -import xgboost as xgb -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score, classification_report -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Create DMatrix for XGBoost:** - -```python -dtrain = xgb.DMatrix(X_train, label=y_train) -dtest = xgb.DMatrix(X_test, label=y_test) -``` - -**Define Parameters and Train the XGBoost Model:** - -```python -params = { - 'objective': 'binary:logistic', # For binary classification - 'eval_metric': 'logloss', - 'eta': 0.1, - 'max_depth': 6 -} - -bst = xgb.train(params, dtrain, num_boost_round=100, evals=[(dtest, 'test')], early_stopping_rounds=10) -``` - -**Evaluate the Model:** - -```python -y_pred = bst.predict(dtest) -y_pred_binary = [1 if pred > 0.5 else 0 for pred in y_pred] - -accuracy = accuracy_score(y_test, y_pred_binary) -print(f'Accuracy: {accuracy:.2f}') -print(classification_report(y_test, y_pred_binary)) -``` - -This example demonstrates loading data, preparing features, training an XGBoost model, and evaluating its performance using the XGBoost library. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: XGBoost can handle high-dimensional data efficiently. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In e-commerce, XGBoost helps in predicting customer purchase behavior by analyzing browsing history and purchase data, ensuring accurate predictions through efficient computational use. - -### Conclusion -Extreme Gradient Boosting (XGBoost) is a versatile and powerful algorithm for classification and regression tasks. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage XGBoost for a variety of predictive modeling tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Gaussian-Discriminant-Analysis.md b/docs/Machine Learning/Gaussian-Discriminant-Analysis.md deleted file mode 100644 index b4107d738..000000000 --- a/docs/Machine Learning/Gaussian-Discriminant-Analysis.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -id: Gaussian Discriminant Analysis -title: Gaussian Discriminant Analysis -sidebar_label: Introduction to Gaussian Discriminant Analysis -sidebar_position: 1 -tags: [Gaussian Discriminant Analysis, GDA, machine learning, classification algorithm, data analysis, data science, probabilistic modeling, supervised learning, discriminative model, Gaussian distribution, feature modeling, pattern recognition, Gaussian Naive Bayes] -description: In this tutorial, you will learn about Gaussian Discriminant Analysis (GDA), its importance, what GDA is, why learn GDA, how to use GDA, steps to start using GDA, and more. ---- - -### Introduction to Gaussian Discriminant Analysis -Gaussian Discriminant Analysis (GDA) is a classical supervised learning algorithm used for classification tasks. It models the probability distributions of features for each class using Gaussian distributions. GDA aims to classify new data points based on the likelihood that they belong to a particular class, making it a powerful tool for probabilistic classification tasks. - -### What is Gaussian Discriminant Analysis? -Gaussian Discriminant Analysis involves modeling the conditional probability distributions of features $X$ given each class $y$: - -- **Single Class Model**Each class $y$ is characterized by its own Gaussian distribution parameters: - - - **Mean**: Represents the average value or center of the distribution. - - - **Covariance**: Describes how the features of the data are correlated with each other. - -- **Decision Rule**: Classify new data points by choosing the class that maximizes the posterior probability $P(y | X)$ using Bayes' theorem. - - -**Gaussian Distribution**: Assumes feature values are normally distributed within each class. -**Bayes' Theorem**: Formula used to determine the probability of a hypothesis given prior knowledge. - - -### Example: -Consider GDA for email spam detection. The algorithm estimates Gaussian distributions of word frequencies in emails for spam and non-spam classes. By calculating posterior probabilities using these distributions, it predicts whether new emails are spam or not. - -### Advantages of Gaussian Discriminant Analysis -Gaussian Discriminant Analysis offers several advantages: - -- **Probabilistic Interpretation**: Provides probabilistic outputs that can be interpreted as confidence scores for class predictions. -- **Flexible Decision Boundaries**: Can model complex decision boundaries that are not necessarily linear. -- **Effective with Small Datasets**: Performs well even when training data is limited, making it suitable for various applications. - -### Example: -In medical diagnostics, GDA can classify patient symptoms and test results into disease categories based on their likelihood under different medical conditions, aiding in accurate diagnosis. - -### Disadvantages of Gaussian Discriminant Analysis -Despite its advantages, Gaussian Discriminant Analysis has limitations: - -- **Assumes Gaussian Distribution**: Performance heavily relies on the correct assumption of Gaussian distributions for features within each class. -- **Sensitive to Outliers**: Outliers or non-Gaussian data can distort distribution estimates, impacting classification accuracy. -- **Computational Intensity**: Estimating covariance matrices can be computationally expensive, especially with high-dimensional data. - -### Example: -In financial fraud detection, GDA's assumptions may not hold for all types of transaction data, leading to less reliable predictions in complex fraud scenarios. - -### Practical Tips for Using Gaussian Discriminant Analysis -To maximize the effectiveness of Gaussian Discriminant Analysis: - -- **Feature Engineering**: Transform or preprocess features to better fit Gaussian distributions (e.g., logarithmic transformation for skewed data). -- **Regularization**: Use regularization techniques to stabilize covariance matrix estimates and improve generalization. -- **Model Selection**: Consider alternative models like Naive Bayes (Gaussian Naive Bayes) if strong independence assumptions are plausible. - -### Example: -In sentiment analysis of customer reviews, GDA can classify reviews into positive, negative, or neutral sentiment categories based on word frequencies. Preprocessing text data to match Gaussian assumptions ensures accurate sentiment classification. - -### Real-World Examples - -#### Handwriting Recognition -Gaussian Discriminant Analysis is applied in optical character recognition (OCR) systems. By modeling pixel intensities of handwritten digits as Gaussian distributions, it can classify new digit images accurately. - -#### Market Segmentation -In marketing analytics, GDA clusters customers based on purchasing behavior and demographic data. This segmentation helps businesses tailor marketing strategies to different customer groups effectively. - -### Difference Between GDA and Naive Bayes -| Feature | Gaussian Discriminant Analysis (GDA) | Gaussian Naive Bayes | -|---------------------------------|--------------------------------------|----------------------| -| Assumptions | Assumes Gaussian distributions for features within each class. | Assumes independence between features given the class, with Gaussian distributions. | -| Complexity | Typically handles more complex decision boundaries. | Simpler and faster due to conditional independence assumption. | -| Use Cases | Suitable when Gaussian distributions are reasonable and complex decision boundaries are needed. | Suitable for high-dimensional data with strong feature dependencies. | - -### Implementation -To implement and train a Gaussian Discriminant Analysis model, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and train a GDA model. - -#### Libraries to Download -- `scikit-learn`: Essential for machine learning tasks, including GDA implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Gaussian Discriminant Analysis Model -Here’s a step-by-step guide to training a GDA model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.discriminant_analysis import LinearDiscriminantAnalysis -from sklearn.model_selection import train_test_split -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Feature Scaling (if necessary):** - -```python -# Perform feature scaling if required -from sklearn.preprocessing import StandardScaler -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the Gaussian Discriminant Analysis Model:** - -```python -gda = LinearDiscriminantAnalysis() -gda.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -from sklearn.metrics import accuracy_score, classification_report - -# Predict on test data -y_pred = gda.predict(X_test) - -# Evaluate accuracy -accuracy = accuracy_score(y_test, y_pred) -print(f'Accuracy: {accuracy:.2f}') - -# Optionally, print classification report for detailed evaluation -print(classification_report(y_test, y_pred)) -``` - -This example demonstrates loading data, preparing features, training a GDA model, and evaluating its performance using scikit-learn. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: GDA performs efficiently with moderate-sized datasets but may become computationally intensive with high-dimensional data. -- **Model Complexity**: Choosing appropriate regularization techniques can improve model stability and scalability. - -### Example: -In climate modeling, Gaussian Discriminant Analysis helps classify weather patterns based on historical data, facilitating accurate weather forecasting and climate analysis. - -### Conclusion -Gaussian Discriminant Analysis is a robust and interpretable classification algorithm suitable for various real-world applications. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage GDA for probabilistic classification tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Generative Adversarial Networks.md b/docs/Machine Learning/Generative Adversarial Networks.md deleted file mode 100644 index 4f311100f..000000000 --- a/docs/Machine Learning/Generative Adversarial Networks.md +++ /dev/null @@ -1,215 +0,0 @@ ---- - -id: generative-adversarial-networks -title: Generative Adversarial Networks (GANs) -sidebar_label: Introduction to GANs -sidebar_position: 1 -tags: [GANs, generative models, deep learning, machine learning, data science, unsupervised learning, neural networks, image generation, data augmentation] -description: In this tutorial, you will learn about Generative Adversarial Networks (GANs), their importance, what GANs are, why learn GANs, how to use GANs, steps to start using GANs, and more. - ---- - -### Introduction to Generative Adversarial Networks (GANs) -Generative Adversarial Networks (GANs) are a revolutionary class of artificial neural networks used for generative tasks. Introduced by Ian Goodfellow and his colleagues in 2014, GANs consist of two neural networks—the generator and the discriminator—that compete against each other to produce high-quality synthetic data. GANs have gained significant popularity for their ability to generate realistic images, videos, and other data types, making them a powerful tool in various applications. - -### What are GANs? -GANs involve two main components: - -- **Generator**: A neural network that generates synthetic data samples from random noise. Its goal is to produce data indistinguishable from real data. -- **Discriminator**: A neural network that evaluates the authenticity of the data samples. Its goal is to distinguish between real and synthetic data. - -The generator and discriminator are trained simultaneously in a minimax game framework where the generator tries to fool the discriminator, and the discriminator tries to correctly identify real versus fake data. - -:::info -**Generator Loss**: Measures how well the generator is at fooling the discriminator. The goal is to minimize this loss. - -**Discriminator Loss**: Measures how well the discriminator is at distinguishing real from fake data. The goal is to maximize this loss. -::: - -### Example: -Consider using GANs for image generation. The generator creates new images from random noise, while the discriminator evaluates whether these images are real (from the training dataset) or fake (generated by the generator). Over time, the generator improves its ability to create realistic images, and the discriminator becomes better at identifying real versus fake images. - -### Advantages of GANs -GANs offer several advantages: - -- **High-Quality Data Generation**: GANs can generate highly realistic and diverse data samples. -- **Data Augmentation**: GANs are useful for augmenting datasets, especially in scenarios with limited data. -- **Unsupervised Learning**: GANs can learn to generate data without requiring labeled datasets. - -### Example: -In medical imaging, GANs can generate synthetic images to augment training datasets, improving the performance of diagnostic models by providing more diverse training samples. - -### Disadvantages of GANs -Despite their advantages, GANs have limitations: - -- **Training Instability**: GANs can be difficult to train and may suffer from issues such as mode collapse, where the generator produces limited variations of samples. -- **Sensitive to Hyperparameters**: The performance of GANs is highly sensitive to hyperparameter settings, requiring careful tuning. - -### Example: -In video game development, GANs can generate realistic textures and environments. However, training stability and hyperparameter tuning are critical to achieving high-quality results. - -### Practical Tips for Using GANs -To maximize the effectiveness of GANs: - -- **Model Architecture**: Experiment with different architectures for the generator and discriminator to achieve the best performance. -- **Training Techniques**: Use techniques such as gradient penalty, label smoothing, and progressive training to stabilize training. -- **Hyperparameter Tuning**: Carefully tune hyperparameters like learning rates, batch sizes, and optimization algorithms. - -### Example: -In fashion design, GANs can generate new clothing designs. Using advanced training techniques and carefully tuning hyperparameters can result in innovative and realistic designs. - -### Real-World Examples - -#### Image Generation -GANs are widely used for image generation tasks such as creating realistic portraits, landscapes, and artworks. Companies use GANs to generate synthetic images for marketing, entertainment, and design. - -#### Data Augmentation -In machine learning, GANs are used to augment datasets by generating synthetic data samples. This is particularly useful in fields like medical imaging, where obtaining large labeled datasets is challenging. - -### Difference Between GANs and Variational Autoencoders (VAEs) - -| Feature | GANs | VAEs | -|----------------------------------|--------------------------------------------|-------------------------------------------| -| Approach | Adversarial training between generator and discriminator | Probabilistic approach using encoder and decoder networks | -| Objective | Generate realistic data samples | Learn latent representations and generate data samples | -| Training Complexity | More difficult to train due to adversarial nature | Easier to train due to explicit probabilistic framework | -| Output Quality | High-quality, realistic samples | Samples may be slightly less realistic but more diverse | -| Use Cases | Image generation, data augmentation | Anomaly detection, data compression, latent space exploration| - -### Implementation -To implement and train a GAN, you can use libraries such as TensorFlow or PyTorch in Python. Below are the steps to install the necessary libraries and train a GAN model. - -#### Libraries to Download - -- `TensorFlow` or `PyTorch`: Essential for building and training GANs. -- `numpy`: Useful for numerical operations. -- `matplotlib`: Useful for visualizing generated samples. - -You can install these libraries using pip: - -```bash -pip install tensorflow numpy matplotlib -``` - -#### Training a GAN Model -Here’s a step-by-step guide to training a GAN model: - -**Import Libraries:** - -```python -import numpy as np -import matplotlib.pyplot as plt -import tensorflow as tf -from tensorflow.keras.layers import Dense, Flatten, Reshape, LeakyReLU -from tensorflow.keras.models import Sequential -from tensorflow.keras.optimizers import Adam -``` - -**Define Generator and Discriminator:** - -```python -def build_generator(): - model = Sequential([ - Dense(256, input_dim=100), - LeakyReLU(alpha=0.2), - Dense(512), - LeakyReLU(alpha=0.2), - Dense(1024), - LeakyReLU(alpha=0.2), - Dense(28*28*1, activation='tanh'), - Reshape((28, 28, 1)) - ]) - return model - -def build_discriminator(): - model = Sequential([ - Flatten(input_shape=(28, 28, 1)), - Dense(512), - LeakyReLU(alpha=0.2), - Dense(256), - LeakyReLU(alpha=0.2), - Dense(1, activation='sigmoid') - ]) - return model -``` - -**Compile Models:** - -```python -# Compile discriminator -discriminator = build_discriminator() -discriminator.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5), metrics=['accuracy']) - -# Compile generator -generator = build_generator() - -# GAN model combining generator and discriminator -z = tf.keras.Input(shape=(100,)) -img = generator(z) -discriminator.trainable = False -validity = discriminator(img) -combined = tf.keras.Model(z, validity) -combined.compile(loss='binary_crossentropy', optimizer=Adam(0.0002, 0.5)) -``` - -**Train GAN:** - -```python -def train(epochs, batch_size=128, save_interval=50): - (X_train, _), (_, _) = tf.keras.datasets.mnist.load_data() - X_train = (X_train.astype(np.float32) - 127.5) / 127.5 - X_train = np.expand_dims(X_train, axis=-1) - valid = np.ones((batch_size, 1)) - fake = np.zeros((batch_size, 1)) - - for epoch in range(epochs): - idx = np.random.randint(0, X_train.shape[0], batch_size) - imgs = X_train[idx] - - noise = np.random.normal(0, 1, (batch_size, 100)) - gen_imgs = generator.predict(noise) - - d_loss_real = discriminator.train_on_batch(imgs, valid) - d_loss_fake = discriminator.train_on_batch(gen_imgs, fake) - d_loss = 0.5 * np.add(d_loss_real, d_loss_fake) - - noise = np.random.normal(0, 1, (batch_size, 100)) - g_loss = combined.train_on_batch(noise, valid) - - if epoch % save_interval == 0: - print(f"{epoch} [D loss: {d_loss[0]} | D accuracy: {100*d_loss[1]}] [G loss: {g_loss}]") - save_images(epoch) - -def save_images(epoch): - noise = np.random.normal(0, 1, (25, 100)) - gen_imgs = generator.predict(noise) - gen_imgs = 0.5 * gen_imgs + 0.5 - - fig, axs = plt.subplots(5, 5) - cnt = 0 - for i in range(5): - for j in range(5): - axs[i, j].imshow(gen_imgs[cnt, :, :, 0], cmap='gray') - axs[i, j].axis('off') - cnt += 1 - fig.savefig(f"images/mnist_{epoch}.png") - plt.close() - -train(epochs=10000, batch_size=64, save_interval=200) -``` - -This example demonstrates how to define, compile, and train a GAN model using TensorFlow. The generator creates synthetic images, and the discriminator evaluates them, improving the model's performance over time. Adjust the model architecture, hyperparameters, and dataset as needed for your specific use case. - -### Performance Considerations - -#### Training Stability -- **Techniques for Stabilizing Training**: Use techniques like Wasserstein loss, gradient penalty, and spectral normalization to stabilize GAN training - -. -- **Batch Size and Learning Rate**: Experiment with different batch sizes and learning rates to find the optimal settings for your GAN model. - -### Example: -In artwork generation, stabilizing training and fine-tuning hyperparameters ensure that GANs produce high-quality and diverse art pieces, enabling artists and designers to explore new creative possibilities. - -### Conclusion -Generative Adversarial Networks (GANs) are a powerful and versatile tool for generating high-quality synthetic data. By understanding their principles, advantages, and practical implementation steps, practitioners can effectively leverage GANs for various machine learning tasks, including image generation, data augmentation, and more. diff --git a/docs/Machine Learning/Gradient Boosted Regression Trees (GBRT).md b/docs/Machine Learning/Gradient Boosted Regression Trees (GBRT).md deleted file mode 100644 index 4ceb4f8fb..000000000 --- a/docs/Machine Learning/Gradient Boosted Regression Trees (GBRT).md +++ /dev/null @@ -1,160 +0,0 @@ ---- -id: gradient-boosted-regression-trees -title: Gradient Boosted Regression Trees (GBRT) -sidebar_label: Introduction to Gradient Boosted Regression Trees -sidebar_position: 4 -tags: [Gradient Boosted Regression Trees, GBRT, machine learning, regression algorithm, data analysis, data science, supervised learning, ensemble learning, boosting, decision trees] -description: In this tutorial, you will learn about Gradient Boosted Regression Trees (GBRT), their importance, what GBRT is, why learn GBRT, how to use GBRT, steps to start using GBRT, and more. ---- - -### Introduction to Gradient Boosted Regression Trees -Gradient Boosted Regression Trees (GBRT) is a powerful and widely-used ensemble learning technique for regression tasks. It builds an additive model in a forward stage-wise fashion; it allows for the optimization of arbitrary differentiable loss functions. GBRT combines the predictions of multiple base learners, typically decision trees, to produce a robust predictive model. - -### What is Gradient Boosted Regression Trees? -GBRT involves creating an ensemble of weak learners (usually shallow decision trees) in a sequential manner. Each new tree is trained to correct the errors made by the previous ensemble, resulting in a strong predictive model. - -- **Boosting**: An ensemble technique that combines the predictions of multiple models to improve accuracy. -- **Residual Error**: The difference between the actual and predicted values; each new tree is trained on the residuals of the previous trees. -- **Learning Rate**: A parameter that controls the contribution of each tree to the final model, helping to prevent overfitting. - -**Loss Function**: Measures the error between the predicted and actual values. Commonly used loss functions in GBRT include Mean Squared Error (MSE) for regression tasks. - -**Base Learners**: Typically, decision trees with limited depth (shallow trees) are used as base learners in GBRT. - -### Example: -Consider using GBRT for predicting house prices. By training on features such as location, size, and amenities, GBRT iteratively improves predictions by correcting errors from previous models. - -### Advantages of Gradient Boosted Regression Trees -GBRT offers several advantages: - -- **High Predictive Accuracy**: Capable of achieving high accuracy by sequentially reducing errors. -- **Flexibility**: Can handle various types of data and loss functions. -- **Robustness to Overfitting**: Incorporating regularization techniques like learning rate and tree depth can help prevent overfitting. - -### Example: -In financial forecasting, GBRT can accurately predict stock prices by iteratively improving the model based on past performance data. - -### Disadvantages of Gradient Boosted Regression Trees -Despite its strengths, GBRT has limitations: - -- **Training Time**: Computationally intensive and can be slow to train, especially with large datasets. -- **Parameter Sensitivity**: Performance depends on the choice of hyperparameters, which may require extensive tuning. -- **Complexity**: The model can become complex and hard to interpret compared to simpler models like linear regression. - -### Example: -In real-time applications like recommendation systems, the long training time of GBRT may not be suitable due to the need for quick updates and predictions. - -### Practical Tips for Using Gradient Boosted Regression Trees -To get the most out of GBRT: - -- **Hyperparameter Tuning**: Experiment with the number of trees, learning rate, and tree depth to optimize performance. -- **Cross-Validation**: Use cross-validation to assess model performance and prevent overfitting. -- **Feature Engineering**: Create meaningful features and handle missing values to improve model accuracy. -- **Regularization**: Apply techniques like limiting tree depth and using a small learning rate to stabilize the model. - -### Example: -In customer segmentation, careful tuning of GBRT hyperparameters and feature engineering can lead to more accurate and meaningful customer groupings. - -### Real-World Examples - -#### Energy Consumption Prediction -GBRT is used to predict energy consumption in buildings based on historical usage patterns and external factors like weather conditions, enabling better energy management and efficiency. - -#### Credit Risk Assessment -In finance, GBRT helps assess credit risk by predicting the likelihood of default based on customer data, allowing for more informed lending decisions. - -### Difference Between GBRT and Random Forest -| Feature | Gradient Boosted Regression Trees (GBRT) | Random Forest | -|---------------------------------|-----------------------------------------|--------------------------------------| -| Training Process | Sequential (each tree corrects errors of the previous trees) | Parallel (independent trees) | -| Objective | Minimize loss function iteratively | Reduce variance through averaging | -| Tuning Complexity | High (many hyperparameters) | Moderate | -| Performance on Noisy Data | Sensitive to noise | Robust | - -### Implementation -To implement and train a Gradient Boosted Regression Trees model, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and train a GBRT model. - -#### Libraries to Download -- scikit-learn: Provides the implementation of GBRT. -- pandas: Useful for data manipulation and analysis. -- numpy: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Gradient Boosted Regression Trees Model -Here’s a step-by-step guide to training a GBRT model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.model_selection import train_test_split -from sklearn.ensemble import GradientBoostingRegressor -from sklearn.preprocessing import StandardScaler -from sklearn.metrics import mean_squared_error -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Feature Scaling (if necessary):** - -```python -# Perform feature scaling if required -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the Gradient Boosted Regression Trees Model:** - -```python -gbrt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42) -gbrt.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -# Predict on test data -y_pred = gbrt.predict(X_test) - -# Evaluate Mean Squared Error -mse = mean_squared_error(y_test, y_pred) -print(f'Mean Squared Error: {mse:.2f}') -``` - -### Performance Considerations - -#### Computational Efficiency -- **Training Time**: GBRT can be slow to train, especially with large datasets and many trees. Parallel processing and GPUs can speed up training. -- **Memory Usage**: Large models with many trees can require significant memory. Ensure your system can handle the computational load. - -#### Model Complexity -- **Number of Trees**: More trees can increase model capacity but also training time and risk of overfitting. -- **Tree Depth**: Deeper trees can capture more complex relationships but may also lead to overfitting. Balance is key. - -### Example: -In climate modeling, GBRT can predict temperature changes by learning complex patterns in historical weather data, offering more accurate forecasts. - -### Conclusion -Gradient Boosted Regression Trees (GBRT) are a versatile and powerful technique for regression tasks in machine learning. By understanding its principles, advantages, and practical implementation, you can effectively apply GBRT to improve predictive performance in various real-world applications. diff --git a/docs/Machine Learning/Gradient-Boosting-Machines.md b/docs/Machine Learning/Gradient-Boosting-Machines.md deleted file mode 100644 index dfb230244..000000000 --- a/docs/Machine Learning/Gradient-Boosting-Machines.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -id: gradient-boosting-machine -title: Gradient Boosting Machine -sidebar_label: Introduction to Gradient Boosting Machine -sidebar_position: 1 -tags: [Gradient Boosting Machine, GBM, machine learning, classification algorithm, regression, data analysis, data science, boosting, ensemble learning, decision trees, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about Gradient Boosting Machine (GBM), its importance, what GBM is, why learn GBM, how to use GBM, steps to start using GBM, and more. ---- - -### Introduction to Gradient Boosting Machine -Gradient Boosting Machine (GBM) is a powerful supervised learning algorithm used for classification and regression tasks. It builds an ensemble of decision trees in a sequential manner, where each tree attempts to correct the errors of its predecessor. GBM is widely used in data science and machine learning due to its ability to produce highly accurate models. - -### What is Gradient Boosting Machine? -A **Gradient Boosting Machine (GBM)** is an ensemble learning algorithm that builds a model from a series of weaker models, typically decision trees, in a sequential manner. Each new model attempts to correct the errors made by the previous models, and the models are combined to produce a final prediction. GBM uses gradient descent to minimize a loss function, which measures the difference between the predicted and actual values. - -- **Boosting**: An ensemble technique that combines the predictions of multiple weak learners (e.g., decision trees) to create a strong learner. Boosting iteratively adjusts the weights of incorrectly predicted instances, ensuring subsequent trees focus more on difficult cases. - -- **Gradient Descent**: An optimization technique used to minimize the loss function by iteratively adjusting the model parameters. In GBM, gradient descent is used to fit new trees to the residual errors of the previous trees. - -**Decision Trees**: Simple models that split data based on feature values to make predictions. In GBM, trees are typically shallow to avoid overfitting. - -**Loss Function**: Measures the difference between the predicted and actual values. GBM minimizes the loss function to improve model accuracy. - - -### Example: -Consider GBM for predicting house prices. The algorithm sequentially builds decision trees, each one correcting the errors made by the previous trees. This results in a highly accurate predictive model that considers various factors influencing house prices. - -### Advantages of Gradient Boosting Machine -Gradient Boosting Machine offers several advantages: - -- **High Accuracy**: Produces highly accurate models by combining multiple decision trees. -- **Feature Importance**: Provides insights into the importance of different features in making predictions. -- **Flexibility**: Can be used for both classification and regression tasks, and handles various types of data well. - -### Example: -In fraud detection, GBM can accurately identify fraudulent transactions by learning complex patterns in transaction data and focusing on difficult-to-predict cases. - -### Disadvantages of Gradient Boosting Machine -Despite its advantages, Gradient Boosting Machine has limitations: - -- **Computationally Intensive**: Training GBM models can be time-consuming and require significant computational resources. -- **Prone to Overfitting**: If not properly tuned, GBM can overfit the training data, especially with too many trees. -- **Complexity**: Interpreting the final model can be challenging due to the ensemble of many trees. - -### Example: -In customer churn prediction, GBM might overfit the training data if too many trees are used, leading to poor generalization on new customer data. - -### Practical Tips for Using Gradient Boosting Machine -To maximize the effectiveness of Gradient Boosting Machine: - -- **Hyperparameter Tuning**: Carefully tune hyperparameters such as learning rate, number of trees, and tree depth to prevent overfitting and improve performance. -- **Regularization**: Use techniques like shrinkage (learning rate) and subsampling to stabilize the model and reduce overfitting. -- **Feature Engineering**: Create meaningful features and perform feature selection to enhance model performance. - -### Example: -In credit scoring, GBM can predict the likelihood of loan defaults. Tuning hyperparameters and performing feature engineering ensures that the model accurately assesses credit risk. - -### Real-World Examples - -#### Sales Forecasting -Gradient Boosting Machine is applied in retail to predict future sales based on historical data, seasonal trends, and market conditions. This helps businesses optimize inventory and plan marketing strategies. - -#### Customer Segmentation -In marketing analytics, GBM clusters customers based on purchasing behavior and demographic data, allowing businesses to target marketing campaigns effectively and improve customer retention. - -### Difference Between GBM and Random Forest -| Feature | Gradient Boosting Machine (GBM) | Random Forest | -|---------------------------------|---------------------------------|---------------| -| Learning Approach | Sequential (boosting) | Parallel (bagging) | -| Focus | Reducing errors of previous trees | Reducing variance through averaging | -| Use Cases | Suitable for highly accurate models and complex patterns | Suitable for robust models with lower risk of overfitting | - -### Implementation -To implement and train a Gradient Boosting Machine model, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and train a GBM model. - -#### Libraries to Download - -- `scikit-learn`: Essential for machine learning tasks, including GBM implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Gradient Boosting Machine Model -Here’s a step-by-step guide to training a GBM model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.ensemble import GradientBoostingClassifier -from sklearn.model_selection import train_test_split -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Feature Scaling (if necessary):** - -```python -# Perform feature scaling if required -from sklearn.preprocessing import StandardScaler -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the Gradient Boosting Machine Model:** - -```python -gbm = GradientBoostingClassifier() -gbm.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -from sklearn.metrics import accuracy_score, classification_report - -# Predict on test data -y_pred = gbm.predict(X_test) - -# Evaluate accuracy -accuracy = accuracy_score(y_test, y_pred) -print(f'Accuracy: {accuracy:.2f}') - -# Optionally, print classification report for detailed evaluation -print(classification_report(y_test, y_pred)) -``` - -This example demonstrates loading data, preparing features, training a GBM model, and evaluating its performance using scikit-learn. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: GBM can handle high-dimensional data but may require substantial computational resources. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In marketing, GBM helps in predicting customer churn by analyzing customer behavior and transaction history, enabling companies to take proactive measures to retain customers. - -### Conclusion -Gradient Boosting Machine is a versatile and powerful algorithm for classification and regression tasks. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage GBM for a variety of predictive modeling tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Hierarchical Clustering.md b/docs/Machine Learning/Hierarchical Clustering.md deleted file mode 100644 index ea28f8bc0..000000000 --- a/docs/Machine Learning/Hierarchical Clustering.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -id: Hierarchical Clustering -title: Hierarchical Clustering -sidebar_label: Introduction of Hierarchical Clustering -sidebar_position: 1 -tags: [hierarchical clustering, clustering algorithm, machine learning, data analysis, data science, dendrogram, agglomerative clustering, divisive clustering, unsupervised learning, data visualization, career opportunities, personal growth, clustering techniques, data segmentation, exploratory data analysis, machine learning algorithms] -description: In this tutorial, you will learn about Hierarchical Clustering, its importance, what Hierarchical Clustering is, why learn Hierarchical Clustering, how to use Hierarchical Clustering, steps to start using Hierarchical Clustering, and more. ---- - -### Introduction to Hierarchical Clustering -Hierarchical clustering is a powerful unsupervised learning algorithm used for clustering tasks. Unlike partitioning methods such as K-Means, hierarchical clustering builds a tree-like structure (dendrogram) that captures the nested grouping relationships among data points. This algorithm is intuitive, effective, and widely used for understanding the hierarchical relationships within datasets. - -### What is Hierarchical Clustering? -Hierarchical clustering can be divided into two main types: - -- **Agglomerative (Bottom-Up) Clustering**: Starts with each data point as an individual cluster and iteratively merges the closest pairs of clusters until a single cluster remains. -- **Divisive (Top-Down) Clustering**: Starts with all data points in a single cluster and recursively splits them into smaller clusters. - -:::info -**Leaves**: Represent individual data points. - -**Nodes**: Represent clusters formed at different stages of the algorithm. - -**Height**: Represents the distance or dissimilarity at which clusters are merged or split. -::: - -### Example: -Consider hierarchical clustering for customer segmentation in a retail company. Initially, each customer is a separate cluster. The algorithm merges customers based on purchase behavior and demographics, forming larger clusters. The dendrogram provides a visual representation of how clusters are nested, helping the company understand customer segments at different levels of granularity. - -### Advantages of Hierarchical Clustering -Hierarchical clustering offers several advantages: - -- **Interpretability**: The dendrogram provides a clear and interpretable visual representation of the nested clustering structure. -- **No Need to Specify Number of Clusters**: Unlike K-Means, hierarchical clustering does not require a predefined number of clusters, allowing for flexible exploration of the data. -- **Deterministic**: The algorithm is deterministic, meaning it produces the same result with each run, given the same data and parameters. - -### Example: -In a healthcare setting, hierarchical clustering can group patients based on a mix of symptoms, medical history, and demographics, providing interpretable insights into patient subgroups and their relationships. - -### Disadvantages of Hierarchical Clustering -Despite its advantages, hierarchical clustering has limitations: - -- **Computational Complexity**: The algorithm can be computationally expensive, especially with large datasets, as it requires computing and updating a distance matrix. -- **Sensitivity to Noise and Outliers**: Hierarchical clustering can be sensitive to noise and outliers, which may lead to the formation of less meaningful clusters. -- **Difficulty in Scaling**: The time complexity of hierarchical clustering makes it challenging to scale to very large datasets. - -### Example: -In financial markets, hierarchical clustering of assets based on historical price movements may be impacted by noise and outliers, leading to less stable clustering results. - -### Practical Tips for Using Hierarchical Clustering -To maximize the effectiveness of hierarchical clustering: - -- **Distance Metrics**: Choose an appropriate distance metric (e.g., Euclidean, Manhattan, or cosine) based on the nature of your data. -- **Linkage Criteria**: Select a suitable linkage criterion (e.g., single, complete, or average linkage) to define how the distance between clusters is computed. -- **Data Preprocessing**: Standardize or normalize your data to ensure that all features contribute equally to the distance calculations. - -### Example: -In e-commerce, hierarchical clustering can be used to segment products based on attributes like price, category, and customer ratings. Preprocessing the data to standardize these attributes ensures that the clustering results are meaningful and interpretable. - -### Real-World Examples - -#### Customer Segmentation -Hierarchical clustering is extensively used in retail for customer segmentation. By analyzing customer demographics, purchase history, and behavior, retailers can understand the hierarchical relationships among customer groups and tailor their marketing strategies accordingly. - -#### Gene Expression Analysis -In bioinformatics, hierarchical clustering helps analyze gene expression data by grouping genes with similar expression patterns. This aids in identifying gene functions and understanding the underlying biological processes. - -### Difference Between Agglomerative and Divisive Clustering - -| Feature | Agglomerative Clustering (Bottom-Up) | Divisive Clustering (Top-Down) | -|---------------------------------|-----------------------------------------|---------------------------------| -| Starting Point | Each data point starts as its own cluster. | All data points start in a single cluster. | -| Process | Iteratively merges the closest pairs of clusters. | Recursively splits the largest clusters. | -| Dendrogram Construction | Built from the leaves (individual points) up to the root (single cluster). | Built from the root (single cluster) down to the leaves (individual points). | -| Complexity | Generally more computationally efficient and widely used. | Typically more computationally intensive and less commonly used. | -| Use Cases | More suitable for large datasets where fine-grained merging is needed. | Can be useful when the top-down approach aligns better with the problem domain. | - -### Implementation -To implement and train a hierarchical clustering model, you can use a machine learning library such as scikit-learn. Below are the steps to install the necessary library and train a hierarchical clustering model. - -#### Libraries to Download -- `scikit-learn`: This is the primary library for machine learning in Python, including hierarchical clustering implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Useful for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Hierarchical Clustering Model -Here’s a step-by-step guide to training a hierarchical clustering model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.preprocessing import StandardScaler -from sklearn.cluster import AgglomerativeClustering -import matplotlib.pyplot as plt -import scipy.cluster.hierarchy as sch -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) -X = data.drop('target_column', axis=1) # replace 'target_column' with the name of your target column if applicable -``` - -**Feature Scaling:** - -```python -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Determine Optimal Number of Clusters:** -Using the dendrogram to visualize the cluster formation: - -```python -# Plot Dendrogram -plt.figure(figsize=(10, 7)) -dendrogram = sch.dendrogram(sch.linkage(X_scaled, method='ward')) -plt.title('Dendrogram') -plt.xlabel('Samples') -plt.ylabel('Euclidean distances') -plt.show() -``` - -**Initialize and Train the Hierarchical Clustering Model:** - -```python -# Initialize the Hierarchical Clustering model -hc = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward') # Choose the appropriate number of clusters - -# Train the model -hc.fit(X_scaled) -``` - -**Evaluate the Model:** - -```python -# Predict cluster labels -cluster_labels = hc.labels_ - -# Optionally, visualize the clusters -plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=cluster_labels, cmap='rainbow') -plt.title('Clusters') -plt.xlabel('Feature 1') -plt.ylabel('Feature 2') -plt.show() -``` - -This example demonstrates how to load data, prepare features, scale the features, determine the optimal number of clusters, train a hierarchical clustering model, and visualize the clustering results. You can adjust parameters and the dataset as needed for your specific use case. - -### Performance Considerations - -#### Scalability and Computational Efficiency -- **Large Datasets**: Hierarchical clustering can be slow with large datasets due to the need to compute and update the distance matrix. -- **Algorithmic Complexity**: Using techniques like approximate hierarchical clustering or limiting the dendrogram depth can improve scalability and efficiency. - -### Example: -In geospatial analysis, hierarchical clustering is used to identify patterns in geographical data. Optimizing the algorithm for large-scale geospatial data ensures efficient and accurate clustering, aiding in urban planning and resource allocation. - -### Conclusion -Hierarchical clustering is a versatile and powerful unsupervised learning algorithm suitable for a variety of applications. Understanding its strengths, limitations, and proper usage is crucial for effectively applying it to different datasets. By carefully selecting parameters, scaling features, and considering computational efficiency, hierarchical clustering can provide valuable insights and groupings for numerous real-world problems. diff --git a/docs/Machine Learning/K-Means Algorithm.md b/docs/Machine Learning/K-Means Algorithm.md deleted file mode 100644 index 3909428b6..000000000 --- a/docs/Machine Learning/K-Means Algorithm.md +++ /dev/null @@ -1,169 +0,0 @@ -# K-Means Clustering - -## Introduction to K-Means Clustering - -K-Means is a popular unsupervised machine learning algorithm used for clustering tasks. It aims to partition a dataset into K distinct, non-overlapping subgroups (clusters) where each data point belongs to the cluster with the nearest mean. This algorithm is simple, efficient, and widely used for identifying patterns and grouping similar data points. - -## K-Means Overview - -K-Means clustering works by initializing K centroids, then iteratively assigning each data point to the nearest centroid and updating the centroids to be the mean of all points in the cluster. This process continues until the centroids no longer change significantly or a maximum number of iterations is reached. The algorithm's goal is to minimize the variance within each cluster. - -### Example: - -Consider a K-Means model used to segment customers based on their purchasing behavior. The model identifies clusters of customers with similar spending patterns, enabling targeted marketing strategies. - -## Advantages of K-Means - -K-Means offers several advantages: - -- **Simplicity:** K-Means is easy to understand and implement. -- **Scalability:** It can efficiently handle large datasets. -- **Speed:** K-Means is computationally efficient, making it suitable for large-scale applications. - -### Example: - -In image compression, K-Means can reduce the number of colors in an image by clustering similar colors and replacing them with the centroid color, significantly reducing the file size. - -## Disadvantages of K-Means - -Despite its advantages, K-Means has some limitations: - -- **Choosing K:** Selecting the optimal number of clusters (K) can be challenging and often requires domain knowledge or trial and error. -- **Sensitivity to Initialization:** The final clusters can depend on the initial placement of centroids, potentially leading to different results in different runs. -- **Assumes Spherical Clusters:** K-Means assumes clusters are spherical and equally sized, which may not be true for all datasets. - -### Example: - -In market segmentation, incorrect initialization of centroids or an inappropriate choice of K can lead to suboptimal customer segments, affecting the effectiveness of marketing strategies. - -## Practical Tips for Using K-Means - -To maximize the effectiveness of K-Means: - -- **Choosing K:** Use methods like the Elbow Method or Silhouette Score to determine the optimal number of clusters. -- **Initialization:** Use techniques like K-Means++ to improve the initialization of centroids and achieve more consistent results. -- **Feature Scaling:** Standardize or normalize the features to ensure the algorithm treats all features equally. - -### Example: - -In social network analysis, K-Means can identify communities within a network. Properly choosing K and scaling features such as the number of connections and interaction frequency can enhance the quality of the identified communities. - -## Real-World Examples - -### Customer Segmentation - -K-Means is extensively used in customer segmentation to group customers based on similar characteristics, such as purchasing behavior, demographics, or engagement levels. This helps businesses tailor their marketing efforts to different customer segments. - -### Document Clustering - -In natural language processing, K-Means clusters documents with similar content. This is useful for organizing large collections of documents, such as news articles, into coherent topics or categories. - -## Implementation - -To implement and train a K-Means model, you can use a machine learning library such as `scikit-learn`. Below are the steps to install the necessary library and train a K-Means model. - -### Libraries to Download - -1. **scikit-learn**: This is the primary library for machine learning in Python, including the K-Means implementation. -2. **pandas**: Useful for data manipulation and analysis. -3. **numpy**: Useful for numerical operations. - -You can install these libraries using pip: - -```sh -pip install scikit-learn pandas numpy -``` - -### Training a K-Means Model - -Here’s a step-by-step guide to training a K-Means model: - -1. **Import Libraries**: - -```python -import pandas as pd -import numpy as np -from sklearn.preprocessing import StandardScaler -from sklearn.cluster import KMeans -from sklearn.metrics import silhouette_score -``` - -2. **Load and Prepare Data**: - -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) -X = data.drop('target_column', axis=1) # replace 'target_column' with the name of your target column if applicable -``` - -3. **Feature Scaling**: - -```python -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -4. **Determine Optimal Number of Clusters (K)**: - -Using the Elbow Method or Silhouette Score to find the best K: - -```python -# Elbow Method -inertia = [] -K = range(1, 11) -for k in K: - kmeans = KMeans(n_clusters=k, random_state=42) - kmeans.fit(X_scaled) - inertia.append(kmeans.inertia_) - -# Plot Elbow Method -import matplotlib.pyplot as plt -plt.figure(figsize=(8, 4)) -plt.plot(K, inertia, 'bx-') -plt.xlabel('Number of clusters') -plt.ylabel('Inertia') -plt.title('Elbow Method for Optimal K') -plt.show() -``` - -5. **Initialize and Train the K-Means Model**: - -```python -# Initialize the K-Means model with the chosen number of clusters -kmeans = KMeans(n_clusters=3, random_state=42) # Choose the appropriate number of clusters - -# Train the model -kmeans.fit(X_scaled) -``` - -6. **Evaluate the Model**: - -```python -# Predict cluster labels -cluster_labels = kmeans.predict(X_scaled) - -# Calculate Silhouette Score -sil_score = silhouette_score(X_scaled, cluster_labels) -print(f'Silhouette Score: {sil_score}') -``` - -This example demonstrates how to load data, prepare features, scale the features, determine the optimal number of clusters, train a K-Means model, and evaluate its performance. You can adjust parameters and the dataset as needed for your specific use case. - -## Performance Considerations - -### Scalability and Computational Efficiency - -- **Large Datasets:** K-Means can be slow with large datasets due to multiple iterations over all data points. -- **Algorithmic Complexity:** Using techniques like mini-batch K-Means can improve the scalability and efficiency of the algorithm. - -### Example: - -In geospatial analysis, K-Means is used to cluster geographical locations based on coordinates. Optimizing the algorithm for large-scale geospatial data ensures efficient and accurate clustering, aiding in urban planning and resource allocation. - -## Conclusion - -K-Means clustering is a versatile and powerful unsupervised learning algorithm suitable for a variety of applications. Understanding its strengths, limitations, and proper usage is crucial for effectively applying it to different datasets. By carefully selecting parameters, scaling features, and considering computational efficiency, K-Means can provide valuable insights and groupings for numerous real-world problems. diff --git a/docs/Machine Learning/Light Gradient Boosting Machine.md b/docs/Machine Learning/Light Gradient Boosting Machine.md deleted file mode 100644 index 6722b96d6..000000000 --- a/docs/Machine Learning/Light Gradient Boosting Machine.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -id: lightgbm -title: Light Gradient Boosting Machine (LightGBM) -sidebar_label: Introduction to LightGBM -sidebar_position: 1 -tags: [LightGBM, gradient boosting, machine learning, classification algorithm, regression, data analysis, data science, boosting, ensemble learning, decision trees, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about Light Gradient Boosting Machine (LightGBM), its importance, what LightGBM is, why learn LightGBM, how to use LightGBM, steps to start using LightGBM, and more. ---- - -### Introduction to Light Gradient Boosting Machine (LightGBM) -Light Gradient Boosting Machine (LightGBM) is a powerful, efficient gradient boosting framework that uses tree-based learning algorithms. It is designed to be distributed and efficient, offering high speed and performance, making it widely used in data science and machine learning for classification and regression tasks. - -### What is Light Gradient Boosting Machine (LightGBM)? -A **Light Gradient Boosting Machine (LightGBM)** is an implementation of gradient boosting decision tree (GBDT) algorithms, optimized for speed and efficiency. LightGBM builds decision trees sequentially, where each tree attempts to correct the errors of its predecessor. It uses histogram-based algorithms for finding the best split, which significantly reduces training time and memory usage. - -- **Gradient Boosting**: An ensemble technique that combines the predictions of multiple weak learners (e.g., decision trees) to create a strong learner. Boosting iteratively adjusts the weights of incorrectly predicted instances, ensuring subsequent trees focus more on difficult cases. - -- **Histogram-Based Algorithms**: Efficiently bin continuous features into discrete bins, speeding up the training process and reducing memory consumption. - -**Decision Trees**: Simple models that split data based on feature values to make predictions. LightGBM uses leaf-wise (best-first) tree growth, which can result in deeper trees and better accuracy. - -**Loss Function**: Measures the difference between the predicted and actual values. LightGBM minimizes the loss function to improve model accuracy. - -### Example: -Consider LightGBM for predicting loan defaults. The algorithm processes historical loan data, learning patterns and trends to accurately predict the likelihood of default. - -### Advantages of Light Gradient Boosting Machine (LightGBM) -LightGBM offers several advantages: - -- **High Speed and Efficiency**: Significantly faster training and prediction times compared to traditional gradient boosting methods. -- **Scalability**: Can handle large datasets and high-dimensional data efficiently. -- **Accuracy**: Produces highly accurate models with robust performance. -- **Feature Importance**: Provides insights into the importance of different features in making predictions. - -### Example: -In credit scoring, LightGBM can quickly and accurately assess the risk of loan applicants by analyzing their financial history and behavior patterns. - -### Disadvantages of Light Gradient Boosting Machine (LightGBM) -Despite its advantages, LightGBM has limitations: - -- **Complexity**: Proper tuning of hyperparameters is essential to achieve optimal performance. -- **Prone to Overfitting**: If not properly tuned, LightGBM can overfit the training data, especially with too many trees or features. -- **Sensitivity to Noisy Data**: May be sensitive to noisy data, requiring careful preprocessing. - -### Example: -In healthcare predictive analytics, LightGBM might overfit if the dataset contains a lot of noise, leading to less reliable predictions on new patient data. - -### Practical Tips for Using Light Gradient Boosting Machine (LightGBM) -To maximize the effectiveness of LightGBM: - -- **Hyperparameter Tuning**: Carefully tune hyperparameters such as learning rate, number of trees, and tree depth to prevent overfitting and improve performance. -- **Regularization**: Use techniques like L1/L2 regularization and feature subsampling to stabilize the model and reduce overfitting. -- **Feature Engineering**: Create meaningful features and perform feature selection to enhance model performance. - -### Example: -In marketing analytics, LightGBM can predict customer churn by analyzing customer behavior data. Tuning hyperparameters and performing feature engineering ensures accurate and reliable predictions. - -### Real-World Examples - -#### Fraud Detection -LightGBM is applied in financial services to detect fraudulent transactions in real-time, analyzing transaction patterns and flagging anomalies to prevent fraud. - -#### Customer Segmentation -In marketing analytics, LightGBM clusters customers based on purchasing behavior and demographic data, allowing businesses to target marketing campaigns effectively and improve customer retention. - -### Difference Between LightGBM and XGBoost -| Feature | LightGBM | XGBoost | -|---------------------------------|-----------------------------------|--------------------------------------| -| Speed | Faster due to histogram-based algorithms | Slower, uses exact greedy algorithms | -| Memory Usage | Lower memory usage | Higher memory usage | -| Tree Growth | Leaf-wise (best-first) growth | Level-wise (breadth-first) growth | - -### Implementation -To implement and train a LightGBM model, you can use the LightGBM library in Python. Below are the steps to install the necessary library and train a LightGBM model. - -#### Libraries to Download - -- `lightgbm`: Essential for LightGBM implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install lightgbm pandas numpy -``` - -#### Training a Light Gradient Boosting Machine (LightGBM) Model -Here’s a step-by-step guide to training a LightGBM model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -import lightgbm as lgb -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score, classification_report -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -**Create LightGBM Dataset:** - -```python -train_data = lgb.Dataset(X_train, label=y_train) -test_data = lgb.Dataset(X_test, label=y_test, reference=train_data) -``` - -**Define Parameters and Train the LightGBM Model:** - -```python -params = { - 'objective': 'binary', # For binary classification - 'metric': 'binary_logloss', - 'boosting_type': 'gbdt', - 'learning_rate': 0.1, - 'num_leaves': 31, - 'feature_fraction': 0.9 -} - -bst = lgb.train(params, train_data, num_boost_round=100, valid_sets=[test_data], early_stopping_rounds=10) -``` - -**Evaluate the Model:** - -```python -y_pred = bst.predict(X_test, num_iteration=bst.best_iteration) -y_pred_binary = [1 if pred > 0.5 else 0 for pred in y_pred] - -accuracy = accuracy_score(y_test, y_pred_binary) -print(f'Accuracy: {accuracy:.2f}') -print(classification_report(y_test, y_pred_binary)) -``` - -This example demonstrates loading data, preparing features, training a LightGBM model, and evaluating its performance using the LightGBM library. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: LightGBM can handle high-dimensional data efficiently. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In e-commerce, LightGBM helps in predicting customer purchase behavior by analyzing browsing history and purchase data, ensuring accurate predictions through efficient computational use. - -### Conclusion -Light Gradient Boosting Machine (LightGBM) is a versatile and powerful algorithm for classification and regression tasks. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage LightGBM for a variety of predictive modeling tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Linear Discriminant Analysis.md b/docs/Machine Learning/Linear Discriminant Analysis.md deleted file mode 100644 index dac187b01..000000000 --- a/docs/Machine Learning/Linear Discriminant Analysis.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -id: linear-discriminant-analysis -title: Linear Discriminant Analysis -sidebar_label: Introduction to Linear Discriminant Analysis -sidebar_position: 3 -tags: [Linear Discriminant Analysis, LDA, machine learning, classification algorithm, data analysis, data science, supervised learning, dimensionality reduction, pattern recognition] -description: In this tutorial, you will learn about Linear Discriminant Analysis (LDA), its importance, what LDA is, why learn LDA, how to use LDA, steps to start using LDA, and more. ---- - -### Introduction to Linear Discriminant Analysis -Linear Discriminant Analysis (LDA) is a powerful classification and dimensionality reduction technique used in machine learning. It seeks to find a linear combination of features that best separates two or more classes. LDA is particularly effective when you need to reduce the dimensionality of your data while maintaining class separability. - -### What is Linear Discriminant Analysis? -LDA works by projecting data points onto a lower-dimensional space where class separability is maximized. It does this by: - -- **Maximizing Separation**: Finding a linear combination of features that maximizes the distance between the means of different classes while minimizing the spread (variance) within each class. -- **Dimensionality Reduction**: Reducing the number of features while retaining as much discriminatory information as possible. - -**Within-Class Scatter Matrix**: Measures how data points within each class scatter around their respective class mean. - -**Between-Class Scatter Matrix**: Measures the separation between the class means. - -### Example: -Consider using LDA for facial recognition. By projecting high-dimensional facial features onto a lower-dimensional space, LDA helps in distinguishing between different individuals based on their facial features. - -### Advantages of Linear Discriminant Analysis -LDA offers several advantages: - -- **Effective Dimensionality Reduction**: Reduces the number of features while maintaining class separability, which can improve model performance and reduce overfitting. -- **Class Separability**: Maximizes the distance between class means, enhancing classification accuracy. -- **Interpretability**: The linear combinations of features can be easily interpreted. - -### Example: -In medical diagnostics, LDA can classify patients into different disease categories based on their test results, reducing the complexity of the feature space while preserving critical information for accurate diagnosis. - -### Disadvantages of Linear Discriminant Analysis -Despite its strengths, LDA has limitations: - -- **Linearity Assumption**: Assumes that the relationship between features and classes is linear, which may not hold for all datasets. -- **Normality Assumption**: Assumes that features are normally distributed within each class, which may not always be the case. -- **Sensitivity to Imbalance**: Performance may be affected by imbalanced class distributions. - -### Example: -In fraud detection, if the features do not follow a Gaussian distribution or if there is significant class imbalance, LDA might not perform optimally. - -### Practical Tips for Using Linear Discriminant Analysis -To get the most out of LDA: - -- **Feature Scaling**: Standardize features to ensure they have the same scale, which can improve the performance of LDA. -- **Data Preprocessing**: Handle missing values and outliers to improve the quality of the input data. -- **Evaluate Assumptions**: Check the assumptions of normality and linearity before applying LDA. - -### Example: -In customer segmentation, preprocessing features by scaling and handling missing data ensures that LDA effectively reduces dimensionality and enhances class separation. - -### Real-World Examples - -#### Face Recognition -LDA is used in facial recognition systems to reduce the dimensionality of facial feature vectors while preserving the variance between different faces, improving the efficiency and accuracy of the recognition process. - -#### Medical Diagnosis -In medical imaging, LDA can be employed to classify images into different categories (e.g., tumor vs. non-tumor) based on extracted features, facilitating diagnostic decisions. - -### Difference Between LDA and PCA -| Feature | Linear Discriminant Analysis (LDA) | Principal Component Analysis (PCA) | -|---------------------------------|-------------------------------------------|--------------------------------------| -| Objective | Maximizes class separability. | Maximizes variance in the data. | -| Assumptions | Assumes linear boundaries between classes. | Does not consider class labels. | -| Dimensionality Reduction | Focuses on preserving class structure. | Focuses on preserving variance. | - -### Implementation -To implement and train a Linear Discriminant Analysis model, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and train an LDA model. - -#### Libraries to Download -- scikit-learn: Provides the implementation of LDA. -- pandas: Useful for data manipulation and analysis. -- numpy: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Linear Discriminant Analysis Model -Here’s a step-by-step guide to training an LDA model: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.discriminant_analysis import LinearDiscriminantAnalysis -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler -from sklearn.metrics import accuracy_score, classification_report -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Feature Scaling (if necessary):** - -```python -# Perform feature scaling if required -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the Linear Discriminant Analysis Model:** - -```python -lda = LinearDiscriminantAnalysis() -lda.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -# Predict on test data -y_pred = lda.predict(X_test) - -# Evaluate accuracy -accuracy = accuracy_score(y_test, y_pred) -print(f'Accuracy: {accuracy:.2f}') - -# Optionally, print classification report for detailed evaluation -print(classification_report(y_test, y_pred)) -``` - -### Performance Considerations - -#### Computational Efficiency -- **Dataset Size**: LDA is generally efficient for moderate-sized datasets but may require more computational resources with very large datasets. -- **Dimensionality**: High-dimensional data can be reduced using LDA, which helps in managing computational costs and improving model performance. - -### Example: -In customer behavior analysis, using LDA to reduce feature dimensions can enhance the performance of subsequent classification models and reduce computational overhead. - -### Conclusion -Linear Discriminant Analysis is a valuable tool for both classification and dimensionality reduction. By understanding its assumptions, advantages, and limitations, practitioners can effectively apply LDA to enhance model performance and gain insights from complex datasets in various machine learning and data science projects. diff --git a/docs/Machine Learning/Logistic-Regression.md b/docs/Machine Learning/Logistic-Regression.md deleted file mode 100644 index 34904faaa..000000000 --- a/docs/Machine Learning/Logistic-Regression.md +++ /dev/null @@ -1,100 +0,0 @@ -# Logistic Regression - - -``` python -from sklearn.datasets import make_classification - -X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42) -``` -Above, is the custom dataset made using `make_classification` from -`sklearn.datasets` . - -``` python -import matplotlib.pyplot as plt -plt.scatter(X[:,0],X[:,1]) -plt.show() -``` -![55558f59d1b98e9a3cc68d08daae54b9b065d057](https://github.com/AmrutaJayanti/codeharborhub/assets/142327526/84578011-0887-43da-b972-9e6f04ae505e) - - - -Logistic Regression is a statistical method used for binary -classification problem. It models the probability that a given input -belongs to a particular category. - -Logistic Function (Sigmoid Function): The core of logistic regression is -the logistic function, which is an S-shaped curve that can take any -real-valued number and map it into a value between 0 and 1. The function -is defined as: - -$$\sigma(x) = \frac{1}{1 + e^{-x}}$$ - -where $x$ is the input to the function - -Logistic Regression is generally used for linearly separated data. - -Logistic Regression cost function : - -$J(\beta) = - \frac{1}{m} \sum_{i=1}^{m} \left[ y_i \log(h_\beta(x_i)) + (1 - y_i) \log(1 - h_\beta(x_i)) \right]$ - -### Applications - -- **Medical Diagnosis**: Predicting whether a patient has a certain - disease (e.g., diabetes, cancer) based on diagnostic features. -- **Spam Detection**: Classifying emails as spam or not spam. -- **Customer Churn**: Predicting whether a customer will leave a - service. -- **Credit Scoring**: Assessing whether a loan applicant is likely to - default on a loan. - - -``` python -from sklearn.model_selection import train_test_split -x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42) -``` - -`X`,`y` are split into training and testing data using `train_test_split` - -``` python -from sklearn.linear_model import LogisticRegression - -model = LogisticRegression() -model.fit(x_train,y_train) -y_pred = model.predict(x_test) - -from sklearn.metrics import accuracy_score -accuracy_score(y_test,y_pred) - -``` -Output: - - 1.0 - -Our model predicts data accurately. Hence the accuracy score is 1 . - -``` python -import numpy as np -x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 -y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 -xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), - np.arange(y_min, y_max, 0.01)) - -# Predict the class for each grid point -Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) -Z = Z.reshape(xx.shape) - -# Plot decision boundary and data points -plt.figure(figsize=(8, 6)) -plt.contourf(xx, yy, Z, alpha=0.8, cmap='viridis') -plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='o', edgecolors='k') -plt.xlabel('Feature 1') -plt.ylabel('Feature 2') -plt.title('Logistic Regression Decision Boundary') -plt.show() -``` - -![3709358d7ef950353a7f26d9dfbb2f5f16fc962e](https://github.com/AmrutaJayanti/codeharborhub/assets/142327526/bd7361ac-b710-4975-8fb2-1ad4bf0ebe99) - - - - diff --git a/docs/Machine Learning/Multiple Regression Visualized/Weight and bias in Multiple Regression.md b/docs/Machine Learning/Multiple Regression Visualized/Weight and bias in Multiple Regression.md deleted file mode 100644 index bfd6eb808..000000000 --- a/docs/Machine Learning/Multiple Regression Visualized/Weight and bias in Multiple Regression.md +++ /dev/null @@ -1,69 +0,0 @@ -# Bias and Weight Visualization in Multiple Regression - -## Introduction - -Multiple regression is a fundamental technique in machine learning used to model the relationship between multiple independent variables and a dependent variable. Visualizing the bias and weights in multiple regression can provide insights into the model's behavior and the importance of different features. - -## Multiple Regression Model - -In multiple regression, we model the relationship as: - -$$ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n + \epsilon $$ - -Where: -- $y$ is the dependent variable -- $x_1, x_2, ..., x_n$ are independent variables -- $\beta_0$ is the bias (intercept) -- $\beta_1, \beta_2, ..., \beta_n$ are the weights (coefficients) -- $\epsilon$ is the error term - -## Mathematical Interpretation - -### Bias ($\beta_0$) - -The bias represents the expected value of $y$ when all $x_i = 0$. It shifts the entire prediction surface up or down. - -### Weights ($\beta_i$) - -Each weight $\beta_i$ represents the expected change in $y$ for a one-unit increase in $x_i$, holding all other variables constant: - -$$\frac{\partial y}{\partial x_i} = \beta_i$$ - -## Regularization Effects - -Regularization techniques like Lasso (L1) and Ridge (L2) affect weight visualization: - -### Lasso Regularization - -Lasso tends to push some weights to exactly zero, resulting in sparse models: - -$$\min_{\beta} \left\{ \sum_{i=1}^n (y_i - \beta_0 - \sum_{j=1}^p \beta_j x_{ij})^2 + \lambda \sum_{j=1}^p |\beta_j| \right\}$$ - -### Ridge Regularization - -Ridge shrinks weights towards zero but rarely sets them exactly to zero: - -$$\min_{\beta} \left\{ \sum_{i=1}^n (y_i - \beta_0 - \sum_{j=1}^p \beta_j x_{ij})^2 + \lambda \sum_{j=1}^p \beta_j^2 \right\}$$ - -Visualizing weights after regularization can show how different features are affected by the regularization process. - -## Conclusion - -Visualizing bias and weights in multiple regression provides valuable insights into model behavior, feature importance, and the effects of regularization. These visualizations aid in model interpretation, feature selection, and understanding the underlying relationships in the data. - -## How to Use This Repository - -- Clone this repository to your local machine. - -```bash - git clone https://github.com/CodeHarborHub/codeharborhub.github.io/tree/main/docs/Machine%20Learning/Multiple Regression Visualized -``` -- For Python implementations and visualizations: - -1. Ensure you have Jupyter Notebook installed - -```bash - pip install jupyter -``` -2. Navigate to the project directory in your terminal. -3. Open weight_bias_multiple_regression.ipynb. diff --git a/docs/Machine Learning/Naive Bayes classifier/Images/equation.webp b/docs/Machine Learning/Naive Bayes classifier/Images/equation.webp deleted file mode 100644 index 822e41df275ba39198fb10f7c777b240ae05711f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15916 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 diff --git a/docs/Machine Learning/Naive Bayes classifier/Images/thomas bayes.webp b/docs/Machine Learning/Naive Bayes classifier/Images/thomas bayes.webp deleted file mode 100644 index cf6babbcec25eacb6ac78ba81836b34fb9c2c283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7042 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 H0|5UA!RCKW diff --git a/docs/Machine Learning/Naive Bayes classifier/Naive-Bayes.md b/docs/Machine Learning/Naive Bayes classifier/Naive-Bayes.md deleted file mode 100644 index c0cb8ae92..000000000 --- a/docs/Machine Learning/Naive Bayes classifier/Naive-Bayes.md +++ /dev/null @@ -1,93 +0,0 @@ -# Naive Bayes Classifier - -## Introduction - -Naive Bayes is a probabilistic machine learning algorithm based on Bayes' theorem, with an assumption of independence between predictors. It's particularly useful for classification tasks and is known for its simplicity and effectiveness, especially with high-dimensional datasets. - - - - -## Theory - -### Bayes' Theorem - -The foundation of Naive Bayes is Bayes' theorem, which describes the probability of an event based on prior knowledge of conditions that might be related to the event. - - -$$ P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} $$ - -Where: -- $P(A|B)$ is the posterior probability -- $P(B|A)$ is the likelihood -- $P(A)$ is the prior probability -- $P(B)$ is the marginal likelihood - - - - -### Naive Bayes Classifier - -The Naive Bayes classifier extends this to classify data points into categories. It assumes that the presence of a particular feature in a class is unrelated to the presence of any other feature (the "naive" assumption). - -For a data point $X = (x_1, x_2, ..., x_n)$ and a class variable : - -$$ P(C|X) = \frac{P(X|C) \cdot P(C)}{P(X)} $$ - -The classifier chooses the class with the highest posterior probability: - -$$ C^* = \underset{c \in C}{argmax} P(X|c) \cdot P(c) $$ - -### Mathematical Formulation - -For a given set of features $(x_1, x_2, ..., x_n)$: - -$$ P(C|x_1, x_2, ..., x_n) \propto P(C) \cdot P(x_1|C) \cdot P(x_2|C) \cdot ... \cdot P(x_n|C) $$ - -Where: -- $P(C|x_1, x_2, ..., x_n)$ is the posterior probability of class $C$ given the features -- $P(C)$ is the prior probability of class $C$ -- $P(x_i|C)$ is the likelihood of feature $x_i$ given class $C$ - -## Types of Naive Bayes Classifiers - -1. **Gaussian Naive Bayes**: Assumes continuous values associated with each feature are distributed according to a Gaussian distribution. - -2. **Multinomial Naive Bayes**: Typically used for discrete counts, like word counts in text classification. - -3. **Bernoulli Naive Bayes**: Used for binary feature models (0s and 1s). - -## Example: Gaussian Naive Bayes in scikit-learn - -Here's a simple example of using Gaussian Naive Bayes in scikit-learn: - -```python -from sklearn.naive_bayes import GaussianNB -from sklearn.datasets import load_iris -from sklearn.model_selection import train_test_split -from sklearn.metrics import accuracy_score - -# Load the iris dataset -iris = load_iris() -X, y = iris.data, iris.target - -# Split the data into training and testing sets -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) - -# Initialize and train -gnb = GaussianNB() -gnb.fit(X_train, y_train) - -# Predictions -y_pred = gnb.predict(X_test) - -# Accuracy -accuracy = accuracy_score(y_test, y_pred) -print(f"Accuracy: {accuracy:.2f}") - -``` - -## Applications of Naive Bayes Algorithm -- Real-time Prediction. -- Multi-class Prediction. -- Text classification/ Spam Filtering/ Sentiment Analysis. -- Recommendation Systems. diff --git a/docs/Machine Learning/Principal Component Analysis.md b/docs/Machine Learning/Principal Component Analysis.md deleted file mode 100644 index 8e03e03f8..000000000 --- a/docs/Machine Learning/Principal Component Analysis.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -id: principal-component-analysis -title: Principal Component Analysis -sidebar_label: Introduction to Principal Component Analysis -sidebar_position: 1 -tags: [Principal Component Analysis, PCA, machine learning, dimensionality reduction, data analysis, data science, feature extraction, unsupervised learning, data preprocessing, variance, eigenvectors, eigenvalues] -description: In this tutorial, you will learn about Principal Component Analysis (PCA), its importance, what PCA is, why learn PCA, how to use PCA, steps to start using PCA, and more. ---- - -### Introduction to Principal Component Analysis -Principal Component Analysis (PCA) is a powerful unsupervised learning algorithm used for dimensionality reduction. It transforms high-dimensional data into a lower-dimensional form while retaining as much variability as possible. PCA is widely used in data preprocessing, visualization, and noise reduction, making it an essential tool for data scientists and machine learning practitioners. - -### What is Principal Component Analysis? -Principal Component Analysis (PCA) is a powerful unsupervised learning algorithm used for dimensionality reduction. It transforms high-dimensional data into a lower-dimensional form while retaining as much variability as possible. PCA achieves this by identifying the directions, called principal components, along which the data varies the most. These principal components are new orthogonal axes where the original data can be projected, effectively reducing its dimensionality. - -PCA is widely used in data preprocessing, visualization, and noise reduction tasks, making it an essential tool for data scientists and machine learning practitioners. - -Principal Component Analysis involves identifying the principal components that capture the most variance in the data: - -**Principal Components:** Orthogonal vectors that represent directions of maximum variance in the data. These components are linear combinations of the original features. - -**Eigenvectors:** Represent the direction of the principal components. - -**Eigenvalues:** Represent the magnitude of the variance captured by each principal component. - -**Transformation:** Projects the original data onto the new subspace defined by the principal components. - -**Variance:** Measures the spread of the data points. PCA aims to maximize the variance in the projected subspace. - -**Covariance Matrix:** A matrix representing the covariance between pairs of features. PCA uses the covariance matrix to identify principal components. - -**Linear Correlation:** Two variables are linearly correlated if a linear function of one variable can be used to predict the other variable. Understanding linear correlation is crucial as PCA relies on these relationships to identify the principal components that best summarize the data's variance. - -**Example:** -Consider PCA for image compression. The algorithm reduces the dimensionality of image data by finding principal components that capture the most significant features, allowing for efficient storage and transmission of images with minimal loss of quality. -### Advantages of Principal Component Analysis -Principal Component Analysis offers several advantages: - -- **Dimensionality Reduction**: Reduces the number of features while retaining the most important information, making data easier to visualize and analyze. -- **Noise Reduction**: Removes noise and redundant features, improving the performance of machine learning models. -- **Data Visualization**: Projects high-dimensional data into 2D or 3D spaces for easier visualization and interpretation. - -### Example: -In genetics, PCA can reduce the dimensionality of gene expression data, allowing researchers to visualize and identify patterns in genetic variations across different populations. - -### Disadvantages of Principal Component Analysis -Despite its advantages, Principal Component Analysis has limitations: - -- **Loss of Interpretability**: Transformed features (principal components) are linear combinations of original features, making them harder to interpret. -- **Assumes Linearity**: PCA assumes linear relationships between features, which may not hold in all datasets. -- **Sensitive to Scaling**: Features with different scales can disproportionately influence the principal components, requiring careful preprocessing. - -### Example: -In finance, PCA might struggle with non-linear relationships between stock prices and economic indicators, limiting its effectiveness in some predictive modeling tasks. - -### Practical Tips for Using Principal Component Analysis -To maximize the effectiveness of Principal Component Analysis: - -- **Standardize Features**: Scale features to have zero mean and unit variance before applying PCA to ensure all features contribute equally. -- **Choose the Right Number of Components**: Use techniques like the explained variance ratio to determine the optimal number of principal components to retain. -- **Interpret Results with Caution**: While PCA simplifies data, interpreting the transformed features requires understanding their linear combinations. - -### Example: -In face recognition, PCA can reduce the dimensionality of facial image data, identifying key features that distinguish different faces. Standardizing pixel values ensures that variations in lighting and contrast do not distort the analysis. - -### Real-World Examples - -#### Image Compression -PCA is used to compress images by reducing the number of pixels while retaining essential visual information. This technique is widely applied in image storage, transmission, and processing. - -#### Market Segmentation -In marketing analytics, PCA helps identify key factors that influence customer behavior, allowing businesses to segment their customer base and tailor marketing strategies effectively. - -### Difference Between PCA and LDA -| Feature | Principal Component Analysis (PCA) | Linear Discriminant Analysis (LDA) | -|---------------------------------|------------------------------------|-----------------------------------| -| Purpose | Dimensionality reduction by maximizing variance. | Dimensionality reduction by maximizing class separability. | -| Data Type | Unsupervised learning. | Supervised learning. | -| Use Cases | Suitable for feature extraction and noise reduction. | Suitable for classification tasks with labeled data. | - -### Implementation -To implement and apply Principal Component Analysis, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and apply PCA. - -#### Libraries to Download -- `scikit-learn`: Essential for machine learning tasks, including PCA implementation. -- `pandas`: Useful for data manipulation and analysis. -- `numpy`: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Applying Principal Component Analysis -Here’s a step-by-step guide to applying PCA: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.decomposition import PCA -from sklearn.preprocessing import StandardScaler -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -``` - -**Feature Scaling:** - -```python -# Standardize the features -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Initialize and Apply PCA:** - -```python -# Initialize PCA -pca = PCA(n_components=2) # Adjust the number of components as needed - -# Fit and transform the data -X_pca = pca.fit_transform(X_scaled) -``` - -**Evaluate Explained Variance:** - -```python -# Print explained variance ratio -print(f'Explained variance ratio: {pca.explained_variance_ratio_}') -``` - -**Visualize the Transformed Data:** - -```python -import matplotlib.pyplot as plt - -# Scatter plot of the first two principal components -plt.scatter(X_pca[:, 0], X_pca[:, 1]) -plt.xlabel('Principal Component 1') -plt.ylabel('Principal Component 2') -plt.title('PCA of Dataset') -plt.show() -``` - -This example demonstrates loading data, scaling features, applying PCA, and visualizing the transformed data using scikit-learn and matplotlib. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Feature Dimensionality**: PCA is computationally efficient for moderate-sized datasets but may become intensive with very high-dimensional data. -- **Number of Components**: Selecting the right number of components balances computational efficiency and information retention. - -### Example: -In climate science, PCA helps reduce the dimensionality of climate model outputs, allowing researchers to analyze and interpret climate patterns efficiently. - -### Conclusion -Principal Component Analysis is a versatile and powerful technique for dimensionality reduction and data visualization. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage PCA for various data science and machine learning tasks. diff --git a/docs/Machine Learning/Random-Forest.md b/docs/Machine Learning/Random-Forest.md deleted file mode 100644 index a0c76ab8d..000000000 --- a/docs/Machine Learning/Random-Forest.md +++ /dev/null @@ -1,162 +0,0 @@ -# Random Forest - -## Introduction to Random Forest - -Random Forest is an ensemble learning method that builds multiple decision trees on random subsets of data and features, then combines their predictions for more accurate and robust results. It is effective for both classification and regression tasks, handling large datasets, managing missing values, and providing feature importance insights. This versatility makes it popular in fields like finance, healthcare, and marketing. - -## Random Forest Overview - -Random Forest is an ensemble learning method that builds multiple decision trees and combines their outputs to improve predictive accuracy and control overfitting. Each tree is constructed from a random subset of the data and features, promoting diversity and robustness in the model. This technique is effective for both classification and regression tasks and provides reliable predictions and feature importance metrics. Due to its versatility and effectiveness, Random Forest is widely used in various domains such as finance, healthcare, and marketing. - -### Example: - -Consider a Random Forest model for predicting customer churn in a telecom company. The model might use multiple decision trees, each splitting customers based on contract type, usage patterns, and demographics. The final prediction on whether a customer is likely to churn is derived from the aggregated outputs of all the trees. - -## Advantages of Random Forest - -Random Forests offer several advantages: - -- **Improved Accuracy:** By averaging the predictions of multiple trees, Random Forests typically achieve higher accuracy than individual decision trees. - -- **Reduced Overfitting:** The aggregation of multiple trees helps mitigate overfitting, making the model generalize better to new data. - -- **Feature Importance:** Random Forests provide insights into feature importance, helping identify the most influential features in the dataset. - -- **Versatility:** They can handle both numerical and categorical data and are effective with large datasets. - -### Example: - -In a healthcare setting, Random Forests can predict patient outcomes by analyzing a mix of medical history, demographics, and treatment options, providing accurate and interpretable insights for clinicians. - -## Disadvantages of Random Forest - -Despite their advantages, Random Forests have limitations: - -- **Computational Complexity:** Training multiple trees can be computationally expensive and time-consuming, especially with large datasets. - -- **Less Interpretability:** The combined model is less interpretable than a single decision tree, making it harder to understand individual predictions. - -- **Need for Tuning:** Hyperparameters like the number of trees and tree depth require tuning to optimize performance. - -### Example: - -In financial markets, predicting stock prices using Random Forests might require significant computational resources and careful hyperparameter tuning to handle high volatility and complex relationships between market factors. - -## Practical Tips for Using Random Forest - -To maximize the effectiveness of Random Forest: - -- **Hyperparameter Tuning:** Experiment with parameters like the number of trees, maximum depth, and minimum samples per leaf to optimize model performance. - -- **Feature Selection:** Use feature importance scores to select and focus on the most relevant features, improving model efficiency. - -- **Parallel Processing:** Utilize parallel processing techniques to speed up training and prediction times. - -### Example: - -In e-commerce, Random Forests can enhance personalized product recommendations by analyzing customer behavior and purchase history, improving user satisfaction and sales through accurate predictions. - -## Real-World Examples - -### Customer Segmentation in Retail - -Random Forests are extensively used in retail for customer segmentation. By analyzing customer demographics, purchase history, and behavior, retailers can create targeted marketing campaigns and personalize customer experiences. - -### Medical Diagnosis - -In healthcare, Random Forests assist in medical diagnosis by analyzing patient symptoms, medical history, and test results to classify diseases or conditions, aiding healthcare professionals in making informed decisions. - -## Implementation - -To implement and train a Random Forest model, you need to use a machine learning library such as `scikit-learn`. Below are the steps to install the necessary library and train a Random Forest model. - -### Libraries to Download - -1. **scikit-learn**: This is the primary library for machine learning in Python, including the Random Forest implementation. -2. **pandas**: Useful for data manipulation and analysis. -3. **numpy**: Useful for numerical operations. - -You can install these libraries using pip: - -```sh -pip install scikit-learn pandas numpy -``` - -### Training a Random Forest Model - -Here’s a step-by-step guide to training a Random Forest model: - -1. **Import Libraries**: - -```python -import pandas as pd -import numpy as np -from sklearn.model_selection import train_test_split -from sklearn.ensemble import RandomForestClassifier -from sklearn.metrics import accuracy_score, confusion_matrix, classification_report -``` - -2. **Load and Prepare Data**: - -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target (y) -X = data.drop('target_column', axis=1) # replace 'target_column' with the name of your target column -y = data['target_column'] -``` - -3. **Split Data into Training and Testing Sets**: - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -4. **Initialize and Train the Random Forest Model**: - -```python -# Initialize the Random Forest model -rf_model = RandomForestClassifier(n_estimators=100, random_state=42) - -# Train the model -rf_model.fit(X_train, y_train) -``` - -5. **Make Predictions and Evaluate the Model**: - -```python -# Make predictions -y_pred = rf_model.predict(X_test) - -# Evaluate the model -accuracy = accuracy_score(y_test, y_pred) -conf_matrix = confusion_matrix(y_test, y_pred) -class_report = classification_report(y_test, y_pred) - -print(f'Accuracy: {accuracy}') -print('Confusion Matrix:') -print(conf_matrix) -print('Classification Report:') -print(class_report) -``` - -This example demonstrates how to load data, prepare features and target variables, split the data, train a Random Forest model, and evaluate its performance. You can adjust parameters and the dataset as needed for your specific use case. - -## Performance Considerations - -### Scalability and Computational Efficiency - -- **Large Datasets:** Random Forests can become computationally intensive with large datasets due to the need to train multiple trees. - -- **Algorithmic Complexity:** Techniques like reducing the number of features considered at each split and limiting tree depth can improve scalability. - -### Example: - -In financial analytics, Random Forests are used to analyze market trends and predict stock movements. Optimizing Random Forest algorithms for large-scale data processing ensures timely and accurate predictions, critical for financial decision-making. - -## Conclusion - -Random Forests are a valuable tool in machine learning, offering a balance of predictive power and robustness. Understanding their structure, strengths, and weaknesses is essential for effectively applying them to diverse real-world problems. diff --git a/docs/Machine Learning/Reinforcement Learning.md b/docs/Machine Learning/Reinforcement Learning.md deleted file mode 100644 index 1caf2162f..000000000 --- a/docs/Machine Learning/Reinforcement Learning.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -id: reinforcement-learning -title: Reinforcement Learning -sidebar_label: Introduction to Reinforcement Learning -sidebar_position: 1 -tags: [Reinforcement Learning, RL, machine learning, data analysis, data science, artificial intelligence, agent-based modeling, decision-making, dynamic environments, policy learning] -description: In this tutorial, you will learn about Reinforcement Learning (RL), its importance, what RL is, why learn RL, how to use RL, steps to start using RL, and more. ---- - -### Introduction to Reinforcement Learning -Reinforcement Learning (RL) is a type of machine learning where an agent learns to make decisions by performing actions in an environment to maximize cumulative rewards. RL is well-suited for problems where an agent interacts with a dynamic environment, making it a powerful tool for tasks requiring sequential decision-making. - -### What is Reinforcement Learning? -Reinforcement Learning involves several key components: - -- **Agent**: The learner or decision maker that interacts with the environment. -- **Environment**: The external system with which the agent interacts. -- **State**: A representation of the current situation or configuration of the environment. -- **Action**: The set of all possible moves the agent can make. -- **Reward**: The feedback from the environment based on the agent's actions. -- **Policy**: A strategy used by the agent to determine the next action based on the current state. -- **Value Function**: Estimates the expected return (cumulative reward) of states or state-action pairs. - -### Example: -Consider using RL for training a robotic arm to pick up objects. The robot (agent) observes its surroundings (state), decides how to move its arm (action), and receives feedback (reward) based on whether it successfully picks up an object. - -### Advantages of Reinforcement Learning -Reinforcement Learning offers several advantages: - -- **Dynamic Learning**: Adapts to changes in the environment, making it suitable for real-time decision-making. -- **Sequential Decision Making**: Excels at tasks that require a series of actions to achieve a goal. -- **Exploration and Exploitation**: Balances exploring new actions and exploiting known actions to maximize rewards. - -### Example: -In video games, RL can train agents to learn optimal strategies by interacting with the game environment, leading to intelligent non-player characters (NPCs) that enhance gameplay. - -### Disadvantages of Reinforcement Learning -Despite its advantages, RL has limitations: - -- **Sample Inefficiency**: Requires a large number of interactions with the environment to learn effectively. -- **Computational Complexity**: Can be computationally expensive, especially for environments with large state and action spaces. -- **Reward Design**: Designing an appropriate reward function can be challenging and significantly impacts learning performance. - -### Example: -In autonomous driving, RL agents need extensive simulation and real-world interactions to learn safe and efficient driving policies, which can be time-consuming and resource-intensive. - -### Practical Tips for Using Reinforcement Learning -To maximize the effectiveness of Reinforcement Learning: - -- **Reward Shaping**: Carefully design reward functions to guide the agent towards desired behaviors. -- **Exploration Strategies**: Use techniques like epsilon-greedy or softmax to balance exploration and exploitation. -- **Environment Simulation**: Utilize simulated environments to accelerate training and reduce real-world risks. - -### Example: -In stock trading, RL agents can be trained in simulated markets to develop trading strategies before being deployed in live markets, minimizing financial risk during training. - -### Real-World Examples - -#### Robotics -RL is used in robotics to enable robots to learn tasks such as walking, grasping, and navigating. By continuously interacting with their environment, robots improve their performance and adapt to new tasks. - -#### Healthcare -In personalized medicine, RL can optimize treatment plans by learning the most effective interventions for individual patients based on historical data and ongoing feedback. - -### Difference Between RL and Supervised Learning -| Feature | Reinforcement Learning (RL) | Supervised Learning | -|---------------------------------|-----------------------------|---------------------| -| Learning Paradigm | Learns by interacting with the environment and receiving feedback. | Learns from labeled data provided by a supervisor. | -| Feedback Type | Receives rewards or penalties based on actions. | Receives explicit labels for input-output pairs. | -| Use Cases | Suitable for sequential decision-making problems. | Suitable for classification and regression tasks. | - -### Implementation -To implement and train a Reinforcement Learning model, you can use libraries such as TensorFlow, PyTorch, or specialized RL libraries like OpenAI Gym and Stable Baselines3. Below are the steps to install the necessary libraries and train an RL agent. - -#### Libraries to Download -- `TensorFlow` or `PyTorch`: Essential for building and training neural networks. -- `gym`: A toolkit for developing and comparing RL algorithms. -- `stable-baselines3`: A set of reliable implementations of RL algorithms. - -You can install these libraries using pip: - -```bash -pip install tensorflow gym stable-baselines3 -``` - -#### Training a Reinforcement Learning Agent -Here’s a step-by-step guide to training an RL agent using Stable Baselines3: - -**Import Libraries:** - -```python -import gym -from stable_baselines3 import PPO -``` - -**Create and Initialize the Environment:** - -```python -# Create the environment -env = gym.make('CartPole-v1') -``` - -**Define and Train the RL Model:** - -```python -# Initialize the PPO agent -model = PPO('MlpPolicy', env, verbose=1) - -# Train the agent -model.learn(total_timesteps=10000) -``` - -**Evaluate the Model:** - -```python -# Evaluate the trained agent -obs = env.reset() -for _ in range(1000): - action, _states = model.predict(obs) - obs, rewards, dones, info = env.step(action) - env.render() - if dones: - obs = env.reset() -env.close() -``` - -This example demonstrates setting up an RL environment, defining a PPO agent, training the agent, and evaluating its performance using Stable Baselines3. Adjust parameters and algorithms based on your specific problem and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Hardware Acceleration**: Utilize GPUs to accelerate the training of deep RL models. -- **Parallel Training**: Run multiple environment instances in parallel to improve sample efficiency. - -### Example: -In real-time strategy games, parallel training with multiple game instances allows RL agents to quickly learn and adapt strategies, improving their performance in complex environments. - -### Conclusion -Reinforcement Learning is a versatile and powerful tool for solving problems that require dynamic and sequential decision-making. By understanding its components, advantages, limitations, and implementation, practitioners can effectively apply RL to a wide range of applications in data science and machine learning projects. diff --git a/docs/Machine Learning/SVM Algorithm.md b/docs/Machine Learning/SVM Algorithm.md deleted file mode 100644 index b3713eaaf..000000000 --- a/docs/Machine Learning/SVM Algorithm.md +++ /dev/null @@ -1,159 +0,0 @@ -# Support Vector Machine (SVM) - -## Introduction to Support Vector Machine - -Support Vector Machine (SVM) is a supervised machine learning algorithm that is primarily used for classification tasks, although it can also be applied to regression problems. SVM works by finding the optimal hyperplane that best separates different classes in the feature space. This algorithm is particularly effective for high-dimensional data and situations where the number of dimensions exceeds the number of samples. - -## SVM Overview - -Support Vector Machine aims to create a decision boundary (hyperplane) that maximizes the margin between different classes. The data points that are closest to the hyperplane and influence its position are called support vectors. SVM can handle both linear and non-linear classification tasks using different kernel functions, which transform the data into higher dimensions to make it separable. - -### Example: - -Consider an SVM model for classifying emails as spam or non-spam. The model identifies the optimal hyperplane based on features like word frequency, email length, and presence of certain keywords, effectively separating spam from non-spam emails. - -## Advantages of SVM - -SVMs offer several advantages: - -- **Effective in High Dimensions:** SVM is highly effective in high-dimensional spaces and scenarios where the number of dimensions is greater than the number of samples. - -- **Robustness to Overfitting:** SVMs are robust to overfitting, especially in high-dimensional space, due to the regularization parameter that controls the trade-off between maximizing the margin and minimizing classification error. - -- **Versatility with Kernels:** SVMs can handle non-linear classification through kernel functions (e.g., polynomial, radial basis function), making them versatile for various datasets. - -### Example: - -In image classification, SVMs can distinguish between different objects (e.g., cats vs. dogs) by transforming the pixel intensity features into a higher-dimensional space using a radial basis function (RBF) kernel. - -## Disadvantages of SVM - -Despite their advantages, SVMs have limitations: - -- **Computationally Intensive:** Training an SVM can be computationally expensive, particularly with large datasets and complex kernel functions. - -- **Choice of Kernel:** Selecting the appropriate kernel function and tuning its parameters (e.g., the cost parameter, kernel coefficient) is crucial for optimal performance but can be challenging. - -- **Less Interpretability:** The decision boundary and support vectors in high-dimensional space can make the model less interpretable compared to simpler algorithms. - -### Example: - -In natural language processing, using SVM to classify text documents (e.g., sentiment analysis) can be computationally demanding due to the high-dimensional nature of textual data and the need to fine-tune kernel parameters for best performance. - -## Practical Tips for Using SVM - -To maximize the effectiveness of SVM: - -- **Hyperparameter Tuning:** Experiment with different kernel functions (linear, polynomial, RBF) and tune parameters like C (regularization) and gamma (kernel coefficient) to optimize model performance. - -- **Feature Scaling:** Ensure that features are scaled (e.g., using StandardScaler) as SVMs are sensitive to the scale of input data. - -- **Cross-Validation:** Use cross-validation techniques to select the best model parameters and prevent overfitting. - -### Example: - -In finance, SVMs can predict credit risk by analyzing customer data such as credit history and financial transactions. Properly tuning the model’s parameters and scaling features ensures accurate and reliable predictions. - -## Real-World Examples - -### Handwriting Recognition - -SVMs are widely used in handwriting recognition, where they classify handwritten digits based on pixel intensity features. The model transforms the features into a higher-dimensional space, enabling accurate classification of digits. - -### Bioinformatics - -In bioinformatics, SVMs classify proteins based on their amino acid sequences and structural features. By using appropriate kernels, SVMs handle the complex, high-dimensional data inherent in biological sequences. - -## Implementation - -To implement and train an SVM model, you can use a machine learning library such as `scikit-learn`. Below are the steps to install the necessary library and train an SVM model. - -### Libraries to Download - -1. **scikit-learn**: This is the primary library for machine learning in Python, including the SVM implementation. -2. **pandas**: Useful for data manipulation and analysis. -3. **numpy**: Useful for numerical operations. - -You can install these libraries using pip: - -```sh -pip install scikit-learn pandas numpy -``` - -### Training an SVM Model - -Here’s a step-by-step guide to training an SVM model: - -1. **Import Libraries**: - -```python -import pandas as pd -import numpy as np -from sklearn.model_selection import train_test_split -from sklearn.svm import SVC -from sklearn.metrics import accuracy_score, confusion_matrix, classification_report -``` - -2. **Load and Prepare Data**: - -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target (y) -X = data.drop('target_column', axis=1) # replace 'target_column' with the name of your target column -y = data['target_column'] -``` - -3. **Split Data into Training and Testing Sets**: - -```python -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) -``` - -4. **Initialize and Train the SVM Model**: - -```python -# Initialize the SVM model -svm_model = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42) - -# Train the model -svm_model.fit(X_train, y_train) -``` - -5. **Make Predictions and Evaluate the Model**: - -```python -# Make predictions -y_pred = svm_model.predict(X_test) - -# Evaluate the model -accuracy = accuracy_score(y_test, y_pred) -conf_matrix = confusion_matrix(y_test, y_pred) -class_report = classification_report(y_test, y_pred) - -print(f'Accuracy: {accuracy}') -print('Confusion Matrix:') -print(conf_matrix) -print('Classification Report:') -print(class_report) -``` - -This example demonstrates how to load data, prepare features and target variables, split the data, train an SVM model, and evaluate its performance. You can adjust parameters and the dataset as needed for your specific use case. - -## Performance Considerations - -### Scalability and Computational Efficiency - -- **Large Datasets:** SVMs can be computationally intensive with large datasets, especially when using non-linear kernels. -- **Algorithmic Complexity:** Techniques such as reducing feature dimensions through Principal Component Analysis (PCA) and using linear kernels for large datasets can improve scalability. - -### Example: - -In text classification, SVMs are used to categorize documents into predefined classes (e.g., news articles into topics). Optimizing SVM algorithms for large-scale text data ensures efficient processing and accurate classifications. - -## Conclusion - -Support Vector Machines are powerful tools in machine learning, especially for classification tasks involving high-dimensional data. Understanding their structure, strengths, and limitations is crucial for effectively applying them to various real-world problems. By carefully tuning parameters and selecting appropriate kernels, SVMs can achieve high accuracy and robustness in diverse applications. diff --git a/docs/Machine Learning/Scikit-Learn.md b/docs/Machine Learning/Scikit-Learn.md deleted file mode 100644 index af5d1f27c..000000000 --- a/docs/Machine Learning/Scikit-Learn.md +++ /dev/null @@ -1,229 +0,0 @@ -# Scikit-Learn - -> Unlock the Power of Machine Learning with Scikit-learn: Simplifying Complexity, Empowering Discovery - - -**Supervised Learning** -- Linear Models - -- Support Vector Machines - -- Data Preprocessing - -1. Linear Models - -The following are a set of -methods intended for regression in which the target value is expected to -be a linear combination of the features. In mathematical notation, if -$\hat{y}$ is the predicted value. - -$$ -\hat{y}(w, x) = w_0 + w_1 + \ldots + w_p -$$ - -Across the module, we designate the vector w = -$(w_0, w_1, \ldots, w_n)$ as `coef_` and $w_0$ as `intercept_`. - - -- *Linear Regression* - Linear Regression fits a linear model with coefficients w = $(w_0 ,w_1 , -...w_n)$ to minimize the residual sum of squares between the observed -targets in the dataset, and the targets predicted by the linear -approximation. Mathematically it solves a problem of the form: - - $\min_{w} || X w - y||_2^2$ - -``` python -from sklearn import linear_model -reg = linear_model.LinearRegression() #To Use Linear Regression -reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) -coefficients = reg.coef_ -intercept = reg.intercept_ - -print("Coefficients:", coefficients) -print("Intercept:", intercept) -``` - -Output: - - Coefficients: [0.5 0.5] - Intercept: 1.1102230246251565e-16 - - -![LinearRegression](https://scikit-learn.org/stable/_images/sphx_glr_plot_ols_001.png) - -This is how the Linear Regression fits the line . - - -- Support Vector Machines - Support vector machines (SVMs) are a set of supervised learning methods -used for classification, regression and outliers detection. - -*The advantages of support vector machines are:* - -Effective in high dimensional spaces. - -Still effective in cases where number of dimensions is greater than the -number of samples. - -Uses a subset of training points in the decision function (called -support vectors), so it is also memory efficient. - -Versatile: different Kernel functions can be specified for the decision -function. Common kernels are provided, but it is also possible to -specify custom kernels. - -*The disadvantages of support vector machines include:* - -If the number of features is much greater than the number of samples, -avoid over-fitting in choosing Kernel functions and regularization term -is crucial. - -SVMs do not directly provide probability estimates, these are calculated -using an expensive five-fold cross-validation (see Scores and -probabilities, below). - -The support vector machines in scikit-learn support both dense -(numpy.ndarray and convertible to that by numpy.asarray) and sparse (any -scipy.sparse) sample vectors as input. However, to use an SVM to make -predictions for sparse data, it must have been fit on such data. For -optimal performance, use C-ordered numpy.ndarray (dense) or -scipy.sparse.csr_matrix (sparse) with dtype=float64 - -**Linear Kernel:** - -Function: 𝐾 ( 𝑥 , 𝑦 ) = 𝑥 𝑇 𝑦 - -Parameters: No additional parameters. - -**Polynomial Kernel:** - -Function: 𝐾 ( 𝑥 , 𝑦 ) = ( 𝛾 𝑥 𝑇 𝑦 𝑟 ) 𝑑 - -Parameters: - -γ (gamma): Coefficient for the polynomial term. Higher values increase -the influence of high-degree polynomials. - -r: Coefficient for the constant term. - -d: Degree of the polynomial. - -**Radial Basis Function (RBF) Kernel:** - -Function: 𝐾 ( 𝑥 , 𝑦 ) = exp ⁡ ( − 𝛾 ∣ ∣ 𝑥 − 𝑦 ∣ ∣ 2 ) - -Parameters: 𝛾 γ (gamma): Controls the influence of each training -example. Higher values result in a more complex decision boundary. - -**Sigmoid Kernel:** - -Function: 𝐾 ( 𝑥 , 𝑦 ) = tanh ⁡ ( 𝛾 𝑥 𝑇 𝑦 𝑟 ) - -Parameters: - -γ (gamma): Coefficient for the sigmoid term. - -r: Coefficient for the constant term. - - -``` python -import numpy as np -import matplotlib.pyplot as plt -from sklearn import svm, datasets - -# Load example dataset (Iris dataset) -iris = datasets.load_iris() -X = iris.data[:, :2] # We only take the first two features -y = iris.target - -# Define the SVM model with RBF kernel -C = 1.0 # Regularization parameter -gamma = 0.7 # Kernel coefficient -svm_model = svm.SVC(kernel='rbf', C=C, gamma=gamma) - -# Train the SVM model -svm_model.fit(X, y) - -# Plot the decision boundary -x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 -y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 -xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), - np.arange(y_min, y_max, 0.02)) -Z = svm_model.predict(np.c_[xx.ravel(), yy.ravel()]) -Z = Z.reshape(xx.shape) - -plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8) - -# Plot the training points -plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) -plt.xlabel('Sepal length') -plt.ylabel('Sepal width') -plt.title('SVM with RBF Kernel') -plt.show() -``` -![SVM](https://github.com/AmrutaJayanti/codeharborhub/assets/142327526/24bc053e-54b6-4702-a442-d7f6e4b34332) - -- Data Preprocessing - Data preprocessing is a crucial step in the machine learning pipeline -that involves transforming raw data into a format suitable for training -a model. Here are some fundamental techniques in data preprocessing -using scikit-learn: - -**Handling Missing Values:** - -Imputation: Replace missing values with a calculated value (e.g., mean, -median, mode) using SimpleImputer. Removal: Remove rows or columns with -missing values using dropna. - -**Feature Scaling:** - -Standardization: Scale features to have a mean of 0 and a standard -deviation of 1 using StandardScaler. - -Normalization: Scale features to a range between 0 and 1 using -MinMaxScaler. Encoding Categorical Variables: - -One-Hot Encoding: Convert categorical variables into binary vectors -using OneHotEncoder. - -Label Encoding: Encode categorical variables as integers using -LabelEncoder. - -**Feature Transformation:** - -Polynomial Features: Generate polynomial features up to a specified -degree using PolynomialFeatures. - -Log Transformation: Transform features using the natural logarithm to -handle skewed distributions. - -**Handling Outliers:** - -Detection: Identify outliers using statistical methods or domain -knowledge. Transformation: Apply transformations (e.g., winsorization) -or remove outliers based on a threshold. - -**Handling Imbalanced Data:** - -Resampling: Over-sample minority class or under-sample majority class to -balance the dataset using techniques like RandomOverSampler or -RandomUnderSampler. - -Synthetic Sampling: Generate synthetic samples for the minority class -using algorithms like Synthetic Minority Over-sampling Technique -(SMOTE). Feature Selection: - -Univariate Feature Selection: Select features based on statistical tests -like ANOVA using SelectKBest or SelectPercentile. - -Recursive Feature Elimination: Select features recursively by -considering smaller and smaller sets of features using RFECV. - -**Splitting Data:** - -Train-Test Split: Split the dataset into training and testing sets using -train_test_split. - -Cross-Validation: Split the dataset into multiple folds for -cross-validation using KFold or StratifiedKFold. diff --git a/docs/Machine Learning/Stochastic Gradient Descent model.md b/docs/Machine Learning/Stochastic Gradient Descent model.md deleted file mode 100644 index 050510df5..000000000 --- a/docs/Machine Learning/Stochastic Gradient Descent model.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -id: stochastic-gradient-descent -title: Stochastic Gradient Descent -sidebar_label: Introduction to Stochastic Gradient Descent -sidebar_position: 1 -tags: [stochastic gradient descent, machine learning, optimization algorithm, deep learning, gradient descent, data science, model training, stochastic optimization, neural networks, supervised learning, gradient descent variants, iterative optimization, parameter tuning] -description: In this tutorial, you will learn about Stochastic Gradient Descent (SGD), its importance, what SGD is, why learn SGD, how to use SGD, steps to start using SGD, and more. ---- - -### Introduction to Stochastic Gradient Descent -Stochastic Gradient Descent (SGD) is a fundamental optimization algorithm widely used in machine learning and deep learning for training models. It belongs to the family of gradient descent methods and is particularly suited for large-scale datasets and complex models due to its efficiency and iterative nature. - -### What is Stochastic Gradient Descent? -Stochastic Gradient Descent is an optimization technique that updates model parameters iteratively to minimize a loss function by taking small steps in the direction of the steepest gradient calculated from a subset (batch) of training data at each iteration. Unlike traditional Gradient Descent, which computes gradients using the entire dataset (batch gradient descent), SGD processes data in smaller batches, making it faster and more suitable for online learning and dynamic environments. - --**Batch Size**: Number of data points used in each iteration to compute the gradient and update parameters. - --**Learning Rate**: Step size that controls the magnitude of parameter updates in each iteration. - - -### Example: -Consider training a deep neural network (DNN) for image classification using SGD. Instead of computing gradients over the entire dataset in one go, SGD updates model weights incrementally after processing each batch of images. This stochastic process helps in navigating complex optimization landscapes efficiently. - -### Advantages of Stochastic Gradient Descent -Stochastic Gradient Descent offers several advantages: - -- **Efficiency**: It processes data in mini-batches, reducing computational requirements compared to batch gradient descent, especially with large datasets. -- **Convergence Speed**: SGD often converges faster than batch methods because it quickly adjusts model parameters using frequent updates. -- **Scalability**: Suitable for large-scale datasets and online learning scenarios where data arrives sequentially or in streams. - -### Example: -In natural language processing (NLP), SGD is used to train models for text classification tasks. By processing text data in batches and updating weights iteratively, SGD enables efficient training of models to classify documents into categories such as spam vs. non-spam emails. - -### Disadvantages of Stochastic Gradient Descent -Despite its advantages, SGD has limitations: - -- **Noisy Updates**: The stochastic nature of SGD introduces noise due to mini-batch sampling, which can lead to fluctuations in training loss and convergence. -- **Learning Rate Tuning**: Requires careful tuning of the learning rate and batch size to achieve optimal convergence and stability. -- **Potential for Overshooting**: In some cases, SGD can overshoot the optimal solution, especially when the learning rate is too high or batch size is too small. - -### Example: -In financial modeling, using SGD for predicting stock prices may require careful tuning of batch size and learning rate to mitigate noise and ensure accurate predictions amidst market volatility. - -### Practical Tips for Using Stochastic Gradient Descent -To effectively apply SGD in model training: - -- **Learning Rate Schedule**: Implement learning rate schedules (e.g., decay or adaptive learning rates) to dynamically adjust the learning rate during training. -- **Batch Size Selection**: Experiment with different batch sizes to find a balance between computational efficiency and model stability. -- **Regularization**: Incorporate regularization techniques (e.g., L2 regularization) to prevent overfitting and improve generalization. - -### Example: -In recommender systems, SGD is employed to optimize matrix factorization models for personalized recommendations. Fine-tuning batch sizes and learning rates ensures that the model efficiently learns user preferences from large-scale interaction data. - -### Real-World Examples - -#### Deep Learning Training -Stochastic Gradient Descent is extensively used in training deep learning models, including convolutional neural networks (CNNs) for image recognition and recurrent neural networks (RNNs) for sequence modeling. Its efficiency in handling large volumes of training data and complex model architectures makes it indispensable in modern AI applications. - -#### Online Learning -In online advertising, SGD enables real-time updates of ad recommendation models based on user interactions and behavioral data. By processing new data streams in mini-batches, SGD continuously refines model predictions to adapt to evolving user preferences. - -### Difference Between Stochastic Gradient Descent and Batch Gradient Descent - -| Feature | Stochastic Gradient Descent | Batch Gradient Descent | -|---------------------------------|--------------------------------------|-----------------------------------| -| Processing | Mini-batches of data points | Entire dataset | -| Gradient Calculation | Subset of data at each iteration | Entire dataset | -| Convergence Speed | Faster due to frequent updates | Slower, requires full dataset | -| Noise Sensitivity | More sensitive due to mini-batch sampling | Smoother due to full dataset | -| Use Cases | Large-scale datasets, online learning | Small to medium-sized datasets | - -### Implementation -To implement Stochastic Gradient Descent in Python, you can use libraries such as TensorFlow, PyTorch, or scikit-learn, depending on your specific model and application requirements. Below is a basic example using scikit-learn for linear regression: - -#### Libraries to Download -- `scikit-learn`: Provides various machine learning algorithms and utilities in Python. - -Install scikit-learn using pip: - -```bash -pip install scikit-learn -``` - -#### Training a Model with SGD -Here’s a simplified example of training a linear regression model using SGD with scikit-learn: - -**Import Libraries:** - -```python -from sklearn.linear_model import SGDRegressor -from sklearn.datasets import make_regression -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler -import numpy as np -import matplotlib.pyplot as plt -``` - -**Generate Synthetic Data:** - -```python -# Generate synthetic data -X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42) - -# Split data into training and testing sets -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) - -# Standardize features -scaler = StandardScaler() -X_train_scaled = scaler.fit_transform(X_train) -X_test_scaled = scaler.transform(X_test) -``` - -**Initialize and Train SGD Model:** - -```python -# Initialize SGDRegressor -sgd = SGDRegressor(max_iter=1000, tol=1e-3, random_state=42) - -# Train the model -sgd.fit(X_train_scaled, y_train) -``` - -**Evaluate the Model:** - -```python -# Evaluate model performance -train_score = sgd.score(X_train_scaled, y_train) -test_score = sgd.score(X_test_scaled, y_test) -print(f"Training R2 Score: {train_score:.2f}") -print(f"Testing R2 Score: {test_score:.2f}") -``` - -This example demonstrates how to train a linear regression model using SGD with scikit-learn, including data preprocessing, model initialization, training, and evaluation. Adjust parameters and data handling based on your specific use case and dataset characteristics. - -### Performance Considerations - -#### Convergence and Hyperparameter Tuning -- **Learning Rate**: Optimize learning rate selection to balance convergence speed and stability. -- **Mini-Batch Size**: Experiment with different batch sizes to find an optimal balance between noise sensitivity and computational efficiency. - -### Example: -In climate modeling, SGD is applied to optimize complex simulation models based on atmospheric data. Efficiently training these models using SGD enables accurate prediction and analysis of climate patterns and phenomena. - -### Conclusion -Stochastic Gradient Descent is a versatile and efficient optimization algorithm crucial for training machine learning models, especially in scenarios involving large datasets and complex model architectures. By understanding its principles, advantages, and implementation strategies, practitioners can effectively leverage SGD to enhance model performance and scalability across various domains of artificial intelligence and data science. diff --git a/docs/Machine Learning/Support Vector Regression.md b/docs/Machine Learning/Support Vector Regression.md deleted file mode 100644 index 2c828cb6c..000000000 --- a/docs/Machine Learning/Support Vector Regression.md +++ /dev/null @@ -1,157 +0,0 @@ ---- - -id: support-vector-regression -title: Support Vector Regression -sidebar_label: Introduction to Support Vector Regression -sidebar_position: 1 -tags: [Support Vector Regression, SVR, machine learning, regression algorithm, data analysis, data science, supervised learning, predictive modeling, feature importance] -description: In this tutorial, you will learn about Support Vector Regression (SVR), its importance, what SVR is, why learn SVR, how to use SVR, steps to start using SVR, and more. - ---- - -### Introduction to Support Vector Regression -Support Vector Regression (SVR) is a machine learning algorithm used for predicting continuous values. It extends the Support Vector Machine (SVM) algorithm, which is typically used for classification, to handle regression tasks. - -### What is Support Vector Regression? -**Support Vector Regression (SVR)** is a type of Support Vector Machine (SVM) used for predicting continuous outcomes. SVR finds a line (or hyperplane) that best fits the data points while keeping most of them within a specified margin of error. - -- **Support Vectors**: Data points that are closest to the line and influence its position. - -- **Epsilon-insensitive Loss Function**: A method that ignores small errors within a specified range (epsilon). - -**Hyperplane**: The line or boundary that SVR tries to find, which best fits the data within the allowed error margin. - -**Kernel Trick**: A technique to transform data into a higher-dimensional space, allowing SVR to handle complex, non-linear relationships. - -### Example: -For predicting house prices, SVR can create a model that finds the relationship between various features (like size, number of rooms) and the price, fitting the data within a margin of error. - -### Advantages of Support Vector Regression -- **Robust to Outliers**: Focuses on the most important data points (support vectors), making it less sensitive to outliers. -- **Flexible with Kernels**: Can handle non-linear relationships using different kernel functions. -- **Effective in High Dimensions**: Works well even when there are many features. - -### Example: -In predicting stock prices, SVR can handle noisy data and complex relationships between market indicators and prices. - -### Disadvantages of Support Vector Regression -- **Computationally Intensive**: Training SVR can be slow, especially with large datasets. -- **Needs Careful Tuning**: Performance depends on selecting the right parameters (like C, epsilon, and kernel type). -- **Complex Interpretation**: The resulting model can be hard to interpret, especially with non-linear kernels. - -### Example: -In forecasting energy usage, SVR might be slow with large datasets, requiring good computational resources. - -### Practical Tips for Using Support Vector Regression -- **Tune Parameters**: Adjust parameters like C, epsilon, and kernel type for better performance. -- **Scale Features**: Normalize features to improve model performance and convergence. -- **Choose Kernels Wisely**: Select an appropriate kernel function based on your data. - -### Example: -In medical diagnostics, SVR can predict patient outcomes. Proper feature scaling and kernel selection improve prediction accuracy. - -### Real-World Examples - -#### Weather Forecasting -SVR is used to predict temperature and rainfall based on historical data, helping in accurate weather forecasting. - -#### Demand Forecasting -In supply chain management, SVR predicts product demand, helping businesses optimize inventory and reduce costs. - -### Difference Between SVR and Linear Regression -| Feature | Support Vector Regression (SVR) | Linear Regression | -|---------------------------------|---------------------------------|-------------------| -| Loss Function | Epsilon-insensitive | Mean squared error | -| Flexibility | Can model non-linear relationships | Assumes linear relationships | -| Robustness to Outliers | More robust to outliers | Sensitive to outliers | - -### Implementation -To implement SVR, you can use Python libraries like scikit-learn. Here are the steps: - -#### Libraries to Download - -- `scikit-learn`: For machine learning tasks, including SVR. -- `pandas`: For data manipulation. -- `numpy`: For numerical operations. - -Install these using pip: - -```bash -pip install scikit-learn pandas numpy -``` - -#### Training a Support Vector Regression Model - -**Import Libraries:** - -``` - -```python -import pandas as pd -import numpy as np -from sklearn.svm import SVR -from sklearn.model_selection import train_test_split -from sklearn.preprocessing import StandardScaler -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) and target variable (y) -X = data.drop('target_column', axis=1) # Replace 'target_column' with your target variable name -y = data['target_column'] -``` - -**Feature Scaling:** - -```python -# Perform feature scaling -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) -``` - -**Split Data into Training and Testing Sets:** - -```python -X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) -``` - -**Initialize and Train the Support Vector Regression Model:** - -```python -svr = SVR(kernel='rbf') -svr.fit(X_train, y_train) -``` - -**Evaluate the Model:** - -```python -from sklearn.metrics import mean_squared_error, r2_score - -# Predict on test data -y_pred = svr.predict(X_test) - -# Evaluate performance -mse = mean_squared_error(y_test, y_pred) -r2 = r2_score(y_test, y_pred) -print(f'Mean Squared Error: {mse:.2f}') -print(f'R^2 Score: {r2:.2f}') -``` - -This example demonstrates loading data, preparing features, training an SVR model, and evaluating its performance using scikit-learn. Adjust parameters and preprocessing steps based on your specific dataset and requirements. - -### Performance Considerations - -#### Computational Efficiency -- **Kernel Choice**: The choice of kernel affects both the computational efficiency and the performance of SVR. -- **Model Complexity**: Proper tuning of hyperparameters can balance model complexity and computational efficiency. - -### Example: -In financial forecasting, SVR helps predict future asset prices based on historical data. Choosing the right kernel and tuning hyperparameters ensures accurate and efficient predictions. - -### Conclusion -Support Vector Regression is a versatile and powerful algorithm for regression tasks. By understanding its assumptions, advantages, and implementation steps, practitioners can effectively leverage SVR for a variety of predictive modeling tasks in data science and machine learning projects. diff --git a/docs/Machine Learning/Transfer Learning.md b/docs/Machine Learning/Transfer Learning.md deleted file mode 100644 index bc462ecdd..000000000 --- a/docs/Machine Learning/Transfer Learning.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -id: transfer-learning -title: Transfer Learning -sidebar_label: Introduction to Transfer Learning -sidebar_position: 1 -tags: [Transfer Learning, neural networks, machine learning, data science, deep learning, pre-trained models, fine-tuning, feature extraction] -description: In this tutorial, you will learn about Transfer Learning, its importance, what Transfer Learning is, why learn Transfer Learning, how to use Transfer Learning, steps to start using Transfer Learning, and more. - ---- - -### Introduction to Transfer Learning -Transfer Learning is a machine learning technique where a model developed for one task is reused as the starting point for a model on a second task. This approach leverages pre-trained models, often trained on large datasets, to improve performance on a related task with less data and computation. Transfer Learning is particularly powerful in deep learning, enabling rapid progress and improved performance across various applications. - -### What is Transfer Learning? -**Transfer Learning** involves taking a pre-trained model and adapting it to a new, often related, task. This can be done in several ways: - -- **Feature Extraction**: Using the pre-trained model's layers as feature extractors. The learned features are fed into a new model for the specific task. -- **Fine-Tuning**: Starting with the pre-trained model and fine-tuning its weights on the new task. This involves retraining some or all of the layers. - -Pre-trained models are typically trained on large datasets like ImageNet, which contains millions of images and thousands of classes, providing a rich feature space. - -:::info -**Feature Extraction**: Utilizes the representations learned by a pre-trained model to extract features from new data. Often involves freezing the layers of the pre-trained model. - -**Fine-Tuning**: Involves retraining some or all of the pre-trained model's layers to adapt them to the new task. This can improve performance but requires more computational resources. -::: - -### Example: -Consider using a pre-trained model like VGG16 for image classification. You can use the convolutional base of VGG16 to extract features from your dataset and train a new classifier on top of these features, significantly reducing the amount of data and training time needed. - -### Advantages of Transfer Learning -Transfer Learning offers several advantages: - -- **Reduced Training Time**: By leveraging pre-trained models, you can reduce the time required to train a new model. -- **Improved Performance**: Pre-trained models have learned rich feature representations, which can enhance performance on related tasks. -- **Less Data Required**: Transfer Learning can achieve good performance even with limited data for the new task. - -### Example: -In medical image analysis, where annotated data is scarce, Transfer Learning allows practitioners to build accurate models by starting with pre-trained models trained on general image datasets. - -### Disadvantages of Transfer Learning -Despite its advantages, Transfer Learning has limitations: - -- **Compatibility Issues**: The pre-trained model needs to be somewhat relevant to the new task for effective transfer. -- **Computational Resources**: Fine-tuning a pre-trained model can be computationally expensive, requiring significant resources. - -### Example: -In natural language processing, using a pre-trained model trained on general text data might not transfer well to domain-specific tasks without significant fine-tuning. - -### Practical Tips for Using Transfer Learning -To maximize the effectiveness of Transfer Learning: - -- **Choose the Right Model**: Select a pre-trained model that is closely related to your task. For image tasks, models like ResNet, VGG, or Inception are popular choices. -- **Freeze Layers Appropriately**: Start by freezing the early layers of the pre-trained model and only train the new layers. Gradually unfreeze layers and fine-tune as needed. -- **Use Appropriate Data Augmentation**: Apply data augmentation techniques to increase the diversity of your training data and improve the model's robustness. - -### Example: -In sentiment analysis, using a pre-trained language model like BERT can significantly improve performance. Fine-tuning BERT on a small annotated dataset can yield state-of-the-art results. - -### Real-World Examples - -#### Image Classification -Transfer Learning is widely used in image classification tasks. Pre-trained models on ImageNet can be fine-tuned for specific tasks like medical image diagnosis, wildlife classification, and more. - -#### Natural Language Processing -In NLP, models like BERT, GPT, and ELMo are pre-trained on large text corpora and fine-tuned for tasks such as sentiment analysis, named entity recognition, and machine translation. - -### Difference Between Transfer Learning and Traditional Machine Learning - -| Feature | Transfer Learning | Traditional Machine Learning | -|----------------------------------|------------------------------------------|-----------------------------------------| -| Training Time | Reduced due to pre-trained models | Longer, as models are trained from scratch | -| Data Requirements | Requires less data for the new task | Requires large amounts of task-specific data | -| Performance | Often higher due to rich pre-trained features | Depends heavily on the size and quality of the dataset | -| Use Cases | Image classification, NLP, medical imaging | General machine learning tasks | - -### Implementation -To implement Transfer Learning, you can use libraries such as TensorFlow, Keras, or PyTorch in Python. Below are the steps to install the necessary libraries and apply Transfer Learning. - -#### Libraries to Download - -- `TensorFlow` or `PyTorch`: Essential for building and training models. -- `numpy`: Useful for numerical operations. -- `matplotlib`: Useful for visualizing training progress and results. - -You can install these libraries using pip: - -```bash -pip install tensorflow numpy matplotlib -``` - -#### Applying Transfer Learning -Here’s a step-by-step guide to applying Transfer Learning using TensorFlow and Keras: - -**Import Libraries:** - -```python -import numpy as np -import matplotlib.pyplot as plt -import tensorflow as tf -from tensorflow.keras.layers import Dense, GlobalAveragePooling2D -from tensorflow.keras.models import Model -from tensorflow.keras.applications import VGG16 -from tensorflow.keras.preprocessing.image import ImageDataGenerator -``` - -**Load Pre-trained Model and Prepare Data:** - -```python -# Load VGG16 model with pre-trained weights -base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) - -# Freeze the layers of the pre-trained model -for layer in base_model.layers: - layer.trainable = False - -# Prepare data generators -train_datagen = ImageDataGenerator(rescale=1./255, horizontal_flip=True, zoom_range=0.2, rotation_range=20) -train_generator = train_datagen.flow_from_directory('path_to_train_data', target_size=(224, 224), batch_size=32, class_mode='binary') - -validation_datagen = ImageDataGenerator(rescale=1./255) -validation_generator = validation_datagen.flow_from_directory('path_to_validation_data', target_size=(224, 224), batch_size=32, class_mode='binary') -``` - -**Add Custom Layers and Compile Model:** - -```python -# Add custom layers on top of the pre-trained base -x = base_model.output -x = GlobalAveragePooling2D()(x) -x = Dense(1024, activation='relu')(x) -predictions = Dense(1, activation='sigmoid')(x) - -# Define the new model -model = Model(inputs=base_model.input, outputs=predictions) - -# Compile the model -model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) -``` - -**Train the Model:** - -```python -# Train the model -history = model.fit(train_generator, epochs=10, validation_data=validation_generator) - -# Plot training and validation accuracy -plt.plot(history.history['accuracy'], label='train accuracy') -plt.plot(history.history['val_accuracy'], label='validation accuracy') -plt.title('Training and Validation Accuracy') -plt.xlabel('Epochs') -plt.ylabel('Accuracy') -plt.legend() -plt.show() -``` - -This example demonstrates how to load a pre-trained VGG16 model, add custom layers, and train it on a new dataset using TensorFlow and Keras. Adjust the model architecture, hyperparameters, and dataset as needed for your specific use case. - -### Performance Considerations - -#### Fine-Tuning Strategy -- **Gradual Unfreezing**: Start by training only the custom layers. Gradually unfreeze and fine-tune the upper layers of the pre-trained model to adapt them to your task. -- **Learning Rate**: Use a lower learning rate for fine-tuning the pre-trained layers to prevent large updates that could destroy the learned features. - -### Example: -In fine-tuning a pre-trained model for object detection, starting with a low learning rate and gradually unfreezing layers can lead to improved performance and stability. - -### Conclusion -Transfer Learning is a powerful technique that leverages pre-trained models to improve performance and reduce training time for new tasks. By understanding the principles, advantages, and practical implementation steps, practitioners can effectively apply Transfer Learning to various machine learning challenges, enhancing their models' efficiency and effectiveness. diff --git a/docs/Machine Learning/linear_regression.md b/docs/Machine Learning/linear_regression.md deleted file mode 100644 index 9cfd2277f..000000000 --- a/docs/Machine Learning/linear_regression.md +++ /dev/null @@ -1,128 +0,0 @@ -# Linear Regression - -### Introduction to Linear Regression - -Linear regression is a fundamental and widely used statistical technique for predicting numeric outcomes based on one or more independent variables. This document provides an overview of linear regression, including its principles, advantages, disadvantages, and practical considerations for application. - -### Overview of Linear Regression Model - -Linear regression models the relationship between a dependent variable (target) and one or more independent variables (predictors) by fitting a linear equation to observed data. - -### Formula: - -$$Y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \cdots + \beta_n x_n + \epsilon$$ - - -#### y: Dependent variable (target) - -#### 𝛽0 : Intercept - -#### 𝛽i : Coefficients for each predictor 𝑥𝑖(Independent variables) - - -#### ϵ: Error term (residuals) - - -### Example: - -In predicting house prices, linear regression may model the relationship between house size, number of bedrooms, and location to estimate the sale price of a property. - -### Code: -```python -#import libraries -from matplotlib import pyplot as plt -import pandas as pd -from sklearn.model_selection import train_test_split -from sklearn.linear_model import LinearRegression -from sklearn.metrics import r2_score - -#read the file -df=pd.read_csv("data.csv") - -#assign x(independent variable) and y(dependent variable) from the dataset -y=df['A'] -x=df['B'] - -#split the data into training and testing sets -X_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25,random_state=50) - -#object -linreg=LinearRegression() -linreg.fit(X_train,y_train) - -#predict for test data -y_pred=linreg.predict(x_test) - -#regression line -plt.xlabel("B") -plt.ylabel("A") -plt.plot(x_test,y_pred) -plt.scatter(x_test,y_test) - -#evaluation of model -print("r2 score : ",r2_score(y_test,y_pred)) -``` - -### Advantages of Linear Regression - -#### Linear regression offers several advantages: - -- Interpretability: Coefficients indicate the strength and direction of relationships between predictors and the target variable. - -- Simple to Implement: The model is straightforward to implement and understand, making it accessible for beginners and useful for quick insights. - -- Efficient Computation: Training and predicting with linear regression are computationally efficient even with large datasets. - -#### Example: - -In marketing, linear regression helps analyze the impact of advertising spend on sales revenue, guiding budget allocation decisions for optimal ROI. - -### Disadvantages of Linear Regression - -Despite its advantages, linear regression has limitations: - -- Assumption of Linearity: Linear regression assumes a linear relationship between predictors and the target, which may not hold true for complex real-world data. - -- Sensitive to Outliers: Outliers can disproportionately influence the regression coefficients and predictions. - -- Limited Flexibility: Linear regression may underperform with nonlinear relationships, requiring transformations or more complex models. - -#### Example: -In economic forecasting, linear regression may struggle to predict GDP growth during periods of economic volatility due to nonlinear factors influencing economic performance. - -### Practical Tips for Using Linear Regression - -#### To maximize the effectiveness of linear regression: - -- Feature Engineering: Select relevant predictors and consider transformations to improve model performance. - -- Residual Analysis: Evaluate residuals to check model assumptions and identify outliers or patterns that could impact predictions. - -- Regularization: Apply regularization techniques (e.g., Ridge, Lasso regression) to handle multicollinearity and improve model robustness. - -#### Example: - -In healthcare analytics, linear regression assists in predicting patient readmission rates based on demographic factors and medical history, facilitating resource allocation and patient care planning. - -### Real-World Applications - -#### Sales Forecasting in Retail - -Linear regression is widely applied in retail for sales forecasting. By analyzing historical sales data and economic indicators, retailers can predict future sales trends and optimize inventory management. - -#### Academic Performance Prediction - -In education, linear regression helps predict student performance based on factors such as attendance, study hours, and socioeconomic background, enabling targeted interventions to improve educational outcomes. - -### Performance Considerations - -- Model Complexity and Scalability -Large Datasets: Linear regression remains efficient for large datasets but may require regularization techniques to handle high-dimensional data. - -- Computational Resources: Model training and inference are generally fast, but scalability can be impacted by the number of predictors and data volume. - -#### Example: -In environmental science, linear regression models are used to analyze the relationship between pollution levels, weather patterns, and health outcomes, guiding public health policies and interventions. - -### Conclusion -Linear regression is a versatile and widely used statistical technique that provides valuable insights into relationships between variables. Understanding its principles and limitations is essential for leveraging its predictive power effectively across various domains and applications. diff --git a/docs/Machine Learning/t-Distributed Stochastic Neighbor Embedding.md b/docs/Machine Learning/t-Distributed Stochastic Neighbor Embedding.md deleted file mode 100644 index aea9fdb08..000000000 --- a/docs/Machine Learning/t-Distributed Stochastic Neighbor Embedding.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -id: t-distributed-stochastic-neighbor-embedding -title: t-Distributed Stochastic Neighbor Embedding -sidebar_label: Introduction to t-Distributed Stochastic Neighbor Embedding -sidebar_position: 2 -tags: [t-Distributed Stochastic Neighbor Embedding, t-SNE, dimensionality reduction, data visualization, machine learning, data science, non-linear dimensionality reduction, feature reduction] -description: In this tutorial, you will learn about t-Distributed Stochastic Neighbor Embedding (t-SNE), its significance, what t-SNE is, why learn t-SNE, how to use t-SNE, steps to start using t-SNE, and more. ---- - -### Introduction to t-Distributed Stochastic Neighbor Embedding -t-Distributed Stochastic Neighbor Embedding (t-SNE) is a popular dimensionality reduction technique used to visualize high-dimensional data in a lower-dimensional space, typically 2D or 3D. It is particularly effective in preserving the local structure of the data, making it an invaluable tool for exploring and understanding complex datasets. - -### What is t-Distributed Stochastic Neighbor Embedding? -t-SNE works by converting high-dimensional data into a probability distribution that captures pairwise similarities between data points. It then maps these points to a lower-dimensional space while preserving these similarities. - -- **High-Dimensional Data**: Data is represented in a high-dimensional space with complex structures. -- **Probability Distribution**: t-SNE calculates the similarity between data points using conditional probabilities. -- **Low-Dimensional Mapping**: The algorithm minimizes the divergence between the high-dimensional and low-dimensional probability distributions, resulting in a 2D or 3D representation. - -**Similarity Measurement**: Uses Gaussian distribution to measure similarity in high-dimensional space and Student’s t-distribution for low-dimensional space. - -### Example: -Consider using t-SNE to visualize clusters in a dataset of handwritten digits. By reducing the data to 2D, you can observe how different digits group together, revealing underlying patterns and clusters. - -### Advantages of t-Distributed Stochastic Neighbor Embedding -t-SNE offers several advantages: - -- **Preserves Local Structure**: Maintains the local relationships between data points, making clusters and patterns more apparent. -- **Non-Linear Mapping**: Capable of capturing complex, non-linear structures in the data. -- **Intuitive Visualization**: Produces intuitive and interpretable visualizations of high-dimensional data. - -### Example: -In bioinformatics, t-SNE can be used to visualize gene expression profiles, revealing patterns and relationships between different genes or samples. - -### Disadvantages of t-Distributed Stochastic Neighbor Embedding -Despite its strengths, t-SNE has limitations: - -- **Computational Complexity**: Can be computationally intensive, especially with large datasets. -- **Parameter Sensitivity**: Results can be sensitive to hyperparameters, such as perplexity and learning rate. -- **Global Structure**: May not preserve global structures or distances well, focusing more on local relationships. - -### Example: -In large-scale image datasets, t-SNE might struggle to maintain meaningful global relationships between images, potentially making it less effective for certain types of analysis. - -### Practical Tips for Using t-Distributed Stochastic Neighbor Embedding -To get the most out of t-SNE: - -- **Choose Perplexity Wisely**: Perplexity is a key parameter that controls the balance between local and global aspects of the data. Experiment with different values to find the best representation. -- **Normalize Data**: Preprocess and normalize data to ensure that t-SNE operates on well-conditioned inputs. -- **Use Dimensionality Reduction Preprocessing**: Apply initial dimensionality reduction (e.g., PCA) to reduce the computational burden and improve the performance of t-SNE. - -### Example: -In a text analysis project, you can preprocess word embeddings using t-SNE to visualize and cluster similar words or documents based on their semantic content. - -### Real-World Examples - -#### Image Analysis -t-SNE is often used in computer vision to visualize the clusters of similar images in a dataset, helping to understand and evaluate image classification algorithms. - -#### Customer Segmentation -In marketing analytics, t-SNE can visualize customer segments based on purchasing behavior, aiding in the development of targeted marketing strategies. - -### Difference Between t-SNE and PCA -| Feature | t-Distributed Stochastic Neighbor Embedding (t-SNE) | Principal Component Analysis (PCA) | -|---------------------------------|------------------------------------------------------|-----------------------------------| -| Linear vs Non-Linear | Non-linear dimensionality reduction. | Linear dimensionality reduction. | -| Preserved Structure | Preserves local structure; may distort global structure. | Preserves global structure; may not capture local nuances. | -| Computational Cost | Computationally intensive with large datasets. | Generally faster and more scalable. | - -### Implementation -To implement and visualize data using t-SNE, you can use libraries such as scikit-learn in Python. Below are the steps to install the necessary library and apply t-SNE. - -#### Libraries to Download -- scikit-learn: Provides the implementation of t-SNE. -- matplotlib: Useful for data visualization. -- pandas: Useful for data manipulation and analysis. -- numpy: Essential for numerical operations. - -You can install these libraries using pip: - -```bash -pip install scikit-learn matplotlib pandas numpy -``` - -#### Applying t-Distributed Stochastic Neighbor Embedding -Here’s a step-by-step guide to applying t-SNE: - -**Import Libraries:** - -```python -import pandas as pd -import numpy as np -from sklearn.manifold import TSNE -import matplotlib.pyplot as plt -``` - -**Load and Prepare Data:** -Assuming you have a dataset in a CSV file: - -```python -# Load the dataset -data = pd.read_csv('your_dataset.csv') - -# Prepare features (X) -X = data.drop('target_column', axis=1) # Replace 'target_column' with any non-feature columns -``` - -**Apply t-SNE:** - -```python -# Initialize t-SNE -tsne = TSNE(n_components=2, random_state=42) - -# Fit and transform the data -X_tsne = tsne.fit_transform(X) -``` - -**Visualize the Results:** - -```python -# Plot t-SNE results -plt.figure(figsize=(10, 8)) -plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=data['target_column'], cmap='viridis', alpha=0.7) -plt.colorbar() -plt.title('t-SNE Visualization') -plt.xlabel('Component 1') -plt.ylabel('Component 2') -plt.show() -``` - -### Performance Considerations - -#### Computational Efficiency -- **Dataset Size**: t-SNE can be slow for very large datasets. Consider using a subset of the data or combining it with other dimensionality reduction techniques (e.g., PCA) to speed up the process. -- **Hyperparameters**: Proper tuning of hyperparameters, such as perplexity, can affect both the quality of the results and the computational cost. - -### Example: -In a large-scale text dataset, combining t-SNE with PCA for initial dimensionality reduction can make the visualization process more manageable and faster. - -### Conclusion -t-Distributed Stochastic Neighbor Embedding is a powerful technique for visualizing and understanding high-dimensional data. By grasping its strengths, limitations, and implementation, practitioners can effectively leverage t-SNE to gain insights and make sense of complex datasets in various data science and machine learning projects. diff --git a/docs/Operating System/_category_.json b/docs/Operating System/_category_.json deleted file mode 100644 index 5ab9f65df..000000000 --- a/docs/Operating System/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Operating System", - "position": 18, - "link": { - "type": "generated-index", - "description": "Operating System lies in the category of system software. It basically manages all the resources of the computer" - } -} diff --git a/docs/Operating System/device_management.md b/docs/Operating System/device_management.md deleted file mode 100644 index 025662ded..000000000 --- a/docs/Operating System/device_management.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -id: device-management -title: device-management -sidebar_label: Device Management -sidebar_position: 12 -tags: [operating_system, create database, commands] -description: Device management is a crucial function of an operating system that handles the communication and control of hardware devices. ---- -# Device Management - -## Introduction -Device management is a crucial function of an operating system that handles the communication and control of hardware devices. It ensures that hardware resources are used efficiently and provides a way for software applications to interact with hardware devices. - -## Key Concepts - -### 1. Device Types -Devices can be broadly categorized into two types: -- **Block Devices**: These devices store data in fixed-size blocks, each with its own address. Examples include hard drives and CD-ROMs. -- **Character Devices**: These devices transmit data as a stream of bytes. Examples include keyboards, mice, and serial ports. - -### 2. Device Controllers -A device controller is a hardware component that manages a specific type of device. It communicates with the CPU and the device it controls. Each device controller has registers to store commands, status, and data. - -### 3. Device Drivers -Device drivers are software programs that act as an interface between the operating system and hardware devices. They translate high-level commands from the OS into device-specific operations. - -## Device Management Functions - -### 1. Device Allocation -The operating system allocates devices to processes as needed. This involves: -- **Exclusive Allocation**: Some devices can be allocated to only one process at a time. -- **Shared Allocation**: Some devices can be shared among multiple processes. - -### 2. Device Scheduling -The OS schedules access to devices to ensure efficient and fair use. This is similar to CPU scheduling but with different algorithms tailored to the specific device. - -### 3. Device Queues -Each device has a queue to manage the requests from processes. The OS uses different scheduling algorithms to process these queues. - -## I/O Control Methods - -### 1. Programmed I/O -The CPU is responsible for executing I/O operations, constantly checking the device's status, and transferring data as needed. This method is simple but inefficient as the CPU is tied up during I/O operations. - -### 2. Interrupt-Driven I/O -The device generates an interrupt when it is ready for the next part of the I/O operation, allowing the CPU to execute other instructions between interrupts. This method improves CPU utilization. - -### 3. Direct Memory Access (DMA) -DMA allows devices to transfer data directly to or from memory without involving the CPU for each byte of transfer. The CPU sets up the DMA controller, which then handles the data transfer independently, significantly improving efficiency. - -## Device Management Techniques - -### 1. Buffering -Buffering involves using memory areas to temporarily hold data while it is being transferred between devices or between a device and an application. It helps to accommodate speed differences between the producer and consumer of the data. - -### 2. Caching -Caching involves keeping copies of frequently accessed data in a faster storage medium to reduce access time. This is commonly used for disk I/O operations. - -### 3. Spooling -Spooling (Simultaneous Peripheral Operations On-line) is a technique where data is written to an intermediate storage (usually a disk) to be processed later. This is commonly used for managing printer queues. - -## Device Drivers - -### 1. Device Driver Structure -A typical device driver consists of: -- **Initialization Code**: Sets up the device and registers it with the OS. -- **I/O Operations**: Handles read and write operations. -- **Interrupt Handling**: Manages device interrupts. -- **Cleanup Code**: Frees resources when the device is no longer needed. - -### 2. Writing Device Drivers -Writing device drivers requires understanding the device's hardware interface and the operating system's driver interface. Drivers must be efficient and handle errors gracefully. - -## Device Management in Modern Operating Systems - -### 1. Plug and Play (PnP) -Modern operating systems support Plug and Play, allowing devices to be automatically detected, configured, and used without manual intervention. PnP involves: -- **Device Detection**: Identifying the presence of a new device. -- **Resource Allocation**: Assigning system resources like IRQs and memory addresses to the device. -- **Driver Installation**: Loading the appropriate device driver. - -### 2. Power Management -Device management also involves managing the power state of devices to conserve energy. Techniques include: -- **Power States**: Devices can be in different power states (e.g., active, standby, sleep). -- **Dynamic Power Management**: Adjusting power usage based on device activity. - -## Conclusion -Device management is essential for the efficient and effective use of hardware resources in an operating system. It involves allocating devices, scheduling access, handling I/O operations, and ensuring smooth communication between hardware and software. Understanding device management helps in optimizing system performance and enhancing user experience. - ---- - -Efficient device management is a cornerstone of modern operating systems, enabling seamless interaction between software applications and hardware components, and ensuring optimal resource utilization and system performance. diff --git a/docs/Operating System/distributed_systems.md b/docs/Operating System/distributed_systems.md deleted file mode 100644 index 7b41bc355..000000000 --- a/docs/Operating System/distributed_systems.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -id: distributed-systems -title: distributed-systems -sidebar_label: Distributed Systems -sidebar_position: 14 -tags: [operating_system, create database, commands] -description: A distributed system is a collection of independent computers that appear to the users of the system as a single coherent system. ---- -# Distributed Systems - -## Introduction -A distributed system is a collection of independent computers that appear to the users of the system as a single coherent system. These systems collaborate to achieve a common goal, sharing resources and communicating over a network. - -## Key Concepts - -### 1. Characteristics of Distributed Systems -- **Resource Sharing**: Resources such as files, printers, and data are shared among multiple systems. -- **Openness**: The system is open if it is easy to add new components and to expand existing services. -- **Concurrency**: Multiple processes run concurrently, accessing shared resources. -- **Scalability**: The system can handle the addition of users, resources, and services without performance degradation. -- **Fault Tolerance**: The system can continue to operate, possibly at a reduced level, when part of the system fails. -- **Transparency**: The complexity of the distributed nature of the system is hidden from users. - -### 2. Types of Distributed Systems -- **Client-Server Systems**: Clients request services, and servers provide them. Examples include web services and database systems. -- **Peer-to-Peer Systems**: Each node acts as both a client and a server. Examples include file-sharing networks and blockchain. -- **Distributed Computing Systems**: Multiple computers work together on a single task. Examples include grid computing and cloud computing. - -## Distributed System Models - -### 1. Architectural Models -- **Layered Architecture**: The system is organized into layers, each providing services to the layer above and consuming services of the layer below. -- **Object-Based Architecture**: The system is composed of objects that interact with each other. Examples include CORBA and DCOM. -- **Data-Centered Architecture**: Data is shared among multiple clients through a central repository. Examples include distributed databases and shared filesystems. -- **Event-Based Architecture**: Components communicate by broadcasting and receiving events. Examples include publish-subscribe systems. - -### 2. Interaction Models -- **Synchronous Communication**: The sender waits for the receiver to acknowledge receipt of the message. -- **Asynchronous Communication**: The sender does not wait for the receiver to acknowledge receipt of the message. -- **Remote Procedure Calls (RPC)**: A function call that is executed on a remote server. -- **Message Passing**: Components communicate by sending and receiving messages. - -## Challenges in Distributed Systems - -### 1. Network Issues -- **Latency**: The time taken for a message to travel from sender to receiver. -- **Bandwidth**: The capacity of the network to transmit data. -- **Jitter**: Variation in the time taken for messages to travel. - -### 2. Security -- **Authentication**: Verifying the identity of users and systems. -- **Authorization**: Ensuring users have permission to access resources. -- **Encryption**: Protecting data from unauthorized access during transmission. - -### 3. Fault Tolerance -- **Redundancy**: Duplicating critical components to ensure availability. -- **Replication**: Copying data across multiple systems to prevent data loss. -- **Checkpointing**: Saving the state of a system at intervals to enable recovery. - -### 4. Synchronization -- **Clock Synchronization**: Ensuring all systems have a consistent view of time. -- **Coordination**: Managing the execution order of processes in different systems. - -## Distributed Algorithms - -### 1. Consensus Algorithms -- **Paxos**: A protocol for achieving consensus in a network of unreliable processors. -- **Raft**: A consensus algorithm designed to be understandable and easier to implement than Paxos. - -### 2. Distributed Hash Tables (DHT) -- **Chord**: A protocol and algorithm for a peer-to-peer distributed hash table. -- **Kademlia**: A distributed hash table for decentralized peer-to-peer computer networks. - -### 3. Leader Election Algorithms -- **Bully Algorithm**: A process elects itself as the leader if it has the highest process ID. -- **Ring Algorithm**: Processes are arranged in a logical ring, and election messages are passed around the ring. - -## Case Studies - -### 1. Google File System (GFS) -A scalable distributed file system designed for large data-intensive applications. It provides fault tolerance and high throughput. - -### 2. Hadoop Distributed File System (HDFS) -A distributed file system designed to run on commodity hardware. It is highly fault-tolerant and designed for large-scale data processing. - -### 3. Amazon DynamoDB -A highly available and scalable distributed data store. It uses a combination of techniques like consistent hashing, replication, and versioning to achieve high availability and scalability. - -## Conclusion -Distributed systems offer numerous benefits, including resource sharing, scalability, and fault tolerance. However, they also pose significant challenges, such as ensuring security, synchronization, and fault tolerance. Understanding the key concepts, models, and algorithms of distributed systems is crucial for designing and managing efficient and robust systems. - ---- - -By leveraging the principles and techniques of distributed systems, organizations can build scalable, reliable, and efficient systems that meet the demands of modern applications. diff --git a/docs/Operating System/file_systems.md b/docs/Operating System/file_systems.md deleted file mode 100644 index 467202963..000000000 --- a/docs/Operating System/file_systems.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: file_systems -title: file_systems -sidebar_label: File Systems -sidebar_position: 11 -tags: [operating_system, create database, commands] -description: A file system is a method and data structure that the operating system uses to control how data is stored and retrieved. ---- - -# File Systems - -## Introduction -A file system is a method and data structure that the operating system uses to control how data is stored and retrieved. Without a file system, information placed in a storage medium would be one large body of data with no way to tell where one piece of information stops and the next begins. - -## Key Concepts - -### 1. File -A file is a collection of related information that is recorded on secondary storage. A file can contain programs, data, or both. - -### 2. Directory -A directory is a special type of file that contains a list of files and other directories. Directories help in organizing files into a hierarchical structure. - -### 3. Path -The path specifies the location of a file or directory in the file system. Paths can be absolute (starting from the root directory) or relative (starting from the current directory). - -## File Attributes -Files have attributes that provide additional information about the file: -- **Name**: The human-readable name of the file. -- **Type**: The type of the file (e.g., text, binary, executable). -- **Location**: The location of the file on the storage medium. -- **Size**: The size of the file in bytes. -- **Protection**: Access control information (e.g., read, write, execute permissions). -- **Timestamps**: Information about the file's creation, modification, and last access times. - -## File Operations -Common file operations include: -- **Create**: Creating a new file. -- **Open**: Opening an existing file for reading or writing. -- **Close**: Closing an open file. -- **Read**: Reading data from a file. -- **Write**: Writing data to a file. -- **Delete**: Deleting a file. -- **Rename**: Changing the name of a file. - -## Directory Structure - -### Single-Level Directory -All files are contained in a single directory. This simple structure can lead to name conflicts and is not scalable for larger systems. - -### Two-Level Directory -There is a separate directory for each user. This structure solves the name conflict issue but still has limitations in organizing a large number of files. - -### Tree-Structured Directory -Directories are organized in a tree structure, allowing for a hierarchical organization of files. Each directory can contain files and subdirectories. - -### Acyclic-Graph Directory -Directories form an acyclic graph, allowing shared subdirectories and files. This structure enables better organization and sharing but requires handling of link deletion and cycles. - -### General Graph Directory -Allows for arbitrary links between directories and files, creating a general graph structure. This structure offers maximum flexibility but requires sophisticated algorithms to manage. - -## File Allocation Methods - -### Contiguous Allocation -Files are stored in contiguous blocks of memory. This method is simple and efficient for sequential access but can lead to fragmentation and difficulty in file size extension. - -### Linked Allocation -Files are stored as linked lists of blocks. Each block contains a pointer to the next block. This method eliminates fragmentation but can be inefficient for direct access. - -### Indexed Allocation -An index block is created, which contains pointers to the actual data blocks of the file. This method supports both sequential and direct access but requires extra space for the index block. - -## Free Space Management - -### Bit Vector -A bit vector is used to represent the free and allocated blocks. Each bit in the vector represents a block; 0 indicates free and 1 indicates allocated. - -### Linked List -Free blocks are linked together, forming a list. Each free block contains a pointer to the next free block. - -### Grouping -Similar to linked list but with a group of free blocks stored together. The first block of the group points to the next group of free blocks. - -### Counting -Stores the address of the first free block and the number of free contiguous blocks that follow it. - -## Disk Scheduling Algorithms - -### First-Come, First-Served (FCFS) -Processes disk requests in the order they arrive. Simple but can lead to inefficient use of the disk. - -### Shortest Seek Time First (SSTF) -Selects the request that is closest to the current head position. Reduces seek time but can lead to starvation of some requests. - -### SCAN (Elevator Algorithm) -The disk arm moves in one direction, fulfilling requests until it reaches the end, then reverses direction. Provides a more uniform wait time. - -### C-SCAN (Circular SCAN) -Similar to SCAN, but when the disk arm reaches the end, it returns to the beginning and starts again. Provides a more uniform wait time. - -### LOOK and C-LOOK -Similar to SCAN and C-SCAN but the disk arm only goes as far as the last request in each direction before reversing or restarting. - -## Conclusion -File systems are a critical component of operating systems, providing a structured way to store, manage, and retrieve data. Understanding the various aspects of file systems, including file operations, directory structures, allocation methods, and disk scheduling algorithms, is essential for efficient data management and system performance. - ---- - -A well-designed file system ensures efficient storage, quick access, and effective management of data, contributing significantly to the overall performance and usability of an operating system. diff --git a/docs/Operating System/function_of_OS.md b/docs/Operating System/function_of_OS.md deleted file mode 100644 index 0ef406daf..000000000 --- a/docs/Operating System/function_of_OS.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -id: function-of-operating-system -title: function-of-operating-system -sidebar_label: Function of Operating System -sidebar_position: 7 -tags: [operating_system, create database, commands] -description: An Operating System acts as a communication bridge (interface) between the user and computer hardware. ---- - -# Functions of Operating System - -An Operating System acts as a communication bridge (interface) between the user and computer hardware. The purpose of an operating system is to provide a platform on which a user can execute programs conveniently and efficiently. - -An operating system is a piece of software that manages the allocation of Computer Hardware. The coordination of the hardware must be appropriate to ensure the correct working of the computer system and to prevent user programs from interfering with the proper working of the system. - -The main goal of the Operating System is to make the computer environment more convenient to use and the secondary goal is to use the resources most efficiently. - -## What is an Operating System? - -An operating system is a program that manages a computer’s hardware. It also provides a basis for application programs and acts as an intermediary between the computer user and computer hardware. The main task an operating system carries out is the allocation of resources and services, such as the allocation of memory, devices, processors, and information. The operating system also includes programs to manage these resources, such as a traffic controller, a scheduler, a memory management module, I/O programs, and a file system. The operating system simply provides an environment within which other programs can do useful work. - -## Why are Operating Systems Used? - -Operating System is used as a communication channel between the computer hardware and the user. It works as an intermediate between system hardware and end-user. Operating System handles the following responsibilities: - -- It controls all the computer resources. - -- It provides valuable services to user programs. - -- It coordinates the execution of user programs. - -- It provides resources for user programs. - -- It provides an interface (virtual machine) to the user. - -- It hides the complexity of software. - -- It supports multiple execution modes. - -- It monitors the execution of user programs to prevent errors. - -## Functions of an Operating System - -### Memory Management - -The operating system manages the Primary Memory or Main Memory. Main memory is fast storage and it can be accessed directly by the CPU. For a program to be executed, it should be first loaded in the main memory. An operating system manages the allocation and deallocation of memory to various processes and ensures that the other process does not consume the memory allocated to one process. An Operating System performs the following activities for Memory Management: - -- It keeps track of primary memory, i.e., which bytes of memory are used by which user program. - -- In multiprogramming, the OS decides the order in which processes are granted memory access, and for how long. - -- It allocates the memory to a process when the process requests it and deallocates the memory when the process has terminated or is performing an I/O operation. - - ![alt text](image-1.png) - -### Processor Management - -In a multi-programming environment, the OS decides the order in which processes have access to the processor, and how much processing time each process has. This function of OS is called Process Scheduling. An Operating System performs the following activities for Processor Management: - -- Manages the processor’s work by allocating various jobs to it and ensuring that each process receives enough time from the processor to function properly. - -- Keeps track of the status of processes. The program which performs this task is known as a traffic controller. - -- Allocates the CPU (processor) to a process. - -- Deallocates the processor when a process is no longer required. - - ![alt text](image-2.png) - -### Device Management - -An OS manages device communication via its respective drivers. It performs the following activities for device management: - -- Keeps track of all devices connected to the system. Designates a program responsible for every device known as the Input/Output controller. - -- Decides which process gets access to a certain device and for how long. - -- Allocates devices effectively and efficiently. - -- Deallocates devices when they are no longer required. - -- Controls the working of input-output devices, receives requests from these devices, performs specific tasks, and communicates back to the requesting process. - -### File Management - -A file system is organized into directories for efficient or easy navigation and usage. These directories may contain other directories and other files. An Operating System carries out the following file management activities: - -- Keeps track of where information is stored, user access settings, the status of every file, and more. These facilities are collectively known as the file system. - -- Keeps track of information regarding the creation, deletion, transfer, copy, and storage of files in an organized way. - -- Maintains the integrity of the data stored in these files, including the file directory structure, by protecting against unauthorized access. - - ![alt text](image-3.png) - -### User Interface or Command Interpreter - -The user interacts with the computer system through the operating system. Hence OS acts as an interface between the user and the computer hardware. This user interface is offered through a set of commands or a graphical user interface (GUI). Through this interface, the user interacts with the applications and the machine hardware. - - ![alt text](image-4.png) - -### Booting the Computer - -The process of starting or restarting the computer is known as booting. If the computer is switched off completely and if turned on then it is called cold booting. Warm booting is a process of using the operating system to restart the computer. - -### Security - -The operating system uses password protection to protect user data and similar other techniques. It also prevents unauthorized access to programs and user data. The operating system provides various techniques which assure the integrity and confidentiality of user data: - -- Protection against unauthorized access through login. - -- Protection against intrusion by keeping the firewall active. - -- Protecting the system memory against malicious access. - -- Displaying messages related to system vulnerabilities. - -### Control Over System Performance - -Operating systems play a pivotal role in controlling and optimizing system performance. They act as intermediaries between hardware and software, ensuring that computing resources are efficiently utilized. One fundamental aspect is resource allocation, where the OS allocates CPU time, memory, and I/O devices to different processes, striving to provide fair and optimal resource utilization. Process scheduling, a critical function, helps decide which processes or threads should run when, preventing any single task from monopolizing the CPU and enabling effective multitasking. - - ![alt text](image-5.png) - -### Job Accounting - -The operating system keeps track of time and resources used by various tasks and users. This information can be used to track resource usage for a particular user or group of users. In a multitasking OS where multiple programs run simultaneously, the OS determines which applications should run in which order and how time should be allocated to each application. - -### Error-Detecting Aids - -The operating system constantly monitors the system to detect errors and avoid malfunctioning computer systems. From time to time, the operating system checks the system for any external threat or malicious software activity. It also checks the hardware for any type of damage. This process displays several alerts to the user so that the appropriate action can be taken against any damage caused to the system. - -### Coordination Between Other Software and Users - -Operating systems also coordinate and assign interpreters, compilers, assemblers, and other software to the various users of the computer systems. In simpler terms, think of the operating system as the traffic cop of your computer. It directs and manages how different software programs can share your computer’s resources without causing chaos. It ensures that when you want to use a program, it runs smoothly without crashing or causing problems for others. - -### Performs Basic Computer Tasks - -The management of various peripheral devices such as the mouse, keyboard, and printer is carried out by the operating system. Today most operating systems are plug-and-play. These operating systems automatically recognize and configure the devices with no user interference. - -### Network Management - -- **Network Communication:** Operating systems help computers talk to each other and the internet. They manage how data is packaged and sent over the network, making sure it arrives safely and in the right order. - -- **Settings and Monitoring:** They let you set up your network connections, like Wi-Fi or Ethernet, and keep an eye on how your network is doing. They make sure your computer is using the network efficiently and securely, like adjusting the speed of your internet or protecting your computer from online threats. - -## Services Provided by an Operating System - -The Operating System provides certain services to the users which can be listed in the following manner: - -- **User Interface:** Almost all operating systems have a user interface (UI). This interface can take several forms such as command-line interface (CLI), batch interface, or graphical user interface (GUI). - -- **Program Execution:** Responsible for the execution of all types of programs whether it be user programs or system programs. - -- **Handling Input/Output Operations:** Responsible for handling all sorts of inputs, i.e., from the keyboard, mouse, desktop, etc. - -- **Manipulation of File System:** Responsible for making decisions regarding the storage of all types of data or files. - -- **Resource Allocation:** Ensures the proper use of all the resources available by deciding which resource to be used by whom for how much time. - -- **Accounting:** Tracks an account of all the functionalities taking place in the computer system at a time. - -- **Information and Resource Protection:** Uses all the information and resources available on the machine in the most protected way. - -- **Communication:** Implements communication between one process to another process to exchange information. - -- **System Services:** Provides various system services, such as printing, time and date management, and event logging. - -- **Error Detection:** Needs to detect and correct errors constantly to ensure correct and consistent computing. - -## Characteristics of Operating System - -- **Virtualization:** Provides virtualization capabilities, allowing multiple operating systems or instances of an operating system to run on a single physical machine. - -- **Networking:** Provides networking capabilities, allowing the computer system to connect to other systems and devices over a network. - -- **Scheduling:** Provides scheduling algorithms that determine the order in which tasks are executed on the system. - -- **Interprocess Communication:** Provides mechanisms for applications to communicate with each other, allowing them to share data and coordinate their activities. - -- **Performance Monitoring:** Provides tools for monitoring system performance, including CPU usage, memory usage, disk usage, and network activity. - -- **Backup and Recovery:** Provides backup and recovery mechanisms to protect data in the event of system failure or data loss. - -- **Debugging:** Provides diff --git a/docs/Operating System/image-1.png b/docs/Operating System/image-1.png deleted file mode 100644 index ad0257ffce8004267e81eca614cfadaa934e2ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72655 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

    AOHYZbz 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 E1GNTR`v3p{ diff --git a/docs/Operating System/image-11.png b/docs/Operating System/image-11.png deleted file mode 100644 index ea9968aceacaeb5e14de16f306731b3c4202d43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98580 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ⅆW7S0QrG7+tss&R&}yPWE2akj~Y>5QLYKhFlq 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%0A0$W7*ySY#Ga_P@s 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 diff --git a/docs/Operating System/image-12.png b/docs/Operating System/image-12.png deleted file mode 100644 index 7a0b932f5746eb73ea4f45cbf07481ff86696fdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115215 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%0AdPP#k}X|uIZW9|o+2S^#Aqr%>WfKW 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 diff --git a/docs/Operating System/image-2.png b/docs/Operating System/image-2.png deleted file mode 100644 index bb1b079fd017baed3a355378f2b3d4203d15aecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34738 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®I=LtXN;C)u18PiEBu}&47$(l90*5k$2brk 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 Y{{J5^V!gwHKY*YlrzTtb$t>*u0JcZ%d;kCd diff --git a/docs/Operating System/image-5.png b/docs/Operating System/image-5.png deleted file mode 100644 index a16e8dfc022c756cf653db942ec14f06552c22d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181463 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

    );5(+GF>=*Pdd|KBq4g*M&2d(qj{ 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 z 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

    %eZ6-%W{2lmhrRL-lh#dyK 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 mzRh!l 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 Fe*o&&M?C-l diff --git a/docs/Operating System/image.png b/docs/Operating System/image.png deleted file mode 100644 index 5446f335200dd27738e706bb8fd224f561cb0316..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48521 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

    ff3nR`glZME?!v!dr?YC$}ae`Q5> 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 diff --git a/docs/Operating System/intro_to_OS.md b/docs/Operating System/intro_to_OS.md deleted file mode 100644 index fedf2bf7d..000000000 --- a/docs/Operating System/intro_to_OS.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -id: operating_system -title: operating_system -sidebar_label: Operating System -sidebar_position: 6 -tags: [operating_system, create database, commands] -description: An operating system acts as an interface between the software and different parts of the computer or the computer hardware. ---- - -# What is an Operating System? - -Operating System lies in the category of system software. It basically manages all the resources of the computer. An operating system acts as an interface between the software and different parts of the computer or the computer hardware. The operating system is designed in such a way that it can manage the overall resources and operations of the computer. - -Operating System is a fully integrated set of specialized programs that handle all the operations of the computer. It controls and monitors the execution of all other programs that reside in the computer, which also includes application programs and other system software of the computer. Examples of Operating Systems are Windows, Linux, Mac OS, etc. - -An Operating System (OS) is a collection of software that manages computer hardware resources and provides common services for computer programs. The operating system is the most important type of system software in a computer system. - -## What is an Operating System Used for? - -The operating system helps in improving the computer software as well as hardware. Without OS, it became very difficult for any application to be user-friendly. The Operating System provides a user with an interface that makes any application attractive and user-friendly. The operating System comes with a large number of device drivers that make OS services reachable to the hardware environment. Each and every application present in the system requires the Operating System. The operating system works as a communication channel between system hardware and system software. The operating system helps an application with the hardware part without knowing about the actual hardware configuration. It is one of the most important parts of the system and hence it is present in every device, whether large or small device. - - ![alt text](image.png) - -## Functions of the Operating System - -- **Resource Management**: The operating system manages and allocates memory, CPU time, and other hardware resources among the various programs and processes running on the computer. - -- **Process Management**: The operating system is responsible for starting, stopping, and managing processes and programs. It also controls the scheduling of processes and allocates resources to them - . -- **Memory Management**: The operating system manages the computer’s primary memory and provides mechanisms for optimizing memory usage. - -- **Security**: The operating system provides a secure environment for the user, applications, and data by implementing security policies and mechanisms such as access controls and encryption. - -- **Job Accounting**: It keeps track of time and resources used by various jobs or users. - -- **File Management**: The operating system is responsible for organizing and managing the file system, including the creation, deletion, and manipulation of files and directories. - -- **Device Management**: The operating system manages input/output devices such as printers, keyboards, mice, and displays. It provides the necessary drivers and interfaces to enable communication between the devices and the computer. - -- **Networking**: The operating system provides networking capabilities such as establishing and managing network connections, handling network protocols, and sharing resources such as printers and files over a network. - -- **User Interface**: The operating system provides a user interface that enables users to interact with the computer system. This can be a Graphical User Interface (GUI), a Command-Line Interface (CLI), or a combination of both. - -- **Backup and Recovery**: The operating system provides mechanisms for backing up data and recovering it in case of system failures, errors, or disasters. - -- **Virtualization**: The operating system provides virtualization capabilities that allow multiple operating systems or applications to run on a single physical machine. This can enable efficient use of resources and flexibility in managing workloads. - -- **Performance Monitoring**: The operating system provides tools for monitoring and optimizing system performance, including identifying bottlenecks, optimizing resource usage, and analyzing system logs and metrics. - -- **Time-Sharing**: The operating system enables multiple users to share a computer system and its resources simultaneously by providing time-sharing mechanisms that allocate resources fairly and efficiently. - -- **System Calls**: The operating system provides a set of system calls that enable applications to interact with the operating system and access its resources. System calls provide a standardized interface between applications and the operating system, enabling portability and compatibility across different hardware and software platforms. - -- **Error-detecting Aids**: These contain methods that include the production of dumps, traces, error messages, and other debugging and error-detecting methods. - -## Objectives of Operating Systems - -Let us now see some of the objectives of the operating system, which are mentioned below. - -- **Convenient to use**: One of the objectives is to make the computer system more convenient to use in an efficient manner. - -- **User Friendly**: To make the computer system more interactive with a more convenient interface for the users. - -- **Easy Access**: To provide easy access to users for using resources by acting as an intermediary between the hardware and its users. - -- **Management of Resources**: For managing the resources of a computer in a better and faster way. - -- **Controls and Monitoring**: By keeping track of who is using which resource, granting resource requests, and mediating conflicting requests from different programs and users. - -- **Fair Sharing of Resources**: Providing efficient and fair sharing of resources between the users and programs. - -## Types of Operating Systems - -- **Batch Operating System**: A Batch Operating System is a type of operating system that does not interact with the computer directly. There is an operator who takes similar jobs having the same requirements and groups them into batches. - -- **Time-sharing Operating System**: Time-sharing Operating System is a type of operating system that allows many users to share computer resources (maximum utilization of the resources). - -- **Distributed Operating System**: Distributed Operating System is a type of operating system that manages a group of different computers and makes appear to be a single computer. These operating systems are designed to operate on a network of computers. They allow multiple users to access shared resources and communicate with each other over the network. Examples include Microsoft Windows Server and various distributions of Linux designed for servers. - -- **Network Operating System**: Network Operating System is a type of operating system that runs on a server and provides the capability to manage data, users, groups, security, applications, and other networking functions. - -- **Real-time Operating System**: Real-time Operating System is a type of operating system that serves a real-time system and the time interval required to process and respond to inputs is very small. These operating systems are designed to respond to events in real time. They are used in applications that require quick and deterministic responses, such as embedded systems, industrial control systems, and robotics. - -- **Multiprocessing Operating System**: Multiprocessor Operating Systems are used in operating systems to boost the performance of multiple CPUs within a single computer system. Multiple CPUs are linked together so that a job can be divided and executed more quickly. - -- **Single-User Operating Systems**: Single-User Operating Systems are designed to support a single user at a time. Examples include Microsoft Windows for personal computers and Apple macOS. - -- **Multi-User Operating Systems**: Multi-User Operating Systems are designed to support multiple users simultaneously. Examples include Linux and Unix. - -- **Embedded Operating Systems**: Embedded Operating Systems are designed to run on devices with limited resources, such as smartphones, wearable devices, and household appliances. Examples include Google’s Android and Apple’s iOS. - -- **Cluster Operating Systems**: Cluster Operating Systems are designed to run on a group of computers, or a cluster, to work together as a single system. They are used for high-performance computing and for applications that require high availability and reliability. Examples include Rocks Cluster Distribution and OpenMPI. - -## How to Check the Operating System? - -There are so many factors to be considered while choosing the best Operating System for our use. These factors are mentioned below. - -- **Price Factor**: Price is one of the factors to choose the correct Operating System as there are some OS that is free, like Linux, but there is some more OS that is paid like Windows and macOS. - -- **Accessibility Factor**: Some Operating Systems are easy to use like macOS and iOS, but some OS are a little bit complex to understand like Linux. So, you must choose the Operating System in which you are more accessible. - -- **Compatibility Factor**: Some Operating Systems support very less applications whereas some Operating Systems supports more application. You must choose the OS, which supports the applications which are required by you. - -- **Security Factor**: The security Factor is also a factor in choosing the correct OS, as macOS provide some additional security while Windows has little fewer security features. - -## Examples of Operating Systems - -- **Windows**: GUI-based, PC - -- **GNU/Linux**: Personal, Workstations, ISP, File, and print server, Three-tier client/Server - -- **macOS**: Used for Apple’s personal computers and workstations (MacBook, iMac) - -- **Android**: Google’s Operating System for smartphones/tablets/smartwatches - -- **iOS**: Apple’s OS for iPhone, iPad, and iPod Touch diff --git a/docs/Operating System/memory_management.md b/docs/Operating System/memory_management.md deleted file mode 100644 index 4c1f0bb91..000000000 --- a/docs/Operating System/memory_management.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -id: memory-management -title: memory-management -sidebar_label: Memory Management -sidebar_position: 10 -tags: [operating_system, create database, commands] -description: Memory management is a crucial function of the operating system that handles or manages primary memory. ---- -# Memory Management - -## Introduction -Memory management is a crucial function of the operating system that handles or manages primary memory. It keeps track of each byte in a computer’s memory and is responsible for allocating and deallocating memory spaces as needed by various programs. - -## Key Concepts - -### 1. Memory Allocation -Memory allocation is the process of assigning blocks of memory to various programs while ensuring efficient use of memory. There are two types of memory allocation: -- **Static Allocation**: Memory is allocated at compile time. -- **Dynamic Allocation**: Memory is allocated at runtime. - -### 2. Contiguous vs Non-Contiguous Allocation -- **Contiguous Allocation**: Each process is allocated a single contiguous block of memory. -- **Non-Contiguous Allocation**: Memory is allocated in different blocks scattered throughout memory. - -### 3. Paging -Paging is a memory management scheme that eliminates the need for contiguous allocation of physical memory. It divides memory into fixed-sized pages. When a process is executed, its pages are loaded into any available memory frames. - -#### Steps in Paging: -1. **Divide the Process**: The process is divided into pages of equal size. -2. **Divide Physical Memory**: Physical memory is divided into frames of the same size as the pages. -3. **Load Pages into Frames**: Pages are loaded into available frames in physical memory. -4. **Page Table**: A page table maintains the mapping between the process's pages and physical memory frames. - -### 4. Segmentation -Segmentation divides a program into different segments such as code, data, stack, etc. Each segment can be placed in different parts of memory. This allows logical grouping of data and code, enhancing protection and sharing. - -#### Steps in Segmentation: -1. **Divide the Program**: The program is divided into logical segments. -2. **Map Segments to Memory**: Segments are mapped to different parts of physical memory. -3. **Segment Table**: A segment table maintains the mapping between the segments and physical memory addresses. - -### 5. Virtual Memory -Virtual memory allows the execution of processes that may not be completely in the physical memory. It extends the available memory on a system by using disk space to simulate additional RAM. Techniques used include paging and segmentation. - -### 6. Memory Allocation Techniques - -#### Fixed Partitioning -Memory is divided into fixed-sized partitions. Each partition can hold one process. However, this leads to inefficient memory use and internal fragmentation. - -#### Dynamic Partitioning -Memory is divided into partitions dynamically, based on the size of the process. This reduces internal fragmentation but can lead to external fragmentation. - -#### Buddy System -The buddy system is a memory allocation and management algorithm that divides memory into blocks of size 2^k. It is a compromise between fixed and dynamic partitioning. - -## Swapping -Swapping is a technique where a process can be temporarily swapped out of memory to a backing store and then brought back into memory for continued execution. This allows more processes to be executed than can fit in memory at one time. - -### Steps in Swapping: -1. **Process Suspension**: The process is suspended and its state is saved. -2. **Transfer to Backing Store**: The process is copied to the backing store (disk). -3. **Loading into Memory**: When the process is to be resumed, it is copied back into memory. - -## Fragmentation - -### Internal Fragmentation -Occurs when fixed-sized memory blocks are allocated and the memory assigned to a process is slightly larger than the memory requested. This leads to wasted space. - -### External Fragmentation -Occurs when free memory is split into small blocks and is interspersed by allocated memory. Compaction can help reduce external fragmentation. - -## Memory Management Algorithms - -### First Fit -Allocates the first block of free memory that is large enough for the process. - -### Best Fit -Allocates the smallest block of memory that is sufficient for the process. This reduces wasted space but can lead to external fragmentation. - -### Worst Fit -Allocates the largest block of free memory. This helps to reduce the chances of small unusable fragments. - -## Conclusion -Memory management is essential for the efficient operation of an operating system. By understanding various memory management techniques and algorithms, we can ensure that memory is used effectively and processes are executed smoothly. - ---- - -Memory management is a complex but crucial aspect of operating systems, ensuring optimal use of memory resources and enabling multitasking and efficient process management. diff --git a/docs/Operating System/os_development.md b/docs/Operating System/os_development.md deleted file mode 100644 index 32cc560fb..000000000 --- a/docs/Operating System/os_development.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -id: os-development -title: os-development -sidebar_label: OS Development -sidebar_position: 18 -tags: [operating_system, create database, commands] -description: Operating system (OS) development involves designing and implementing the core software that manages hardware resources and provides services for application programs. ---- -# Operating System Development - -## Introduction -Operating system (OS) development involves designing and implementing the core software that manages hardware resources and provides services for application programs. It is a complex and challenging field that requires a deep understanding of computer architecture, systems programming, and software engineering principles. - -## Key Concepts - -### 1. Kernel -The kernel is the core component of an operating system. It manages system resources, including CPU, memory, and I/O devices, and provides essential services such as process scheduling, memory management, and device management. - -### 2. Bootloader -A bootloader is a small program that initializes the hardware and loads the kernel into memory during the system startup process. Examples include GRUB (Grand Unified Bootloader) and UEFI (Unified Extensible Firmware Interface). - -### 3. System Calls -System calls are the interface between user programs and the operating system kernel. They allow programs to request services from the kernel, such as file operations, process control, and inter-process communication. - -### 4. Process Management -Process management involves creating, scheduling, and terminating processes. It ensures efficient use of the CPU and provides mechanisms for process synchronization and communication. - -### 5. Memory Management -Memory management involves allocating and deallocating memory for processes and ensuring efficient use of memory resources. It includes techniques such as paging, segmentation, and virtual memory. - -### 6. File Systems -File systems manage the storage and retrieval of data on disk. They provide a hierarchical structure for organizing files and directories and handle tasks such as file creation, deletion, reading, and writing. - -### 7. Device Drivers -Device drivers are specialized programs that enable the operating system to communicate with hardware devices. They provide a standard interface for accessing and controlling devices such as keyboards, mice, and storage devices. - -## Development Process - -### 1. Setting Up the Development Environment -- **Cross-Compiler**: A cross-compiler is required to compile code for the target architecture. GCC (GNU Compiler Collection) is commonly used. -- **Emulator**: An emulator, such as QEMU, allows you to test the OS without needing physical hardware. -- **Version Control**: Using a version control system like Git helps manage code changes and collaboration. - -### 2. Writing the Bootloader -The bootloader initializes the hardware, sets up the memory map, and loads the kernel into memory. It typically involves low-level programming in assembly language. - -### 3. Developing the Kernel -- **Kernel Initialization**: Setting up the kernel environment, including memory management structures and hardware initialization. -- **Process Management**: Implementing process creation, scheduling, and context switching. -- **Memory Management**: Setting up the virtual memory system, including page tables and memory allocation. -- **File System**: Developing the file system structure, including inode management and directory operations. -- **Device Drivers**: Writing drivers for essential hardware components, such as the keyboard, display, and disk storage. - -### 4. Implementing System Calls -System calls provide the interface for user programs to interact with the kernel. Implementing system calls involves defining the API, handling parameters, and performing the requested operations in the kernel. - -### 5. Developing User Space Programs -User space programs run outside the kernel and interact with it via system calls. Developing basic utilities, such as a shell, text editor, and file manager, is part of OS development. - -## Tools and Resources - -### 1. Development Tools -- **GCC**: A cross-compiler for building the OS. -- **QEMU**: An emulator for testing the OS. -- **GDB**: A debugger for debugging the OS. -- **Make**: A build automation tool for managing the compilation process. - -### 2. Documentation and Tutorials -- **OSDev.org**: A community-driven resource for OS development, including tutorials and documentation. -- **The Linux Kernel**: Reading and understanding the source code of the Linux kernel can provide valuable insights into OS design and implementation. -- **Books**: Recommended books include "Operating Systems: Design and Implementation" by Andrew S. Tanenbaum and "Modern Operating Systems" by Andrew S. Tanenbaum. - -### 3. Sample Projects -- **MINIX**: A small, educational operating system designed for teaching OS principles. -- **XV6**: A modern re-implementation of Unix Version 6, used in MIT's operating systems course. - -## Challenges in OS Development - -### 1. Complexity -OS development is inherently complex, requiring knowledge of computer architecture, low-level programming, and concurrent programming. - -### 2. Debugging -Debugging kernel code is challenging due to the lack of standard debugging tools and the need to work with raw hardware interfaces. - -### 3. Performance -Ensuring efficient resource utilization and low latency is critical in OS development, particularly for real-time and high-performance systems. - -### 4. Security -Implementing robust security mechanisms, such as access control, encryption, and secure communication, is essential to protect the OS from attacks. - -## Conclusion -Operating system development is a challenging but rewarding field that requires a deep understanding of computer systems and software engineering. By mastering key concepts, tools, and techniques, developers can build robust, efficient, and secure operating systems. - ---- - -Operating system development involves creating the core software that manages hardware resources and provides services for application programs. It requires a deep understanding of computer architecture, systems programming, and software engineering principles. diff --git a/docs/Operating System/process_management.md b/docs/Operating System/process_management.md deleted file mode 100644 index e9a4a070b..000000000 --- a/docs/Operating System/process_management.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -id: process-management -title: process-management -sidebar_label: Process Management -sidebar_position: 9 -tags: [operating_system, create database, commands] -description: Process management is a fundamental concept in operating systems that deals with the creation, scheduling, and termination of processes. ---- -# Process Management - -## Introduction -Process management is a fundamental concept in operating systems that deals with the creation, scheduling, and termination of processes. It ensures that the CPU is utilized efficiently and that processes are executed smoothly without conflicts. - -## Key Concepts - -### 1. Process -A process is a program in execution. It consists of the program code, current activity, and associated resources. Each process has a unique Process ID (PID). - -### 2. Process States -Processes typically go through a series of states during their lifecycle: -- **New**: The process is being created. -- **Ready**: The process is waiting to be assigned to a processor. -- **Running**: Instructions are being executed. -- **Waiting**: The process is waiting for some event to occur. -- **Terminated**: The process has finished execution. - -### 3. Process Control Block (PCB) -The PCB is a data structure used by the operating system to store all the information about a process. This includes the process state, program counter, CPU registers, memory management information, and accounting information. - -### 4. Context Switching -Context switching is the process of storing the state of a currently running process and restoring the state of the next process to be executed. It allows multiple processes to share a single CPU. - -### 5. Scheduling -Process scheduling is the activity of the process manager that handles the removal of the running process from the CPU and the selection of another process. There are different types of scheduling algorithms: -- **First-Come, First-Served (FCFS)** -- **Shortest Job Next (SJN)** -- **Priority Scheduling** -- **Round Robin (RR)** -- **Multilevel Queue Scheduling** - -## Process Creation and Termination - -### Process Creation -Processes can be created using system calls like `fork()` in Unix-based systems. A new process, called the child process, is created as a copy of the parent process. - -#### Steps in Process Creation: -1. **Forking**: The operating system creates a new process by duplicating the parent process. -2. **Execution**: The child process starts executing. It can run a different program using the `exec` system call. -3. **Address Space Allocation**: The operating system allocates memory for the new process. - -### Process Termination -A process terminates when it finishes execution or is explicitly killed. System calls like `exit()` are used for normal termination, while `kill()` can be used to terminate a process forcefully. - -#### Reasons for Process Termination: -1. **Normal Completion**: The process finishes its task. -2. **Errors**: Errors occur during execution. -3. **Resource Unavailability**: Required resources are not available. -4. **User Request**: The user requests the termination of the process. -5. **Parent Termination**: The parent process is terminated. - -## Inter-Process Communication (IPC) -IPC mechanisms allow processes to communicate and synchronize their actions. Common IPC methods include: -- **Pipes**: Unidirectional communication channels between processes. -- **Message Queues**: A linked list of messages stored within the kernel. -- **Shared Memory**: Multiple processes can access the same memory space. -- **Semaphores**: Used to control access to a common resource by multiple processes. - -### Synchronization -Synchronization is essential to ensure that processes do not interfere with each other while sharing resources. Techniques include: -- **Mutexes**: Locks that ensure mutual exclusion. -- **Condition Variables**: Used to block a process until a particular condition is met. -- **Monitors**: High-level synchronization constructs. - -## Conclusion -Process management is crucial for the efficient operation of an operating system. It ensures that processes are executed in a manner that maximizes CPU utilization and minimizes conflicts. By understanding process management, we gain insight into how operating systems handle multitasking and ensure that multiple processes can run smoothly and efficiently. - diff --git a/docs/Operating System/real_time_systems.md b/docs/Operating System/real_time_systems.md deleted file mode 100644 index bf564f65c..000000000 --- a/docs/Operating System/real_time_systems.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -id: real-time-systems -title: real-time-systems -sidebar_label: Real Time Systems -sidebar_position: 15 -tags: [operating_system, create database, commands] -description: Real-time systems are computing systems that must respond to inputs and deliver outputs within a specified time frame. ---- -# Real-Time Systems - -## Introduction -Real-time systems are computing systems that must respond to inputs and deliver outputs within a specified time frame. These systems are used in environments where timing is critical, such as embedded systems, industrial control systems, and aerospace applications. - -## Key Concepts - -### 1. Hard vs. Soft Real-Time Systems -- **Hard Real-Time Systems**: Systems where missing a deadline can lead to catastrophic consequences. Examples include airbag systems in cars and pacemakers. -- **Soft Real-Time Systems**: Systems where deadlines are important but missing them does not result in catastrophic failure, although it may degrade system performance. Examples include video streaming and online transaction processing. - -### 2. Determinism -Determinism in real-time systems refers to the predictability of system behavior. A deterministic system guarantees response within a known time limit. - -### 3. Latency -Latency is the time taken from the occurrence of an event to the start of the response. Minimizing latency is crucial in real-time systems. - -### 4. Jitter -Jitter is the variability in response time. In real-time systems, low jitter is desirable to ensure consistent performance. - -## Real-Time Operating Systems (RTOS) - -### 1. Characteristics of RTOS -- **Preemptive Multitasking**: Allows the RTOS to interrupt tasks to ensure high-priority tasks get CPU time. -- **Priority-Based Scheduling**: Tasks are assigned priorities, and the scheduler ensures that high-priority tasks are executed first. -- **Inter-task Communication**: Mechanisms such as message queues, semaphores, and events for tasks to communicate and synchronize. -- **Minimal Interrupt Latency**: Ensures that the system responds quickly to interrupts. -- **Resource Management**: Efficient management of CPU, memory, and other resources to meet timing requirements. - -### 2. Common RTOS Examples -- **FreeRTOS**: An open-source RTOS used in embedded systems. -- **VxWorks**: A commercial RTOS used in aerospace and defense applications. -- **RTEMS**: A free RTOS designed for real-time embedded systems. -- **QNX**: A commercial RTOS known for its microkernel architecture. - -## Real-Time Scheduling Algorithms - -### 1. Rate Monotonic Scheduling (RMS) -A fixed-priority algorithm where tasks with shorter periods are assigned higher priorities. It is optimal for preemptive, fixed-priority scheduling. - -### 2. Earliest Deadline First (EDF) -A dynamic scheduling algorithm where tasks closest to their deadlines are given the highest priority. It is optimal for both preemptive and non-preemptive scheduling. - -### 3. Least Laxity First (LLF) -A dynamic scheduling algorithm where tasks with the least laxity (slack time) are given the highest priority. Laxity is the difference between the time remaining until the deadline and the remaining execution time. - -### 4. Priority Inheritance Protocol -A protocol to handle priority inversion by temporarily elevating the priority of a task holding a resource that a higher-priority task needs. - -## Real-Time Communication - -### 1. Time-Triggered Protocol (TTP) -A communication protocol where messages are transmitted at predefined times. It is used in applications requiring high reliability and predictability. - -### 2. Controller Area Network (CAN) -A robust vehicle bus standard designed to allow microcontrollers and devices to communicate with each other without a host computer. - -### 3. Time-Sensitive Networking (TSN) -A set of standards for time-sensitive transmission of data over Ethernet networks. It is used in industrial automation and automotive applications. - -## Case Studies - -### 1. Automotive Systems -Modern cars use real-time systems for engine control, braking systems, and airbag deployment. These systems require precise timing and reliability to ensure safety. - -### 2. Industrial Control Systems -Real-time systems control manufacturing processes, robotics, and assembly lines. They ensure timely and synchronized operations to maintain productivity and safety. - -### 3. Aerospace Systems -Real-time systems are used in avionics for navigation, flight control, and communication systems. They require high reliability and low latency to ensure passenger safety. - -## Conclusion -Real-time systems are essential in applications where timing is critical. They require specialized operating systems and scheduling algorithms to ensure timely and predictable responses. Understanding the principles of real-time systems is crucial for designing systems that meet the stringent timing and reliability requirements of various industries. - ---- - -Real-time systems play a vital role in ensuring the correct and timely operation of critical applications. Their design and implementation require a thorough understanding of timing constraints, scheduling algorithms, and communication protocols. diff --git a/docs/Operating System/security_and_protection.md b/docs/Operating System/security_and_protection.md deleted file mode 100644 index 405a70b25..000000000 --- a/docs/Operating System/security_and_protection.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -id: security-and-protection -title: security-and-protection -sidebar_label: Security and Protection -sidebar_position: 13 -tags: [operating_system, create database, commands] -description: Security and protection are critical aspects of operating systems, ensuring that the system's resources are used as intended and protecting against unauthorized access, misuse, and harm. ---- -# Security and Protection - -## Introduction -Security and protection are critical aspects of operating systems, ensuring that the system's resources are used as intended and protecting against unauthorized access, misuse, and harm. These mechanisms are designed to safeguard data integrity, confidentiality, and availability. - -## Key Concepts - -### 1. Security vs. Protection -- **Security**: Refers to defending the system against external threats such as viruses, malware, and hackers. -- **Protection**: Refers to internal mechanisms that control access to system resources, ensuring that programs and users can access only the resources they are authorized to. - -### 2. Threats and Attacks -- **Threat**: A potential cause of an unwanted incident, which may result in harm to a system or organization. -- **Attack**: An action taken to exploit a vulnerability in the system. - -### 3. Types of Attacks -- **Passive Attacks**: Attempts to learn or make use of information from the system but do not affect system resources (e.g., eavesdropping). -- **Active Attacks**: Attempts to alter system resources or affect their operation (e.g., viruses, worms). - -## Security Measures - -### 1. Authentication -Authentication is the process of verifying the identity of a user or process. Methods include: -- **Passwords**: Secret words or phrases used to verify identity. -- **Biometrics**: Using physical characteristics like fingerprints or retina scans. -- **Two-Factor Authentication (2FA)**: Combining two different methods for higher security. - -### 2. Authorization -Authorization determines what an authenticated user or process is allowed to do. It involves setting permissions and access rights. - -### 3. Encryption -Encryption transforms readable data into an unreadable format to protect it from unauthorized access. Types include: -- **Symmetric Encryption**: The same key is used for both encryption and decryption. -- **Asymmetric Encryption**: Different keys are used for encryption and decryption (public key and private key). - -### 4. Intrusion Detection Systems (IDS) -IDS monitor network or system activities for malicious actions or policy violations. They can be: -- **Host-Based IDS (HIDS)**: Installed on individual devices to monitor local activities. -- **Network-Based IDS (NIDS)**: Monitor network traffic for suspicious activities. - -### 5. Firewalls -Firewalls control incoming and outgoing network traffic based on predetermined security rules. They can be hardware-based or software-based. - -## Protection Mechanisms - -### 1. Access Control -Access control mechanisms determine who can access what resources in the system. Models include: -- **Discretionary Access Control (DAC)**: Access rights are assigned by the owner of the resource. -- **Mandatory Access Control (MAC)**: Access rights are assigned based on fixed policies set by the administrator. -- **Role-Based Access Control (RBAC)**: Access rights are assigned based on user roles within an organization. - -### 2. Protection Domains -A protection domain defines the set of resources that a process can access. Each process operates within its own domain. - -### 3. Capability-Based Systems -Capabilities are tokens or keys that grant a process specific access rights to objects. They simplify access control by binding access rights to the object. - -### 4. Language-Based Protection -Programming languages can enforce protection by using language constructs to define access rights. For example, Java provides access control modifiers like private, protected, and public. - -## Security Policies - -### 1. Principle of Least Privilege -Users and processes should operate with the minimum set of privileges necessary to complete their tasks. This minimizes the potential damage from accidents or malicious activities. - -### 2. Defense in Depth -Multiple layers of security controls and defenses are used to protect the system. If one layer fails, others still provide protection. - -### 3. Separation of Duties -Responsibilities are divided among multiple individuals or systems to prevent fraud and errors. No single user should have control over all aspects of any critical function. - -## Conclusion -Security and protection are vital for maintaining the integrity, confidentiality, and availability of system resources. By implementing robust security measures and protection mechanisms, operating systems can defend against a wide range of threats and ensure that resources are used appropriately and securely. - ---- - -A well-secured operating system not only defends against external threats but also ensures proper usage of resources internally, maintaining the overall health and functionality of the system. diff --git a/docs/Operating System/system_calls.md b/docs/Operating System/system_calls.md deleted file mode 100644 index bd3cb1310..000000000 --- a/docs/Operating System/system_calls.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -id: system-calls -title: system-calls -sidebar_label: System calls -sidebar_position: 17 -tags: [operating_system, create database, commands] -description: System calls are the interface between a running program and the operating system. ---- -# System Calls - -## Introduction -System calls are the interface between a running program and the operating system. They allow user-level processes to request services from the kernel, such as file manipulation, process control, and communication. - -## Key Concepts - -### 1. Definition -A system call is a function that provides the programmatic interface to the services provided by the operating system. - -### 2. User Mode vs. Kernel Mode -- **User Mode**: The mode in which user applications run. Limited access to system resources. -- **Kernel Mode**: The mode in which the operating system runs. Full access to all system resources. - -### 3. System Call Interface -The system call interface acts as a boundary between user programs and the operating system kernel. It provides a set of services that programs can use to perform operations. - -## Types of System Calls - -### 1. Process Control -- **fork()**: Creates a new process by duplicating the calling process. -- **exec()**: Replaces the current process image with a new process image. -- **exit()**: Terminates the calling process. -- **wait()**: Waits for a child process to terminate. - -### 2. File Management -- **open()**: Opens a file. -- **close()**: Closes a file descriptor. -- **read()**: Reads data from a file. -- **write()**: Writes data to a file. -- **lseek()**: Repositions the read/write file offset. -- **unlink()**: Removes a directory entry. - -### 3. Device Management -- **ioctl()**: Controls device parameters. -- **read()**: Reads data from a device. -- **write()**: Writes data to a device. - -### 4. Information Maintenance -- **getpid()**: Gets the process ID. -- **alarm()**: Sets an alarm clock for delivery of a signal. -- **sleep()**: Suspends execution for an interval of time. -- **gettimeofday()**: Gets the current time. - -### 5. Communication -- **pipe()**: Creates a unidirectional data channel. -- **shmget()**: Allocates a shared memory segment. -- **shmat()**: Attaches a shared memory segment. -- **semget()**: Gets a semaphore set identifier. - -## System Call Implementation - -### 1. System Call Handler -When a system call is invoked, control is transferred to the system call handler in the kernel, which performs the requested service and returns control to the user program. - -### 2. Software Interrupt -System calls are typically implemented using software interrupts or traps. This involves an interrupt instruction that switches the CPU to kernel mode and transfers control to a predefined interrupt handler. - -### 3. Parameter Passing -Parameters for system calls can be passed in several ways: -- **Registers**: Parameters are passed via CPU registers. -- **Stack**: Parameters are pushed onto the stack. -- **Memory**: Parameters are stored in a memory block, and the address of the block is passed. - -## Examples of System Calls - -### 1. Linux -- **fork()**: Creates a new process. -- **execve()**: Executes a program. -- **mmap()**: Maps files or devices into memory. -- **kill()**: Sends a signal to a process. - -### 2. Windows -- **CreateProcess()**: Creates a new process. -- **ReadFile()**: Reads data from a file. -- **WriteFile()**: Writes data to a file. -- **CreateFile()**: Opens a file. - -## System Call Optimization - -### 1. System Call Batching -Combining multiple system calls into a single call to reduce overhead. - -### 2. Fast System Calls -Using specialized CPU instructions to reduce the overhead of switching between user mode and kernel mode. - -### 3. Asynchronous System Calls -Allowing system calls to be non-blocking, so a process can continue execution without waiting for the system call to complete. - -## Security Considerations - -### 1. Access Control -Ensuring that only authorized processes can make certain system calls. - -### 2. Input Validation -Validating parameters passed to system calls to prevent buffer overflows and other vulnerabilities. - -### 3. Privilege Escalation -Preventing unauthorized processes from gaining elevated privileges through system calls. - -## Conclusion -System calls are a critical aspect of operating system functionality, providing the necessary interface between user programs and the kernel. Understanding how system calls work and how they are implemented is essential for system programming and OS development. - ---- - -System calls are the bridge between user applications and the operating system, enabling programs to perform essential operations and interact with hardware. diff --git a/docs/Operating System/types_of_OS.md b/docs/Operating System/types_of_OS.md deleted file mode 100644 index 88bf8d0f4..000000000 --- a/docs/Operating System/types_of_OS.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -id: types-of-operating_system -title: types-of-operating_system -sidebar_label: Types of Operating System -sidebar_position: 8 -tags: [operating_system, create database, commands] -description: An Operating System performs all the basic tasks like managing files, processes, and memory. . ---- - -# Types of Operating Systems - -## Pre-Requisite: What is an Operating System? - -An Operating System performs all the basic tasks like managing files, processes, and memory. Thus operating system acts as the manager of all the resources, i.e. resource manager. Thus, the operating system becomes an interface between the user and the machine. It is one of the most required software that is present in the device. - -Operating System is a type of software that works as an interface between the system program and the hardware. There are several types of Operating Systems, many of which are mentioned below. Let’s have a look at them. - -## Types of Operating Systems - -There are several types of Operating Systems which are mentioned below. - -1. [Batch Operating System](#batch-operating-system) - -2. [Multi-Programming System](#multi-programming-operating-system) - -3. [Multi-Processing System](#multi-processing-operating-system) - -4. [Multi-Tasking Operating System](#multi-tasking-operating-system) - -5. [Time-Sharing Operating System](#time-sharing-operating-system) - -6. [Distributed Operating System](#distributed-operating-system) - -7. [Network Operating System](#network-operating-system) - -8. [Real-Time Operating System](#real-time-operating-system) - -### Batch Operating System - -This type of operating system does not interact with the computer directly. There is an operator which takes similar jobs having the same requirement and groups them into batches. It is the responsibility of the operator to sort jobs with similar needs. - - ![alt text](image-6.png) - -#### Advantages of Batch Operating System - -- Multiple users can share the batch systems. - -- The idle time for the batch system is very less. - -- It is easy to manage large work repeatedly in batch systems. - -#### Disadvantages of Batch Operating System - -- The computer operators should be well known with batch systems. - -- Batch systems are hard to debug. - -- It is sometimes costly. - -- The other jobs will have to wait for an unknown time if any job fails. - -- In batch operating system the processing time for jobs is commonly difficult to accurately predict while they are in the queue. - -- It is difficult to accurately predict the exact time required for a job to complete while it is in the queue. - -#### Examples of Batch Operating Systems - -- Payroll Systems, Bank Statements, etc. - -### Multi-Programming Operating System - -Multiprogramming Operating Systems can be simply illustrated as more than one program is present in the main memory and any one of them can be kept in execution. This is basically used for better execution of resources. - - ![alt text](image-7.png) - -#### Advantages of Multi-Programming Operating System - -- Multi Programming increases the Throughput of the System. - -- It helps in reducing the response time. - -#### Disadvantages of Multi-Programming Operating System - -- There is not any facility for user interaction of system resources with the system. - -### Multi-Processing Operating System - -Multi-Processing Operating System is a type of Operating System in which more than one CPU is used for the execution of resources. It betters the throughput of the System. - - ![alt text](image-8.png) - -#### Advantages of Multi-Processing Operating System - -- It increases the throughput of the system. - -- As it has several processors, so, if one processor fails, we can proceed with another processor. - -#### Disadvantages of Multi-Processing Operating System - -- Due to the multiple CPU, it can be more complex and somehow difficult to understand. - -### Multi-Tasking Operating System - -Multitasking Operating System is simply a multiprogramming Operating System with having facility of a Round-Robin Scheduling Algorithm. It can run multiple programs simultaneously. - - ![alt text](image-9.png) - -#### Types of Multi-Tasking Systems - -- Preemptive Multi-Tasking - -- Cooperative Multi-Tasking - -#### Advantages of Multi-Tasking Operating System - -- Multiple Programs can be executed simultaneously in Multi-Tasking Operating System. - -- It comes with proper memory management. - -#### Disadvantages of Multi-Tasking Operating System - -- The system gets heated in case of heavy programs multiple times. - -### Time-Sharing Operating System - -Each task is given some time to execute so that all the tasks work smoothly. Each user gets the time of the CPU as they use a single system. These systems are also known as Multitasking Systems. The task can be from a single user or different users also. The time that each task gets to execute is called quantum. After this time interval is over OS switches over to the next task. - - ![alt text](image-10.png) - -#### Advantages of Time-Sharing OS - -- Each task gets an equal opportunity. - -- Fewer chances of duplication of software. - -- CPU idle time can be reduced. - -- Resource Sharing: Time-sharing systems allow multiple users to share hardware resources such as the CPU, memory, and peripherals, reducing the cost of hardware and increasing efficiency. - -- Improved Productivity: Time-sharing allows users to work concurrently, thereby reducing the waiting time for their turn to use the computer. This increased productivity translates to more work getting done in less time. - -- Improved User Experience: Time-sharing provides an interactive environment that allows users to communicate with the computer in real time, providing a better user experience than batch processing. - -#### Disadvantages of Time-Sharing OS - -- Reliability problem. - -- One must have to take care of the security and integrity of user programs and data. - -- Data communication problem. - -- High Overhead: Time-sharing systems have a higher overhead than other operating systems due to the need for scheduling, context switching, and other overheads that come with supporting multiple users. - -- Complexity: Time-sharing systems are complex and require advanced software to manage multiple users simultaneously. This complexity increases the chance of bugs and errors. - -- Security Risks: With multiple users sharing resources, the risk of security breaches increases. Time-sharing systems require careful management of user access, authentication, and authorization to ensure the security of data and software. - -#### Examples of Time-Sharing OS with explanation - -- **IBM VM/CMS**: IBM VM/CMS is a time-sharing operating system that was first introduced in 1972. It is still in use today, providing a virtual machine environment that allows multiple users to run their own instances of operating systems and applications. - -- **TSO (Time Sharing Option)**: TSO is a time-sharing operating system that was first introduced in the 1960s by IBM for the IBM System/360 mainframe computer. It allowed multiple users to access the same computer simultaneously, running their own applications. - -- **Windows Terminal Services**: Windows Terminal Services is a time-sharing operating system that allows multiple users to access a Windows server remotely. Users can run their own applications and access shared resources, such as printers and network storage, in real-time. - -### Distributed Operating System - -These types of operating system is a recent advancement in the world of computer technology and are being widely accepted all over the world and, that too, at a great pace. Various autonomous interconnected computers communicate with each other using a shared communication network. Independent systems possess their own memory unit and CPU. These are referred to as loosely coupled systems or distributed systems. These systems’ processors differ in size and function. The major benefit of working with these types of the operating system is that it is always possible that one user can access the files or software which are not actually present on his system but some other system connected within this network i.e., remote access is enabled within the devices connected in that network. - - ![alt text](image-11.png) - -#### Advantages of Distributed Operating System - -- Failure of one will not affect the other network communication, as all systems are independent of each other. -- Electronic mail increases the data exchange speed. -- Since resources are being shared, computation is highly fast and durable. -- Load on host computer reduces. -- These systems are easily scalable as many systems can be easily added to the network. -- Delay in data processing reduces. - -#### Disadvantages of Distributed Operating System - -- Failure of the main network will stop the entire communication. -- To establish distributed systems the language is used not well-defined yet. -- These types of systems are not readily available as they are very expensive. Not only that the underlying software is highly complex and not understood well yet. - -#### Examples of Distributed Operating Systems - -- LOCUS, etc. - -#### Issues in Distributed OS - -- Networking causes delays in the transfer of data between nodes of a distributed system. Such delays may lead to an inconsistent view of data located in different nodes, and make it difficult to know the chronological order in which events occurred in the system. -- Control functions like scheduling, resource allocation, and deadlock detection have to be performed in several nodes to achieve computation speedup and provide reliable operation when computers or networking components fail. -- Messages exchanged by processes present in different nodes may travel over public networks and pass through computer systems that are not controlled by the distributed operating system. An intruder may exploit this feature to tamper with messages, or create fake messages to fool the authentication procedure and masquerade as a user of the system. - -### Network Operating System - -These systems run on a server and provide the capability to manage data, users, groups, security, applications, and other networking functions. These types of operating systems allow shared access to files, printers, security, applications, and other networking functions over a small private network. One more important aspect of Network Operating Systems is that all the users are well aware of the underlying configuration, of all other users within the network, their individual connections, etc. and that’s why these computers are popularly known as tightly coupled systems. - - ![alt text](image-12.png) - -#### Advantages of Network Operating System - -- Highly stable centralized servers. - -- Security concerns are handled through servers. - -- New technologies and hardware up-gradation are easily integrated into the system. - -- Server access is possible remotely from different locations and types of systems. - -#### Disadvantages of Network Operating System - -- Servers are costly. - -- User has to depend on a central location for most operations. - -- Maintenance and updates are required regularly. - -#### Examples of Network Operating Systems - -- Microsoft Windows Server 2003, Microsoft Windows Server 2008, UNIX, Linux, Mac OS X, Novell NetWare, BSD, etc. - -### Real-Time Operating System - -These types of OSs serve real-time systems diff --git a/docs/Operating System/virtualization.md b/docs/Operating System/virtualization.md deleted file mode 100644 index 826e5952d..000000000 --- a/docs/Operating System/virtualization.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -id: virtualization -title: virtualization -sidebar_label: Virtualization -sidebar_position: 16 -tags: [operating_system, create database, commands] -description: Virtualization is a technology that allows a single physical machine to run multiple virtual machines (VMs), each with its own operating system and applications. ---- -# Virtualization - -## Introduction -Virtualization is a technology that allows a single physical machine to run multiple virtual machines (VMs), each with its own operating system and applications. This abstraction layer separates the hardware from the software, enabling efficient resource utilization, isolation, and flexibility. - -## Key Concepts - -### 1. Virtual Machines (VMs) -A virtual machine is a software emulation of a physical computer. Each VM runs its own operating system and applications, behaving like an independent computer. - -### 2. Hypervisor -A hypervisor, also known as a virtual machine monitor (VMM), is software that creates and manages VMs by allocating hardware resources to them. Hypervisors can be classified into two types: -- **Type 1 (Bare-Metal Hypervisors)**: Run directly on the physical hardware. Examples include VMware ESXi, Microsoft Hyper-V, and Xen. -- **Type 2 (Hosted Hypervisors)**: Run on a host operating system that provides virtualization services. Examples include VMware Workstation and Oracle VirtualBox. - -### 3. Host and Guest -- **Host**: The physical machine on which the hypervisor runs. -- **Guest**: The virtual machines running on the hypervisor. - -## Benefits of Virtualization - -### 1. Resource Efficiency -Virtualization allows multiple VMs to share the same physical resources, leading to higher utilization of CPU, memory, and storage. - -### 2. Isolation -Each VM is isolated from others, ensuring that issues in one VM do not affect others. This isolation also enhances security. - -### 3. Flexibility and Scalability -Virtualization enables easy scaling by adding or removing VMs based on demand. It also allows for rapid provisioning and deployment of new services. - -### 4. Disaster Recovery -Virtualization simplifies backup and recovery processes. VMs can be easily backed up and restored, and they can be moved between physical machines without downtime. - -## Types of Virtualization - -### 1. Hardware Virtualization -Emulates hardware devices, allowing VMs to run different operating systems. This includes full virtualization and paravirtualization. -- **Full Virtualization**: VMs are completely isolated from the host. Examples include VMware and Hyper-V. -- **Paravirtualization**: VMs are aware of the virtualization layer, allowing for optimized performance. Examples include Xen and KVM. - -### 2. Operating System Virtualization -Enables multiple isolated user-space instances (containers) to run on a single OS kernel. Examples include Docker and LXC (Linux Containers). - -### 3. Network Virtualization -Abstracts physical network resources into multiple virtual networks, each with its own topology and policies. Examples include VLANs (Virtual Local Area Networks) and SDN (Software-Defined Networking). - -### 4. Storage Virtualization -Combines multiple physical storage devices into a single logical storage unit, providing flexible storage management. Examples include SAN (Storage Area Network) and NAS (Network-Attached Storage). - -## Virtualization Techniques - -### 1. Emulation -The hypervisor emulates the complete hardware environment for the guest OS. This allows any OS to run on any hardware but can be slow due to overhead. - -### 2. Binary Translation -The hypervisor translates sensitive instructions from the guest OS into safe instructions on the fly. This improves performance compared to emulation. - -### 3. Hardware-Assisted Virtualization -Modern CPUs provide virtualization extensions (e.g., Intel VT-x, AMD-V) that allow the hypervisor to run VMs more efficiently by executing certain instructions directly on the hardware. - -### 4. Containerization -Containers share the host OS kernel and run as isolated processes. They are lightweight and provide fast startup times compared to VMs. Examples include Docker and Kubernetes. - -## Virtualization in Cloud Computing -Virtualization is a foundational technology for cloud computing. It enables the creation of scalable, on-demand infrastructure services such as Infrastructure as a Service (IaaS) and Platform as a Service (PaaS). - -## Case Studies - -### 1. VMware vSphere -A comprehensive virtualization platform that provides powerful tools for managing and automating VMs, including vMotion for live VM migration and DRS (Distributed Resource Scheduler) for load balancing. - -### 2. Docker -A platform for developing, shipping, and running applications in containers. Docker simplifies application deployment by packaging all dependencies into a single container image. - -### 3. Amazon EC2 -A cloud computing service that provides scalable virtual servers (instances) on demand. Users can choose from various instance types optimized for different workloads. - -## Conclusion -Virtualization is a transformative technology that enhances resource utilization, provides flexibility, and simplifies management. Understanding virtualization concepts and techniques is essential for modern IT infrastructure, enabling efficient and scalable deployment of applications and services. - ---- - -Virtualization is a key enabler for cloud computing and modern data centers, offering significant benefits in terms of efficiency, scalability, and management. diff --git a/docs/Pandas/Pandas-gettingstarted.md b/docs/Pandas/Pandas-gettingstarted.md deleted file mode 100644 index ba5cb6892..000000000 --- a/docs/Pandas/Pandas-gettingstarted.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: Pandas-GettingStarted -title: Pandas Getting Started -sidebar_label: Pandas Getting Started -sidebar_position: 2 -tags: [Python-library, Pandas , Machine-learning] -description: Learn how to install and use Pandas, a powerful Python library for data manipulation and analysis. ---- - - -![pandas](image.png) - - -## Installation of Pandas - -If you already have Python and PIP installed on your system, installing Pandas is straightforward. Simply run the following command: - -``` -pip install pandas -``` - -If the command fails, consider using a Python distribution that already includes Pandas, such as Anaconda or Spyder. - -## Importing Pandas - -Once Pandas is installed, you can import it into your applications using the `import` keyword: - -```python -import pandas -``` - -Now, Pandas is imported and ready to be used. - -## Example - -Here's a simple example that demonstrates the usage of Pandas: - -```python -import pandas - -mydataset = { - 'cars': ["BMW", "Volvo", "Ford"], - 'passings': [3, 7, 2] -} - -myvar = pandas.DataFrame(mydataset) - -print(myvar) -``` - -This example creates a DataFrame using a dictionary and prints its contents. - -Pandas is a versatile library that provides powerful tools for data manipulation and analysis in Python. By learning how to install and use Pandas, you can enhance your data processing capabilities and streamline your data analysis workflows. \ No newline at end of file diff --git a/docs/Pandas/Read-files.md b/docs/Pandas/Read-files.md deleted file mode 100644 index 58722f4f5..000000000 --- a/docs/Pandas/Read-files.md +++ /dev/null @@ -1,255 +0,0 @@ ---- -id: Pandas-Readfiles -title: Pandas Read Files -sidebar_label: Pandas Read Files -sidebar_position: 6 -tags: [Python-library, Pandas ,Pandas-files, Machine-learning] -description: Read CSV files , JSON files in PANDAS. ---- - - -### Read CSV Files -A simple way to store big data sets is to use CSV files (comma separated files). - -CSV files contain plain text and are a well-known format that can be read by everyone, including Pandas. - -In our examples, we will be using a CSV file called 'data.csv'. - -Download data.csv or Open data.csv - -**Example: Get your own Python Server** - -Load the CSV into a DataFrame: - -```python -import pandas as pd - -df = pd.read_csv('data.csv') - -print(df.to_string()) -``` - -**Tip:** Use `to_string()` to print the entire DataFrame. - -If you have a large DataFrame with many rows, Pandas will only return the first 5 rows and the last 5 rows: - -**Example:** -Print the DataFrame without the `to_string()` method: - -```python -import pandas as pd - -df = pd.read_csv('data.csv') - -print(df) -``` - -### max_rows -The number of rows returned is defined in Pandas option settings. - -You can check your system's maximum rows with the `pd.options.display.max_rows` statement. - -**Example:** -Check the number of maximum returned rows: - -```python -import pandas as pd - -print(pd.options.display.max_rows) -``` - -In my system, the number is 60, which means that if the DataFrame contains more than 60 rows, the `print(df)` statement will return only the headers and the first and last 5 rows. - -You can change the maximum rows number with the same statement. - -**Example:** -Increase the maximum number of rows to display the entire DataFrame: - -```python -import pandas as pd - -pd.options.display.max_rows = 9999 - -df = pd.read_csv('data.csv') - -print(df) -``` - -## Pandas Read JSON -### Read JSON -Big data sets are often stored or extracted as JSON. - -JSON is plain text but has the format of an object and is well-known in the world of programming, including Pandas. - -In our examples, we will be using a JSON file called 'data.json'. - -Open data.json. - -**Example: Get your own Python Server** - -Load the JSON file into a DataFrame: - -```python -import pandas as pd - -df = pd.read_json('data.json') - -print(df.to_string()) -``` - -**Tip:** Use `to_string()` to print the entire DataFrame. - -### Dictionary as JSON -JSON = Python Dictionary - -JSON objects have the same format as Python dictionaries. - -If your JSON code is not in a file but in a Python Dictionary, you can load it into a DataFrame directly: - -**Example:** -Load a Python Dictionary into a DataFrame: - -```python -import pandas as pd - -data = { - "Duration":{ - "0":60, - "1":60, - "2":60, - "3":45, - "4":45, - "5":60 - }, - "Pulse":{ - "0":110, - "1":117, - "2":103, - "3":109, - "4":117, - "5":102 - }, - "Maxpulse":{ - "0":130, - "1":145, - "2":135, - "3":175, - "4":148, - "5":127 - }, - "Calories":{ - "0":409, - "1":479, - "2":340, - "3":282, - "4":406, - "5":300 - } -} - -df = pd.DataFrame(data) - -print(df) -``` - -## Pandas - Analyzing DataFrames -### Viewing the Data -One of the most used methods for getting a quick overview of the DataFrame is the `head()` method. - -The `head()` method returns the headers and a specified number of rows, starting from the top. - -**Example: Get your own Python Server** -Get a quick overview by printing the first 10 rows of the DataFrame: - -```python -import pandas as pd - -df = pd.read_csv('data.csv') - -print(df.head(10)) -``` - -In our examples, we will be using a CSV file called 'data.csv'. - -Download data.csv or open data.csv in your browser. - -**Note:** If the number of rows is not specified, the `head()` method will return the top 5 rows. - -**Example:** -Print the first 5 rows of the DataFrame: - -```python -import pandas as pd - -df = pd.read_csv('data.csv') - -print(df.head()) -``` - -There is also a `tail()` method for viewing the last rows of the DataFrame. - -The `tail()` method returns the headers and a specified number of rows, starting from the bottom. - -**Example:** -Print the last 5 rows of the DataFrame: - -```python -print(df.tail()) -``` - -**w3schools CERTIFIED.2022** -Get Certified! -Complete the Pandas modules, do the exercises, take the exam, and you will become w3schools certified! - -### Info About the Data -The DataFrame object has a method called `info()`, which gives you more information about the dataset. - -**Example:** -Print information about the data: - -```python -print(df.info()) -``` - -**Result:** - -``` - -RangeIndex: 169 entries, 0 to 168 -Data columns (total 4 columns): - # Column Non-Null Count Dtype ---- ------ -------------- ----- - 0 Duration 169 non-null int64 - 1 Pulse 169 non-null int64 - 2 Maxpulse 169 non-null int64 - 3 Calories 164 non-null float64 -dtypes: float64(1), int64(3) -memory usage: 5.4 KB -None -``` - -**Result Explained:** -The result tells us there are 169 rows and 4 columns: - -``` -RangeIndex: 169 entries, 0 to 168 -Data columns (total 4 columns): -``` - -And the name of each column, with the data type: - -``` - # Column Non-Null Count Dtype ---- ------ -------------- ----- - 0 Duration 169 non-null int64 - 1 Pulse 169 non-null int64 - 2 Maxpulse 169 non-null int64 - 3 Calories 164 non-null float64 -``` - -**Null Values:** -The `info()` method also tells us how many Non-Null values there are present in each column, and in our dataset, it seems like there are 164 out of 169 Non-Null values in the "Calories" column. - -Which means that there are 5 rows with no value at all in the "Calories" column, for whatever reason. - -Empty values or Null values can be bad when analyzing data, and you should consider removing rows with empty values. This is a step towards what is called cleaning data, and you will learn more about that in the next chapters. \ No newline at end of file diff --git a/docs/Pandas/_category_.json b/docs/Pandas/_category_.json deleted file mode 100644 index e52e486f2..000000000 --- a/docs/Pandas/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Pandas", - "position": 19, - "link": { - "type": "generated-index", - "description": "Pandas is a powerful data manipulation and analysis library for Python that provides easy-to-use data structures and data analysis tools." - } -} \ No newline at end of file diff --git a/docs/Pandas/image-1.png b/docs/Pandas/image-1.png deleted file mode 100644 index 61c32c377e894242c69fd55d6363edb3cc7ec4bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21889 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 diff --git a/docs/Pandas/image-2.png b/docs/Pandas/image-2.png deleted file mode 100644 index a752626a3b41581e62efb79c4a922d188e865647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41555 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 diff --git a/docs/Pandas/image.png b/docs/Pandas/image.png deleted file mode 100644 index dd624148f680f2e9ee5b0ca8b45fba8be3b07efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67450 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 Z^!)$+2VK)ioL^6<^gvCnQpPmk{{Si=&HDfV diff --git a/docs/Pandas/pandas-dataframe.md b/docs/Pandas/pandas-dataframe.md deleted file mode 100644 index aaef43046..000000000 --- a/docs/Pandas/pandas-dataframe.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -id: Pandas-dataframes -title: Pandas Data Frames -sidebar_label: Pandas Data Frames -sidebar_position: 4 -tags: [Python-library, Pandas , Machine-learning] -description: A Pandas DataFrame is a 2-dimensional data structure, similar to a 2-dimensional array or a table with rows and columns. ---- - - - - -### What is a DataFrame? - -A Pandas DataFrame is a 2-dimensional data structure, similar to a 2-dimensional array or a table with rows and columns. - -![pandas Data-Frames](image-2.png) - -Create a simple Pandas DataFrame: - -```python -import pandas as pd - -data = { - "calories": [420, 380, 390], - "duration": [50, 40, 45] -} - -# Load data into a DataFrame object: -df = pd.DataFrame(data) - -print(df) -``` - -Result: - -``` - calories duration -0 420 50 -1 380 40 -2 390 45 -``` - -Locate Row -As you can see from the result above, the DataFrame is like a table with rows and columns. - -Pandas uses the `loc` attribute to return one or more specified row(s). - -Example: Return row 0 - -```python -# Refer to the row index: -print(df.loc[0]) -``` - -Result: - -``` -calories 420 -duration 50 -Name: 0, dtype: int64 -``` - -Note: This example returns a Pandas Series. - -Example: Return row 0 and 1 - -```python -# Use a list of indexes: -print(df.loc[[0, 1]]) -``` - -Result: - -``` - calories duration -0 420 50 -1 380 40 -``` - -Note: When using `[]`, the result is a Pandas DataFrame. - - -Named Indexes -With the `index` argument, you can name your own indexes. - -Example: Add a list of names to give each row a name - -```python -import pandas as pd - -data = { - "calories": [420, 380, 390], - "duration": [50, 40, 45] -} - -df = pd.DataFrame(data, index = ["day1", "day2", "day3"]) - -print(df) -``` - -Result: - -``` - calories duration -day1 420 50 -day2 380 40 -day3 390 45 -``` - -Locate Named Indexes -Use the named index in the `loc` attribute to return the specified row(s). - -Example: Return "day2" - -```python -# Refer to the named index: -print(df.loc["day2"]) -``` - -Result: - -``` -calories 380 -duration 40 -Name: day2, dtype: int64 -``` - -Load Files Into a DataFrame -If your data sets are stored in a file, Pandas can load them into a DataFrame. - -Example: Load a comma-separated file (CSV file) into a DataFrame - -```python -import pandas as pd - -df = pd.read_csv('data.csv') - -print(df) -``` - diff --git a/docs/Pandas/pandas-introduction.md b/docs/Pandas/pandas-introduction.md deleted file mode 100644 index d5c0c6b5a..000000000 --- a/docs/Pandas/pandas-introduction.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -id: Pandas-Introduction -title: Pandas Introduction -sidebar_label: Pandas Introduction -sidebar_position: 1 -tags: [Python-library, Pandas , Machine-learning] -description: In this tutorial, you will learn about Pandas, a powerful Python library for data manipulation and analysis. ---- - - -Pandas is a popular Python library used for data manipulation and analysis. It provides data structures and functions to efficiently handle structured data, making it a valuable tool for data scientists and analysts. - -![pandas](image.png) - - -**Some key uses and applications of Pandas include:** - -- Data cleaning and preprocessing: Pandas offers powerful tools for cleaning and transforming data, such as handling missing values, removing duplicates, and reshaping data. -- Data exploration and analysis: With Pandas, you can easily perform various data analysis tasks, such as filtering, sorting, grouping, and aggregating data. It also supports statistical operations and time series analysis. -- Data visualization: Pandas integrates well with other libraries like Matplotlib and Seaborn, allowing you to create insightful visualizations to better understand your data. - -**Pros of using Pandas:** -- Easy data manipulation: Pandas provides a simple and intuitive API for handling data, allowing you to perform complex operations with just a few lines of code. -- Efficient performance: Pandas is built on top of NumPy, a high-performance numerical computing library. This makes Pandas fast and efficient, especially when working with large datasets. -- Wide range of functionality: Pandas offers a wide range of functions and methods for data manipulation, analysis, and visualization, making it a versatile tool for various data-related tasks. - -**Cons of using Pandas:** -- Memory usage: Pandas can consume a significant amount of memory, especially when working with large datasets. It's important to be mindful of memory usage and optimize your code accordingly. -- Steep learning curve: While Pandas provides a powerful set of tools, it can have a steep learning curve, especially for beginners. It requires understanding of concepts like data frames, indexing, and data manipulation techniques. - -**Future scope of Pandas:** -- Continual development: Pandas is an actively maintained library with a large community of contributors. It continues to evolve with new features and improvements, ensuring its relevance in the future. -- Integration with other libraries: Pandas is often used in conjunction with other libraries like scikit-learn and TensorFlow for machine learning and data analysis tasks. Its integration with these libraries will further enhance its capabilities. - -In conclusion, Pandas is a versatile Python library for data manipulation and analysis, offering a wide range of functionality. While it has some limitations, its benefits outweigh the drawbacks, making it a valuable tool for data professionals. - diff --git a/docs/Pandas/pandas-series.md b/docs/Pandas/pandas-series.md deleted file mode 100644 index c909780d5..000000000 --- a/docs/Pandas/pandas-series.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -id: Pandas-Series -title: Pandas Series -sidebar_label: Pandas Series -sidebar_position: 3 -tags: [Python-library, Pandas ,Pandas-seriees, Machine-learning] -description: Learn how to use Pandas series , a powerful Python library for data manipulation and analysis. ---- - -## What is a Series? -A Pandas Series is similar to a column in a table. It is a one-dimensional array that can hold data of any type. - - -![pandas-series](image-1.png) - - -## Example: Creating a Pandas Series -To create a simple Pandas Series from a list, you can use the following code: - -```python -import pandas as pd - -a = [1, 7, 2] - -myvar = pd.Series(a) - -print(myvar) -``` - -## Labels -By default, the values in a Pandas Series are labeled with their index numbers. The first value has index 0, the second value has index 1, and so on. You can use these labels to access specific values in the Series. - -## Example: Accessing Values by Index -To return the first value of the Series, you can use the following code: - -```python -print(myvar[0]) -``` - -## Creating Custom Labels -You can also create your own labels for the values in a Pandas Series using the `index` argument. - -## Example: Creating Custom Labels -To create your own labels for the values in a Series, you can use the following code: - -```python -import pandas as pd - -a = [1, 7, 2] - -myvar = pd.Series(a, index=["x", "y", "z"]) - -print(myvar) -``` - -## Accessing Values by Label -Once you have created custom labels for the values in a Series, you can access specific values by referring to their labels. - -## Example: Accessing Values by Label -To return the value associated with the label "y", you can use the following code: - -```python -print(myvar["y"]) -``` - -## Key/Value Objects as Series -You can also create a Pandas Series using a key/value object, such as a dictionary. - -## Example: Creating a Series from a Dictionary -To create a simple Pandas Series from a dictionary, you can use the following code: - -```python -import pandas as pd - -calories = {"day1": 420, "day2": 380, "day3": 390} - -myvar = pd.Series(calories) - -print(myvar) -``` - -Note: The keys of the dictionary become the labels in the Series. - -## Selecting Specific Items from a Dictionary -If you only want to include specific items from the dictionary in the Series, you can use the `index` argument to specify the desired items. - -## Example: Selecting Specific Items from a Dictionary -To create a Series using only the data from "day1" and "day2" in the dictionary, you can use the following code: - -```python -import pandas as pd - -calories = {"day1": 420, "day2": 380, "day3": 390} - -myvar = pd.Series(calories, index=["day1", "day2"]) - -print(myvar) -``` - -## DataFrames -In Pandas, data sets are usually represented as multi-dimensional tables called DataFrames. A Series is similar to a column, while a DataFrame represents the entire table. - -## Example: Creating a DataFrame from Series -To create a DataFrame from two Series, you can use the following code: - -```python -import pandas as pd - -data = { - "calories": [420, 380, 390], - "duration": [50, 40, 45] -} - -myvar = pd.DataFrame(data) - -print(myvar) -``` - -**You will learn more about DataFrames in the next chapter.** diff --git a/docs/Ruby/BlocksAndProcs.md b/docs/Ruby/BlocksAndProcs.md deleted file mode 100644 index 98b3ce2d0..000000000 --- a/docs/Ruby/BlocksAndProcs.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -id: ruby-blocks-and-procs -title: Blocks And Procs -sidebar_label: Blocks And Procs -sidebar_position: 5 -description: Ruby Blocks And Procs -tags: [Ruby,Introduction,oops,Blocks And Procs,programming Language] ---- - -In Ruby, blocks and Procs are fundamental constructs that allow for flexible and powerful control over the flow of execution and behavior of your code. - -### Blocks - -Blocks in Ruby are chunks of code that can be passed around like objects. They are typically enclosed within either `do..end` or `{}` and are commonly associated with methods that yield control to them. Here's a basic example: - -```ruby -# Using a block with each method -[1, 2, 3].each do |num| - puts num * 2 -end -``` - -In this example: -- `do |num| ... end` defines a block that multiplies each element of the array `[1, 2, 3]` by 2. -- `num` is the parameter passed to the block for each iteration. - -Blocks can also be defined with curly braces `{}`: -```ruby -[1, 2, 3].each { |num| puts num * 2 } -``` - -Blocks are most commonly used with iterator methods like `.each`, `.map`, `.select`, etc., allowing for concise and readable code. - -### Procs - -A Proc (short for procedure) is an object that holds a block of code and can be stored in a variable, passed to methods, and executed later. They provide a way to package blocks of code into reusable entities. - -Here's how you define and use a Proc: - -```ruby -# Define a Proc -multiply_proc = Proc.new { |x, y| x * y } - -# Call the Proc -puts multiply_proc.call(3, 4) # Outputs: 12 -``` - -In this example: -- `Proc.new { |x, y| x * y }` creates a Proc that multiplies two numbers. -- `multiply_proc.call(3, 4)` invokes the Proc with arguments `3` and `4`. - -Procs are particularly useful when you want to store a block of code for later use or when you want to pass behavior as an argument to a method. - -### Differences and Usage - -- **Blocks** are anonymous and tied directly to method invocations. They are not objects themselves but can be converted to Procs implicitly by using the `&` operator. - -- **Procs** are objects and can be manipulated like any other object in Ruby. They are useful for storing blocks of code that need to be executed multiple times or passed around as arguments. - -```ruby -# Example of passing a block as a Proc argument -def execute_operation(x, y, operation) - operation.call(x, y) -end - -puts execute_operation(5, 3, multiply_proc) # Outputs: 15 -``` \ No newline at end of file diff --git a/docs/Ruby/CommunityAndRails.md b/docs/Ruby/CommunityAndRails.md deleted file mode 100644 index 5f38e11fe..000000000 --- a/docs/Ruby/CommunityAndRails.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -id: ruby-community-and-rails -title: Community and Rails -sidebar_label: Community and Rails -sidebar_position: 9 -description: Ruby Community and Rails -tags: [Ruby,Introduction,oops,Community and Rails,programming Language] ---- - -The Ruby on Rails framework, commonly known as Rails, has a vibrant and supportive community that plays a significant role in its development, adoption, and ongoing evolution. Here’s a closer look at the community surrounding Rails and its impact: - -### Community Involvement - -1. **Open Source Collaboration**: Rails is open source, and its development relies heavily on contributions from a global community of developers. This community contributes code, identifies bugs, suggests improvements, and helps maintain the framework. - -2. **Online Forums and Communities**: There are numerous online forums, discussion boards, and communities dedicated to Ruby on Rails. Platforms like Stack Overflow, Reddit (r/rails), and various Slack channels provide spaces for developers to ask questions, share knowledge, and discuss best practices. - -3. **Conferences and Meetups**: Rails enthusiasts often gather at conferences and local meetups worldwide. These events serve as venues for networking, learning about new features, discussing challenges, and exploring the future direction of Rails. - -4. **Documentation and Tutorials**: The community actively contributes to improving documentation and creating tutorials, guides, and educational resources. This helps newcomers get started with Rails and allows experienced developers to deepen their understanding. - -### Support and Learning Resources - -1. **Gem Ecosystem**: RubyGems, the package manager for Ruby, hosts thousands of gems (libraries) that extend Rails functionality. Many of these gems are maintained by community members, enhancing Rails’ capabilities in various domains such as authentication, testing, and deployment. - -2. **Bloggers and Thought Leaders**: Influential developers and thought leaders within the Rails community regularly publish blog posts, articles, and books. These resources cover advanced topics, best practices, and updates related to Rails and its ecosystem. - -3. **Contributions to the Ruby Language**: Since Rails is built on the Ruby programming language, the Ruby community’s contributions also indirectly support Rails development. Ruby itself benefits from a dedicated community that continues to refine and expand the language’s capabilities. - -### Impact on Development Practices - -1. **Agile Development**: Rails has played a significant role in popularizing agile development practices within web development. Its emphasis on convention over configuration and the DRY (Don't Repeat Yourself) principle encourages efficient and iterative development cycles. - -2. **Industry Adoption**: Many startups, tech companies, and enterprises use Rails to build scalable and maintainable web applications. The framework’s reliability, productivity gains, and strong community support contribute to its widespread adoption. - -### Evolution and Future Directions - -The Rails community continues to evolve the framework, incorporating feedback, addressing security concerns, and adapting to changes in web development practices and technologies. Recent versions have introduced improvements in performance, support for modern JavaScript frameworks, and enhanced developer tooling. - \ No newline at end of file diff --git a/docs/Ruby/DynamicTyping.md b/docs/Ruby/DynamicTyping.md deleted file mode 100644 index 9899d809a..000000000 --- a/docs/Ruby/DynamicTyping.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: ruby-dynamic-typing -title: Dynamic Typing -sidebar_label: Dynamic Typing -sidebar_position: 3 -description: Ruby Support Dynamic Typing -tags: [Ruby,Introduction,oops,Dynamic Typing,programming Language] ---- - -Dynamic typing is a programming language feature where the type of a variable is determined at runtime rather than at compile time. In dynamically typed languages like Ruby, Python, JavaScript, and others, you do not need to explicitly declare the type of a variable when you define it. Instead, the type is inferred based on the value assigned to it at runtime. - -### Key Aspects of Dynamic Typing: - -1. **Type Inference**: Variables acquire their types dynamically based on the value assigned to them. For example, in Ruby: - ```ruby - x = 5 # x is inferred to be an integer - y = "Hello" # y is inferred to be a string - ``` - -2. **Flexibility**: Dynamic typing allows variables to hold values of different types at different points in the program's execution. This flexibility can simplify coding and prototyping. - -3. **Implicit Type Conversion**: Operations involving variables of different types may implicitly convert types to perform the operation. For example: - ```ruby - a = 5 - b = "10" - c = a + b.to_i # c will be 15 (integer), after converting "10" to integer - ``` - -4. **Runtime Checks**: Since type checking occurs at runtime, type errors (e.g., adding a string to an integer) may not be caught until the corresponding code is executed. This can lead to runtime errors if not handled properly. - -### Benefits: - -- **Conciseness**: Dynamic typing often leads to shorter and more readable code since developers do not need to explicitly declare types. - -- **Rapid Development**: It facilitates rapid prototyping and iteration, allowing developers to quickly modify and test code without strict type constraints. - -- **Flexibility**: Dynamic typing supports a wide range of programming styles and paradigms, making it suitable for various domains and use cases. - -### Considerations: - -- **Runtime Errors**: Type errors may only be caught during runtime, potentially leading to unexpected behavior if type assumptions are not carefully managed. - -- **Documentation**: Due to the lack of explicit type declarations, documentation and comments play a crucial role in conveying expected types and behavior. - -### Example in Ruby: - -In Ruby, variables are dynamically typed, as shown in the following example: - -```ruby -x = 10 # x is an integer -y = "Hello" # y is a string - -# Later in the code, we can change the type of the variable -x = "World" # Now x is a string -``` - -Dynamic typing is a fundamental characteristic of many modern scripting and interpreted languages, offering a balance of flexibility and simplicity while requiring careful management of type-related issues during development and testing. \ No newline at end of file diff --git a/docs/Ruby/GarbageCollection.md b/docs/Ruby/GarbageCollection.md deleted file mode 100644 index 728601d50..000000000 --- a/docs/Ruby/GarbageCollection.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: ruby-garbage-collection -title: Garbage Collection -sidebar_label: Garbage Collection -sidebar_position: 6 -description: Ruby Garbage Collection -tags: [Ruby,Introduction,oops,Garbage Collection,programming Language] ---- - -Garbage collection (GC) is a critical automated memory management process found in many modern programming languages, including Ruby. Its primary purpose is to automatically reclaim memory occupied by objects that are no longer in use, thereby making that memory available for future allocations. Here’s a deeper look into how garbage collection works in the context of Ruby: - -### Key Concepts: - -1. **Automatic Memory Management**: In Ruby, memory allocation and deallocation are handled automatically by the runtime environment. Developers do not need to explicitly allocate or deallocate memory as they might in lower-level languages like C or C++. - -2. **Mark-and-Sweep Algorithm**: Ruby's garbage collector uses a mark-and-sweep algorithm. Here’s a simplified breakdown of this process: - - - **Mark Phase**: The garbage collector traverses all reachable objects starting from known roots (global variables, local variables, and objects referenced directly or indirectly from these roots). Objects that are reachable are marked as live. - - - **Sweep Phase**: Once marking is complete, the garbage collector sweeps through the entire heap (memory space allocated to the Ruby program) and deallocates memory for objects that are not marked as live (i.e., objects that are no longer reachable). - -3. **Generational Garbage Collection**: Ruby also employs generational garbage collection, which is optimized for programs where the majority of objects are short-lived. It divides objects into different generations based on their age (how long they have been alive) and collects each generation with different frequencies. This approach aims to improve performance by focusing garbage collection efforts on younger, more frequently allocated objects. - -4. **Tuning and Configuration**: While Ruby’s garbage collector generally works well out of the box, it can be tuned and configured for specific performance requirements. This includes adjusting thresholds, heap sizes, and tuning parameters in Ruby implementations like MRI (Matz's Ruby Interpreter) or JRuby. - -### Benefits: - -- **Ease of Use**: Automatic garbage collection simplifies memory management for developers, reducing the likelihood of memory leaks and segmentation faults common in manual memory management languages. - -- **Improved Performance**: Effective garbage collection algorithms can enhance overall program performance by reducing the overhead associated with manual memory management. - -- **Scalability**: Garbage collection supports scalability by automatically managing memory as the program scales up in complexity and size. - -### Challenges: - -- **Performance Overhead**: Garbage collection introduces overhead in terms of CPU cycles and pause times, particularly for large heaps or applications with real-time performance requirements. - -- **Tuning Complexity**: While automatic, tuning garbage collection for specific use cases can be complex and require understanding of the underlying algorithms and implementation details. - -### Example in Ruby: - -```ruby -# Example demonstrating automatic garbage collection in Ruby -def create_objects - 1_000_000.times { |i| Object.new } # Creates a million objects -end - -# Method to demonstrate garbage collection -def demonstrate_gc - create_objects - GC.start # Manually triggers garbage collection -end - -demonstrate_gc # Objects created in create_objects are now eligible for garbage collection -``` - -In this example: -- The method `create_objects` creates a large number of objects. -- After `create_objects` finishes executing, the objects it created become eligible for garbage collection. -- Calling `GC.start` manually triggers the garbage collection process to reclaim memory occupied by objects that are no longer referenced. - \ No newline at end of file diff --git a/docs/Ruby/Introduction.md b/docs/Ruby/Introduction.md deleted file mode 100644 index 553e69bb4..000000000 --- a/docs/Ruby/Introduction.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: ruby-intro -title: Welcome to Ruby -sidebar_label: Welcome -sidebar_position: 1 -description: Everything in Ruby is an object -tags: [Ruby,Introduction,oops,programming Language] ---- - - -Ruby is a dynamic, reflective, object-oriented programming language that was designed and developed in the mid-1990s by Yukihiro Matsumoto (often referred to as "Matz"). It combines syntax inspired by Perl with Smalltalk-like object-oriented features and is known for its simplicity and readability. - -Key features of Ruby include: - -1. **Object-Oriented**: Everything in Ruby is an object, including primitive data types like integers and booleans. - -2. **Dynamic Typing**: Ruby uses dynamic typing, which means you don't have to declare the type of a variable when you create it. - -3. **Mixins and Inheritance**: Ruby supports both single and multiple inheritance, as well as mixins, which allow classes to inherit features from multiple sources. - -4. **Blocks and Procs**: Ruby has a powerful mechanism for handling code blocks, which are chunks of code that can be passed around and executed later. - -5. **Garbage Collection**: Ruby has automatic memory management through garbage collection. - -6. **Libraries and Gems**: Ruby has a rich ecosystem of libraries and frameworks, with tools like RubyGems for package management. - -7. **Metaprogramming**: Ruby allows for extensive metaprogramming, meaning you can write code that writes code. - -8. **Community and Rails**: Ruby on Rails, often simply called Rails, is a popular web application framework built on Ruby. It has a large and active community of developers. - -Ruby's syntax emphasizes readability and simplicity, aiming to make programming more enjoyable for developers. It has been used to build a wide range of applications, from web applications to system utilities. \ No newline at end of file diff --git a/docs/Ruby/LibrariesAndGems.md b/docs/Ruby/LibrariesAndGems.md deleted file mode 100644 index 495b421ed..000000000 --- a/docs/Ruby/LibrariesAndGems.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: ruby-libraries-and-gems -title: Libraries and Gems -sidebar_label: Libraries and Gems -sidebar_position: 7 -description: Ruby Libraries and Gems -tags: [Ruby,Introduction,oops,Libraries and Gems,programming Language] ---- - -In the context of Ruby and Ruby on Rails, libraries and gems play a crucial role in extending the functionality of the language and framework. Here’s a detailed overview of libraries, gems, and their significance: - -### Libraries - -**Libraries** in Ruby refer to reusable collections of code that provide specific functionalities. These can be included directly into your Ruby codebase using `require` statements. Ruby itself comes with a standard library that includes modules and classes for various tasks, such as file I/O, networking, and more. - -Examples of Ruby standard libraries include `net/http` for HTTP communication, `json` for JSON parsing and generation, `csv` for working with CSV files, and `date` for date and time manipulation. - -### Gems - -**Gems** are Ruby's package manager system and consist of prepackaged libraries or applications. They are distributed through RubyGems.org, which is the primary repository for Ruby gems. Gems simplify sharing and managing third-party code across Ruby projects. Here are key aspects of gems: - -1. **Installation**: Gems are installed using the `gem` command-line tool, which comes bundled with Ruby installations by default. For example, to install the popular Rails framework, you would use: - ``` - gem install rails - ``` - -2. **Dependencies**: Gems can depend on other gems, which are automatically installed when the main gem is installed. This dependency management simplifies handling complex libraries with multiple requirements. - -3. **Versioning**: Gems adhere to Semantic Versioning (SemVer), specifying version constraints to ensure compatibility and manage updates. Version management is crucial for maintaining stability in a project's dependencies. - -4. **Gemfile and Bundler**: In Ruby on Rails projects, dependencies are typically managed using a `Gemfile` where gems and their versions are listed. Bundler is used to install and manage these dependencies, ensuring consistent environments across development, testing, and production. - -### Usage in Ruby on Rails - -In the Ruby on Rails ecosystem, gems are extensively used to add features such as authentication, database management, testing frameworks, and more. Some widely used gems in Rails include: - -- **Devise**: A flexible authentication solution for Rails applications. -- **RSpec**: A behavior-driven development (BDD) framework for Ruby. -- **CarrierWave**: Provides file uploads for Rails applications. -- **Capistrano**: Automates deployment tasks. - -### Benefits of Gems: - -- **Rapid Development**: Gems allow developers to leverage existing solutions for common problems, speeding up development time. -- **Community Contributions**: Gems are contributed by a large community of developers, ensuring continuous updates, bug fixes, and improvements. -- **Modularity**: Using gems promotes a modular architecture, where functionality can be added or removed easily as project requirements evolve. -- **Testing and Security**: Popular gems are often well-tested and audited for security vulnerabilities, providing a reliable foundation for application development. - -### Considerations: - -- **Dependency Management**: Careful attention must be paid to gem versions and dependencies to avoid conflicts and ensure compatibility across different environments. -- **Maintenance**: Regularly updating gems is important to benefit from new features, bug fixes, and security patches. - \ No newline at end of file diff --git a/docs/Ruby/Metaprogramming.md b/docs/Ruby/Metaprogramming.md deleted file mode 100644 index fc4deb23e..000000000 --- a/docs/Ruby/Metaprogramming.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: ruby-metaprogramming -title: Metaprogramming -sidebar_label: Metaprogramming -sidebar_position: 8 -description: Ruby Metaprogramming -tags: [Ruby,Introduction,oops,Metaprogramming,programming Language] ---- - -Metaprogramming is a powerful technique in programming languages like Ruby that allows programs to treat code as data. This means you can write programs that generate or modify other programs (including themselves) at runtime. Ruby, in particular, provides robust support for metaprogramming, which can lead to more flexible and expressive codebases when used judiciously. Here’s an in-depth look at metaprogramming in Ruby: - -### Key Concepts in Metaprogramming - -1. **Reflection**: Ruby provides reflection capabilities that allow programs to examine and modify their own structure, such as classes, methods, and variables, at runtime. This is done using methods like `class`, `methods`, `instance_variables`, and `send`. - -2. **Dynamic Method Definition**: Ruby allows methods to be defined dynamically at runtime using constructs like `define_method`, `class_eval`, and `instance_eval`. This enables classes to be extended or modified based on conditions or input data. - -3. **Open Classes and Monkey Patching**: Ruby allows classes to be reopened and modified, even after they have been defined. This technique, known as monkey patching, allows developers to add or modify methods in existing classes or modules at runtime. - -4. **Code Generation**: Metaprogramming can be used to generate code dynamically based on templates, configuration data, or other inputs. This can reduce redundancy and improve maintainability by generating repetitive code automatically. - -### Practical Uses of Metaprogramming in Ruby - -1. **DSLs (Domain-Specific Languages)**: Metaprogramming is frequently used to create internal or external DSLs in Ruby. DSLs allow developers to write domain-specific code that closely matches the problem domain, improving readability and expressiveness. - -2. **Rails ActiveRecord**: Ruby on Rails utilizes metaprogramming extensively, especially in ActiveRecord, the ORM (Object-Relational Mapping) framework. For instance, ActiveRecord dynamically creates methods like `find_by_column_name`, `where`, and `scope` based on model definitions. - -3. **Configuration and Initialization**: Metaprogramming can be used to configure and initialize applications dynamically based on configuration files, environment variables, or database settings. - -4. **Aspect-Oriented Programming (AOP)**: Metaprogramming can implement cross-cutting concerns such as logging, caching, and security checks by dynamically injecting behavior into existing methods. - -### Benefits of Metaprogramming - -- **Reduced Code Duplication**: Metaprogramming allows developers to abstract common patterns and behaviors into reusable components, reducing the amount of boilerplate code. - -- **Improved Expressiveness**: By defining methods and behaviors dynamically, code can be more concise and expressive, reflecting the intent of the program more clearly. - -- **Flexibility**: Metaprogramming enables programs to adapt to changing requirements or conditions at runtime, enhancing flexibility and agility in development. - -### Considerations and Best Practices - -- **Complexity**: Metaprogramming can make code harder to understand and debug if not used judiciously. Clear documentation and comments are crucial when employing metaprogramming techniques. - -- **Performance**: Dynamically generated code may incur overhead compared to statically defined code. Careful consideration should be given to performance implications, especially in performance-critical sections of code. - -- **Maintainability**: While metaprogramming can reduce redundancy, excessive use can lead to code that is difficult to maintain and refactor. It’s essential to strike a balance between flexibility and maintainability. - \ No newline at end of file diff --git a/docs/Ruby/MixinsAndINheritance.md b/docs/Ruby/MixinsAndINheritance.md deleted file mode 100644 index da1ce4e53..000000000 --- a/docs/Ruby/MixinsAndINheritance.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -id: ruby-mixins-and-inheritance -title: Mixins and Inheritance -sidebar_label: Mixins and Inheritance -sidebar_position: 4 -description: Mixins and Inheritance -tags: [Ruby,Introduction,oops,Mixins & Inheritance,programming Language] ---- - -Mixins and inheritance are both fundamental concepts in object-oriented programming (OOP), particularly in languages like Ruby. They provide mechanisms for code reuse and organizing classes hierarchically. Here’s a detailed comparison of mixins and inheritance in Ruby: - -### Inheritance - -**Inheritance** is a mechanism where a class (subclass or derived class) inherits attributes and behaviors (methods) from another class (superclass or base class). In Ruby, classes can inherit from one superclass only, following a single inheritance model. - -**Example:** -```ruby -class Animal - def speak - "Animal speaks" - end -end - -class Dog < Animal - def speak - "Woof!" - end -end - -dog = Dog.new -puts dog.speak # Outputs: "Woof!" -``` - -- **Usage**: Inheritance is used when a subclass is a specialized version of its superclass, sharing and extending its behavior. Subclasses can override methods inherited from the superclass to provide specialized implementations (`speak` method in the example). - -- **Relationship**: Inheritance establishes an "is-a" relationship between classes. For example, a `Dog` is a kind of `Animal`. - -- **Hierarchical Structure**: Inheritance creates a hierarchical structure among classes, where subclasses inherit attributes and methods from their superclass. - -### Mixins - -**Mixins** are a way of sharing behavior between classes in a more flexible manner than inheritance. They allow classes to include methods from modules, enabling multiple inheritance of behavior. In Ruby, a class can include multiple mixins using the `include` keyword. - -**Example:** -```ruby -module Swimmable - def swim - "Swimming!" - end -end - -class Animal - # No swim method here -end - -class Fish < Animal - include Swimmable -end - -fish = Fish.new -puts fish.swim # Outputs: "Swimming!" -``` - -- **Usage**: Mixins are used to add functionality to classes that may not share a hierarchical relationship but need similar behavior (`swim` method in the example). - -- **Flexibility**: Mixins provide a flexible way to share and reuse code across different classes without creating a rigid class hierarchy. - -- **Composition over Inheritance**: Mixins promote composition over inheritance, allowing classes to be composed of behaviors from multiple sources (modules). - -### Comparison - -- **Code Reuse**: Both mixins and inheritance facilitate code reuse, but mixins are often preferred when classes need to share behavior across different hierarchies. - -- **Method Overriding**: Inheritance allows subclasses to override methods inherited from a superclass. Mixins can also provide default implementations that can be overridden by including classes. - -- **Relationship**: Inheritance establishes a direct relationship between classes based on specialization (`is-a` relationship). Mixins provide a way to add capabilities (`has-a` relationship) to classes without imposing a strict hierarchy. - -- **Multiple Inclusion**: Mixins allow classes to include multiple modules, while inheritance limits a class to a single superclass. - -### When to Use Each - -- **Inheritance** is suitable when there is a clear "is-a" relationship between classes, and subclass specialization is straightforward and hierarchical. - -- **Mixins** are suitable when classes need to share behavior that doesn't fit into a strict hierarchical structure, or when multiple classes need to share the same set of methods from a module. - -In Ruby, both mixins and inheritance are powerful tools for structuring and organizing code. Choosing between them depends on the specific requirements of the application and the nature of the relationships between classes. \ No newline at end of file diff --git a/docs/Ruby/ObjectOriented.md b/docs/Ruby/ObjectOriented.md deleted file mode 100644 index 9a8fdef9c..000000000 --- a/docs/Ruby/ObjectOriented.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -id: ruby-object-oriented -title: Object Oriented -sidebar_label: Object Oriented -sidebar_position: 2 -description: Everything in Ruby is an object -tags: [Ruby,Introduction,oops,programming Language] ---- - -Object-oriented programming (OOP) is a programming paradigm that organizes software design around objects and data rather than actions and logic. It focuses on creating reusable patterns of code, encapsulating data and behavior into objects, and using inheritance and polymorphism to reuse and extend existing code. Here are the core principles and concepts of object-oriented programming, with examples from Ruby: - -### Core Principles of OOP - -1. **Encapsulation**: Encapsulation is the bundling of data (attributes) and methods (functions) that operate on the data into a single unit called an object. It allows objects to control their state and hide implementation details from the outside world. - - **Example in Ruby**: - ```ruby - class Person - attr_accessor :name, :age - - def initialize(name, age) - @name = name - @age = age - end - - def greet - "Hello, my name is #{@name} and I am #{@age} years old." - end - end - - person = Person.new("Alice", 30) - puts person.greet # Outputs: "Hello, my name is Alice and I am 30 years old." - ``` - -2. **Inheritance**: Inheritance allows one class (subclass) to inherit the properties and behaviors (methods) of another class (superclass). It supports code reuse and establishes a hierarchical relationship between classes. - - **Example in Ruby**: - ```ruby - class Animal - def speak - "Animal speaks" - end - end - - class Dog < Animal - def speak - "Woof!" - end - end - - dog = Dog.new - puts dog.speak # Outputs: "Woof!" - ``` - -3. **Polymorphism**: Polymorphism allows objects of different classes to be treated as objects of a common superclass. It enables flexibility in method implementation through method overriding and method overloading (in languages that support it). - - **Example in Ruby**: - ```ruby - class Animal - def speak - raise NotImplementedError, "Subclasses must implement this method" - end - end - - class Dog < Animal - def speak - "Woof!" - end - end - - class Cat < Animal - def speak - "Meow!" - end - end - - animals = [Dog.new, Cat.new] - animals.each do |animal| - puts animal.speak - end - # Outputs: "Woof!" - # "Meow!" - ``` - -4. **Abstraction**: Abstraction focuses on the essential qualities of an object, hiding unnecessary details while exposing essential features. It simplifies complex systems by modeling classes appropriate to the problem domain. - - **Example in Ruby**: - ```ruby - class Car - def initialize(make, model) - @make = make - @model = model - end - - def drive - "Driving #{@make} #{@model}" - end - end - - car = Car.new("Toyota", "Camry") - puts car.drive # Outputs: "Driving Toyota Camry" - ``` - -5. **Association**: Objects often interact with each other to perform tasks beyond their own capabilities. Associations define how objects are connected and interact within a system, such as one-to-one, one-to-many, or many-to-many relationships. - - **Example in Ruby**: - ```ruby - class Author - attr_accessor :name - - def initialize(name) - @name = name - end - end - - class Book - attr_accessor :title, :author - - def initialize(title, author) - @title = title - @author = author - end - end - - author = Author.new("J.K. Rowling") - book = Book.new("Harry Potter", author) - puts "#{book.title} by #{book.author.name}" # Outputs: "Harry Potter by J.K. Rowling" - ``` - -### Benefits of OOP - -- **Modularity**: OOP promotes modular design, making it easier to understand, maintain, and modify code. - -- **Code Reusability**: Objects and classes can be reused in different contexts or applications, reducing redundancy and improving productivity. - -- **Flexibility and Scalability**: OOP allows programs to scale by adding new features or modifying existing ones without affecting the entire codebase. - -- **Enhanced Security**: Encapsulation limits access to data, preventing unintended modifications and ensuring data integrity. - \ No newline at end of file diff --git a/docs/Ruby/_category_.json b/docs/Ruby/_category_.json deleted file mode 100644 index 3595db864..000000000 --- a/docs/Ruby/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Ruby", - "position": 20, - "link": { - "type": "generated-index", - "description": "Ruby is a dynamic, reflective, object-oriented programming language that was designed and developed in the mid-1990s by Yukihiro Matsumoto (often referred to as `Matz`)." - } - } \ No newline at end of file diff --git a/docs/SQL/01-intro-to-dbms-sql.md b/docs/SQL/01-intro-to-dbms-sql.md deleted file mode 100644 index b1ed364f5..000000000 --- a/docs/SQL/01-intro-to-dbms-sql.md +++ /dev/null @@ -1,215 +0,0 @@ -# Introduction to dbms & sql - -## Agenda - -- What is a Database -- What, What Not, Why, How of Scaler SQL Curriculum -- Types of Databases -- Intro to Relational Databases -- Intro to Keys - -## What is a Database - -Okay, tell me, In your day to day life whenever you have a need to save some information, where do you save it? Especially when you may need to refer to it later, maybe something like your expenses for the month, or your todo or shopping list? - -Correct! Many of us use softwares like Excel, Google Sheets, Notion, Notes app etc to keep a track of things that are important for us and we may need to refer to it in future. Everyone, be it humans or organizations, have need to store a lot of data that me useful for them later. Example, let's think about Scaler. At Scaler, we would want to keep track of all of your's attendance, assignments solved, codes written, coins, mentor session etc! We would also need to store details about instructors, mentors, TAs, batches, etc. And not to forget all of your's email, phone number, password. Now, where will we do this? - -For now, forget that you know anything about databases. Imagine yourself to be a new programmer who just knows how to write code in a programming language. Where will you store data so that you are able to retrieve it later and process that? - -Correct! You will store it in files. You will write code to read data from files, and write data to files. And you will write code to process that data. For example you may create separate CSV (comma separated values, you will understand as we proceed) files to store information about let's say students, instructors, batches. Eg: - -``` -students.csv -name, batch, psp, attendance, coins, rank -Naman, 1, 94, 100, 0, 1 -Amit, 2, 81, 70, 400, 1 -Aditya, 1, 31, 100, 100, 2 -``` - -```instructors.csv -name, subjects, average_rating -Rachit, C++, 4.5 -Rishabh, Java, 4.8 -Aayush, C++, 4.9 -``` - -```batches.csv -id, name, start_date, end_date -1, AUG 22 Intermediate, 2022-08-01, 2023-08-01 -2, AUG 22 Beginner, 2022-08-01, 2023-08-01 -``` - -Now, let's say you want to find out the average attendance of students in each batch. How will you do that? You will have to write code to read data from students.csv, and batches.csv, and then process it to find out the average attendance of students in each batch. Right? Do you think this will be very cumbersome? - -### Issues with Files as a Database - -1. Inefficient - -While the above set of data is very small in size, let's think of actual Scaler scale. We have 2M+ users in our system. Imagine going through a file with 2M lines, reading each line, processing it to find your relevant information. Even a very simple task like finding the psp of a student named Naman will require you to open the file, read each line, check if the name is Naman, and then return the psp. Time complexity wise, this is O(N) and very slow. - -2. Integrity - -Is there anyone stopping you from putting a new line in `students.csv` as ```Naman, 1, Hello, 100, 0, 1``` . If you see that `Hello` that is unexpected. The psp can't be a string. But there is no one to validate and this can lead to very bad situations. This is known as data integrity issue, where the data is not as expected. - -3. Concurrency - -Later in the course, you will learn about multi-threading and multi-processing. It is possible for more than 1 people to query about the same data at the same time. Similarly, 2 people may update the same data at the same time. On save, whose version should you save? Imagine you give same Google Doc to 2 people and both make changes on the same line and send to you. Whose version will you consider to be correct? This is known as concurrency issue. - -4. Security - -Earlier we talked about storing password of users. Imagine them being stored on files. Anyone who has access to the file can see the password of all users. Also anyone who has access to the file can update it as well. THere is no authorization at user level. Eg: a particular person may be only allowed to read, not write. ' - -### What's a Database - -Now let's get back to our main topic. What is a database? A database is nothing but a collection of related data. Example, Scaler will have a Database that stores information about our students, users, batches, classes, instructors, and everything else. Similarly, Facebook will have a database that stores information about all of it's users, their posts, comments, likes, etc. The above way of storing data into files was also nothing but a database, though not the easiest one to use and with a lot of issues. - -### What's a Database Management System (DBMS) - -A DBMS as the name suggests is a software system that allows to efficiently manage a database. A DBMS allows us to create, retrieve, update, and delete data (often also called CRUD operations). It also allows to define rules to ensure data integrity, security, and concurrency. It also provides ways to query the data in the database efficiently. Eg: find all students with psp > 50, find all students in batch 1, find all students with rank 1 in their batch, etc. There are many database management systems, each with their tradeoffs. We will talk about the types of databases later today. - -Now let me talk about how the curriculum is structured. We will be having 11 live classes, followed by a contest. In the live classes we are going to cover everything that is important for you for interviews as well as day to day job. Having said that, as I mentioned that Databases are avery vast field, attached with every live class you will be able to see a set of recorded videos curated for you for extra learning you can gain. Those videos will mostly be around theoretical concepts behind databases that are not much asked in interviews much nor used at day to day job, but good to know. Sometimes these videos will be on solving extra problems for a particular SQL Topic. You can go through those videos if you want to gain deeper understanding but aren't mandatory to solve assignments or clear contest. - -| S.No | Lecture Title | -| --- | --- | -| 1 | Introduction to Databases and SQL | -| 2 | CRUD | -| 3 | CRUD-2 and Joins | -| 4 | Joins - 2 | -| 5 | Aggregate and Subqueries | -| 6 | Indexes | -| 7 | Transactions | -| 8 | Schema Design - 1 | -| 9 | Schema Design - 2 | -| 10 | Views and Window Functions | -| CONTEST | - | - -I hope this excites you for your learning journey in this module and I wish you are able to make the most out of it. - -## Types of Databases - -Welcome back after the break. Hope you had a good rest and had some water, etc. Now let's start with the next topic for the day and discuss different types of databases that exist. Okay, tell me one thing, when you have to store some data, eg let's say you are an instructor at Scaler and want to keep a track of attendance and psp of every student of you, in what form will you store that? - - -Correct! Often one of the easiest and most intuitive way to store data can be in forms of tables. Example for the mentioned use case, I may create a table with 3 columns: name, attendance, psp and fill values for each of my students there. This is very intuitive and simple and is also how relational databases work. - -### Relational Databases - -Relational Databases allow you to represent a database as a collection of multiple related tables. Each table has a set of columns and rows. Each row represents a record and each column represents a field. Example, in the above case, I may have a table with 3 columns: name, attendance, psp and fill values for each of my students there. Let's learn some properties of relational databases. - -1. Relational Databases represent a database as a collection of tables with each table storing information about something. This something can be an entity or a relationship between entities. Example: I may have a table called students to store information about students of my batch (an entity). Similarly I may have a table called student_batches to store information about which student is in which batch (a relationship betwen entities). -2. Every row is unique. This means that in a table, no 2 rows can have same values for all columns. Example: In the students table, no 2 students can have same name, attendance and psp. There will be something different for example we might also want to store their roll number to distingusih 2 students having the same name. -3. All of the values present in a column hold the same data type. Example: In the students table, the name column will have string values, attendance column will have integer values and psp column will have float values. It cannot happen that for some students psp is a String. -4. Values are atomic. What does atomic mean? What does the word `atom` mean to you? - -Correct. Similarly, atomic means indivisible. So, in a relational database, every value in a column is indivisible. Example: If we have to store multiple phone numbers for a student, we cannot store them in a single column as a list. How to store those, we will learn in the end of the course when we do Schema Design. Having said that, there are some SQL databases that allow you to store list of values in a column. But that is not a part of SQL standard and is not supported by all databases. Even those that support, aren't most optimal with queries on such columns. - -5. The columns sequence is not guaranteed. This is very important. SQL standard doesn't guarantee that the columns will be stored in the same sequence as you define them. So, if you have a table with 3 columns: name, attendance, psp, it is not guaranteed that the data will be stored in the same sequence. So it is recommended to not rely on the sequence of columns and always use column names while writing queries. While MySQL guaranteees that the order of columns shall be same as defined at time of creating table, it is not a part of SQL standard and hence not guaranteed by all databases and relying on order can cause issues if in future a new column is added in between. - -6. The rows sequence is not guaranteed. Similar to columns, SQL doesn't guarantee the order in which rows shall be returned after any query. So, if you want to get rows in a particular order, you should always use `ORDER BY` clause in your query which we will learn about in the next class. So when you write an SQL query, don't assume that the first row will always be the same. The order of rows may change across multiple runs of same query. Having said that, MySQL does return rows in order of their primary key (we will learn about this later today), but again, don't rely on that as not guaranteed by SQL standard. - -7. The name of every column is unique. This means that in a table, no 2 columns can have same name. Example: In the students table, I cannot have 2 columns with name `name`. This is because if I have to write a query to get the name of a student, I will have to write `SELECT name FROM students`. Now if there are 2 columns with name `name`, how will the database know which one to return? Hence, the name of every column is unique. - - -### Non-Relational Databases - -Now that we have learnt about relational databases, let's talk about non-relational databases. Non-relational databases are those databases that don't follow the relational model. They don't store data in form of tables. Instead, they store data in form of documents, key-value pairs, graphs, etc. In the DBMS module, we will not be talking about them. We will talk about them in the HLD Module. - -In the DBMS module, our goal is to cover the working of relational databases and how to work with them, that is via SQL queries. - -## Keys in Relational Databases - -Now we are moving to probably the most important foundational concept of Relational Databases: Keys. let's say you are working at Scaler and are maintaining a table of every students' details. Someone tells you to update the psp of Naman to 100. How will you do that? What can go wrong? - -What if there are 2 Namans? - -Correct. If there are 2 Namans, how will you know which one to update? This is where keys come into picture. Keys are used to uniquely identify a row in a table. There are 2 important types of keys: Primary Key and Foreign Key. There are also other types of keys like Super Key, Candidate Key etc. Let's learn about them one by one. - -### Super Keys - -To understand this, let's take an example of a students table at scaler with following columns. - -| name | psp | email | batch | phone number | -| - | - |- | - | - | -|Naman | 1 | 94 | 100 | 0 | 1 | -|Amit | 2 | 81 | 70 | 400 | 1 | -|Aditya| 1| 31| 100| 100| 2 | - -Which are the columns that can be used to uniquely identify a row in this table? - -Let's start with name. How many of you think name can be used to uniquely identify a row in this table? - -Correct. Name is not a good idea to recognize a row. Why? Because there can be multiple students with same name. So, if we have to update the psp of a student, we cannot use name to uniquely identify the student. Email, phone number on the other hand are a great idea, assuming no 2 students have same email, or same phone number. - -Do you think the value of combination of columns (name, email) can uniquely identify a student? Do you think there will be only 1 student with a particular combination of name and email. Eg: will there be only 1 student like (Naman, naman@scaler.com)? - -Correct, similarly do you think (name, phone number) can uniquely identify a student? What about (name, email, phone number)? What about (name, email, psp)? What about (email, psp)? - -The answer to each of the above is Yes. Each of these can be considered a `Super Key`. A super key is a combination of columns whose values can uniquely identify a row in a table. What do you think are other such super keys in the students table? - -In the above keys, did you ever feel something like "but this column was useless to uniquely identify a row.." ? Let's take example of (name, email, psp). Do you think psp is required to uniquely identify a row? Similarly, do you think name is required as you anyways have email right? - -Now let's remove the columns that weren't necessary. - -Also, let's say we were an offline school, and students don't have email or phone number. In that case what do you think schools use to uniquely identify a student? Eg: If we remove redundant columns from (name, email, psp), we will be left with (email). Similarly, if we remove redundant columns from (name, email, phone number), we will be left with (phone number) or (email). These are known as `candidate keys`. A candidate key is a super key from which no column can be removed and still have the property of uniquely identifying a row. If any more column is removed from a candidate key, it will no longer be able to uniquely identify a row. Let's take another example. Consider a table Scaler has for storing students's attendance for every class - -| student_id | class_id | attendance | - -What do you think are the candidate keys for this table? Do you think (student_id) is a candidate key? Will there be only 1 row with a particular student_id? - -Is (class_id) a candidate key? Will there be only 1 row with a particular class_id? - -Is (student_id, class_id) a candidate key? Will there be only 1 row with a particular combination of student_id and class_id? - -Yes! (student_id, class_id) is a candidate key. If we remove any of the columns of this, the remanining part is not a candidate key. Eg: If we remove student_id, we will be left with (class_id). But there can be multiple rows with same class_id. Similarly, if we remove class_id, we will be left with (student_id). But there can be multiple rows with same student_id. Hence, (student_id, class_id) is a candidate key. - -Is (student_id, class_id, attendance) a candidate key? Will there be only 1 row with a particular combination of student_id, class_id and attendance? - -But can we remove any column from this and still have a candidate key? Eg: If we remove attendance, we will be left with (student_id, class_id). This is a candidate key. Hence, (student_id, class_id, attendance) is not a candidate key. - -### Primary Key - -We just learnt about super keys and candidate keys. Can 1 table have mulitiple candidate keys? Yes. The table earlier had both (email), (phone number) as candidate keys. A key in MySQL plays a very important role. Example, MySQL orders the data in disk by the key. Similarly, by default, it returns answers to queries ordered by key. Thus, it is important that there is only 1 key. And that is called `primary key`. A primary key is a candidate key that is chosen to be the key for the table. In the students table, we can choose (email) or (phone number) as the primary key. Let's choose (email) as the primary key. - -Sometimes, we may have to or want to create a new column to be the primary key. Eg: If we have a students table with columns (name, email, phone number), we may have to create a new column called roll number or studentId to be the primary key. This may be because let's say a user can change their email or phone number. Something that is used to uniquely identify a row should ideally never change. Hence, we create a new column called roll number or studentId to be the primary key. - -We will see later today on how MySQL allows to create primary keys etc. Before we go to foreign keys and composite keys, let's actually get our hands dirt with SQL. - -### Foreign Keys - -Now let's get to the last topic of the day. Which is foreign keys. Let's say we have a table called batches which stores information about batchesat Scaler. It has columns (id, name, startDate, endDate). We would want to know for every student, which batch do they belong to. How can we do that? - -Correct, We can add batchId column in students table. But how do we know which batch a student belongs to? How do we ensure that the batchId we are storing in the students table is a valid batchId? What if someone puts the value in batchID column as 4 but there is no batch with id 4 in batches table. We can set such kind of constraints using foreign keys. A foreign key is a column in a table that references a column in another table. It has nothing to do with primary, candidate, super keys. It can be any column in 1 table that refers to any column in other table. In our case, batchId is a foreign key in the students table that references the id column in the batches table. This ensures that the batchId we are storing in the students table is a valid batchId. If we try to insert any value in the batchID column of students table that isn't present in id column of batches table, it will fail. ANother example: - -Let's say we have `years` table as: -`| id | year | number_of_days |` - -and we have a table students as: -`| id | name | year |` - -Is `year` column in students table a foreign key? - -The correct answer is yes. It is a foreign key that references the id column in years table. Again, foreign key has nothing to do with primary key, candidate key etc. It is just any column on one side that references another column on other side. Though often it doesn't make sense to have that and you just keep primary key of the other table as the foreign key. If not a primary key, it should be a column with unique constraint. Else, there will be ambiguities. - -Okay, now let's think of what can go wrong with foreign keys? - -Correct, let's say we have students and batches tables as follows: - -| batch_id | batch_name | -|----------|------------| -| 1 | Batch A | -| 2 | Batch B | -| 3 | Batch C | - - -| student_id | first_name | last_name | batch_id | -|------------|------------|-----------|----------| -| 1 | John | Doe | 1 | -| 2 | Jane | Doe | 1 | -| 3 | Jim | Brown | 2 | -| 4 | Jenny | Smith | 3 | -| 5 | Jack | Johnson | 2 | - -Now let's say we delete the row with batch_id 2 from batches table. What will happen? Yes, the students Jim and Jack will be orphaned. They will be in the students table but there will be no batch with id 2. This is called orphaning. This is one of the problems with foreign keys. Another problem is that if we update the batch_id of a batch in batches table, it will not be updated in students table. Eg: If we update the batch_id of Batch A from 1 to 4, the students John and Jane will still have batch_id as 1. This is called inconsistency. - -To fix for these, MySQL allows you to set ON DELETE constraints so that cascading deletes happen when such a delete happens. Implementation details will be discussed in the next set of classes. - diff --git a/docs/SQL/02-crud-operations.md b/docs/SQL/02-crud-operations.md deleted file mode 100644 index bfce51daa..000000000 --- a/docs/SQL/02-crud-operations.md +++ /dev/null @@ -1,389 +0,0 @@ -# Crud - -## What is CRUD? - -Hello Everyone -Today we are going to start the journey of learning MySQL queries by learning about CRUD Operations. Okay tell me one thing. Let's say there is a table in which we are storing information about students. What all can we do in that table or its entries? - -Correct. Primarily, on any entity stored in a table, there are 4 operations possible: - -1. Create (or inserting a new entry) -2. Read (fetching some entries) -3. Update (updating information about an entry already stored) -4. Delete (deleting an entry) - -Today we are going to discuss about these operations in detail. Understand that read queries can get a lot more complex, involving aggregate functions, subqueries etc, which we shall talk about in detail in later classes. So don't worry about that. Take today's class as an introduction to the world of MySQL queries. - -We will be starting with learning about Create, then go to Read, then Update and finally Delete. So let's get started. For today's class as well as most of the classes ahead, we will be using Sakila database, which is an official sample database provided by MySQL. I hope you have downloaded and set that up on your machine already, following instructions shared in the earlier classes. - -## Sakila Database Walkthrough - -Let me give you all a brief idea about what Sakila database represents so that it is easy to relate to the conversations that we shall have around this over the coming weeks. Sakila database represents a digital video rental store, assume an old movie rental store before Netflix etc came. It's designed with functionality that would allow for all the operations of such a business, including transactions like renting films, managing inventory, and storing customer and staff information. Example: it has tables regarding films, actors, customers, staff, stores, payments etc. You shall get more familiar with this in the coming classes, don't worry! - -## Create - -### CREATE Query - -First of all, what is SQL? SQL stands for Structured Query Language. It is a language used to interact with relational databases. It allows you to create tables, fetch data from them, update data, manage user permissions etc. Today we will just focus on creation of data. Remaining things will be covered over the coming classes. Why "Structured Query" bceause it allows to query over data arranged in a structured way. Eg: In Relational databases, data is structured into tables. - -A simple query to create a table in MySQL has: - - column names - - data type of column (integer, varchar, boolean, date, timestamp) - - properties of column (unique, not null, default) - -Similarily, the table could also have properties (primary key, key) - -```sql -CREATE TABLE students ( - id INT AUTO_INCREMENT, - firstName VARCHAR(50) NOT NULL, - lastName VARCHAR(50) NOT NULL, - email VARCHAR(100) UNIQUE NOT NULL, - dateOfBirth DATE NOT NULL, - enrollmentDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - psp DECIMAL(3, 2) CHECK (psp BETWEEN 0.00 AND 100.00), - batchId INT, - isActive BOOLEAN DEFAULT TRUE, - PRIMARY KEY (id), -); -``` - -Here we are creating a table called students. Inside brackets, we mention the different columns that this table has. Alongwith each columns, we mention the data type of that column. Eg: firstName is of type VARCHAR(50). Please do watch the video on SQL Data Types attached to today's class to understand what VARCHAR, TIMESTAMP etc means. For our today's discussion, it suffices to know that these are different data types supported by MySQL. After the data type, we mention any constraints on that column. Eg: NOT NULL means that this column cannot be null. In tomorrow's class when we will learn how to insert data, if we try to not put a value of this column, we will get an error. UNIQUE means that this column cannot have duplicate values. If we insert a new row in a table, or update an existing row that leads to 2 rows having same value of this column, the query will fail and we will get an error. DEFAULT specifies that if no value is provided for this column, it will take the given value. Example, for enrollmentDate, it will take the value of current_timestamp, which the time when you are inserting the row. CHECK (psp BETWEEN 0.00 AND 100.00) means that the value of this column should be between 0.00 and 100.00. If some other value is put, the query will fail. - - -### INSERT Query - -Now let's start with the first set of operation for the day: The Create Operation. As the name suggests, this operation is used to create new entries in a table. Let's say we want to add a new film to the database. How do we do that? - -`INSERT` statement in MySQL is used to insert new entries in a table. Let's see how we can use it to insert a new film in the `film` table of Sakila database. - -```sql -INSERT INTO film (title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features) -VALUES ('The Dark Knight', 'Batman fights the Joker', 2008, 1, 3, 4.99, 152, 19.99, 'PG-13', 'Trailers'), - ('The Dark Knight Rises', 'Batman fights Bane', 2012, 1, 3, 4.99, 165, 19.99, 'PG-13', 'Trailers'), - ('The Dark Knight Returns', 'Batman fights Superman', 2016, 1, 3, 4.99, 152, 19.99, 'PG-13', 'Trailers'); -``` - -Let's dive through the syntax of the query. First we have the `INSERT INTO` clause, which is used to specify the table in which we want to insert the new entry. Then we have the column names in the brackets, which are the columns in which we want to insert the values. Then we have the `VALUES` clause, which is used to specify the values that we want to insert in the columns. The values are specified in the same order as the columns are specified in the `INSERT INTO` clause. So the first value in the `VALUES` clause will be inserted in the first column specified in the `INSERT INTO` clause, and so on. - -A few things to note here: - -1. The column names is optional. If you don't specify the column names, then the values will be inserted in the columns in the order in which they were defined at the time of creating the table. Example: in the above query, if we don't specify the column names, then the values will be inserted in the order `film_id`, `title`, `description`, `release_year`, `language_id`, `original_language_id`, `rental_duration`, `rental_rate`, `length`, `replacement_cost`, `rating`, `special_features`, `last_update`. So the value `The Dark Knight` will be inserted in the `film_id` column, `Batman fights the Joker` will be inserted in the `title` column and so on. - - This is not a good practice, as it makes the query prone to errors. So always specify the column names. - - This makes writing queries tedious as while writing query you have to keep a track of what column was where. And even a small miss can lead to a big error. - - Also, if you don't specify the column names, then you have to specify values for all the columns. If you don't want to specify values for all the columns, then you have to specify the column names. Example: if you don't specify column names, then you have to specify values for all the columns, including `film_id`, `original_language_id` and `last_update`, which we may want to keep `NULL`. - -Anyways, an example of a query without column names is as follows: - -```sql -INSERT INTO film -VALUES (default, 'The Dark Knight', 'Batman fights the Joker', 2008, 1, NULL, 3, 4.99, 152, 19.99, 'PG-13', 'Trailers', default); -``` - -NULL is used to specify that the value of that column should be `NULL`, and `default` is used to specify that the value of that column should be the default value specified for that column. Example: `film_id` is an auto-increment column, so we don't need to specify its value. So we can specify `default` for that column, which will insert the next auto-increment value in that column. - -So that's pretty much all that's there about Create operations. There is 1 more thing about insert, which is how to insert data from one table to another, but we will talk about that after talking about read. Any doubts till now? Via thumbs up/ down can you all let me know how many of you are 100% clear till here? - -So seems like all doubts are clear. Before I start with read operations, let me have 2 small Quiz questions for you. - -## Read - -Now let's get to the most interest, and also maybe most important part of today's session: Read operations. . `SELECT` statement is used to read data from a table. Let's see how we can use it to read data via different queries on the `film` table of Sakila database. A basic select query is as follows: - -```sql -SELECT * FROM film; -``` - -Here we are selecting all the columns from the `film` table. The `*` is used to select all the columns. This query will give you the value of each column in each row of the film table. If we want to select only specific columns, then we can specify the column names instead of `*`. Example: - -```sql -SELECT title, description, release_year FROM film; -``` - -Here we are selecting only the `title`, `description` and `release_year` columns from the `film` table. Note that the column names are separated by commas. Also, the column names are case-insensitive, so `title` and `TITLE` are the same. Example following query would have also given the same result: - -```sql -SELECT TITLE, DESCRIPTION, RELEASE_YEAR FROM film; -``` - -Now, let's learn some nuances around the `SELECT` statement. - -### Selecting Distinct Values - -Let's say we want to select all the distinct values of the `rating` column from the `film` table. How do we do that? We can use the `DISTINCT` keyword to select distinct values. Example: - -```sql -SELECT DISTINCT rating FROM film; -``` - -This query will give you all the distinct values of the `rating` column from the `film` table. Note that the `DISTINCT` keyword, as all other keywords in MySQL, is case-insensitive, so `DISTINCT` and `distinct` are the same. - -We can also use the `DISTINCT` keyword with multiple columns. Example: - -```sql -SELECT DISTINCT rating, release_year FROM film; -``` - -This query will give you all the distinct values of the `rating` and `release_year` columns from the `film` table. Let's talk about how this works. A lot of SQL queries can be easily understood by relating them to basic for loops etc. Over this class, and the coming classes, I will relate every complex query with a corresponding pseudo code has you tried to do the same in a programming language. As all of you have already solved many DSA problems, this shall be much more easy and fun for you to learn. BTW: At the end, I will also share a final diagram that relates an SQL query to a corresponding pseudo code, with select, aggregate, group by, having, order by, limit, join, subquery, etc. - -So, let's try to understand the above query with a pseudo code. The pseudo code for the above query would be as follows: - -```python -answer = [] - -for each row in film: - answer.append(row) - -filtered_answer = [] - -for each row in answer: - filtered_answer.append(row['rating'], row['release_year']) - -unique_answer = set(filtered_answer) - -return unique_answer -``` - -So what you see is that DISTINCT keyword on multiple column gives you for all of the rows in the table, the distinct value of pair of these columns. - -### Select statement to print a constant value - -Let's say we want to print a constant value in the output. Eg: The first program that almost every programmer writes: "Hello World". How do we do that? We can use the `SELECT` statement to print a constant value. Example: - -```sql -SELECT 'Hello World'; -``` - -That's it. No from, nothing. Just the value. You can also combine it with other columns. Example: - -```sql -SELECT title, 'Hello World' FROM film; -``` - -### Operations on Columns - -Let's say we want to select the `title` and `length` columns from the `film` table. If you see, the value of length is currently in minutes, but we want to select the length in hours instead of minutes. How do we do that? We can use the `SELECT` statement to perform operations on columns. Example: - -```sql -SELECT title, length/60 FROM film; -``` - -Later in the course we will learn about Built In functions in SQL as well. You can use those functions as well to perform operations on columns. Example: - -```sql -SELECT title, ROUND(length/60) FROM film; -``` - -ROUND function is used to round off a number to the nearest integer. So the above query will give you the title of the film, and the length of the film in hours, rounded off to the nearest integer. - -### Inserting Data from Another Table - -BTW, select can also be used to insert data in a table. Let's say we want to insert all the films from the `film` table into the `film_copy` table. We can combine the `SELECT` and `INSERT INTO` statements to do that. Example: - -```sql -INSERT INTO film_copy (title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features) -SELECT title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features -FROM film; -``` - -Here we are using the `SELECT` statement to select all the columns from the `film` table, and then using the `INSERT INTO` statement to insert the selected data into the `film_copy` table. Note that the column names in the `INSERT INTO` clause and the `SELECT` clause are the same, and the values are inserted in the same order as the columns are specified in the `INSERT INTO` clause. So the first value in the `SELECT` clause will be inserted in the first column specified in the `INSERT INTO` clause, and so on. - -Okay, let's take a pause to answer any doubts anyone may be having till now. For those who are absolutely clear can you please do a thumbs up in the chat. If any doubt, can you please do a thumbs down and post the doubt in chat. - -Okay, let me also verify how well you have learnt till now with a few quiz questions. - -Till now, we have been doing basic read operations. SELECT query with only FROM clause is rarely sufficient. Rarely do we want to return all rows. Often we need to have some kind of filtering logic etc. for the rows that should be returned. Let's learn how to do that. - -### WHERE Clause - -Let's say we want to select all the films from the `film` table which have a rating of `PG-13`. How do we do that? We can use the `WHERE` clause to filter rows based on a condition. Example: - -```sql -SELECT * FROM film WHERE rating = 'PG-13'; -``` - -Here we are using the `WHERE` clause to filter rows based on the condition that the value of the `rating` column should be `PG-13`. Note that the `WHERE` clause is always used after the `FROM` clause. In terms of pseudocode, you can think of where clause to work as follows: - -```python -answer = [] - -for each row in film: - if row.matches(conditions in where clause) # new line from above - answer.append(row) - -filtered_answer = [] - -for each row in answer: - filtered_answer.append(row['rating'], row['release_year']) - -unique_answer = set(filtered_answer) # assuming we also had DISTINCT - -return unique_answer -``` - -If you seem where clause can be considered analgous to `if` in a programming language. With if as well there are many other operators that are used, right. Can you name which operators do we often use in programming languages with `if`? - -> NOTE: Wait for students to give answer. Give hints to get AND, OR, NOT from them. - -### AND, OR, NOT - -Correct. We use things like `and` , `or`, `!` in programming languages to combine multiple conditions. Similarly, we can use `AND`, `OR`, `NOT` operators in SQL as well. Example: We want to get all the films from the `film` table which have a rating of `PG-13` and a release year of `2006`. We can use the `AND` operator to combine multiple conditions. - -```sql -SELECT * FROM film WHERE rating = 'PG-13' AND release_year = 2006; -``` - -Similarly, we can use the `OR` operator to combine multiple conditions. Example: We want to get all the films from the `film` table which have a rating of `PG-13` or a release year of `2006`. We can use the `OR` operator to combine multiple conditions. - -```sql -SELECT * FROM film WHERE rating = 'PG-13' OR release_year = 2006; -``` - -Similarly, we can use the `NOT` operator to negate a condition. Example: We want to get all the films from the `film` table which do not have a rating of `PG-13`. We can use the `NOT` operator to negate the condition. - -```sql -SELECT * FROM film WHERE NOT rating = 'PG-13'; -``` - -An advice on using these operators. If you are using multiple operators, it is always a good idea to use parentheses to make your query more readable. Else, it can be difficult to understand the order in which the operators will be evaluated. Example: - -```sql -SELECT * FROM film WHERE rating = 'PG-13' OR release_year = 2006 AND rental_rate = 0.99; -``` - -Here, it is not clear whether the `AND` operator will be evaluated first or the `OR` operator. To make it clear, we can use parentheses. Example: - -```sql -SELECT * FROM film WHERE rating = 'PG-13' OR (release_year = 2006 AND rental_rate = 0.99); -``` - -Till now, we have used only `=` for doing comparisons. Like traditional programming languages, MySQL also supports other comparison operators like `>`, `<`, `>=`, `<=`, `!=` etc. Just one special case, `!=` can also be written as `<>` in MySQL. Example: - -```sql -SELECT * FROM film WHERE rating <> 'PG-13'; -``` - -### IN Operator - -With comparison operators, we can only compare a column with a single value. What if we want to compare a column with multiple values? For example, we want to get all the films from the `film` table which have a rating of `PG-13` or `R`. One way to do that can be to combine multiple consitions using `OR`. A better way will be to use the `IN` operator to compare a column with multiple values. Example: - -```sql -SELECT * FROM film WHERE rating IN ('PG-13', 'R'); -``` - -Okay, now let's say we want to get those films that have ratings anything oter than the above 2. Any guesses how we may do that? - -Correct! We had earlier discussed about `NOT`. You can also use `NOT` before `IN` to negate the condition. Example: - -```sql -SELECT * FROM film WHERE rating NOT IN ('PG-13', 'R'); -``` - -Think of IN to be like any other operator. Just that it allows comparison with multiple values. - -Hope you had a good break. Let's continue with the session. In this second part of the session, we are going to start the discussion by discussing about another important keyword in SQL, `BETWEEN`. - -### IS NULL Operator - -Now we are almost at the end of the discussion about different operators. Do you all remember how we store emptiess, that is, no value for a particular column for a particular row? We store it as `NULL`. Interestingly working with NULLs is a bit tricky. We cannot use the `=` operator to compare a column with `NULL`. Example: - -```sql -SELECT * FROM film WHERE description = NULL; -``` - -The above query will not return any rows. Why? Because `NULL` is not equal to `NULL`. Infact, `NULL` is not equal to anything. Nor is it not equal to anything. It is just `NULL`. - -Example: - -```sql -SELECT NULL = NULL; -``` - -The above query will return `NULL`. Similarly, `3 = NULL` , `3 <> NULL` , `NULL <> NULL` will also return `NULL`. So, how do we compare a column with `NULL`? We use the `IS NULL` operator. Example: - -```sql -SELECT * FROM film WHERE description IS NULL; -``` - -Similarly, we can use the `IS NOT NULL` operator to find all the rows where a particular column is not `NULL`. Example: - -```sql -SELECT * FROM film WHERE description IS NOT NULL; -``` - -In many assignments, you will find that you will have to use the `IS NULL` and `IS NOT NULL` operators. Without them you will miss out on rows that had NULL values in them and get the wrong answer. Example: -find customers with id other than 2. If you use `=` operator, you will miss out on the customer with id `NULL`. Example: - -```sql -SELECT * FROM customers WHERE id != 2; -``` - -The above query will not return the customer with id `NULL`. So, you will get the wrong answer. Instead, you should use the `IS NOT NULL` operator. Example: - -```sql -SELECT * FROM customers WHERE id IS NOT NULL AND id != 2; -``` - -## Update - -Now let's move to learn U of CRUD. Update and Delete are thankfully much simple, so don't worry, we will be able to breeze through it over the coming 20 mins. As the name suggests, this is used to update rows in a table. The general syntax is as follows: - -```sql -UPDATE table_name SET column_name = value WHERE conditions; -``` - -Example: - -```sql -UPDATE film SET release_year = 2006 WHERE id = 1; -``` - -The above query will update the `release_year` column of the row with `id` 1 in the `film` table to 2006. You can also update multiple columns at once. Example: - -```sql -UPDATE film SET release_year = 2006, rating = 'PG' WHERE id = 1; -``` - -Let's talk about how update works. It works as follows: - -```python -for each row in film: - if row.matches(conditions in where clause) - row['release_year'] = 2006 - row['rating'] = 'PG' -``` - -So basically update query iterates through all the rows in the table and updates the rows that match the conditions in the where clause. So, if you have a table with 1000 rows and you run an update query without a where clause, then all the 1000 rows will be updated. So, be careful while running update queries. Example: - -```sql -UPDATE film SET release_year = 2006; -``` - -## Delete - -Finally, we are at the end of CRUD. Let's talk about Delete operations. The general syntax is as follows: - -```sql -DELETE FROM table_name WHERE conditions; -``` - -Example: - -```sql -DELETE FROM film WHERE id = 1; -``` - -The above query will delete the row with `id` 1 from the `film` table. If you don't specify a where clause, then all the rows from the table will be deleted. Example: - -```sql -DELETE FROM film; -``` - -Let's talk about how delete works as well in terms of code. - -```python -for each row in film: - if row.matches(conditions in where clause) - delete row -``` - diff --git a/docs/SQL/03-crud2.md b/docs/SQL/03-crud2.md deleted file mode 100644 index af7b94910..000000000 --- a/docs/SQL/03-crud2.md +++ /dev/null @@ -1,352 +0,0 @@ -# Crud pt-2 - -### Agenda - - Delete - - Delete vs truncate vs drop - - Limit - - Count - - Order By - - Join - - -### Delete - -```sql -DELETE FROM table_name WHERE conditions; -``` - -Example: - -```sql -DELETE FROM film WHERE id = 1; -``` - -The above query will delete the row with `id` 1 from the `film` table. - -Beware, If you don't specify a where clause, then all the rows from the table will be deleted. Example: - -```sql -DELETE FROM film; -``` - -Let's talk about how delete works as well in terms of code. - -```python -for each row in film: - if row.matches(conditions in where clause) - delete row -``` - -There is a minor advance thing about DELETE which we shall talk about along with Joins in the next class. So, don't worry about it for now. - -### Delete vs Truncate vs Drop - -There are two more commands which are used to delete rows from a table. They are `TRUNCATE` and `DROP`. Let's discuss them one by one. - -#### Truncate - -The command looks as follows: - -```sql -TRUNCATE film; -``` - -The above query will delete all the rows from the `film` table. TRUNCATE command internally works by removing the complete table and then recreating it. So, it is much faster than DELETE. But it has a disadvantage. It cannot be rolled back. We will learn more about rollbacks in the class on Transactions (In short, rollbacks can only happen for incomplete transactions - not committed yet - to be discussed in future classes). But at a high level, this is because as the complete table is deleted as an intermediate step, no log is maintained as to what all rows were deleted, and thus is not easy to revert. So, if you run a TRUNCATE query, then you cannot undo it. - ->Note: It also resets the primary key ID. For example, if the highest ID in the table before truncating was 10, then the next row inserted after truncating will have an ID of 1. - -#### Drop - -The command looks as follows: - -Example: - -```sql -DROP TABLE film; -``` - -The above query will delete the `film` table. The difference between `DELETE` and `DROP` is that `DELETE` is used to delete rows from a table and `DROP` is used to delete the entire table. So, if you run a `DROP` query, then the entire table will be deleted. All the rows and the table structure will be deleted. So, be careful while running a `DROP` query. Nothing will be left of the table after running a `DROP` query. You will have to recreate the table from scratch. - -Note that, -DELETE: -1. Removes specified rows one-by-one from table (may delete all rows if no condition is present in query but keeps table structure intact). -2. It is slower than TRUNCATE. -3. Doesn't reset the key. -4. It can be rolled back. - -TRUNCATE: -1. Removes the complete table and then recreats it. -2. Faster than DELETE. -3. Resets the key. -4. It can not be rolled back because the complete table is deleted as an intermediate step. - -DROP: -1. Removes complete table and the table structre as well. -2. It can not be rolled back. - -Rollback to be discussed in transactions class. Note that there is no undo in SQL queries once the query is completely committed. - - -### LIKE Operator - -LIKE operator is one of the most important and frequently used operator in SQL. Whenever there is a column storing strings, there comes a requirement to do some kind of pattern matching. Example, assume Scaler's database where we have a `batches` table with a column called `name`. Let's say we want to get the list of `Academy` batches and the rule is that an Academy batch shall have `Academy` somewhere within the name. How do we find those? We can use the `LIKE` operator for this purpose. Example: - -```sql -SELECT * FROM batches WHERE name LIKE '%Academy%'; -``` - -Similarly, let's say in our Sakila database, we want to get all the films which have `LOVE` in their title. We can use the `LIKE` operator. Example: - -```sql -SELECT * FROM film WHERE title LIKE '%LOVE%'; -``` - -Let's talk about how the `LIKE` operator works. The `LIKE` operator works with the help of 2 wildcards in our queries, `%` and `_`. The `%` wildcard matches any number of characters (>= 0 occurrences of any set of characters). The `_` wildcard matches exactly one character (any character). Example: - -1. LIKE 'cat%' will match "cat", "caterpillar", "category", etc. but not "wildcat" or "dog". -2. LIKE '%cat' will match "cat", "wildcat", "domesticcat", etc. but not "cattle" or "dog". -3. LIKE '%cat%' will match "cat", "wildcat", "cattle", "domesticcat", "caterpillar", "category", etc. but not "dog" or "bat". -4. LIKE '_at' will match "cat", "bat", "hat", etc. but not "wildcat" or "domesticcat". -5. LIKE 'c_t' will match "cat", "cot", "cut", etc. but not "chat" or "domesticcat". -6. LIKE 'c%t' will match "cat", "chart", "connect", "cult", etc. but not "wildcat", "domesticcat", "caterpillar", "category". - - -### COUNT - -Count function takes the values from a particular column and returns the number of values in that set. Umm, but don't you think it will be exactly same as the number of rows in the table? Nope. Not true. Aggregate functions only take not null values into account. So, if there are any null values in the column, they will not be counted. - -Example: Let's take a students table with data like follows: - -| id | name | age | batch_id | -|----|------|-----|----------| -| 1 | A | 20 | 1 | -| 2 | B | 21 | 1 | -| 3 | C | 22 | null | -| 4 | D | 23 | 2 | - -If you will try to run COUNT and give it the values in batch_id column, it will return 3. Because there are 3 not null values in the column. This is different from number of rows in the students table. - -Let's see how do you use this operation in SQL. - -```sql -SELECT COUNT(batch_id) FROM students; -``` - -To understand how aggregate functions work via a pseudocode, let's see how SQL query optimizer may execute them. - -```python -table = [] - -count = 0 - -for row in table: - if row[batch_id] is not null: - count += 1 - -print(count) -``` - -Few things to note here: -While printing, do we have access to the values of row? Nope. We only have access to the count variable. So, we can only print the count. Extrapolating this point, when you use aggregate functions, you can only print the result of the aggregate function. You cannot print the values of the rows. - -Eg: - -```sql -SELECT COUNT(batch_id), batch_id FROM students; -``` - -This will be an invalid query. Because, you are trying to print the values of `batch_id` column as well as the count of `batch_id` column. But, you can only print the count of `batch_id` column. - -### LIMIT Clause - -And now let's discuss the last clause for the day. LIMIT clause allows us to limit the number of rows returned by a query. Example: - -```sql -SELECT * FROM film LIMIT 10; -``` - -The above query will return only 10 rows from the `film` table. If you want to return 10 rows starting from the 11th row, you can use the `OFFSET` keyword. Example: - -```sql -SELECT * FROM film LIMIT 10 OFFSET 10; -``` - -The above query will return 10 rows starting from the 11th row from the `film` table. -Note that in MySQL, you cannot use the `OFFSET` keyword without the `LIMIT` keyword. Example: - -```sql -SELECT * FROM film OFFSET 10; -``` - -throws an error. - -LIMIT clause is applied at the end. Just before printing the results. Taking the example of pseudocode, it works as follows: - -```python -answer = [] - -for each row in film: - if row.matches(conditions in where clause) # new line from above - answer.append(row) - -answer.sort(column_names in order by clause) - -filtered_answer = [] - -for each row in answer: - filtered_answer.append(row['rating'], row['release_year']) - -return filtered_answer[start_of_limit: end_of_limit] -``` - -Thus, if your query contains ORDER BY clause, then LIMIT clause will be applied after the ORDER BY clause. Example: - -```sql -SELECT * FROM film ORDER BY title LIMIT 10; -``` - -The above query will return 10 rows from the `film` table in ascending order of the `title` column. - - -### ORDER BY Clause - -Now let's discuss another important clause. ORDER BY clause allows to return values in a sorted order. Example: - -```sql -SELECT * FROM film ORDER BY title; -``` - -The above query will return all the rows from the `film` table in ascending order of the `title` column. If you want to return the rows in descending order, you can use the `DESC` keyword. Example: - -```sql -SELECT * FROM film ORDER BY title DESC; -``` - -You can also sort by multiple columns. Example: - -```sql -SELECT * FROM film ORDER BY title, release_year; -``` - -The above query will return all the rows from the `film` table in ascending order of the `title` column and then in ascending order of the `release_year` column. Consider the second column as tie breaker. If 2 rows have same value of title, release year will be used to break tie between them. Example: - -```sql -SELECT * FROM film ORDER BY title DESC, release_year DESC; -``` - -Above query will return all the rows from the `film` table in descending order of the `title` column and if tie on `title`, in descending order of the `release_year` column. - -By the way, you can ORDER BY on a column which is not present in the SELECT clause. Example: - -```sql -SELECT title FROM film ORDER BY release_year; -``` - -Let's also build the analogy of this with a pseudocode. - -```python -answer = [] - -for each row in film: - if row.matches(conditions in where clause) # new line from above - answer.append(row) - -answer.sort(column_names in order by clause) - -filtered_answer = [] - -for each row in answer: - filtered_answer.append(row['rating'], row['release_year']) - -return filtered_answer -``` - -If you see, the `ORDER BY` clause is applied after the `WHERE` clause. So, first the rows are filtered based on the `WHERE` clause and then they are sorted based on the `ORDER BY` clause. And only after that are the columns that have to be printed taken out. And that's why you can sort based on columns not even in the `SELECT` clause. - -#### ORDER BY Clause with DISTINCT keyword - -If you also have DISTINCT in the SELECT clause, then you can only sort by columns that are present in the SELECT clause. Example: - -```sql -SELECT DISTINCT title FROM film ORDER BY release_year; -``` - -The above query will give an error. You can only sort by `title` column. Example: - -```sql -SELECT DISTINCT title FROM film ORDER BY title; -``` - -Why this? Because without this the results can be ambiguous. Example: - -```sql -SELECT DISTINCT title FROM film ORDER BY release_year; -``` - -The above query will return all the distinct titles from the `film` table. But which `release_year` should be used to sort them? There can be multiple `release_year` for a particular `title`. So, the results will be ambiguous. - -### Joins - -Every SQL query we had written till now was only finding data from 1 table. Most of the queries we had written in the previous classes were on the `film` table where we applied multiple filters etc. But do you think being able to query data from a single table is enough? Let's take a scenario of Scaler. Let's say we have 2 tables as follows in the Scaler's database: - -`batches` - -| batch_id | batch_name | -|----------|------------| -| 1 | Batch A | -| 2 | Batch B | -| 3 | Batch C | - -`students` - -| student_id | first_name | last_name | batch_id | -|------------|------------|-----------|----------| -| 1 | John | Doe | 1 | -| 2 | Jane | Doe | 1 | -| 3 | Jim | Brown | 2 | -| 4 | Jenny | Smith | 3 | -| 5 | Jack | Johnson | 2 | - -Suppose, someone asks you to print the name of every student, along with the name of their batch. The output should be something like: - -| student_name | batch_name | -|--------------|------------| -| John | Batch A | -| Jane | Batch A | -| Jim | Batch B | -| Jenny | Batch C | -| Jack | Batch B | - -Will you be able to get all of this data by querying over a single table? No. The `student_name` is there in the students table, while the `batch_name` is in the batches table! We somehow need a way to combine the data from both the tables. This is where joins come in. What does the word `join` mean to you? - -Joins, as the name suggests, are a way to combine data from multiple tables. For example, if I want to combine the data from the `students` and `batches` table, I can use joins for that. Think of joins as a way to stitch rows of 2 tables together, based on the condition you specify. Example: In our case, we would want to stitch a row of students table with a row of batches table based on what? Imagine that every row of `students` I try to match with every row of `batches`. Based on what condition to be true between those will I stitch them? - -We would want to stitch a row of students table with a row of batches table based on the `batch_id` column. This is what we call a `join condition`. A join condition is a condition that must be true between the rows of 2 tables for them to be stitched together. Let's see how we can write a join query for our example. - -```sql -SELECT students.first_name, batches.batch_name -FROM students -JOIN batches -ON students.batch_id = batches.batch_id; -``` - -Let's break down this query. The first line is the same as what we have been writing till now. We are selecting the `first_name` column from the `students` table and the `batch_name` column from the `batches` table. The next line is where the magic happens. We are using the `JOIN` keyword to tell SQL that we want to join the `students` table with the `batches` table. The next line is the join condition. We are saying that we want to join the rows of `students` table with the rows of `batches` table where the `batch_id` column of `students` table is equal to the `batch_id` column of `batches` table. This is how we write a join query. - -Let's take an example of this on the Sakila database. Let's say for every film, we want to print its name and the language. How can we do that? - -```sql -SELECT film.title, language.name -FROM film -JOIN language -ON film.language_id = language.language_id; -``` - -Now, sometimes typing name of tables in the query can become difficult. For example, in the above query, we have to type `film` and `language` multiple times. To make this easier, we can give aliases to the tables. For example, we can give the alias `f` to the `film` table and `l` to the `language` table. We can then use these aliases in our query. Let's see how we can do that: - -```sql -SELECT f.title, l.name -FROM film AS f -JOIN language AS l -ON f.language_id = l.language_id; -``` - diff --git a/docs/SQL/04-joins-2.md b/docs/SQL/04-joins-2.md deleted file mode 100644 index f95881c52..000000000 --- a/docs/SQL/04-joins-2.md +++ /dev/null @@ -1,354 +0,0 @@ -# Joins pt-2 - -## Agenda - - - Self Join - - More problems on Joins - - Inner vs Outer joins - - WHERE vs ON - - Union and Union All - - -## Self Join - -Let's say at Scaler, for every student we assign a Buddy. For this we have a `students` table, which looks as follows: - -`id | name | buddy_id` - -This `buddy_id` will be an id of what? - -Correct. Now, let's say we have to print for every student, their name and their buddy's name. How will we do that? Here 2 rows of which tables would we want to stitch together to get this data? - -Correct, an SQL query for the same shall look like: - -```sql -SELECT s1.name, s2.name -FROM students s1 -JOIN students s2 -ON s1.buddy_id = s2.id; -``` - -This is an example of SELF join. A self join is a join where we are joining a table with itself. In the above query, we are joining the `students` table with itself. In a self joining, aliasing tables is very important. If we don't alias the tables, then SQL will not know which row of the table to match with which row of the same table (because both of them have same names as they are the same table only). - -### SQL query as pseudocode - -As we have been doing since the CRUD class, let's also see how Joins can be represented in terms of pseudocode. - -Let's take this query: - -```sql -SELECT s1.name, s2.name -FROM students s1 -JOIN students s2 -ON s1.buddy_id = s2.id; -``` - -In pseudocode, it shall look like: - -```python3 -ans = [] - -for row1 in students: - for row2 in students: - if row1.buddy_id == row2.id: - ans.add(row1 + row2) - -for row in ans: - print(row.name, row.name) -``` - -## More problems on JOIN - -### Joining multiple tables - -Till now, we had only joined 2 tables. But what if we want to join more than 2 tables? Let's say we want to print the name of every film, along with the name of the language and the name of the original language. How can we do that? If you have to add 3 numbers, how do you do that? - -To get the name of the language, we would first want to combine film and language table over the `language_id` column. Then, we would want to combine the result of that with the language table again over the `original_language_id` column. This is how we can do that: - -```sql -SELECT f.title, l1.name, l2.name -FROM film f -JOIN language l1 -ON f.language_id = l1.language_id -JOIN language l2 -ON f.original_language_id = l2.language_id; -``` - -Let's see how this might work in terms of pseudocode: - -```python3 -ans = [] - -for row1 in film: - for row2 in language: - if row1.language_id == row2.id: - ans.add(row1 + row2) - -for row in ans: - for row3 in language: - if row.language_id == row3.language_id: - ans.add(row + row3) - -for row in ans: - print(row.name, row.language_name, row.original_language_name) -``` - -### Joins with multiple conditions in ON clause - -Till now, whenever we did a join, we joined based on only 1 condition. Like in where clause we can combine multiple conditions, in Joins as well, we can have multiple conditions. - -Let's see an example. For every film, name all the films that were released in the range of 2 years before or after that film and there rental rate was more than the rate of the movie. - -```sql -SELECT f1.name, f2.name -FROM film f1 -JOIN film f2 -ON (f2.year BETWEEN f1.year - 2 AND f1.year + 2) AND f2.rental > f1.rental; -``` - -> Note: -> 1. Join does not need to happen on equality of columns always. -> 2. Join can also have multiple conditions. - -A Compound Join is one where Join has multiple conditions on different columns. - - -## Inner vs Outer Joins - -While we have pretty much discussed everything that is mostly important to know about joins, there are a few nitty gritties that we should know about. - -Let's take the join query we had written a bit earlier: - -```sql -SELECT s1.name, s2.name -FROM students s1 -JOIN students s2 -ON s1.buddy_id = s2.id; -``` - -Let's say there is a student that does not have a buddy, i.e., their `buddy_id` is null. What will happen in this case? Will the student be printed? - -If you remember what we discussed about CRUD , is NULL equal to anything? Nope. Thus, the row will never match with anything and not get printed. The join that we discussed earlier is also called inner join. You could have also written that as: - -```sql -SELECT s1.name, s2.name -FROM students s1 -INNER JOIN students s2 -ON s1.buddy_id = s2.id -``` - -The keyword INNER is optional. By default a join is INNER join. - -As you see, an INNER JOIN doesn't include a row that didn't match the condition for any combination. - -Opposite of INNER JOIN is OUTER JOIN. Outer Join will include all rows, even if they don't match the condition. There are 3 types of outer joins: -- Left Join -- Right Join -- Full Join - -As the names convey, left join will include all rows from the left table, right join will include all rows from the right table and full join will include all rows from both the tables. - -Let's take an example to understand these well: - -Assume we have 2 tables: students and batches with following data: - - -`batches` - -| batch_id | batch_name | -|----------|------------| -| 1 | Batch A | -| 2 | Batch B | -| 3 | Batch C | - -`students` - -| student_id | name | batch_id | -|------------|------------|----------| -| 1 | John | 1 | -| 2 | Jane | 1 | -| 3 | Jim | null | -| 4 | Ram | null | -| 5 | Sita | 2 | - -Now let's write queries to do each of these joins: - -```sql -SELECT s.name, b.batch_name -FROM students s -LEFT JOIN batches b -ON s.batch_id = b.batch_id; -``` - -```sql -SELECT s.name, b.batch_name -FROM students s -RIGHT JOIN batches b -ON s.batch_id = b.batch_id; -``` - -```sql -SELECT s.name, b.batch_name -FROM students s -FULL OUTER JOIN batches b -ON s.batch_id = b.batch_id; -``` - - -Now let's use different types of joins and tell me which row do you think will not be a part of the join. - -Output of LEFT JOIN (Go row by row in left table - which is students and then look for match/matches): - -``` -John batchA -Jane batchA -Jim NULL -Ram NULL -Sita batchB -``` - -Output of RIGHT JOIN (Go row by row in right table - which is batches table and then look for match/matches): -batchA has 2 matches - John and Jane -batchB has 1 match - Sita -batchC has 0 match - NULL - -``` -John batchA -Jane batchA -Sita batchB -NULL batchC -``` - -Output of FULL JOIN (Do the left join. Then look at every row of right table which is `batches` and figure out rows which were not printed yet - print them with null match) - -``` -John batchA -Jane batchA -Jim NULL -Ram NULL -Sita batchB -NULL batchC -``` - -## Join with WHERE v/s ON - -Let's take an example to discuss this. If we consider a simple query: -```sql -SELECT * -FROM A -JOIN B -ON A.id = B.id; -``` -In pseudocode, it will look like: - -```python3 -ans = [] - -for row1 in A: - for row2 in B: - if (ON condition matches): - ans.add(row1 + row2) - -for row in ans: - print(row.id, row.id) -``` -Here, the size of intermediary table (`ans`) will be less than `n*m` because some rows are filtered. - -We can also write the above query in this way: - -```sql -SELECT * -FROM A, B -WHERE A.id = B.id; -``` -The above query is nothing but a CROSS JOIN behind the scenes which can be written as: - -```sql -SELECT * -FROM A -CROSS JOIN B -WHERE A.id = B.id; -``` -Here, the intermediary table `A CROSS JOIN B` is formed before going to WHERE condition. - -In pseudocode, it will look like: - -```python3 -ans = [] - -for row1 in A: - for row2 in B: - ans.add(row1 + row2) - -for row in ans: - if (WHERE condition matches): - print(row.id, row.id) -``` - -The size of `ans` is always `n*m` because table has cross join of A and B. The filtering (WHERE condition) happens after the table is formed. - -From this example, we can see that: -1. The size of the intermediary table (`ans`) is always greater or equal when using WHERE compared to using the ON condition. Therefore, joining with ON uses less internal space. -2. The number of iterations on `ans` is higher when using WHERE compared to using ON. Therefore, joining with ON is more time efficient. - -In conclusion, -1. The ON condition is applied during the creation of the intermediary table, resulting in lower memory usage and better performance. -2. The WHERE condition is applied during the final printing stage, requiring additional memory and resulting in slower performance. -3. Unless you want to create all possible pairs, avoid using CROSS JOINS. - -## UNION and UNION ALL - -Sometimes, we want to print the combination of results of multiple queries. Let's take an example of the following tables: - -`students` -| id | name | -|----|------| - -`employees` -| id | name | -|----|------| - -`investors` -| id | name | -|----|------| - - -You are asked to print the names of everyone associated with Scaler. So, in the result we will have one column with all the names. - -We can't have 3 SELECT name queries because it will not produce this singular column. We basically need SUM of such 3 queries. Join is used to stitch or combine rows, here we need to add the rows of one query after the other to create final result. - -UNION allows you to combine the output of multiple queries one after the other. - -```sql -SELECT name FROM students -UNION -SELECT name FROM employees -UNION -SELECT name FROM investors; -``` -Now, as the output is added one after the other, there is a constraint: Each of these individual queries should output the same number of columns. - -Note that, you can't use ORDER BY for the combined result because each of these queries are executed independently. - -UNION outputs distinct values of the combined result. **It stores the output of individual queries in a set and then outputs those values in final result. Hence, we get distinct values. But if we want to keep all the values, we can use UNION ALL. It stores the output of individual queries in a list and gives the output, so we get all the duplicate values.** - -If you want to perform any operation on the combined result, you put them in braces and give it an alias. -For example, - -```sql -SELECT - first_name, last_name -FROM -(SELECT first_name, last_name -FROM customer - -UNION - -SELECT first_name, last_name -FROM actor) AS some_alias - - -ORDER BY first_name, last_name -LIMIT 10 -``` - diff --git a/docs/SQL/05-aggregate-subqueries.md b/docs/SQL/05-aggregate-subqueries.md deleted file mode 100644 index b3ba2de98..000000000 --- a/docs/SQL/05-aggregate-subqueries.md +++ /dev/null @@ -1,185 +0,0 @@ -# Aggregate subqueries - -## Agenda - - - Group By - - Group by on multiple columns - - Having clause - - Sub-queries - -## GROUP BY Clause - -Till now we combined multiple values into a single values by doing some operation on all of them. What if, we want to get the final values in multiple sets? That is, we want to get the set of values as our result in which each value is derived from a group of values from the column. - -The way Group By clause works is it allows us to break the table into multiple groups so as to be used by the aggregate function. - -For example: `GROUP BY batch_id` will bring all rows with same `batch_id` together in one group - -> Note: Also, GROUP BY always works before aggregate functions. Group By is used to apply aggregate function within groups (collection of rows). The result comes out to be a set of values where each value is derived from its corresponding group. - -Let's take an example. - - -| id | name | age | batch_id | -|----|------|-----|----------| -| 1 | A | 20 | 1 | -| 2 | B | 21 | 3 | -| 3 | C | 22 | 1 | -| 4 | D | 23 | 2 | -| 5 | E | 23 | 1 | -| 6 | F | 25 | 2 | -| 7 | G | 22 | 3 | -| 8 | H | 21 | 2 | -| 9 | I | 20 | 1 | - -```sql -SELECT COUNT(*), batch_id FROM students GROUP BY batch_id; -``` - -The result of above query will be: -| COUNT(\*) | batch_id | -|-----------|----------| -| 4 | 1 | -| 3 | 2 | -| 2 | 3 | - -Explanation: The query breaks the table into 3 groups each having rows with `batch_id` as 1, 2, 3 respectively. There are 4 rows with `batch_id = 1`, 3 rows with `batch_id = 2` and 2 rows with `batch_id = 3`. - -Note that, we can only use the columns in SELECT which are present in Group By because only those columns will have same value across all rows in a group. - -**Ordering of Operations:** - -``` -1. Select the tables. - 1.2. Do the joins if required -2. Apply the filters (where clause) -3. Group by - 3.2: Filtering happens with having clause -4. Select what to print including aggregates -5. Order by, limit, offset. -``` - -### Examples - -***Q1: Print the name of every actor (first_name, last_name) and with that print the number of films they have acted in.*** - -```sql -SELECT - a.first_name, a.last_name, count(1) AS count_movies - - FROM actor a - JOIN film_actor b - ON a.actor_id = b.actor_id - - -GROUP BY a.actor_id -``` - -***Q2: If you have a table `user_classes` with columns as (userID, classID, attended (0 / 1)), then find user-wise attendance.*** - -```sql -SELECT userid, AVG(attended) FROM user_classes GROUP BY userid -``` - -### Group by on multiple columns - -**Table: companies_users** - -| user_id | company_id | round_date | interview_result | -| --- | --- | --- | --- | -| 1 | 1 | 2023-07-01 | 1 | -| 1 | 1 | 2023-07-03 | 1 | -| 1 | 1 | 2023-07-07 | 0 | -| 1 | 2 | 2023-07-02 | 0 | -| 2 | 2 | 2023-07-03 | 1 | -| 2 | 2 | 2023-07-04 | 1 | - -***Q:Find the number of rounds given by every user in every company they interviewed for.*** - -```sql -SELECT user_id, company_id, count(1) -FROM companies_users -GROUP BY user_id, company_id -``` - -## HAVING Clause - -HAVING clause is used to filter groups. Let's take a question to understand the need of HAVING clause: - -There are 2 tables: Students(id, name, age, batch_id) and Batches(id, name). Print the batch names that have more than 100 students along with count of the students in each batch. - -```sql -SELECT COUNT(S.id), B.name -FROM Students S -JOIN Batches B ON S.batch_id = B.id -GROUP BY B.name; -HAVING COUNT(S.id) > 100; -``` - -Here, `GROUP BY B.name` groups the results by the `B.name` column (batch name). It ensures that the count is calculated for each distinct batch name. -`HAVING COUNT(S.id) > 100` condition filters the grouped results based on the count of `S.id` (number of students). It retains only the groups where the count is greater than 100. - -The sequence in which query executes is: -- Firstly, join of the two tables is done. -- Then is is divided into groups based on `B.name`. -- In the third step, result is filtered using the condition in HAVING clause. -- Lastly, it is printed through SELECT. - -FROM -> WHERE -> GROUP BY -> HAVING -> SELECT - -WHERE is not build to be able to handle aggregates. We can not use WHERE after GROUP BY because WHERE clause works on rows and as soon as GROUP BY forms a result, the rows are convereted into groups. So, no individual conditions or actions can be performed on rows after GROUP BY. - -## SUBQUERIES - -Imagine you are given an employee table which has all employee ID, names and their salary. -If I asked you to report employees who earn more than company average, how would you do it? - -Note that the following query does not work: - -```sql -SELECT * FROM employees WHERE salary > AVG(salary) -``` - -**Why?:** Because where clause filters row by row. Aggregation only happens at the time of printing (unless for group_by and having clause). WHERE clause does not know about AVG(salary). - -Manually, I will first find out the company average and then put it in a query. But what if I did not want to put it manually. Subqueries come to our rescue here. - -If I break the above down, what are the steps: - - - Step 1: Find the average salary amongst all employees. - -```sql -SELECT AVG(salary) FROM employees -``` - - - Step 2: Find all employees who make more than the above number. - -```sql -SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees) -``` - -As you can see, in SQL, it's possible to place a SQL query inside another query. This inner query is known as a subquery. -In a subquery, the outer query's result depends on the result set of the inner subquery. That's why subqueries are also called nested queries. - -### More examples - -***Q: Find all employees who make more salary than their department average.*** - -What's step 1 here? I need to find out department wise average salaries. -Ok, let's do that. - -```sql -SELECT dept, AVG(salary) FROM employees GROUP BY dept -``` - -If the above was a table, would it be possible to get result quickly by doing a JOIN. Oh yes, absolutely. Let's do that then. - -```sql -SELECT - e.id, e.name -FROM employees AS e - JOIN (SELECT dept, AVG(salary) AS dept_salary FROM employees GROUP BY dept) AS tmp_table - ON (e.dept = tmp_table.dept AND e.salary > tmp_table.dept_salary) -``` - -Hope this helps build intuition about group by, having and sub-queries. diff --git a/docs/SQL/06-indexing.md b/docs/SQL/06-indexing.md deleted file mode 100644 index a3ad302fc..000000000 --- a/docs/SQL/06-indexing.md +++ /dev/null @@ -1,170 +0,0 @@ -# Indexing - -## Agenda - -- Introduction to Indexing -- How Indexes Work -- Indexes and Range Queries - - Data structures used for indexing -- Cons of Indexes -- Indexes on Multiple Columns -- Indexing on Strings -- How to create index - - -## Introduction to Indexing - -Hello Everyone - -Till now, in the course, we had been discussing majorly about how to write SQL queries to fetch data we want to fetch. While discussing those queries, I also often wrote pseudocode talking about how at a higher level that query might work behind the scenes. - -Let us go back to that pseudocode. What do you think are some of the problems you see a user of DB will face if the DB really worked exactly how the pseudocode mentioned it worked? - -Correct! In the pseudocode we had, for loops iterated over each row of the database to retrieve the desired rows. This resulted in a minimum time complexity of O(N) for every query. When joins or other operations are involved, the complexity further increases. - -Adding to this, in which hardware medium is the data stored in a database? - -Yes. A database stores its data in disk. Now, one of the biggest problems with disk is that accessing data from disk is very slow. Much slower than accessing data from RAM. For reference, read https://gist.github.com/jboner/2841832 Reading data from disk is 20x slower than reading from RAM! Let's talk about how data is fetched from the disk. We all know that on disk DB stores data of each row one after other. When data is fetched from disk, OS fetches data in forms of blocks. That means, it reads not just the location that you wnat to read, but also locations nearby. - -First OS fetches data from disk to memory, then CPU reads from memory. Now imagine a table with 100 M rows and you have to first get the data for each row from disk into RAM, then read it. It will be very slow. Imagine you have a query like: - -```sql -select * from students where id = 100; -``` - -To execute above, you will have to go through literally each row on the disk, and access even the blocks where this row doesn't exist. Don't you think this is a massive issue and can lead to performance problems? - -To understand this better, let's take an example of a book. Imagine a big book covering a lot of topics. Now, if you want to find a particular topic in the book, what will you do? Will you start reading the book from the first page? No, right? You will go to the index of the book, find the page number of the topic you want to read, and then go to that page. This is exactly what indexing is. As index of a book helps go to the correct page of the book fast, the index of a database helps go to the correct block of the disk fast. - -Now this is a very important line. Many people say that an index sorts a table. Nope. It has nothing to do with sorting. We will go over this a bit later in today's class. The major problem statement that indexes solve is to reduce the number of disk block accesses to be done. By preventing wastefull disk block accesses, indexes are able to increase performance of queries. - -## How Indexes Work - -While we have talked about the problem statement that indexes help solve, let's talk about how indexes work behind the scenes to optimize the queries. Let's try to build indexes ourselves. Let's imagine a huge table with 100s of millions of rows in table spread across 100s of disk blocks. We have a query like: - -```sql -select * from students where id = 100; -``` - -We want to somehow avoid going to any of the disk block that is definitely not going to have the student with id 100. I need something that can help me directly know that hey, the row with id 100 is present in this block. Are you familiar with a data structure that can be stored in memory and can quickly provide the block information for each ID? - -Correct. A map or a hashtable, whatever you call it can help us. If we maintain a hashmap where key is the id of the student and value is the disk block where the row containing that ID is present, is it going to solve our problem? Yes! That will help. Now, we can directly go to the block where the row is present and fetch the row. This is exactly how indexes work. They use some other data structure, which we will come to later. - -Here we had queries on id. An important thing about `id` is that id is? - -Yes. ID is unique. Will the same approach work if the column on which we are querying may have duplicates? Like multiple rows with same value of that column? Let's see. Let's imagine we have an SQL query as follows: - -```sql -select * from students where name = 'Naman'; -``` - -How will you modify your map to be able to accomodate multiple rows with name 'Naman'? - -Yes. What if we modify our map a bit. Now our keys will be String (name) and values will be a list of blocks that contain that name. Now, for a query, we will first go to the list of blocks for that name, and then go to each block and fetch the rows. This way as well, have we avoided fetching the blocks from the disk that were useless? Yes! Again, this will ensure our performance speeds up. - -## Indexes and Range Queries - -So, is this all that is there about indexes? Are they that simple? Well, no. Are the SQL queries you write always like `x = y`? What other kind of queries you often have to do in DB? - -If a HashMap is how an index works, do you think it will be able to take care of range queries? Let's say we have a query like: - -```sql -select * from students where psp between 40.1 and 90.1; -``` - -Will you be able to use hashmap to get the blocks that contain these students? Nope. A hashmap allows you to get a value in O(1) but if you have to check all the values in the range, you will have to check them 1 by 1 and potentially it will take O(N) time. - -Hmm. So how will we solve it. Is there any other type of Map you know? Something that allow you to iterate over the values in a sorted way? - -Correct. There is another type of Map called TreeMap. - -Let's in brief talk about the working of a TreeMap. For more detailed discussion, revise your DSA classes. A TreeMap uses a Balanced Binary Search Tree (often AVL Tree or Red Black Tree) to store data. Here, each node contains data and the pointers to left and right node. - -Now, how will a TreeMap help us in our case? A TreeMap allows us to get the node we are trying to query in O(log N). From there, we can move to the next biggest value in O(log N). Thus, queries on range can also be solved. - -## B and B+ Trees - -Databases also use a Tree like data structure to store indexes. But they don't use a TreeMap. They use a B Tree or a B+ Tree. Here, each node can have multiple children. This helps further reduce the height of the tree, making queries faster. We will learn about these later. - -## Cons of Indexes - -While we have seen how indexes help make the read queries faster, like everything in engineering, they also have their cons. Let's try to think of those. What are the 4 types of operations we can do on a database? Out of these, which operations may require us to do extra work because of indexes? - -Yes, whenever we update data, we may also have to update the corresponding nodes in the index. This will require us to do extra work and thus slow down those operations. - -Also, do you think we can store index only on memory? Well technically yes, but memory is volatile. If something goes wrong, we may have to recreate complete index again. Thus, often a copy of index is also stored on disk. This also requires extra space. There are two big problems that can arise with the use of index: -1. Writes will be slower -2. Extra storage - - -Thus, it is recommended to use index if and only if you see the need for it. Don't create indexes prematurely. - -## Indexes on Multiple Columns - -How do you decide on which columns to create an index? Let's revisit how an index works. If I create an index on the `id` column, the tree map used for storing data will allow for faster retrieval based on that column. However, a query like: - -```sql -select * from students where psp = 90.1; -``` - -will not be faster with this index. The index on `id` has no relevance to the `psp` column, and the query will perform just as slowly as before. Therefore, we need to create an index on the column that we are querying. - -We can also create index on 2 columns. Imagine a students table with columns like: - -`id | name | email | batch_id | psp |` - -We are writing a query like this: - -```sql -select * from students where name = 'Naman'; -``` - -Let's say I create an index on (id, name). Let's see how the index will look like: - -When create index on these 2 columns, it is indexed according to id first and then if there is a tie it, will be indexed on name. So, there can be a name with different ids and we will not be able to filter it, as name is just a tie breaker here. - -Thus, if we create an index on (id, name), it will actually not help us on the filter of name column. - -## Indexing on Strings - -Now let's think of a scenario. How often do we need to use a query like this: - -```sql -SELECT * FROM user WHERE email = 'abc@scaler.com'; -``` - -But this query is very slow, so we will definitely create an index on the email column. So, the map that is created behind the scenes using indexing will have email mapped to the corresponding block in the memory. - -Now, instead of creating index on whole email, we can create an index for the first part of the email (text before @) and have list of blocks (for more than one email having same first part) mapped to it. Hence, the space is saved. - -Typically, with string columns, index is created on prefix of the column instead of the whole column. It gives enough increase in performance. - -Consider the query: -```sql -SELECT * FROM user -WHERE address LIKE '%ambala%'; -``` - -We can see that indexing will not help in such queries for pattern matching. In such cases, we use Full-Text Index about which we will discuss later. - -## How to create index - -Let's look at the syntax using `film` table: -```sql -CREATE INDEX idx_film_title_release -ON film(title, release_year); -``` - -Good practices for creating index: -1. Prefix the index name by 'idx' -2. Format for index name - idx\\\\\\... - - -Now, let's use the index in a query: -```sql -EXPLAIN ANALYZE SELECT * FROM film -WHERE title = 'Shawshank Redemption'; -``` - -If you look at the log of this query, "Index lookup on film using idx_film_title_release" is printed. If we remove the index and run the above query again, we can see that the time in executing the query is different. In case where indexing is not used, it takes more time to execute and more rows are searched to find the title. - diff --git a/docs/SQL/07-transactions.md b/docs/SQL/07-transactions.md deleted file mode 100644 index d674f5e46..000000000 --- a/docs/SQL/07-transactions.md +++ /dev/null @@ -1,205 +0,0 @@ -# Transaction - -## Agenda - - - Need for concurrency - - Problems that arise with concurrency - - Introduction to transactions - - Commit / Rollback - - ACID - - Is ACID boolean - - Durability levels - - Isolation levels - - -## Need for concurrency - -Till now, all our SQL queries were written with the assumption that there is no interference from any other operation on the machine. -Basically, all operations are being run sequentially. - -That's however like there being only one queue in immigration. Leads to things being slow and large wait time for someone in the queue. -In such a case, what do you do? -Correct. Open multiple counters so that there are multiple *parallel* lines. - -Very similarily, in a database, there could be multiple people trying to run their queries at the same time. If DB chooses to run them sequentially, it will become really slow. Machines have multi-core CPUs. So, Database can think of running multiple queries concurrently which will increase it's throughput and reduce the wait time for people trying to run their queries. - -## Problems that arise with concurrency - -However, concurrency is not all good. It can lead to some issues around data integrity and unexpected behavior. Let's explore one such case. - -Imagine we have a database for a bank. -What's one common transaction in a bank? Transfer money from person X to person Y. - -What would be steps of doing that money transaction (let's say transfer 500 INR from X to Y): - -``` - 1. Read balA = current balance of user X. - 2. If balA >= 500: - 3. update current balane of user X to be (balA - 500) - 4. Read balB = current balance of user Y - 5. update current balance of user Y to be (balB + 500) - -``` - - -Let's imagine there are 2 money transactions happening at the same time - Person A transferring 700 INR to Person B, and Person A transferring 800 INR to Person C. -Assume current balance of A is 1000, B is 5000, C is 2000. - -It is possible that Step 1 (`Read balA = current balance of A`) gets exectuted for both money transaction at the same time. So, both money transaction find balA = 1000. And hence step 2 (balance being larger than the money being transferred) passes for both. Then step 3 gets executed for both money transactions (let's say). A's balance will be updated to 300 by money transaction 1 and then to 200 by money transaction 2. -A's balance at the end will be 200, with both B and C getting the money and ending at 5700 and 2800 respectively. - -Total sum of money does not add up. Seems like the bank owes more money now. -If you see, if both money transactions had happened one after another (after first had completely finished), then this issue would not have occurred. -How do we avoid this? - -## Introduction to transactions. - -Let's understand the solution to the above in 2 parts. - - 1. What guidelines does the database management system give to the end user to be able to solve the above. Basically, what should I do as the end user, and the guarantees provided by my database. - 2. How does the DB really solve it internally? What's happening behind the scene. - -Let's first look at 1. What tools does the DBMS give to me to be able to avoid situations like the above. - -In the above case, doing a money transaction involved 5 steps (multiple SQL queries). -Database says why don't you group these tasks into a single unit called **Transactions**. - -Formally, Transactions group a set of tasks into a single execution unit. Each transaction begins with a specific task and ends when all the tasks in the group successfully complete. If any of the tasks fail, the transaction fails. Therefore, a transaction has only two results: success or failure. - -For example, a transaction example could be: - -```sql -BEGIN TRANSACTION - -UPDATE film SET title = "TempTitle1" WHERE id = 10; -UPDATE film SET title = "TempTitle2" WHERE id = 100; - -COMMIT -``` - -The above transaction has 2 SQL statements. These statements do not get finalized on the disk until commit command is executed. If any statement fails, all updates are rolled back (like undo operation). -You can also explicitly write `ROLLBACK` which undoes all operations till the last commit. - -Database basically indicates that if you want a group of operations to happen together and you want database to handle all concurrency, put them in a single transaction and then send it to the database. -If you do so, database promises the following. - -## ACID - -If you send a transaction to a DBMS, it sets the following expectations to you: - - - **ATOMICITY:** All or none. Either all operations in the transactions will succeed or none will. - - **CONSISTENCY:** Correctness / Validity. All operations will be executed correctly and will leave the database in a consistent state before and after the transaction. For example, in the money transfer example, consistency was violated because the money amount sum should have stayed the same, but it was not. - - **ISOLATION:** Multiple transactions can be executed concurrently without interfering with each other. Isolation is one of the factors helping with consistency. - - **DURABILITY:** Updates/Writes to the database are permanent and will not be lost. They are persisted. - - -However, there is one caveat to the above. Atomicity is boolean - all transactions are definitely atomic. -But all the remaining parameters are not really boolean but have levels. That is so, because there is a tradeoff. To make my database support highest amount of isolation and consistency, I will have to compromise performance which we will see later. So, based on your application requirement, your DBMS lets you configure the level of isolation or durability. Let's discuss them one by one. - -### Durability levels - -The most basic form of durability is writing updates to disk. However, someone can argue that what if my hard disk has a failure which causes me to loose information stored on the hard disk. -I can choose then to have replica and all commits are forwarded to replicas as well. That has cost of latency and cost of additional machines. -We will discuss more about master slave and replication during system design classes. - -## Isolation Levels - -Before we explore isolation levels, let's understand how would database handle concurrency between multiple transactions happening at the same time. -Typically, you would take locks to block other operations from interfering with your current transactions. [You'll study more about locks during concurrency class]. -When you take a lock on a table row for example, any other transaction which also might be trying to access the same row would wait for you to complete. Which means with a lot of locks, overall transactions become slower, as they may be spending a lot of time waiting for locks to be released. - -Locks are of 2 kinds: - - Shared Locks: Which means multiple transactions could be reading the same entity at the same time. However, a transaction that intends to write, will have to wait for ongoing reads to finish, and then would have to block all other reads and writes when it is writing/updating the entity. - - Exclusive Locks: Exclusive lock when taken blocks all reads and writes from other transaction. They have to wait till this transaction is complete. -There are other kind of locks as well, but not relevant to this discussion for now. - -A database can use a combination of the above to achieve isolation during multiple transactions happening at the same time. -Note that the locks are acquired on rows of the table instead of the entire table. More granular the lock, better it is for performance. - -As we can see that locks interfere with performance, database lets you choose isolation levels. Lower the level, more the performance, but lower the isolation/consistency levels. - -The isolation levels are the following: - -### Read uncommitted. - -This is most relaxed isolation level. In READ UNCOMMITTED isolation level, there isn’t much isolation present between the transactions at all, ie ., No locks. -This is the lowest level of isolation, and does almost nothing. It means that transactions can read data being worked with by other transactions, even if the changes aren’t committed yet. This means the performance is going to be really fast. - -However, there are major challenges to consistency. -Let's consider a case. - -| Time | Transaction 1 | Transaction 2 | -| --- | ------------- | ------------- | -| 1 | Update row #1, balance updated from 500 to 1000 | | -| 2 | | Select row #1, gets value as 1000 | -| 3 | Rollback (balance reverted to 500) | | - -T1 reverts the balance to 500. However, T2 is still using the balance as 1000 because it read a value which was not committed yet. This is also called as `dirty read`. -`Read uncommitted` has the problem of dirty reads when concurrent transactions are happening. - -**Example usecase:** Imagine you wanted to maintain count of live users on hotstar live match. You want very high performance, and you don't really care about the exact count. If count is off by a little, you don't mind. So, you won't mind compromising consistency for performance. Hence, read uncommitted is the right isolation level for such a use case. - -### Read committed - -The next level of isolation is READ_COMMITTED, which adds a little locking into the equation to avoid dirty reads. In READ_COMMITTED, transactions can only read data once writes have been committed. Let’s use our two transactions, but change up the order a bit: T2 is going to read data after T1 has written to it, but then T1 gets rolled back (for some reason). - -| Time | Transaction 1 | Transaction 2 | -| --- | ------------- | ------------- | -| 1 | Selects row #1 | | -| 2 | Updates row #1, acquires lock | | -| 3 | | Tries to select row #1, but blocked by T1’s lock | -| 4 | Rolls back transaction | | -| 5 | | Selects row #1 | - -READ_COMMITTED helps avoid a dirty read here: if T2 was allowed to read row #1 at Time 3, that read would be invalid; T1 ended up getting rolled back, so the data that T2 read was actually wrong. Because of the lock acquired at Time 2 (thanks READ_COMMITTED!), everything works smoothly and T2 waits to execute its SELECT query. - -**This is the default isolation levels in some DBMS like Postgres.** - -However, this isolation level has a problem of **Non-repeatable reads.** Let's understand what that is. - -Consider the following. - -| Time | Transaction 1 | Transaction 2 | -| --- | ------------- | ------------- | -| 1 | Selects emails with low psp | | -| 2 | | update some low psp users with a better psp, acquires lock | -| 3 | | commit, lock released | -| 4 | Select emails with low psp again | | - -At timestamp 4, I might want to read the emails again because I might want to update the status of having scheduled reminder emails to them. However, I will get a different set of emails in the same transaction (timestamp 1 vs timestamp 4). This issues is called non-repeatable reads and can happen in the current isolation level. - -### Repeatable reads - -The third isolation level is repeatable reads. This is the default isolation levels in many DBMS including MySQL. - -The primary difference in repeable reads is the following: - - Every transaction reads all the committed rows required for executing reads and writes before the start of the transaction and stores it locally in memory as a snapshot. That way, if you read the same information multiple times in the same transaction, you will get the same entries. - - Locking mechanism: - - Writes acquire exclusive locks (same as read committed) - - Reads with write intent (SELECT FOR UPDATE) acquire exclusive locks. - -Further reading: https://ssudan16.medium.com/database-isolation-levels-explained-61429c4b1e31 - -| Time | Transaction 1 | Transaction 2 | -| ---- | ------------- | ------------- | -| 1 | Selects row #1 **for update**, acquires lock on row #1 | | -| 2 | | Tries to update row #1, but is blocked by T1’s lock | -| 3 | updates row #1, commits transaction | | -| 4 | | Updates row #1 | - -The first example we took of money transfer could work if select for update is properly used in transactions with this isolation level. -However, this still has the following issue: - - Normal reads do not take any lock. So, it is possible while I have a local copy in my snapshot, the real values in DB have changed. Reads are not strongly consistent. - - Phantom reads: A very corner case, but the table might change if there are new rows inserted while the transaction is ongoing. Since new rows were not part of the snapshot, it might cause inconsistency in new writes, reads or updates. - -### Serializable Isolation level - -This is the strictest isolation level in a DB. It's the same as repeatable reads with the following differences: - - All reads acquire a shared lock. So, they don't let updates happen till they are completed. - - No snapshots required anymore. - - Range locking - To avoid phantom reads, this isolation level also locks a few entries in the range close to what is being read. - -**Example usecase:** This is the isolation levels that banks use because they want strong consistency with every single piece of their information. -However, systems that do not require as strict isolation levels (like Scaler or Facebook) would then use Read Committed OR Repeatable Reads. - - diff --git a/docs/SQL/08-schema-design1.md b/docs/SQL/08-schema-design1.md deleted file mode 100644 index 77a16dbc0..000000000 --- a/docs/SQL/08-schema-design1.md +++ /dev/null @@ -1,257 +0,0 @@ -# Schema design - -## Agenda - -- What is Schema Design -- What can go wrong -- Normalisation -- How to approach Schema Design -- Cardinality - - How to find cardinality in relations - - How to represent different cardinalities -- Nuances when representing relations - -## What is Schema Design - -Let's understand what Schema is. Schema refers to the structure of the database. Broadly speaking, schema gives information about the following: -- Structure of a database -- Tables in a database -- Columns in a table -- Primary Key -- Foreign Key -- Index -- Pictorial representation of how the DB is structured. - -In general, 'Design' refers to the pictorial reference for solving how should something be formed considering the constraints. Prototyping, blueprinting or a plan, or structuring how something should exist is called Design. - -Before any table or database is created for a software, a design document is formed consisting: -- Schema -- Class Diagram -- Architectural Diagram - -## What can go wrong - - -#### Example 1: -Let's say Flipkart has a table for t-shirts. T-shirt has a column named color. -Some t-shirts could have multiple colors. What do you put in the color column then? Maybe I put all the colors comma separated. - -So, something like, - -| tshirt_id | collar_type | size | color | -|-----------|-------------|------|-------| -| 1 | Round | M | red | -| 2 | Round | L | red, green | -| 3 | Round | L | blue, red | - -How do you find all t-shirts of color red here. - -```sql -SELECT * FROM tshirt WHERE color LIKE "%red%" -``` - -The above query is going to do full-text search on color. You'll not be able to make it fast as it cannot leverage the power of indexing. -And for that reason, some of your queries will always be slow. - - -#### Example 2: - -Let's say we want to store classes and their instructor. Instead of creating 2 separate tables, I choose to put all information in one single table. - - -| class_id | topic | instructor_id | instructor_name | Instructor_email | -|----------|-------|---------------|-----------------|----------------| -| 1 | Transactions | 4 | Anshuman | abcd@abcd.com | -| 2 | Indexing | 4 | Anshuman | abcd@abcd.com | -| 3 | Schema Design | 4 | Anshuman | abcd@abcd.com | -| 4 | SQL-1 | 6 | Ayush | ayush@abcd.com | - -This has the following problems: - - Update problem: If name for Anshuman needs to be updated, it has to be updated in all 3 rows containing Anshuman. Missing even a single row causes inconsistency. - - Delete problem: If you delete the class #4, you end up loosing all infomation about the instructor Ayush. - - Insert problem: If a new instructor has been onboarded, there is no way to record their information. I cannot create a row with dummy entries. The only way to save their information is when they have a class assigned. - -Bad design. -As you can see, if you start with bad design, it causes tons of issues around performance, data integrity in the future. If you design your schema well, 50% of the battle is won. Let's see principles used for good schema design. - -## Normalisation - -Normalization is the process to eliminate data redundancy and enhance data integrity in the table. It is a systematic technique of decomposing tables to eliminate data redundancy (repetition) and undesirable characteristics like Insertion, Update, and Deletion anomalies. - -To understand, if we are using the technique properly, various normalized forms are defined. Let's look at them one by one. - -### 1-NF - -A table is referred to as being in its First Normal Form if atomicity of the table is 1. -Here, atomicity states that a single cell cannot hold multiple values. It must hold only a single-valued attribute. -The First normal form disallows the multi-valued attribute, composite attribute, and their combinations. - -So, example 1 above is not in 1-NF form. -However, if all your table columns contain atomic values, then your schema satisfies 1-NF form. - -How do you solve example 1 to make it 1-NF? -Create another table called tshirt_color and have a unique row for every tshirt-id, color combination. - -### 2-NF - -A table is said to be in the second normal form if and only if: - - The table is already in 1-NF form. - - If the proper subset of candidate key determines non-prime attribute, it is called partial dependency. A table should not have partial dependencies. - -Let's see with an example (Example 2). - - -| class_id | topic | instructor_id | instructor_name | Instructor_email | -|----------|-------|---------------|-----------------|----------------| -| 1 | Transactions | 4 | Anshuman | abcd@abcd.com | -| 2 | Indexing | 4 | Anshuman | abcd@abcd.com | -| 3 | Schema Design | 4 | Anshuman | abcd@abcd.com | -| 4 | SQL-1 | 6 | Ayush | ayush@abcd.com | - -Here, instructor_name cannot alone decide the class_id or the topic or instructor_id. Various instructors could have the same name with different instructor ID. Hence, instructor_name is a non prime attribute. -instructor_name can be derived from instructor_id which is a proper subset of the key (instructor_id alone cannot be the key). Hence, the above table violates 2-NF form. - -How do you solve to make it 2-NF? -Only keep instructor_id in the table. Move all other instructor relalted parameters like instructor_name, instructor_email to another table where you have one entry for every unique instructor. - - -## How to approach Schema Design - -Let's learn about this using a familiar example. You are asked to build a software for Scaler which can handle some base requirements. - -The requirements are as follows: -1. Scaler will have multiple batches. -2. For each batch, we need to store the name, start month and current instructor. -3. Each batch of Scaler will have multiple students. -4. Each batch has multiple classes. -5. For each class, store the name, date and time, instructor of the class. -6. For every student, we store their name, graduation year, University name, email, phone number. -7. Every student has a buddy, who is also a student. -8. A student may move from one batch to another. -9. For each batch a student moves to, the date of starting is stored. -10. Every student has a mentor. -11. For every mentor, we store their name and current company name. -12. Store information about all mentor sessions (time, duration, student, mentor, student rating, mentor rating). -13. For every batch, store if it is an Academy-batch or a DSML-batch. - -Representation of schema doesn't matter. What matters is that you have all the tables needed to satisfy the requirements. Considering above requirements, how will you design a schema? Let's see the steps involved in creating the schema design. - -Steps: -1. **Create the tables:** For this we need to identify the tables needed. To identify the tables, - - Find all the nouns that are present in requirements. - - For each noun, ask if you need to store data about that entity in your DB. - - If yes, create the table; otherwise, move ahead. - - Here, such nouns are batches, instructors (if we just need to store instructor name then it will be a column in batches table. But if we need to store information about instructor then we need to make a separate table), students, classes, mentor, mentor session. - - Note that, a good convention about names: -Name of a table should be plural, because it is storing multiple values. Eg. 'mentor_sessions'. Name of a column is singular and in snake-case. - -2. **Add primary key (id) and all the attributes** about that entity in all the tables created above. - - Expectation with the primary key is that: - - It should rarely change. Because indexing is done on PK (primary key) and the data on disk is sorted according to PK. Hence, these are updated with every change in primary key. - - It should ideally be a datatype which is easy to sort and has smaller size. Have a separate integer/big integer column called 'id' as a primary key. For eg. twitter's algorithm ([Snowflake](https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake)) to generate the key (id) for every tweet. - - A good convention to name keys is \\id. For example, 'batch_id'. - - Now, for writing attributes of each table, just see which attributes are of that entity itself. For `batches`, coulmns will be `name`, `start_month`. `current_instructor` will not be a column as we don't just want to store the name of current instructor but their details as well. So, it is not just one attribute, there will be a relation between `batches` and `instructors` table for this. So we will get these tables: - -`batches` -| batch_id | name | start_month | -|----------|------|-------------| - -`instructors` -| instructor_id | name | email | avg_rating | -|---------------|------|-------|------------| - -`students` -| student_id | name | email | phone_number | grad_year | univ_name | -|------------|------|-------|--------------|-----------|-----------| - -`classes` -| class_id | name | schedule_time | -|----------|------|---------------| - -`mentors` -| mentor_id | name | company_name | -|-----------|------|--------------| - -`mentor_sessions` -| mentor_session_id | time | duration | student_rating | mentor_rating | -|-------------------|------|----------|----------------|---------------| - -3. **Representing relations:** For understanding this step, we need to look into cardinality. - -## Cardinality - -When two entities are related to each other, there is a questions: how many of one are related to how many of the other. - -For example, for two tables students and batches, cardinality represents how many students are related to how many batches and vice versa. - -- 1:1 cardinality means 1 student belongs to only 1 batch and 1 batch has only 1 students. -- 1:m cardinality means 1 student can belong to multiple batches and 1 batch has only 1 student. -- m:1 cardinality means 1 student belongs to only 1 batch and 1 batch can have multiple students. -- m:m cardinality means multiple students can belong to multiple batches, and vice versa. - -In cardinality, `1` means an entity can be associated to 1 instance at max, [0, 1]. `m` means an entity can be associated with zero or more instances, [0, 1, 2, ... inf] - -### Steps to calculate cardinality - -If you want to calculate relationship between `noun1` and `noun2`, then you can do the following: - - *Step 1:* If you take one example of `noun2`, how many noun1 are related to this example object. Output : Either `1` or `many` - - *Step 2:* If you take one example of `noun1`, how many noun2 are related to this example object. Output : Either `1` or `many` - -Take output from step1 (o1) and output from step2 (o2). o1:o2 is your relationship. - -Let's take an example. -What is the cardinality between employee and department. Assume that an employee can be part of only one department. - - - Step 1: Example of department: Finance. How many employees can be part of Finance. Answer: **many** - - Step 2: Example of employee: Sudhanshu. How many department can Sudhanshu be part of? Answer: **one** - -So, answer = **many-to-one** - -**Example 2:** What is the cardinality between ticket and seat in apps like bookMyShow? - -In one ticket, we can book multiple seats. -One seat can be booked in only 1 ticket. - -So, the final cardinality between ticket and seat is **one-to-many** - -**Example 3:** Consider a monogamous community. What is the cardinality between husband and wife? - -| husband | --- married to --- | wife | -| ------- | ------------------ | ---- | -| 1 | > | 1 | -| 1 | < | 1 | - - -In a monogamous community, 1 man is married to 1 woman and vice versa. Hence, the cardinality is **one-to-one** - -**Example 4:** What is the cardinality between class and current instructor at Scaler? -Answer: many-to-one - -## How to represent different cardinalities - -When we have a 1:1 cardinality, the `id` column of any one relation can be used as an attribute in another relation. It is not suggested to include the both the respective `id` column of the two relations in each other because it may cause update anomaly in future transactions. - -For 1:m and m:1 cardinalities, the `id` column of `1` side relation is included as an attribute in `m` side relation. - -For m:m cardinalities, create a new table called a **mapping table** or **lookup table** which stores the ids of both tables according to their associations. - -For example, for tables `orders` and `products` in previous quiz have m:m cardinality. So, we will create a new table `orders_products` to accomodate the relation between order ids and products ids. - -`orders_products` -| order_id | product_id | -| -------- | ---------- | -| 1 | 1 | -| 1 | 2 | -| 1 | 3 | -| 2 | 2 | -| 2 | 4 | -| 3 | 1 | -| 3 | 5 | -| 4 | 5 | - - -We will cover case studies for the next class - applying the principles learnt. diff --git a/docs/SQL/10-views-and-window-function.md b/docs/SQL/10-views-and-window-function.md deleted file mode 100644 index 54a75c8a6..000000000 --- a/docs/SQL/10-views-and-window-function.md +++ /dev/null @@ -1,358 +0,0 @@ -# Views & window function - -## Agenda - - - Views - - Window function - -## Views - -Imagine in sakillaDB, I frequently have queries of the following type: - - Given an actor, give me the name of all films they have acted in. - - Given a film, give me the name of all actors who have acted in it. - -Getting the above requires a join across 3 tables, `film`, `film_actor` and `actor`. - -Why is that an issue? - - Writing these queries time after time is cumbersome. Infact imagine queries that are even more complex - requiring joins across a lot of tables with complex conditions. Writing those everytime with 100% accuracy is difficult and time-taking. - - Not every team would understand the schema really well to pull data with ease. And understanding the entire schema for a large, complicated system would be hard and would slow down teams. - -So, what's the solution? -Databases allow for creation of views. Think of views as an alias which when referred is replaced by the query you store with the view. - -So, a query like the following: - -```sql -CREATE OR REPLACE view actor_film_name AS - -SELECT - concat(a.first_name, a.last_name) AS actor_name, - f.title AS file_name -FROM actor a - JOIN film_actor fa - ON fa.actor_id = a.actor_id - JOIN film f - ON f.film_id = fa.film_id -``` - - -**Note that a view is not a table.** It runs the query on the go, and hence data redundancy is not a problem. - -### Operating with views - -Once a view is created, you can use it in queries like a table. Note that in background the view is replaced by the query itself with view name as alias. -Let's see with an example. - -```sql -SELECT film_name FROM -actor_film_name WHERE actor_name = "JOE SWANK" -``` - -OR - -```sql -SELECT actor_name FROM -actor_file_name WHERE film_name = "AGENT TRUMAN" -``` - -If you see, with views it's super simple to write queries that I write frequently. Lesser chances to make an error. -Note that however, actor_file_name above is not a separate table but more of an alias. - -An easy way to understand that is that assume every occurrence of `actor_file_name` is replaced by - -```sql -(SELECT - concat(a.first_name, a.last_name) AS actor_name, - f.title AS file_name -FROM actor a - JOIN film_actor fa - ON fa.actor_id = a.actor_id - JOIN film f - ON f.film_id = fa.film_id) AS actor_file_name -``` - -**Caveat:** Certain DBMS natively support materialised views. Materialised views are views with a difference that the views also store results of the query. This means there is redundancy and can lead to inconsistency / performance concerns with too many views. But it helps drastically improve the performance of queries using views. MySQL for example does not support materialised views. Materialised views are tricky and should not be created unless absolutely necessary for -performance. - -#### How to best leverage views - -Imagine there is an enterprise team at Scaler which helps with placements of the students. -Should they learn about the entire Scaler schema? Not really. They are only concerned with student details, their resume, Module wise PSP, Module wise Mock Interview clearance, companies details and student status in the companies where they have applied. - -In such a case, can we create views which gets all of the information in 1 or 2 tables? If we can, then they need to only understand those 2 tables and can work with that. - -#### More operations on views - -**How to get all views in the database:** - -```sql -SHOW FULL TABLES WHERE table_type = 'VIEW'; -``` - -**Dropping a view** - -```sql -DROP VIEW actor_file_name; -``` - -**Updating a view** - -```sql -ALTER view actor_film_name AS - - SELECT - concat(a.first_name, a.last_name) AS actor_name, - f.title AS file_name - FROM actor a - JOIN film_actor fa - ON fa.actor_id = a.actor_id - JOIN film f - ON f.film_id = fa.film_id -``` - -**Note:** Not recommended to run update on views to update the data in the underlying tables. Best practice to use views for reading information. - -**See the original create statement for a view** - -```sql -SHOW CREATE TABLE actor_film_name -``` - -## Window Function - -Imagine you have an `employees` table with the following columns. - -```sql -employees -emp_no | department | salary - 1 | Tech | 60,000 - 2 | Tech | 50,000 - 3 | HR | 40,000 - 4 | HR | 60,000 -``` - -If I ask you to fetch the average salary for every department, what would you do? -Yes, you would use a group_by to fetch the avg salary in a department. - -```sql -SELECT department, AVG(salary) -FROM employees -GROUP BY department -``` - -which will print - -``` -department | AVG(salary) - Tech | 55000 - HR | 50000 -``` - -However, what if I ask you to print every row in the employees table along with the avg salary of the department. -You can use WINDOW function for that. Window function is exactly like group by, just that it prints it's output for every row. - -**Syntax:** - -```sql -SELECT - emp_no, - department, - salary, - AVG(salary) OVER (PARTITION BY department) AS dept_avg -FROM employees -``` - -The term `OVER` indicates that I am using a window function. -Just like group by, window function would need to define what is a group like. For that, it uses PARTITION BY. `PARTITION BY department` creates 2 groups/windows - one for Tech, one for HR. -In each group, you calculate the aggregate function specified before `OVER`. - -So, the above query yields: - -```sql -employees -emp_no | department | salary | dept_avg - 1 | Tech | 60,000 | 55000 - 2 | Tech | 50,000 | 55000 - 3 | HR | 40,000 | 50000 - 4 | HR | 60,000 | 50000 -``` - -What happens if there is no Partition by? What's the group then? -Correct. The entire table becomes the group. - -So, the following query: - -```sql -SELECT - emp_no, - department, - salary, - AVG(salary) OVER () AS dept_avg -FROM employees -``` - -yields - - -```sql -employees -emp_no | department | salary | dept_avg - 1 | Tech | 60,000 | 52500 - 2 | Tech | 50,000 | 52500 - 3 | HR | 40,000 | 52500 - 4 | HR | 60,000 | 52500 -``` - -You can have multiple window function in the same SQL statement. For example, how do I print MAX, MIN and AVG salary in every department along with the employee? - -```sql -SELECT - emp_no, - department, - salary, - AVG(salary) OVER (PARTITION BY department) AS dept_avg, - MAX(salary) OVER (PARTITION BY department) AS dept_max, - MIN(salary) OVER (PARTITION BY department) AS dept_min -FROM employees -``` - -This would yield: - -```sql -employees -emp_no | department | salary | dept_avg | dept_max | dept_min - 1 | Tech | 60,000 | 55000 | 60000 | 50000 - 2 | Tech | 50,000 | 55000 | 60000 | 50000 - 3 | HR | 40,000 | 50000 | 60000 | 40000 - 4 | HR | 60,000 | 50000 | 60000 | 40000 -``` - -*You can have multiple window functions with different partition by in a SQL query. Just that it would do more work - twice as expensive. It would create different groups / windows in parallel and then calculate the aggregate value.* - -Window function also allows you to order entries in a certain order within a group / partition / window. For example, if I wanted that within a single department, entries are sorted based on salary in descending order, I can write: - - -```sql -SELECT - emp_no, - department, - salary, - AVG(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS dept_avg -FROM employees -``` - -which would yield: - -```sql -employees -emp_no | department | salary | dept_avg - 1 | Tech | 60,000 | 55000 - 2 | Tech | 50,000 | 55000 - 4 | HR | 60,000 | 50000 - 3 | HR | 40,000 | 50000 -``` - -### Aggregate function which work only with Window function. - -**RANK()** - Gives the rank of every entry in the group/window/partition it belongs to. It is recommended to specify a order by clause in window function when using rank(). Ranking is done based on the ordering of entries within a partitio. -Imagine I wanted to print all employees along with their department rank based on salary. - -```sql -SELECT - emp_no, - department, - salary, - RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank -FROM employees -``` - -which yields - - -```sql -employees -emp_no | department | salary | dept_rank - 1 | Tech | 60,000 | 1 - 2 | Tech | 50,000 | 2 - 4 | HR | 60,000 | 1 - 3 | HR | 40,000 | 2 -``` - -In the absence of partition by, the entire table becomes one large group and hence salaries are ranked in the entire company. - -```sql -SELECT - emp_no, - department, - salary, - RANK() OVER (ORDER BY salary DESC) AS company_rank -FROM employees -``` - -yields - - -```sql -employees -emp_no | department | salary | company_rank - 1 | Tech | 60,000 | 1 - 4 | HR | 60,000 | 1 - 2 | Tech | 50,000 | 3 - 3 | HR | 40,000 | 4 -``` - -Note that 2 entries with the same salary got the same rank. How do I know that I need to compare salaries (because that's whats specified in order by clause). Conflicting entries get the same rank. And next entry (after the duplicate/conflicting entries) gets a number which it would have gotten had the entries been different. -If you want the next entry to get the next natural number, then you can use the **dense_rank()** function which works exactly like the rank() function with the only difference being how the next entry is assigned a rank in case of duplicate values. - -**DENSE_RANK()** - Explained above. - -**ROW_NUMBER()** - Imagine in the above rank() example, you don't want same ranks assigned to entries with the same value. In that case, you can use row_number(). - -```sql -SELECT - emp_no, - department, - salary, - ROW_NUMBER() OVER (ORDER BY salary DESC) AS company_rank -FROM employees -``` - -yields - -```sql -employees -emp_no | department | salary | company_rank - 1 | Tech | 60,000 | 1 - 4 | HR | 60,000 | 2 - 2 | Tech | 50,000 | 3 - 3 | HR | 40,000 | 4 -``` - - -**LAG(column) / LEAD(column)**: Imagine in the above context, I wanted to print the value from the previous row in the group, or the next row in the group, then I use the lead or lag functions. -LAG(column) - As the name indicates, it prints the column value from the previous row in the group. -LEAD(column) - column value from the next row in the group. -For example, what if I wanted to print the next higher salary than me in the department (or the next lower) along with my rank. - -```sql -SELECT - emp_no, - department, - salary, - RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank, - LAG(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS next_higher_salary -FROM employees -``` - -yields - -```sql -employees -emp_no | department | salary | dept_rank | next_higher_salary - 1 | Tech | 60,000 | 1 | NULL - 2 | Tech | 50,000 | 2 | 60000 - 4 | HR | 60,000 | 1 | NULL - 3 | HR | 40,000 | 2 | 60000 -``` - - diff --git a/docs/SQL/SQL-Aggregrate-Function.md b/docs/SQL/SQL-Aggregrate-Function.md deleted file mode 100644 index be2192684..000000000 --- a/docs/SQL/SQL-Aggregrate-Function.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -id: sql-aggregrate-function -title: Aggregate Functions in SQL -sidebar_label: Aggregate Functions -sidebar_position: 9 -tags: [sql, database, functions] -description: In this tutorial, you will learn how to Aggregate Functions in the SQL. ---- - -SQL aggregate functions perform a calculation on a set of values and return a single value. They are commonly used with the GROUP BY clause of the SELECT statement. - - -## The most commonly used SQL aggregate functions are: - -- MIN() - returns the smallest value within the selected column. -- MAX() - returns the largest value within the selected column. -- COUNT() - returns the number of rows in a set. -- SUM() - returns the total sum of a numerical column. -- AVG() - returns the average value of a numerical column. - -**Aggregate functions ignore null values (except for COUNT()).** -Aggregate functions are often used with the GROUP BY clause of the SELECT statement. The GROUP BY clause splits the result-set into groups of values and the aggregate function can be used to return a single value for each group. - -## Advantages of SQL Aggregate Functions - -**1. Data Summarization** -Aggregate functions allow you to summarize and gain insights from your data efficiently. For example, you can quickly find out the total sales, average price, or number of transactions. - -**2. Reduced Data Retrieval** -Instead of retrieving and processing all individual records in an application, you can use aggregate functions to perform calculations directly in the database. This reduces the amount of data transferred and processed outside the database, improving performance. - -**3. Simplified Queries** -Aggregate functions can simplify complex data analysis tasks. For example, calculating the average, sum, or maximum value in SQL is straightforward compared to doing the same in application code. - -**4. Improved Performance** -Databases are optimized for executing aggregate functions, often using indexes and other internal mechanisms to perform calculations efficiently. This can result in better performance compared to processing data in the application layer. -## Examples of Aggregate Function in SQL - -#### Count() -Description : Counts the number of rows in a set. -Syntax : -```sql -SELECT COUNT(*) -FROM table_name; -``` -#### SUM() - -- Description: Adds up the values in a numeric column. -- Syntax : -```sql -SELECT SUM(column_name) -FROM table_name; -``` -### AVG() - -- Description: Calculates the average value of a numeric column. -- Syntax : -```sql -SELECT AVG(column_name) -FROM table_name; -``` -### MIN() - -- Description: Returns the minimum value in a set. -- Syntax : -```sql -SELECT MIN(column_name) -FROM table_name; -``` -### MAX() - -- Description: Returns the maximum value in a set. -- Syntax : -```sql -SELECT MAX(column_name) -FROM table_name; -``` - -## Conclusion -SQL aggregate functions are powerful and efficient tools for data summarization, reporting, and analysis. They allow you to perform calculations directly within the database, which improves performance, simplifies queries, and reduces the amount of data transferred between the database and the application. By leveraging these functions, you can gain valuable insights from your data with minimal effort and enhanced performance, making them indispensable for any data-intensive application or analysis task. Whether you're calculating totals, averages, or other statistical measures, aggregate functions help you achieve your goals quickly and effectively. - ---- - -## Authors: - -
    - {['Damini2004'].map(username => ( - - ))} -
    diff --git a/docs/SQL/SQL-Between-Operator.md b/docs/SQL/SQL-Between-Operator.md deleted file mode 100644 index 0cd2e3e06..000000000 --- a/docs/SQL/SQL-Between-Operator.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -id: sql-between-operator -title: Between Operator in SQL -sidebar_label: Between Operator -sidebar_position: 10 -tags: [sql, database, operator] -description: In this tutorial, you will learn how to Between Operator in the SQL. ---- - -The BETWEEN operator in SQL is used to filter the result set within a certain range. It selects values within a given range, inclusive of the start and end values. The BETWEEN operator can be used with numeric values, text values, and dates. - - -## Advantages of SQL Aggregate Functions - -**1. Readability and Simplicity** -The BETWEEN operator makes SQL queries more readable and easier to write. Instead of using multiple comparison operators, you can express a range condition concisely. - -**2. Inclusive Range** -The BETWEEN operator is inclusive, meaning it includes both the start and end values of the range. This simplifies the logic when you want to include boundary values in your results. - -**3. Versatility** -The BETWEEN operator works with different data types, including numbers, dates, and strings, making it a versatile tool for various use cases. - -**4. Performance** -In many cases, using the BETWEEN operator can be more efficient than using multiple AND conditions. Database engines often optimize range queries, especially if indexes are in place. - -### Examples -**Numeric Range** -Suppose you have a table named employees with a column salary and you want to select employees with a salary between 30000 and 50000. - -``` -sql -SELECT * FROM employees -WHERE salary BETWEEN 30000 AND 50000;``` - -**Date Range** - If you have a table named orders with a column order_date and you want to select orders placed between January 1, 2023, and June 30, 2023. - -```sql -SELECT * FROM orders -WHERE order_date BETWEEN '2023-01-01' AND '2023-06-30'; -``` - -**Text Range** -For a table named products with a column product_name, to select products with names between 'Apple' and 'Orange': - -```sql -SELECT * FROM products -WHERE product_name BETWEEN 'Apple' AND 'Orange'; -``` - - -#### Equivalent BETWEEN with Comparison Operators -The BETWEEN operator can also be written using comparison operators: - -```sql -SELECT * FROM employees -WHERE salary >= 30000 AND salary <= 50000; -``` -### Using NOT BETWEEN -To select values outside a specified range, you can use the NOT BETWEEN operator. - -```sql -SELECT * FROM employees -WHERE salary NOT BETWEEN 30000 AND 50000; -``` -### Combining with Other Conditions -You can combine the BETWEEN operator with other conditions using AND or OR. - -```sql -SELECT * FROM employees -WHERE salary BETWEEN 30000 AND 50000 AND department_id = 10; -``` -### Conclusion -The BETWEEN operator enhances the clarity, conciseness, and efficiency of SQL queries when filtering data within a range. Its inclusive nature, versatility, and ease of maintenance make it a preferred choice for range-based conditions in SQL queries. - - - - - - diff --git a/docs/SQL/SQL-Delete-Statement.md b/docs/SQL/SQL-Delete-Statement.md deleted file mode 100644 index 00f7081e8..000000000 --- a/docs/SQL/SQL-Delete-Statement.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: sql-delete-statement -title: Delete Statement in SQL -sidebar_label: Where Clause -sidebar_position: 8 -tags: [sql, database, statement] -description: In this tutorial, you will learn how to delete the data,rows,colums,table in the SQL. ---- - -The DELETE statement in SQL is used to remove one or more rows from a table. It is a Data Manipulation Language (DML) command, which means it is used to manage and modify the data within database tables. The DELETE statement allows for both targeted deletions, where specific rows are removed based on a condition, and bulk deletions, where multiple rows or even all rows in a table can be removed. - - -## Syntax -```sql -DELETE FROM table_name -WHERE condition; - -``` - -## Advantages of SQL WHERE Clause - -**1.Targeted Data Removal:** -The DELETE statement allows you to remove specific records based on conditions specified in the WHERE clause. This precision helps in maintaining data accuracy and relevance. - -**2.Flexibility:** -You can delete one or multiple records using a single DELETE statement, depending on the criteria provided. This flexibility is useful for various data cleanup and maintenance tasks. - -**3.Conditional Deletion:** -The DELETE statement supports complex conditions using logical operators, subqueries, and joins, allowing for sophisticated data removal strategies. - -**4.Maintaining Data Integrity:** -By using transactions, you can ensure that deletions are only finalized if they meet certain conditions, preserving data integrity and allowing rollback in case of errors. - -**5.Improving Database Performance:** -Regular use of the DELETE statement to remove outdated or irrelevant data can improve database performance by reducing the amount of data the database needs to handle. - -## Examples of Delete Statement in SQL - -#### Deleting a Single Record -Description - To delete a specific record where id is 1: -Example - -```sql -DELETE FROM employees -WHERE id = 1; -``` -### Deleting Multiple Records -Description - To delete all employees in the 'Sales' department: -Example - -```sql -DELETE FROM employees -WHERE department = 'Sales'; -``` -### Deleting All Records -Description - To delete all records from the employees table (but keep the table structure intact): -Example - -```sql -DELETE FROM employees; -``` -### Using Subqueries -Description - You can use a subquery in the WHERE clause to specify records to delete. For example, deleting employees who have a low performance score from another table: -Example - -```sql -DELETE FROM employees -WHERE id IN (SELECT employee_id FROM performance WHERE score < 50); -``` -## Conclusion -The DELETE statement is a fundamental command in SQL for removing data from tables. It provides flexibility to delete specific records based on conditions, and it can handle both small-scale and large-scale deletions. However, it must be used with caution to avoid unintentional data loss. Using the WHERE clause, transactions, and backup strategies ensures that deletions are performed safely and effectively, maintaining the integrity and reliability of the database. - ---- - -## Authors: - -
    - {['Damini2004'].map(username => ( - - ))} -
    diff --git a/docs/SQL/SQL-Inner-Join.md b/docs/SQL/SQL-Inner-Join.md deleted file mode 100644 index e36953f0b..000000000 --- a/docs/SQL/SQL-Inner-Join.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -id: sql-inner-join -title: Inner Join in SQL -sidebar_label: Inner Join -sidebar_position: 14 -tags: [sql, database, operation] -description: In this tutorial, we will learn about inner joins in sql. ---- - -## What is an inner join? -An inner join of 2 tables, say table_1 and table_2 on a column would return all rows with same values in common columns.An inner join may or may not have an 'on' clause. An inner join without an 'on' clause returns the cross join of the tables. - -## Syntax - -```sql -select * -from table_1 inner join table_2 -on table_1.col=table_2.col; -``` - -##### Note that the columns of table_1 and table_2 in the on clause must be the same attribute. - -## Example - -Consider the following tables: - -```sql -select * from students; -+---------+-----------+ -| stud_id | stud_name | -+---------+-----------+ -| 101 | Shreeya | -| 102 | Aakash | -| 103 | Mansi | -| 104 | Aditya | -+---------+-----------+ - - select * from grades; -+---------+-------+ -| stud_id | grade | -+---------+-------+ -| 101 | A | -| 104 | A+ | -+---------+-------+ -``` - -Now , lets try to obtain a result using inner join with and without the on clause. - -##### With 'on' clause: -```sql -select s.stud_id, s.stud_name, g.grade -from students s inner join grades g -on s.stud_id=g.stud_id; - -Output: -+---------+-----------+-------+ -| stud_id | stud_name | grade | -+---------+-----------+-------+ -| 101 | Shreeya | A | -| 104 | Aditya | A+ | -+---------+-----------+-------+ -``` -We can observe that only the rows with matching values in common column (stud_id) are returned. - -##### Without 'on' clause: -```sql -select s.stud_id, s.stud_name, g.grade -from students s inner join grades g; - -Output: -+---------+-----------+-------+ -| stud_id | stud_name | grade | -+---------+-----------+-------+ -| 101 | Shreeya | A | -| 101 | Shreeya | A+ | -| 102 | Aakash | A | -| 102 | Aakash | A+ | -| 103 | Mansi | A | -| 103 | Mansi | A+ | -| 104 | Aditya | A | -| 104 | Aditya | A+ | -+---------+-----------+-------+ -``` -Here we can see that the output is the cross join of both the tables. - -## Conclusion -In this tutorial, we learnt how to use the inner join with and without the 'on' clause. -Inner joins are used when we want to retrieve all the rows with same values in common column(s). \ No newline at end of file diff --git a/docs/SQL/SQL-Insert-Into.md b/docs/SQL/SQL-Insert-Into.md deleted file mode 100644 index f9c8f7799..000000000 --- a/docs/SQL/SQL-Insert-Into.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -id: sql-not-operator -title: Not Operator in SQL -sidebar_label: Not Operator -sidebar_position: 5 -tags: [sql, database, operator] -description: In this tutorial, you will learn how to build queries with Negations to get the desired output. ---- - - -In SQL, the NOT operator is used to negate a condition in a WHERE clause or other SQL statement. Its primary function is to reverse the logical meaning of the condition that follows it. - -## Syntax -```sql -SELECT column1, column2, ... -FROM table_name -WHERE NOT condition; - -``` - -## Operators Used in the WHERE Clause -1. `=` : Equal -2. `>` : Greater than -3. `<` : Less than -4. `>=` : Greater than or equal -5. `<=` : Less than or equal -6. `<>` : Not equal (Note: In some versions of SQL, this operator may be written as `!=`) -7. `BETWEEN` : Between a certain range -8. `LIKE` : Search for a pattern -9. `IN` : To specify multiple possible values for a column - -## Advantages of SQL WHERE Clause - -**1.Enhanced Query Flexibility:** -- Allows for the creation of more complex and precise queries by enabling the exclusion of specific conditions. -- Facilitates the implementation of complex logical expressions by negating conditions. -**2.Filtering Specific Data:** -- Useful for filtering out unwanted records from query results. For example, it can be used to exclude records that meet certain criteria, such as records with a specific status or value. -- Helps in scenarios where you need to select records that do not match a particular condition, enhancing the specificity of your data retrieval. -**3.Handling NULL Values:** -- Effective in checking for non-NULL values in a dataset. Using NOT NULL helps in ensuring data completeness and integrity by filtering out rows with missing values. -- For instance, WHERE column IS NOT NULL is a common usage pattern to exclude rows with NULL values from the results. -**4.Simplifying Logical Expressions:** -- Allows for straightforward negation of conditions, making SQL queries easier to read and understand. -- By using NOT, you can avoid complex nested conditions, making the query logic clearer. -**5.Compatibility with Other SQL Operators:** -- Works seamlessly with other SQL logical operators such as AND and OR, enabling the construction of more refined and targeted queries. -- Enhances the expressiveness of SQL statements when combined with these operators. - -## Examples of Not Operator in SQL - -### NOT LIKE -```sql -SELECT * FROM Customers -WHERE CustomerName NOT LIKE 'A%'; -``` - -### NOT BETWEEN -```sql -SELECT * FROM Customers -WHERE CustomerID NOT BETWEEN 10 AND 60; -``` - -### NOT IN -```sql -SELECT * FROM Customers -WHERE City NOT IN ('Paris', 'London'); -``` - -### NOT Greater Than -```sql -SELECT * FROM Customers -WHERE NOT CustomerID > 50; -``` - -### NOT Less Than -```sql -SELECT * FROM Customers -WHERE NOT CustomerId < 50; -``` - - -## Conclusion -The NOT operator in SQL provides a straightforward way to negate conditions in SQL queries, allowing for more flexible and precise data retrieval. Understanding its usage is crucial for crafting effective SQL statements, particularly when dealing with complex filtering requirements. - ---- - -## Authors: - -
    - {['Damini2004'].map(username => ( - - ))} -
    - - diff --git a/docs/SQL/SQL-Joins.md b/docs/SQL/SQL-Joins.md deleted file mode 100644 index 71d68df40..000000000 --- a/docs/SQL/SQL-Joins.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: sql-joins -title: Joins in SQL -sidebar_label: Joins -sidebar_position: 11 -tags: [sql, database, operation] -description: In this tutorial, you will learn how to Joins in the SQL. ---- - -Understanding and effectively using SQL joins can be challenging for many users. This often leads to inefficient queries or incorrect data retrieval, causing frustration and hindering productivity. - -### Syntax -```sql -SELECT columns -FROM table1 -INNER JOIN table2 -ON table1.common_column = table2.common_column; -``` - -## Advantages of SQL Aggregate Functions - -**1. Readability and Simplicity** -The BETWEEN operator makes SQL queries more readable and easier to write. Instead of using multiple comparison operators, you can express a range condition concisely. - -**2. Inclusive Range** -The BETWEEN operator is inclusive, meaning it includes both the start and end values of the range. This simplifies the logic when you want to include boundary values in your results. - -**3. Versatility** -The BETWEEN operator works with different data types, including numbers, dates, and strings, making it a versatile tool for various use cases. - -**4. Performance** -In many cases, using the BETWEEN operator can be more efficient than using multiple AND conditions. Database engines often optimize range queries, especially if indexes are in place. - -### Types of Joins -**1.Right Join** -A RIGHT JOIN returns all rows from the right table (table2) and the matched rows from the left table (table1). If no match is found, NULL values are returned for columns from the left table. - - -**2.Left Join** -A LEFT JOIN returns all rows from the left table (table1) and the matched rows from the right table (table2). If no match is found, NULL values are returned for columns from the right table. - -**3.Inner Join** -An INNER JOIN returns rows that have matching values in both tables. -**4.Full Join** -A FULL JOIN returns all rows when there is a match in either table. If there is no match, the result is NULL on the side where there is no match. - - -![Joins](image-1.png) -### Conclusion -Joins are fundamental in SQL for combining data from multiple tables. Understanding the different types of joins and their use cases is essential for effective database querying and data manipulation. - - - - - - - - - - - - diff --git a/docs/SQL/SQL-Left-Join.md b/docs/SQL/SQL-Left-Join.md deleted file mode 100644 index fc6d4a5e5..000000000 --- a/docs/SQL/SQL-Left-Join.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: sql-left-join -title: Left Join in SQL -sidebar_label: Left Join -sidebar_position: 13 -tags: [sql, database, operation] -description: In this tutorial, we will learn about left joins in sql. ---- - -## What is a left join? -A left join of two tables, say table 1 and table 2, would return all the rows from the left table and matched values from table 2. If for a particular row in table 1 there is no matching entry in table 2, 'null' is returned. - -## Syntax - -```sql -select * -from table_1 left join table_2 -on table_1.col=table_2.col; -``` - -##### Note that the columns of table_1 and table_2 in the on clause must be the same attribute. - -## Example - -Consider the following tables: - -```sql -select * from students; -+---------+-----------+ -| stud_id | stud_name | -+---------+-----------+ -| 101 | Shreeya | -| 102 | Aakash | -| 103 | Mansi | -| 104 | Aditya | -+---------+-----------+ - - select * from grades; -+---------+-------+ -| stud_id | grade | -+---------+-------+ -| 101 | A | -| 104 | A+ | -+---------+-------+ -``` - -Now , lets try to obtain a result using left join. - -```sql -select s.stud_id, s.stud_name, g.grade -from students s left outer join grades g -on s.stud_id=g.stud_id; - -Output: -+---------+-----------+-------+ -| stud_id | stud_name | grade | -+---------+-----------+-------+ -| 101 | Shreeya | A | -| 102 | Aakash | NULL | -| 103 | Mansi | NULL | -| 104 | Aditya | A+ | -+---------+-----------+-------+ -``` -Here we can see that the output contains the entry of student id's 102 and 103 even though they are not assigned any grade, i.e., they are not present in the 'grades' table. - -## Conclusion -In this tutorial, we learnt how to use the left outer join with an example. -Left outer joins are used when we want to retrieve all the rows from the left(1st) table, irrespective of it being in the right(2nd) table. \ No newline at end of file diff --git a/docs/SQL/SQL-Not-Operator.md b/docs/SQL/SQL-Not-Operator.md deleted file mode 100644 index 1e6e8f997..000000000 --- a/docs/SQL/SQL-Not-Operator.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -id: not-operator-in-sql -title: Not Operator in SQL -sidebar_label: Not Operator -sidebar_position: 5 -tags: [sql, database, operator] -description: In this tutorial, you will learn how to build queries with Negations to get the desired output. ---- - -In SQL, the NOT operator is used to negate a condition in a WHERE clause or other SQL statement. Its primary function is to reverse the logical meaning of the condition that follows it. - -## Syntax - -```sql -SELECT column1, column2, ... -FROM table_name -WHERE NOT condition; - -``` - -## Operators Used in the WHERE Clause - -1. `=` : Equal -2. `>` : Greater than -3. `<` : Less than -4. `>=` : Greater than or equal -5. `<=` : Less than or equal -6. `<>` : Not equal (Note: In some versions of SQL, this operator may be written as `!=`) -7. `BETWEEN` : Between a certain range -8. `LIKE` : Search for a pattern -9. `IN` : To specify multiple possible values for a column - -## Advantages of SQL WHERE Clause - -**1.Enhanced Query Flexibility:** - -- Allows for the creation of more complex and precise queries by enabling the exclusion of specific conditions. -- Facilitates the implementation of complex logical expressions by negating conditions. - **2.Filtering Specific Data:** -- Useful for filtering out unwanted records from query results. For example, it can be used to exclude records that meet certain criteria, such as records with a specific status or value. -- Helps in scenarios where you need to select records that do not match a particular condition, enhancing the specificity of your data retrieval. - **3.Handling NULL Values:** -- Effective in checking for non-NULL values in a dataset. Using NOT NULL helps in ensuring data completeness and integrity by filtering out rows with missing values. -- For instance, WHERE column IS NOT NULL is a common usage pattern to exclude rows with NULL values from the results. - **4.Simplifying Logical Expressions:** -- Allows for straightforward negation of conditions, making SQL queries easier to read and understand. -- By using NOT, you can avoid complex nested conditions, making the query logic clearer. - **5.Compatibility with Other SQL Operators:** -- Works seamlessly with other SQL logical operators such as AND and OR, enabling the construction of more refined and targeted queries. -- Enhances the expressiveness of SQL statements when combined with these operators. - -## Examples of Not Operator in SQL - -### NOT LIKE - -```sql -SELECT * FROM Customers -WHERE CustomerName NOT LIKE 'A%'; -``` - -### NOT BETWEEN - -```sql -SELECT * FROM Customers -WHERE CustomerID NOT BETWEEN 10 AND 60; -``` - -### NOT IN - -```sql -SELECT * FROM Customers -WHERE City NOT IN ('Paris', 'London'); -``` - -### NOT Greater Than - -```sql -SELECT * FROM Customers -WHERE NOT CustomerID > 50; -``` - -### NOT Less Than - -```sql -SELECT * FROM Customers -WHERE NOT CustomerId < 50; -``` - -## Conclusion - -The NOT operator in SQL provides a straightforward way to negate conditions in SQL queries, allowing for more flexible and precise data retrieval. Understanding its usage is crucial for crafting effective SQL statements, particularly when dealing with complex filtering requirements. - ---- - -## Authors: - -
    - {['Damini2004'].map(username => ( - - ))} -
    diff --git a/docs/SQL/SQL-OR-Operator.md b/docs/SQL/SQL-OR-Operator.md deleted file mode 100644 index a8607f0aa..000000000 --- a/docs/SQL/SQL-OR-Operator.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: sql-or-operator -title: OR Operator in SQL -sidebar_label: OR Operator -sidebar_position: 5 -tags: [sql, database, operator ] -description: In this tutorial, you will learn how to add OR operator in the query to get desired output. ---- - -The OR operator in SQL is used to combine multiple conditions in a WHERE clause, returning rows that satisfy at least one of the conditions specified. - -# Syntax -`SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2 OR condition3 ...;` - -# Advantage of SQL WHERE Clause - -**1.Order of Evaluation:** -SQL evaluates conditions combined with AND before those combined with OR. Use parentheses to explicitly define the order of evaluation. - -**2.Performance:** -The performance of queries using OR can be influenced by the presence of indexes on the columns involved in the conditions. Proper indexing can significantly speed up query execution. - -# Example of Order By Clause in SQL - -**1.Selecting rows based on multiple conditions:** -- Example : `SELECT * FROM Employees WHERE Age < 25 OR Department = 'HR';` -- Description : Suppose you have a table called Employees with columns EmployeeID, FirstName, LastName, Age, and Department.This query selects all employees who are either younger than 25 or work in the HR department. - -**2.Using OR with other operators:** -- Example : `SELECT * FROM Employees WHERE Age < 25 OR Age > 50 OR Department = 'Sales';` -- Description : You can combine OR with other comparison operators like `=`, `!=`, `<`, `>`, `<=`, `>=`.This query selects all employees who are either younger than 25, older than 50, or work in the Sales department. - -**3.Combining OR with AND:** -- Example : `SELECT * FROM Employees WHERE (Age < 25 AND Department = 'Marketing') OR (Age > 50 AND Department = 'Sales');` -- Descriptiom : When combining OR with AND, you often use parentheses to ensure the correct order of evaluation.This query selects employees who are either younger than 25 and work in Marketing or older than 50 and work in Sales. - -# Conclusion -The OR operator in SQL is essential for retrieving rows that meet at least one of several conditions within a WHERE clause. Understanding and effectively using the OR operator enhances your ability to filter data according to complex criteria. Proper use of parentheses ensures the correct logical evaluation, and indexing relevant columns can improve query performance. For further insights, refer to the documentation specific to your SQL database system. - - -## Authors: - -
    - {['damini-chachane'].map(username => ( - - ))} -
    diff --git a/docs/SQL/SQL-Right-Join.md b/docs/SQL/SQL-Right-Join.md deleted file mode 100644 index 3a1315241..000000000 --- a/docs/SQL/SQL-Right-Join.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: sql-Right-join -title: Right Join in SQL -sidebar_label: Right Join -sidebar_position: 12 -tags: [sql, database, operation] -description: In this tutorial, you will learn how to build queries with Right Join to get the desired output. ---- - -Certainly! A RIGHT JOIN (or RIGHT OUTER JOIN) in SQL is used to return all rows from the right table (table2), and the matched rows from the left table (table1). If there is no match, NULL values are returned for columns from the left table. - -### Syntax -```sql -SELECT columns -FROM table1 -RIGHT JOIN table2 -ON table1.common_column = table2.common_column; -``` -### Example -Consider two tables, employees and departments: - -**employees Table:** -employee_id name department_id -1 John 10 -2 Jane 20 -3 Mike 30 -**departments Table:** -department_id department_name -10 HR -20 Finance -40 Marketing - -To perform a RIGHT JOIN to get all departments and their corresponding employees: - -```sql -SELECT employees.employee_id, employees.name, departments.department_name -FROM employees -RIGHT JOIN departments -ON employees.department_id = departments.department_id; -``` -**Result:** -employee_id name department_name -1 John HR -2 Jane Finance -NULL NULL Marketing - -**Explanation** -- Row 1: The employee with ID 1 (John) works in the HR department. -- Row 2: The employee with ID 2 (Jane) works in the Finance department. -- Row 3: There are no employees assigned to the Marketing department, so NULL values are returned for employee_id and name. - -### Conclusion -A RIGHT JOIN retrieves all records from the right table (table2) and matched records from the left table (table1). It ensures that every row from the right table is returned, even if there are no matching rows in the left table, in which case NULL values are used. This type of join is useful when you want to include all records from the right table, ensuring no data is left out from that side of the join operation. diff --git a/docs/SQL/SQL-Update-Statement.md b/docs/SQL/SQL-Update-Statement.md deleted file mode 100644 index a76f71b66..000000000 --- a/docs/SQL/SQL-Update-Statement.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -id: sql-update-statement -title: Update Statement -sidebar_label: Update Statement -sidebar_position: 7 -tags: [sql, database, statement] -description: In this tutorial, you will learn how to Update the data into the database. ---- - - -The UPDATE statement in SQL is used to modify the existing records in a table. Below is a comprehensive overview of the UPDATE statement, including syntax, usage, and examples. - - -## Syntax -```sql -UPDATE table_name -SET column1 = value1, column2 = value2, ... -WHERE condition; - - -``` - -## Advantages of SQL Update into Statement - -**1.Efficient Data Modification:** -The UPDATE statement allows you to efficiently modify existing records without the need to delete and reinsert them. This can save time and reduce the risk of errors. - -**2.Targeted Updates:** -You can update specific records using the WHERE clause, ensuring that only the desired rows are affected. This precision helps maintain data integrity and prevents unintended changes. - -**3.Bulk Updates:** -The UPDATE statement can be used to modify multiple records at once, which is particularly useful for batch updates and maintaining large datasets. - -**4.Conditional Updates:** -With the WHERE clause, you can apply conditions to update only those records that meet certain criteria. This flexibility allows for dynamic and context-specific data modifications. - -**5.Use of Expressions and Functions:** -You can incorporate SQL expressions and functions in the SET clause to perform complex updates. For example, you can calculate new values based on existing data. - -## Examples of Update Into in SQL - -### Updating a Single Column -Description - Let's assume we have a table called employees with the following columns: id, name, position, and salary. -To update the salary of an employee with id 1: -Example - -```sql -UPDATE employees -SET salary = 75000 -WHERE id = 1; -``` - -### Updating Multiple Columns -Description - To update both the position and salary of an employee with id 2: -Example - -```sql -UPDATE employees -SET position = 'Senior Data Analyst', salary = 70000 -WHERE id = 2; -``` -### Updating Multiple Rows -Description - To increase the salary of all employees in the 'Sales' department by 5000: -Example - -```sql -UPDATE employees -SET salary = salary + 5000 -WHERE department = 'Sales'; -``` -### Updating All Rows -Description - To set the default department to 'General' for all employees: - -Example - -```sql -UPDATE employees -SET department = 'General'; -``` - -Note: Be careful when omitting the WHERE clause, as this will update all rows in the table. - -### Conditional Update Using Subquery -Description - To update the salary of employees based on their performance score stored in another table: -Example - - -```sql -UPDATE employees -SET salary = salary + 5000 -WHERE id IN (SELECT employee_id FROM performance WHERE score > 90); -``` - -## Conclusion -In conclusion, the UPDATE statement in SQL is a powerful and essential tool for database management. Its advantages include efficient data modification, targeted updates, the ability to handle bulk and conditional updates, and the use of expressions and functions to perform complex operations. The UPDATE statement also enhances data consistency and integrity, improves performance, and is easy to use, making it a fundamental part of any database administrator's toolkit. ---- - -## Authors: - -
    - {['Damini2004'].map(username => ( - - ))} -
    -Footer diff --git a/docs/SQL/SQL-Where-Clause.md b/docs/SQL/SQL-Where-Clause.md deleted file mode 100644 index 047e38456..000000000 --- a/docs/SQL/SQL-Where-Clause.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -id: sql-where-clause -title: Where Clause in SQL -sidebar_label: Where Clause -sidebar_position: 3 -tags: [sql, database, clause] -description: In this tutorial, you will learn how to build queries with conditions to get the desired output. ---- - -The WHERE clause in SQL is used to filter records from a result set. It specifies the conditions that must be met for the rows to be included in the result. The WHERE clause is often used in SELECT, UPDATE, DELETE, and other SQL statements to narrow down the data returned or affected. - -## Syntax -```sql -SELECT column1, column2, ... -FROM table_name -WHERE condition; -``` - -## Operators Used in the WHERE Clause -1. `=` : Equal -2. `>` : Greater than -3. `<` : Less than -4. `>=` : Greater than or equal -5. `<=` : Less than or equal -6. `<>` : Not equal (Note: In some versions of SQL, this operator may be written as `!=`) -7. `BETWEEN` : Between a certain range -8. `LIKE` : Search for a pattern -9. `IN` : To specify multiple possible values for a column - -## Advantages of SQL WHERE Clause - -1. **Filtering Rows:** The WHERE clause evaluates each row in the table to determine if it meets the specified condition(s). Only rows that satisfy the condition are included in the result set. -2. **Conditions:** Conditions in the WHERE clause can use comparison operators like `=`, `<>` (not equal), `>`, `<`, `>=`, `<=`. Logical operators such as `AND`, `OR`, and `NOT` can be used to combine multiple conditions. -3. **Pattern Matching:** The LIKE operator can be used for pattern matching. For example, `LIKE 'A%'` matches any string that starts with the letter 'A'. -4. **Range Checks:** The BETWEEN operator checks if a value is within a range of values. For example, `BETWEEN 10 AND 20`. -5. **Null Values:** The `IS NULL` and `IS NOT NULL` operators are used to filter records with null values. - -## Examples of WHERE Clause in SQL - -### Basic Select Query -```sql -SELECT * FROM Students WHERE marks > 50; -``` - -### WHERE Clause in UPDATE Statement -```sql -UPDATE employees SET salary = salary * 1.10 -WHERE performance_rating = 'Excellent'; -``` - -### WHERE Clause in DELETE Statement -```sql -DELETE FROM employees -WHERE last_login < '2023-01-01'; -``` - -### WHERE Clause with LIKE Statement -```sql -SELECT * FROM customers -WHERE name LIKE 'J%'; -``` - -### WHERE Clause with BETWEEN Statement -```sql -SELECT * FROM orders -WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'; -``` - -### WHERE Clause with IS NULL Statement -```sql -SELECT * FROM employees -WHERE manager_id IS NULL; -``` - -## Conclusion -The WHERE clause in SQL is a powerful tool for filtering data in various SQL statements. It allows you to specify conditions that rows must meet to be included in the result set, thereby enabling precise data retrieval and manipulation. By using comparison operators, logical operators, pattern matching, range checks, and handling null values, you can create complex queries tailored to your specific data requirements. Mastering the WHERE clause is essential for efficient database management and analysis, providing the ability to focus on relevant data and perform targeted updates and deletions. - ---- - -## Authors: - -
    - {['damini-chachane'].map(username => ( - - ))} -
    diff --git a/docs/SQL/_category_.json b/docs/SQL/_category_.json deleted file mode 100644 index a60eafbfd..000000000 --- a/docs/SQL/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "SQL", - "position": 24, - "link": { - "type": "generated-index", - "description": "in this tutorial you will learn about SQL " - } -} \ No newline at end of file diff --git a/docs/SQL/image-1.png b/docs/SQL/image-1.png deleted file mode 100644 index 4ce468609c7bb1132062e7d35e2deaf9bd722363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141894 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 ...]; - ``` - - **Example**: - ```sql - ALTER DATABASE myDatabase - MODIFY NAME = newDatabaseName; - ``` - -### Table Operations -- **CREATE TABLE**: Creates a new table. - - **Syntax**: - ```sql - CREATE TABLE table_name ( - column1 datatype, - column2 datatype, ... - ); - ``` - - **Example**: - ```sql - CREATE TABLE Customers ( - CustomerID int, - CustomerName varchar(255) - ); - ``` - -- **ALTER TABLE**: Modifies a table. - - **Syntax**: - ```sql - ALTER TABLE table_name - ADD column_name datatype; - ``` - - **Example**: - ```sql - ALTER TABLE Customers - ADD Email varchar(255); - ``` - -- **DROP TABLE**: Deletes a table. - - **Syntax**: - ```sql - DROP TABLE table_name; - ``` - - **Example**: - ```sql - DROP TABLE Customers; - ``` - -### Index Management -- **CREATE INDEX**: Creates an index (search key). - - **Syntax**: - ```sql - CREATE INDEX index_name - ON table_name (column1, column2, ...); - ``` - - **Example**: - ```sql - CREATE INDEX idx_lastname - ON Customers (LastName); - ``` - -- **DROP INDEX**: Deletes an index. - - **Syntax**: - ```sql - DROP INDEX index_name ON table_name; - ``` - - **Example**: - ```sql - DROP INDEX idx_lastname; - ``` - -## Diving Deeper into SQL: Beyond the Basics - -### Advanced Data Retrieval -- **SELECT DISTINCT**: Retrieves unique values from a column. - - **Example**: - ```sql - SELECT DISTINCT Country - FROM Customers; - ``` - -- **SELECT COUNT()**: Counts the number of rows that match a specified condition. - - **Example**: - ```sql - SELECT COUNT(CustomerID) - FROM Customers; - ``` - -- **SELECT AVG()**: Calculates the average value of a numeric column. - - **Example**: - ```sql - SELECT AVG(OrderAmount) - FROM Orders; - ``` - -- **SELECT SUM()**: Calculates the total sum of a numeric column. - - **Example**: - ```sql - SELECT SUM(OrderAmount) - FROM Orders; - ``` - -### Data Filtering and Sorting -- **WHERE**: Filters records. - - **Example**: - ```sql - SELECT * - FROM Customers - WHERE Country = 'Germany'; - ``` - -- **AND/OR**: Combines multiple conditions. - - **Example**: - ```sql - SELECT * - FROM Customers - WHERE Country = 'Germany' - AND City = 'Berlin'; - ``` - -- **ORDER BY**: Sorts the result set. - - **Example**: - ```sql - SELECT * - FROM Customers - ORDER BY Country ASC, CustomerName DESC; - ``` - -### Joins and Subqueries -- **INNER JOIN**: Returns records that have matching values in both tables. - - **Example**: - ```sql - SELECT Orders.OrderID, Customers.CustomerName - FROM Orders - INNER JOIN Customers - ON Orders.CustomerID = Customers.CustomerID; - ``` - -- **LEFT JOIN**: Returns all records from the left table, and the matched records from the right table. - - **Example**: - ```sql - SELECT Customers.CustomerName, Orders.OrderID - FROM Customers - LEFT JOIN Orders - ON Customers.CustomerID = Orders.CustomerID; - ``` - -- **RIGHT JOIN**: Returns all records from the right table, and the matched records from the left table. - - **Example**: - ```sql - SELECT Orders.OrderID, Customers.CustomerName - FROM Orders - RIGHT JOIN Customers - ON Orders.CustomerID = Customers.CustomerID; - ``` - -- **FULL JOIN**: Returns all records when there is a match in either left or right table. - - **Example**: - ```sql - SELECT Customers.CustomerName, Orders.OrderID - FROM Customers - FULL JOIN Orders - ON Customers.CustomerID = Orders.CustomerID; - ``` - -- **Subquery**: A query nested inside another query. - - **Example**: - ```sql - SELECT CustomerName - FROM Customers - WHERE CustomerID IN (SELECT CustomerID - FROM Orders - WHERE OrderAmount > 500); - ``` - -### Data Grouping and Aggregation -- **GROUP BY**: Groups rows that have the same values into summary rows. - - **Example**: - ```sql - SELECT COUNT(CustomerID), Country - FROM Customers - GROUP BY Country; - ``` - -- **HAVING**: Filters records after the `GROUP BY` statement. - - **Example**: - ```sql - SELECT COUNT(CustomerID), Country - FROM Customers - GROUP BY Country - HAVING COUNT(CustomerID) < 5; - ``` - -### Data Constraints -- **NOT NULL**: Ensures that a column cannot have a NULL value. - - **Example**: - ```sql - CREATE TABLE Orders ( - OrderID int NOT NULL, - OrderNumber int NOT NULL - ); - ``` - -- **UNIQUE**: Ensures all values in a column are unique. - - ** - -Example**: - ```sql - CREATE TABLE Customers ( - CustomerID int UNIQUE, - CustomerName varchar(255) - ); - ``` - -- **PRIMARY KEY**: Uniquely identifies each record in a table. - - **Example**: - ```sql - CREATE TABLE Customers ( - CustomerID int PRIMARY KEY, - CustomerName varchar(255) - ); - ``` - -- **FOREIGN KEY**: Uniquely identifies a record in another table. - - **Example**: - ```sql - CREATE TABLE Orders ( - OrderID int, - CustomerID int, - FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) - ); - ``` - -- **CHECK**: Ensures that the values in a column satisfy a specific condition. - - **Example**: - ```sql - CREATE TABLE Orders ( - OrderID int, - OrderAmount int CHECK (OrderAmount > 0) - ); - ``` - -- **DEFAULT**: Sets a default value for a column if no value is specified. - - **Example**: - ```sql - CREATE TABLE Orders ( - OrderID int, - OrderStatus varchar(255) DEFAULT 'Pending' - ); - ``` - -## RDBMS - -A Relational Database Management System (RDBMS) is a software system that facilitates the creation, management, and use of relational databases. RDBMSes are built on the principles of relational algebra and structured query language (SQL), providing a structured approach to storing and retrieving data. - -### Key Components of RDBMS -- **Tables**: Data in RDBMSes is organized into tables, which consist of rows and columns. Each row represents a record, and each column represents a specific attribute or field of the data. -- **Relationships**: RDBMSes support relationships between tables through keys. Primary keys uniquely identify each row in a table, while foreign keys establish relationships between tables. -- **SQL**: SQL is the standardized language used to interact with RDBMSes. It allows users to define, manipulate, query, and control data within the database. -- **Data Integrity**: RDBMSes enforce data integrity constraints such as entity integrity (ensuring each row is unique with a primary key), referential integrity (maintaining relationships between tables), and domain integrity (ensuring valid data types and values). -- **Transactions**: RDBMSes support transactions, which are atomic units of work that ensure all operations within a transaction either succeed completely or fail completely, preserving data consistency. -- **Indexing**: Indexes are used to optimize data retrieval by providing fast access paths to data based on indexed columns. - -### Applications of RDBMS -RDBMSes are widely used across various industries and applications: -1. **Web Applications**: Storing user data, session management, and content management systems. -2. **Enterprise Applications**: Managing business data, transactions, and customer relationships. -3. **Data Warehousing**: Storing and analyzing large volumes of data for business intelligence and decision-making. -4. **E-commerce**: Handling product catalogs, order processing, and customer transactions. - -## Conclusion -SQL plays a crucial role in managing structured data and is essential for anyone involved in database-driven applications or systems. This introduction provides a concise overview of SQL, highlighting its importance, capabilities, and widespread use in database management. Adjustments can be made based on specific audience or detailed requirements as needed. diff --git a/docs/Swift/Concurrency.md b/docs/Swift/Concurrency.md deleted file mode 100644 index 7e133ab1f..000000000 --- a/docs/Swift/Concurrency.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: swift-concurrency -title: Swift Concurrency -sidebar_label: Concurrency -sidebar_position: 9 -description: Task to execute independently and potentially simultaneously. -tags: [Swift,Introduction,Concepts,Concurrency,programming Language] ---- - -Concurrency in Swift allows tasks to execute independently and potentially simultaneously, improving performance and responsiveness in applications. It enables efficient utilization of multi-core processors and better handling of asynchronous operations. - -```swift -import Foundation - -// Define a function that simulates fetching data asynchronously -func fetchData() async throws -> String { - return "Data fetched successfully" -} - -// Example of using async/await -func asyncExample() async { - do { - let result = try await fetchData() - print(result) // Output: Data fetched successfully - } catch { - print("Error fetching data: \(error)") - } -} - -// Run the async function -Task { - await asyncExample() -} - -// Example of using DispatchQueue for concurrent tasks -let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent) - -// Execute tasks asynchronously on the concurrent queue -concurrentQueue.async { - for i in 1...5 { - print("Task 1: \(i)") - } -} - -concurrentQueue.async { - for j in 1...5 { - print("Task 2: \(j)") - } -} -``` - -### Explanation: - -1. **Async/Await Example**: - - `fetchData()` is an asynchronous function that returns a `String` and can throw errors (`throws`). - - `asyncExample()` is an asynchronous function that calls `fetchData()` using `await`, handling potential errors. - - The `Task` block asynchronously executes `asyncExample()`. - -2. **DispatchQueue Example**: - - `concurrentQueue` is created with `.concurrent` attribute, allowing multiple tasks to run concurrently. - - Two tasks are dispatched asynchronously on `concurrentQueue`, printing sequential numbers for each task. - -### Concepts: - -- **Async/Await**: Simplifies asynchronous programming by allowing functions to pause execution (`await`) until a result is available. -- **DispatchQueue**: Manages the execution of tasks asynchronously, either concurrently or serially. -- **Concurrency Handling**: Ensures tasks can execute independently and concurrently, improving performance and responsiveness. - \ No newline at end of file diff --git a/docs/Swift/ControlFlow.md b/docs/Swift/ControlFlow.md deleted file mode 100644 index 9b5230555..000000000 --- a/docs/Swift/ControlFlow.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -id: swift-control-flow -title: Swift Control Flow -sidebar_label: Control Flow -sidebar_position: 4 -description: Statements and Condition checking. -tags: [Swift,Introduction,Concepts,Control Flow,programming Language] ---- - -Control flow in Swift allows developers to dictate the order in which code statements are executed. It includes conditional statements (`if`, `guard`, `switch`) for making decisions based on conditions, and looping statements (`for-in`, `while`, `repeat-while`) for repeating code blocks until a condition is met or satisfied. - -### Key Concepts: - -1. **Conditional Statements**: - - **`if` Statement**: Executes a block of code if a condition is true. - ```swift - let number = 10 - if number > 0 { - print("Number is positive") - } else { - print("Number is non-positive") - } - ``` - - - **`guard` Statement**: Provides an early exit from a function if a condition isn’t met. - ```swift - func process(number: Int?) { - guard let number = number else { - print("Number is nil") - return - } - print("Number is \(number)") - } - process(number: 42) // Output: Number is 42 - ``` - - - **`switch` Statement**: Evaluates a value against multiple possible matching patterns. - ```swift - let grade = "A" - switch grade { - case "A": - print("Excellent!") - case "B", "C": - print("Good") - default: - print("Need improvement") - } - ``` - -2. **Looping Statements**: - - **`for-in` Loop**: Iterates over a sequence (e.g., array, range) of items. - ```swift - let names = ["Alice", "Bob", "Charlie"] - for name in names { - print("Hello, \(name)!") - } - ``` - - - **`while` Loop**: Executes a block of code repeatedly as long as a condition is true. - ```swift - var counter = 5 - while counter > 0 { - print("Counter: \(counter)") - counter -= 1 - } - ``` - - - **`repeat-while` Loop**: Similar to `while`, but ensures the block of code is executed at least once before checking the condition. - ```swift - var attempts = 0 - repeat { - print("Attempt \(attempts)") - attempts += 1 - } while attempts < 3 - ``` - -3. **Control Transfer Statements**: - - **`break`**: Terminates the execution of a loop or switch statement. - - **`continue`**: Skips the current iteration of a loop and proceeds to the next iteration. - - **`fallthrough`**: Used in a `switch` statement to fall through to the next case. - -### Example: - -```swift -// Example combining conditional and looping statements -let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -var sum = 0 - -for number in numbers { - if number % 2 == 0 { - continue // Skip even numbers - } - - if number > 5 { - break // Stop processing when number exceeds 5 - } - - sum += number -} - -print("Sum of odd numbers less than or equal to 5: \(sum)") // Output: Sum of odd numbers less than or equal to 5: 9 -``` - -### Key Concepts Demonstrated: - -- **Combining Statements**: The example demonstrates using `for-in` loop to iterate over an array, using `if` statements for conditions (`continue` and `break`), and accumulating a sum based on specific conditions. -- **Control Transfer**: `continue` skips even numbers, `break` stops processing when a condition is met, showing how control flow statements alter program execution. - \ No newline at end of file diff --git a/docs/Swift/ErrorHandling.md b/docs/Swift/ErrorHandling.md deleted file mode 100644 index eb67d7aa7..000000000 --- a/docs/Swift/ErrorHandling.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: swift-error-handling -title: Swift Error Handling -sidebar_label: Error Handling -sidebar_position: 8 -description: Enable code to respond to and recover from unexpected or erroneous conditions during execution. -tags: [Swift,Introduction,Concepts,Error Handling,programming Language] ---- - -Error handling in Swift enables code to respond to and recover from unexpected or erroneous conditions during execution. It uses the `throw`, `try`, `catch`, and `throws` keywords to propagate and handle errors safely. - -### Key Concepts: - -1. **Throwing Errors**: - - **`throw`**: Used to throw an error explicitly within a function or method. - ```swift - enum CustomError: Error { - case notFound - case serverError(String) - } - - func fetchData(from url: String) throws -> String { - if url.isEmpty { - throw CustomError.notFound - } - // Simulate fetching data - return "Data from \(url)" - } - ``` - -2. **Error Handling**: - - **`try`**: Marks a segment of code that can potentially throw an error. - - **`catch`**: Catches and handles errors thrown by a `try` block. - ```swift - do { - let data = try fetchData(from: "https://example.com/data") - print(data) - } catch CustomError.notFound { - print("Data not found") - } catch CustomError.serverError(let message) { - print("Server error: \(message)") - } catch { - print("An error occurred: \(error)") - } - ``` - -3. **Propagating Errors**: - - **`throws`**: Indicates that a function or method can throw errors to its caller. - - Allows errors to be handled or propagated up the call stack. - ```swift - func process() throws { - let result = try fetchData(from: "https://example.com/data") - print(result) - } - - do { - try process() - } catch { - print("Error processing data: \(error)") - } - ``` - -4. **Rethrowing Errors**: - - Functions marked with `throws` can rethrow errors thrown by functions they call. - - Useful for forwarding errors without handling them. - ```swift - func fetchAndProcessData(from url: String) throws { - let data = try fetchData(from: url) - // Process data - } - ``` - -5. **Error Types**: - - Errors are represented as types conforming to the `Error` protocol. - - Custom errors can be defined using `enum` to provide structured error handling. - -### Example: - -```swift -enum NetworkError: Error { - case invalidURL - case noInternetConnection -} - -func fetchData(from url: String) throws -> String { - guard let url = URL(string: url) else { - throw NetworkError.invalidURL - } - - // Simulate fetching data (network call) - if !isConnectedToInternet() { - throw NetworkError.noInternetConnection - } - - return "Data fetched successfully from \(url)" -} - -func processURL(_ urlString: String) { - do { - let result = try fetchData(from: urlString) - print(result) - } catch NetworkError.invalidURL { - print("Invalid URL") - } catch NetworkError.noInternetConnection { - print("No internet connection") - } catch { - print("Error: \(error)") - } -} - -func isConnectedToInternet() -> Bool { - // Simulate internet connectivity check - return true -} - -// Usage -processURL("https://example.com/data") -processURL("invalid-url") -``` - -### Key Concepts Demonstrated: - -- **Custom Errors**: `NetworkError` enum defines specific error cases (`invalidURL`, `noInternetConnection`) for structured error handling. -- **Error Propagation**: `fetchData(from:)` function propagates errors (`throw`) to its caller (`processURL(_:)`) using `throws` and `try`. -- **Error Handling**: `do-catch` block in `processURL(_:)` handles different error cases gracefully, ensuring robust error management in the application. - \ No newline at end of file diff --git a/docs/Swift/FunctionsAndClosures.md b/docs/Swift/FunctionsAndClosures.md deleted file mode 100644 index ea065bf78..000000000 --- a/docs/Swift/FunctionsAndClosures.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -id: swift-functions-and-closures -title: Functions and Closures -sidebar_label: Functions and Closures -sidebar_position: 5 -description: Functions and closures are fundamental concepts in Swift. -tags: [Swift,Introduction,Concepts,Functions and Closures,programming Language] ---- - -Functions and closures are fundamental concepts in Swift, providing mechanisms for defining and executing reusable blocks of code. - -**Functions**: -- Functions in Swift are self-contained blocks of code that perform a specific task. -- They can take parameters, return values, and are reusable throughout the codebase. - -**Closures**: -- Closures are anonymous functions that capture and store references to any constants and variables from the context in which they are defined. -- They can be passed around as variables and parameters to other functions, and provide a concise syntax for inline function-like behavior. - -### Concepts: - -1. **Functions**: - - **Declaration**: Defined using the `func` keyword, followed by a function name and parameters in parentheses. - - **Parameters**: Input values passed to the function when called, specified with a name and type. - - **Return Values**: Output values returned by the function, specified after an arrow (`->`) followed by the return type. - -2. **Closures**: - - **Closure Expression**: A block of code enclosed in curly braces `{}`. - - **Capture Lists**: Capture and store references to any constants and variables from the surrounding context. - - **Syntax**: Can be written in a concise form without a name or `func` keyword. - -### Example: - -```swift -// Function example -func greet(person: String) -> String { - return "Hello, \(person)!" -} - -let greeting = greet(person: "John") -print(greeting) // Output: Hello, John! - -// Closure example -let greetClosure = { (person: String) -> String in - return "Hello, \(person)!" -} - -let greetingClosure = greetClosure("Jane") -print(greetingClosure) // Output: Hello, Jane! -``` - -### Key Concepts Demonstrated: - -- **Functions**: `greet(person:)` function takes a `String` parameter `person` and returns a `String` greeting. -- **Closures**: `greetClosure` is an anonymous closure that captures the `person` parameter and returns a greeting string. - - -- **Function Types**: Functions in Swift are first-class citizens, meaning they can be assigned to variables, passed as parameters to other functions, and returned from functions. - -- **Capturing Values**: Closures can capture and store references to any constants and variables from the surrounding context in which they are defined. - -- **Trailing Closures**: When a closure is the last argument to a function, it can be written outside the parentheses, enhancing readability. - -```swift -// Example of using a trailing closure -func performAction(completion: () -> Void) { - print("Performing action...") - completion() -} - -performAction { - print("Action completed!") -} -// Output: -// Performing action... -// Action completed! -``` - -Functions and closures provide powerful tools for modularizing code, promoting reusability, and supporting functional programming paradigms in Swift. They are essential for writing clear, concise, and maintainable code in iOS, macOS, watchOS, and tvOS development. \ No newline at end of file diff --git a/docs/Swift/Introduction.md b/docs/Swift/Introduction.md deleted file mode 100644 index ad264df9d..000000000 --- a/docs/Swift/Introduction.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: swift-introduction -title: Swift Introduction -sidebar_label: Introduction -sidebar_position: 1 -description: what is Swfit and Concepts.. -tags: [Swift,Introduction,Concepts,programming Language] ---- - -Swift is a modern, statically-typed programming language developed by Apple for building iOS, macOS, watchOS, and tvOS applications. It emphasizes safety, speed, and expressiveness, aiming to simplify the development process. - -### Main Concepts: - -1. **Variables and Constants**: - - **Key Concepts**: Swift uses `var` for mutable variables and `let` for immutable constants, enforcing safe and clear data handling. - -2. **Optionals**: - - **Key Concepts**: Allows developers to handle potentially absent values safely using `?` and unwrapping with `!` or safe methods like optional binding. - -3. **Control Flow**: - - **Key Concepts**: Includes `if`, `for-in`, `while`, and powerful `switch` statements supporting pattern matching and range expressions. - -4. **Functions and Closures**: - - **Key Concepts**: Functions are defined with `func` and can take parameters and return values; closures provide flexible, self-contained blocks of functionality. - -5. **Object-Oriented Programming**: - - **Key Concepts**: Supports classes, structs, and enums, with classes allowing inheritance, properties, methods, and initializers. - -6. **Memory Management**: - - **Key Concepts**: Utilizes Automatic Reference Counting (ARC) to manage memory automatically, ensuring efficient memory usage without manual intervention. - -7. **Error Handling**: - - **Key Concepts**: Errors are represented by types conforming to the `Error` protocol, managed using `do-catch` blocks for structured error handling. - -8. **Concurrency**: - - **Key Concepts**: Swift provides async/await for asynchronous programming, enabling developers to manage concurrent tasks efficiently without blocking the main thread. - -These concepts encapsulate Swift's core features, designed to empower developers with a robust and versatile language for creating modern applications across Apple platforms. \ No newline at end of file diff --git a/docs/Swift/MemoryManagement.md b/docs/Swift/MemoryManagement.md deleted file mode 100644 index ecef15a74..000000000 --- a/docs/Swift/MemoryManagement.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -id: swift-memory-management -title: Swift Memory Management -sidebar_label: Memory Management -sidebar_position: 7 -description: Swift revolves around the automatic management of memory allocation and deallocation. -tags: [Swift,Introduction,Concepts,Memory Management,programming Language] ---- - -Memory management in Swift revolves around the automatic management of memory allocation and deallocation through Automatic Reference Counting (ARC). ARC tracks and manages instances of classes to ensure that memory is deallocated when no longer needed, preventing memory leaks and improving performance. - -### Key Concepts: - -1. **Automatic Reference Counting (ARC)**: - - **Concept**: ARC automatically tracks and manages the memory used by instances of classes. - - **Increment and Decrement**: ARC increments the reference count when a new instance is created or an existing reference is retained. It decrements the count when a reference is released or becomes nil. - -2. **Strong References**: - - **Concept**: By default, Swift uses strong references to manage memory. A strong reference keeps an instance alive as long as at least one strong reference to it exists. - - **Example**: - ```swift - class Person { - var name: String - init(name: String) { - self.name = name - print("\(name) is initialized") - } - deinit { - print("\(name) is deinitialized") - } - } - - var reference1: Person? - var reference2: Person? - var reference3: Person? - - reference1 = Person(name: "John") - reference2 = reference1 // Strong reference, increments reference count - reference3 = reference1 // Strong reference, increments reference count - - reference1 = nil // Decrements reference count - reference2 = nil // Decrements reference count - reference3 = nil // Decrements reference count - // Output: John is initialized - // John is deinitialized - ``` - -3. **Weak and Unowned References**: - - **Concept**: Weak and unowned references are used to avoid strong reference cycles (retain cycles) where two instances hold strong references to each other, preventing deallocation. - - **Example**: - ```swift - class Apartment { - var tenant: Person? - } - - class Person { - var apartment: Apartment? - } - - var john: Person? - var apartment: Apartment? - - john = Person() - apartment = Apartment() - - john!.apartment = apartment - apartment!.tenant = john - - john = nil // Breaks the strong reference cycle - apartment = nil // Breaks the strong reference cycle - ``` - -4. **Unowned References**: - - **Concept**: Unowned references are similar to weak references but assume that the reference will always have a value throughout its lifetime. They do not keep the instance alive, but do not require unwrapping as weak references do. - - **Example**: - ```swift - class Customer { - let name: String - var card: CreditCard? - init(name: String) { - self.name = name - } - deinit { print("\(name) is being deinitialized") } - } - - class CreditCard { - let number: UInt64 - unowned let customer: Customer - init(number: UInt64, customer: Customer) { - self.number = number - self.customer = customer - } - deinit { print("Card #\(number) is being deinitialized") } - } - - var john: Customer? - john = Customer(name: "John Appleseed") - john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!) - - john = nil - // Prints: - // John Appleseed is being deinitialized - // Card #1234567890123456 is being deinitialized - ``` - -### Example: - -```swift -// Example of strong reference cycle (retain cycle) without using weak or unowned references -class Person { - var apartment: Apartment? - deinit { - print("Person instance is being deinitialized") - } -} - -class Apartment { - var tenant: Person? - deinit { - print("Apartment instance is being deinitialized") - } -} - -var john: Person? -var unit4A: Apartment? - -john = Person() -unit4A = Apartment() - -john!.apartment = unit4A -unit4A!.tenant = john - -john = nil // Person instance is not deallocated because of the strong reference cycle -unit4A = nil // Apartment instance is not deallocated because of the strong reference cycle -``` - -### Concepts : - -- **Automatic Reference Counting (ARC)**: Manages memory allocation and deallocation automatically based on strong reference counts. -- **Strong, Weak, and Unowned References**: Differentiates between reference types to manage memory effectively and avoid retain cycles. -- **Deinitialization**: Executed automatically when an instance is no longer referenced, freeing up allocated memory. - \ No newline at end of file diff --git a/docs/Swift/Object-OrientedProgramming.md b/docs/Swift/Object-OrientedProgramming.md deleted file mode 100644 index 49a694115..000000000 --- a/docs/Swift/Object-OrientedProgramming.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -id: swift-object-oriented-programming -title: Swift Object-Oriented Programming -sidebar_label: Object-Oriented Programming -sidebar_position: 6 -description: Object-Oriented Programming (OOP) focuses on modeling software using objects that encapsulate data and behavior -tags: [Swift,Introduction,Object-Oriented Programming,Concepts,programming Language] ---- - -Object-Oriented Programming (OOP) focuses on modeling software using objects that encapsulate data and behavior. Swift supports OOP principles such as encapsulation, inheritance, polymorphism, and abstraction, which help in building modular, maintainable, and scalable applications. - -### Concepts: - -1. **Classes and Objects**: - - **Class**: Blueprint for creating objects. Defines properties (data) and methods (functions) that characterize objects. - - **Object**: Instance of a class that encapsulates data and behavior defined by its class. - -2. **Encapsulation**: - - **Concept**: Bundling of data (properties) and methods that operate on the data within a single unit (class). Access to data is restricted to methods of the class. - - **Example**: - ```swift - class Car { - private var engine: String // Encapsulated property - - init(engine: String) { - self.engine = engine - } - - func start() { - print("Starting \(engine) engine") - } - } - - let myCar = Car(engine: "V8") - myCar.start() // Output: Starting V8 engine - // myCar.engine = "V6" // Error: 'engine' is inaccessible due to 'private' protection level - ``` - -3. **Inheritance**: - - **Concept**: Mechanism where a class (subclass) can inherit properties and methods from another class (superclass). - - **Example**: - ```swift - class Vehicle { - var brand: String - - init(brand: String) { - self.brand = brand - } - - func drive() { - print("Driving the \(brand)") - } - } - - class Car: Vehicle { - var type: String - - init(brand: String, type: String) { - self.type = type - super.init(brand: brand) - } - } - - let myCar = Car(brand: "Toyota", type: "Sedan") - myCar.drive() // Output: Driving the Toyota - ``` - -4. **Polymorphism**: - - **Concept**: Ability to present the same interface for different data types. Methods can be overridden in subclasses to provide specialized implementations. - - **Example**: - ```swift - class Shape { - func draw() { - print("Drawing shape") - } - } - - class Circle: Shape { - override func draw() { - print("Drawing circle") - } - } - - let shape: Shape = Circle() - shape.draw() // Output: Drawing circle - ``` - -5. **Abstraction**: - - **Concept**: Hides complex implementation details behind a simpler interface. Abstract classes and protocols define interfaces without specifying implementation. - - **Example**: - ```swift - protocol Drawable { - func draw() - } - - class Circle: Drawable { - func draw() { - print("Drawing circle") - } - } - - let circle = Circle() - circle.draw() // Output: Drawing circle - ``` - -### Example: - -```swift -// Example of using inheritance and polymorphism -class Animal { - var name: String - - init(name: String) { - self.name = name - } - - func makeSound() { - print("Animal makes a sound") - } -} - -class Dog: Animal { - override func makeSound() { - print("Bark!") - } -} - -class Cat: Animal { - override func makeSound() { - print("Meow!") - } -} - -let myDog = Dog(name: "Buddy") -let myCat = Cat(name: "Whiskers") - -myDog.makeSound() // Output: Bark! -myCat.makeSound() // Output: Meow! -``` - -### Concepts : - -- **Classes and Objects**: `Animal`, `Dog`, and `Cat` are classes representing different types of animals. -- **Inheritance**: `Dog` and `Cat` inherit from `Animal`, sharing common behavior (`makeSound`) defined in `Animal`. -- **Polymorphism**: `makeSound` method is overridden in `Dog` and `Cat` to provide specialized behavior. \ No newline at end of file diff --git a/docs/Swift/Optionals.md b/docs/Swift/Optionals.md deleted file mode 100644 index 8354286ac..000000000 --- a/docs/Swift/Optionals.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -id: swift-optionals -title: Swift Optionals -sidebar_label: Optionals -sidebar_position: 3 -description: safely handle situations where a value may be missing. -tags: [Swift,Introduction,optionals,Concepts,programming Language] ---- - -Optionals in Swift provide a way to safely handle situations where a value may be missing. They allow you to write clearer and safer code by explicitly indicating the possibility of a `nil` value for variables and constants. - -### Concepts: - -1. **Optional Declaration**: - - **Syntax**: Optionals are declared by appending a `?` after the type name. - - **Example**: - ```swift - var optionalInt: Int? - optionalInt = 42 - optionalInt = nil - ``` - -2. **Unwrapping Optionals**: - - **Optional Binding**: Use `if let` or `guard let` to safely unwrap and assign an optional's value to a new constant or variable if it contains a non-nil value. - - **Example**: - ```swift - var optionalName: String? - - if let name = optionalName { - print("Hello, \(name)") - } else { - print("Hello, Guest") - } - ``` - -3. **Force Unwrapping**: - - **Syntax**: Use `!` after an optional value to force unwrap it and access the underlying value. Use with caution as it will trigger a runtime error if the optional is `nil`. - - **Example**: - ```swift - var optionalString: String? = "Hello" - let unwrappedString = optionalString! - ``` - -4. **Optional Chaining**: - - **Syntax**: Allows you to call properties, methods, and subscripts on an optional that might currently be `nil`. If the optional contains a value, the property, method, or subscript call succeeds; if the optional is `nil`, the call returns `nil`. - - **Example**: - ```swift - class Person { - var residence: Residence? - } - - class Residence { - var address: Address? - } - - class Address { - var street: String = "123 Swift Street" - } - - let person = Person() - let address = person.residence?.address?.street - ``` - -5. **Nil-Coalescing Operator**: - - **Syntax**: Provides a default value when unwrapping an optional that is `nil`. - - **Example**: - ```swift - let username: String? = nil - let greeting = "Hello, " + (username ?? "Guest") - ``` - -### Example: - -```swift -// Example of using optionals and optional binding -var optionalName: String? = "Alice" - -if let name = optionalName { - print("Hello, \(name)") // Output: Hello, Alice -} else { - print("Hello, Guest") -} - -optionalName = nil - -if let name = optionalName { - print("Hello, \(name)") -} else { - print("Hello, Guest") // Output: Hello, Guest -} -``` - -### Demonstrated: - -- **Optionals**: `optionalName` can hold either a `String` value or `nil`. -- **Optional Binding**: `if let` checks if `optionalName` contains a value and assigns it to `name` if so. -- **Nil-Coalescing Operator**: Provides a default value when `optionalName` is `nil`. \ No newline at end of file diff --git a/docs/Swift/VariablesAndConstants.md b/docs/Swift/VariablesAndConstants.md deleted file mode 100644 index cb6d77749..000000000 --- a/docs/Swift/VariablesAndConstants.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: swift-variable-constants -title: Variable and Constants -sidebar_label: Variable and Constants -sidebar_position: 2 -description: variables and constants are used to store values -tags: [Swift,Introduction,Variable,Concepts,programming Language] ---- - -In Swift, variables and constants are used to store values of different types like `Int`, `String`, `Bool`, etc. Variables are mutable, meaning their values can change after they are initialized, while constants are immutable, meaning their values cannot change once set. - -### Concepts: - -1. **Variables (`var`)**: - - **Declaration**: Declared using the `var` keyword followed by a name and optional type annotation (`: Type`). - - **Example**: - ```swift - var age: Int = 30 - age = 31 // Valid: Changing the value of a variable - ``` - -2. **Constants (`let`)**: - - **Declaration**: Declared using the `let` keyword followed by a name and optional type annotation (`: Type`). - - **Example**: - ```swift - let name: String = "John" - // name = "Jane" // Error: Cannot assign to value: 'name' is a 'let' constant - ``` - -3. **Type Inference**: - - **Concept**: Swift uses type inference to automatically determine the type of a variable or constant based on the initial value assigned. - - **Example**: - ```swift - var temperature = 25.5 // Inferred as Double - let message = "Welcome!" // Inferred as String - ``` - -4. **Mutability**: - - **Variables (`var`)**: Mutable; their values can be changed after initialization. - - **Constants (`let`)**: Immutable; their values cannot be changed once set. - -5. **Naming Conventions**: - - **CamelCase**: Preferred naming convention for variables and constants (`myVariable`, `myConstant`). - - **Meaningful Names**: Use descriptive names to indicate the purpose or content of the variable or constant. - -### Example: - -```swift -// Example demonstrating variables and constants -var count: Int = 10 -count = 15 // Valid: Changing the value of a variable - -let pi: Double = 3.14 -// pi = 3.14159 // Error: Cannot assign to value: 'pi' is a 'let' constant - -// Type inference example -var message = "Hello, World!" // Inferred as String -var number = 42 // Inferred as Int - -// Naming conventions -let firstName: String = "Alice" -var numberOfStudents: Int = 30 -``` - -### Concepts : - -- **Variables (`var`)**: `count` is declared as a variable and its value is mutable (`Int`). -- **Constants (`let`)**: `pi` is declared as a constant and its value is immutable (`Double`). -- **Type Inference**: Swift infers the type of `message` and `number` based on their initial values. -- **Naming Conventions**: `firstName` and `numberOfStudents` follow Swift's naming conventions for variables and constants. - \ No newline at end of file diff --git a/docs/Swift/_category_.json b/docs/Swift/_category_.json deleted file mode 100644 index 9fe3b6620..000000000 --- a/docs/Swift/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Swift", - "position": 22, - "link": { - "type": "generated-index", - "description": "Swift is a programming language developed by Apple Inc. It was introduced in 2014 as a modern alternative to Objective-C for iOS, macOS, watchOS, and tvOS development. " - } - } \ No newline at end of file diff --git a/docs/cpp/03_Control_Flow/01_Conditional_Statements.md b/docs/cpp/03_Control_Flow/01_Conditional_Statements.md deleted file mode 100644 index ee429b9d4..000000000 --- a/docs/cpp/03_Control_Flow/01_Conditional_Statements.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -id: cpp-conditional-statements -title: C++ Conditional Statements -sidebar_label: C++ Conditional Statements -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ features, - c++ control flow, - control flow, - c++ conditional statements, - conditional statements, - if, else if, else - ] -description: In this tutorial, we will learn about conditional statements in the C++ programming language. We will explore the syntax and usage of `if`, `else if`, and `else` statements, as well as switch-case structures. By understanding how to implement these conditional statements, you will be able to control the flow of your C++ programs and make decisions based on different conditions. ---- - -# Conditional Statements - -## Introduction - -Conditional statements in C++ are used to execute different blocks of code based on certain conditions. These statements allow you to control the flow of your program and make decisions during runtime. - -## Types of Conditional Statements - -### If Statement - -The `if` statement evaluates a boolean expression and executes a block of code if the expression is true. - -**Syntax:** - -```cpp -if (condition) { - // code to be executed if the condition is true -} -``` - -**Example:** - -```cpp -int number = 10; -if (number > 0) { - std::cout << "The number is positive." << std::endl; -} -``` - -### If-Else Statement - -The `if-else` statement provides an alternative block of code that executes if the boolean expression is false. - -**Syntax:** - -```cpp -if (condition) { - // code to be executed if the condition is true -} else { - // code to be executed if the condition is false -} -``` - -**Example:** - -```cpp -int number = -10; -if (number > 0) { - std::cout << "The number is positive." << std::endl; -} else { - std::cout << "The number is negative or zero." << std::endl; -} -``` - -### If-Else-If Ladder - -The `if-else-if` ladder allows you to check multiple conditions in sequence. The first condition that evaluates to true will have its corresponding block executed. - -**Syntax:** - -```cpp -if (condition1) { - // code to be executed if condition1 is true -} else if (condition2) { - // code to be executed if condition2 is true -} else { - // code to be executed if all conditions are false -} -``` - -**Example:** - -```cpp -int number = 0; -if (number > 0) { - std::cout << "The number is positive." << std::endl; -} else if (number < 0) { - std::cout << "The number is negative." << std::endl; -} else { - std::cout << "The number is zero." << std::endl; -} -``` - -### Nested If Statements - -You can nest `if` or `if-else` statements within another `if` or `if-else` statement to create more complex conditions. - -**Syntax:** - -```cpp -if (condition1) { - // code to be executed if condition1 is true - if (condition2) { - // code to be executed if condition2 is true - } -} -``` - -**Example:** - -```cpp -int number = 5; -if (number > 0) { - if (number % 2 == 0) { - std::cout << "The number is positive and even." << std::endl; - } else { - std::cout << "The number is positive and odd." << std::endl; - } -} -``` - -### Short Hand If...Else (Ternary Operator) - -There is also a short-hand if-else, known as the ternary operator because it consists of three operands. It can be used to replace multiple lines of code with a single line. It is often used to replace simple if-else statements. - -**Syntax:** - -```cpp -variable = (condition) ? expressionTrue : expressionFalse; -``` - -**Example:** - -Instead of writing: - -```cpp -int time = 20; -if (time < 18) { - std::cout << "Good day." << std::endl; -} else { - std::cout << "Good evening." << std::endl; -} -``` - -You can simply write: - -```cpp -int time = 20; -std::string result = (time < 18) ? "Good day." : "Good evening."; -std::cout << result << std::endl; -``` - -### Switch Statement - -The `switch` statement is used to execute one block of code among many based on the value of a variable or expression. - -**Syntax:** - -```cpp -switch (expression) { - case value1: - // code to be executed if expression equals value1 - break; - case value2: - // code to be executed if expression equals value2 - break; - // you can have any number of case statements - default: - // code to be executed if none of the cases match - break; -} -``` - -**Example:** - -```cpp -int day = 3; -switch (day) { - case 1: - std::cout << "Monday" << std::endl; - break; - case 2: - std::cout << "Tuesday" << std::endl; - break; - case 3: - std::cout << "Wednesday" << std::endl; - break; - case 4: - std::cout << "Thursday" << std::endl; - break; - case 5: - std::cout << "Friday" << std::endl; - break; - case 6: - std::cout << "Saturday" << std::endl; - break; - case 7: - std::cout << "Sunday" << std::endl; - break; - default: - std::cout << "Invalid day" << std::endl; - break; -} -``` - -## Conclusion - -Conditional statements are essential for controlling the flow of your C++ programs. By using `if`, `if-else`, `if-else-if` statements, nested `if` statements, the ternary operator, and `switch` statements, you can make your programs more dynamic and responsive to different conditions. diff --git a/docs/cpp/03_Control_Flow/02_Loops_in_Cpp.md b/docs/cpp/03_Control_Flow/02_Loops_in_Cpp.md deleted file mode 100644 index e95bef0a8..000000000 --- a/docs/cpp/03_Control_Flow/02_Loops_in_Cpp.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -id: loops-in-cpp -title: Loops in C++ -sidebar_label: Loops in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ features, - c++ control flow, - control flow, - c++ loops, - for, while - ] -description: In this tutorial, we will learn about loops in the C++ programming language. We will explore the syntax and usage of `for`, `while`, and `do-while` loops. By understanding how to implement these looping constructs, you will be able to execute code repeatedly based on specified conditions, making your C++ programs more efficient and powerful. ---- - -# Loops in CPP - -## Introduction - -Loops in C++ are used to execute a block of code repeatedly until a specified condition is met. They are essential for tasks that require repetition, such as iterating over arrays or performing a series of calculations. - -## Types of Loops - -### For Loop - -The `for` loop is used when you know in advance how many times you want to execute a statement or a block of statements. - -**Syntax:** - -```cpp -for (initialization; condition; update) { - // code to be executed -} -``` - -**Example:** - -```cpp -for (int i = 0; i < 5; i++) { - std::cout << "Iteration: " << i << std::endl; -} -``` - -### Range-based For Loop - -The range-based `for` loop, also known as the `for-each` loop, is used to iterate over elements in arrays or collections. - -**Syntax:** - -```cpp -for (type element : array) { - // code to be executed -} -``` - -**Example:** - -```cpp -int numbers[] = {1, 2, 3, 4, 5}; -for (int number : numbers) { - std::cout << "Number: " << number << std::endl; -} -``` - -### While Loop - -The `while` loop is used when you do not know in advance how many times you need to execute a block of code. It repeats the block as long as the specified condition is true. - -**Syntax:** - -```cpp -while (condition) { - // code to be executed -} -``` - -**Example:** - -```cpp -int i = 0; -while (i < 5) { - std::cout << "Iteration: " << i << std::endl; - i++; -} -``` - -### Do-While Loop - -The `do-while` loop is similar to the `while` loop, but it ensures that the code block is executed at least once before checking the condition. - -**Syntax:** - -```cpp -do { - // code to be executed -} while (condition); -``` - -**Example:** - -```cpp -int i = 0; -do { - std::cout << "Iteration: " << i << std::endl; - i++; -} while (i < 5); -``` - -## Control Statements - -### Break Statement - -The `break` statement is used to exit a loop prematurely when a certain condition is met. - -**Example:** - -```cpp -for (int i = 0; i < 10; i++) { - if (i == 5) { - break; - } - std::cout << "Iteration: " << i << std::endl; -} -``` - -### Continue Statement - -The `continue` statement is used to skip the current iteration of the loop and proceed to the next iteration. - -**Example:** - -```cpp -for (int i = 0; i < 10; i++) { - if (i == 5) { - continue; - } - std::cout << "Iteration: " << i << std::endl; -} -``` - -## Nested Loops - -You can nest loops within each other to handle more complex situations. - -**Example:** - -```cpp -for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - std::cout << "i: " << i << ", j: " << j << std::endl; - } -} -``` - -## Conclusion - -Loops are fundamental constructs in C++ that help execute code repeatedly based on specified conditions. Understanding how to use `for`, `while`, and `do-while` loops, along with control statements like `break` and `continue`, is essential for efficient programming. diff --git a/docs/cpp/03_Control_Flow/03_Switch_Case_Statements.md b/docs/cpp/03_Control_Flow/03_Switch_Case_Statements.md deleted file mode 100644 index 24feb8872..000000000 --- a/docs/cpp/03_Control_Flow/03_Switch_Case_Statements.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -id: switch-case-statements-in-cpp -title: Switch Case Statements in C++ -sidebar_label: Switch Case Statements in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ features, - c++ control flow, - control flow, - c++ switch, - switch case statement - ] -description: In this tutorial, we will learn about switch case statements in the C++ programming language. We will explore the syntax and usage of the switch statement and how to handle multiple cases. By understanding how to implement switch case statements, you will be able to simplify complex conditional logic and improve the readability of your C++ programs. ---- - -# Switch and Ternary Statements - -## Introduction - -Switch and ternary statements are control flow tools in C++ that help manage decision-making processes within your code. The `switch` statement provides a way to handle multiple conditions based on the value of a single variable, while the ternary operator offers a concise way to execute one of two possible expressions based on a condition. - -## Switch Statement - -The `switch` statement is used to execute one block of code among many based on the value of a variable or expression. It is particularly useful when you have multiple potential values for a variable and want to execute different code blocks depending on that value. - -### Syntax - -```cpp -switch (expression) { - case value1: - // code to be executed if expression equals value1 - break; - case value2: - // code to be executed if expression equals value2 - break; - // you can have any number of case statements - default: - // code to be executed if none of the cases match - break; -} -``` - -### Example - -```cpp -int day = 3; -switch (day) { - case 1: - std::cout << "Monday" << std::endl; - break; - case 2: - std::cout << "Tuesday" << std::endl; - break; - case 3: - std::cout << "Wednesday" << std::endl; - break; - case 4: - std::cout << "Thursday" << std::endl; - break; - case 5: - std::cout << "Friday" << std::endl; - break; - case 6: - std::cout << "Saturday" << std::endl; - break; - case 7: - std::cout << "Sunday" << std::endl; - break; - default: - std::cout << "Invalid day" << std::endl; - break; -} -``` - -### Points to Remember - -- Each `case` must be followed by a constant value and a colon. -- The `break` statement is used to terminate a case and prevent fall-through to subsequent cases. -- The `default` case is optional and executes if none of the other cases match. It is similar to the `else` clause in an `if-else` statement. - -## Ternary Operator - -The ternary operator is a shorthand way of writing an `if-else` statement. It is used to assign a value to a variable based on a condition. - -### Syntax - -```cpp -variable = (condition) ? expressionTrue : expressionFalse; -``` - -### Example - -```cpp -int time = 20; -std::string result = (time < 18) ? "Good day." : "Good evening."; -std::cout << result << std::endl; -``` - -#### Explanation - -- The condition `time < 18` is evaluated. -- If the condition is true, "Good day." is assigned to `result`. -- If the condition is false, "Good evening." is assigned to `result`. - -### Points to Remember - -- The ternary operator is composed of three parts: a condition, an expression to execute if the condition is true, and an expression to execute if the condition is false. -- It is a more concise way to write simple `if-else` statements and can make the code more readable when used appropriately. - -## Conclusion - -Switch and ternary statements are powerful tools for managing control flow in C++ programs. The `switch` statement is useful for handling multiple conditions based on a single variable, while the ternary operator offers a compact way to perform conditional assignments. Understanding how to use these constructs effectively can enhance your ability to write clear and efficient C++ code. diff --git a/docs/cpp/03_Control_Flow/_category_.json b/docs/cpp/03_Control_Flow/_category_.json deleted file mode 100644 index 4863bf926..000000000 --- a/docs/cpp/03_Control_Flow/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Control Flow In C++", - "position": 4, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about control flow in C++, the mechanisms that dictate the order in which statements and instructions are executed. We will cover essential concepts such as conditional statements, loops, and control flow constructs that enable you to manage the execution path of your C++ programs efficiently and logically." - } -} \ No newline at end of file diff --git a/docs/cpp/04_Functions/01_Function_Basics.md b/docs/cpp/04_Functions/01_Function_Basics.md deleted file mode 100644 index 3261ba0bf..000000000 --- a/docs/cpp/04_Functions/01_Function_Basics.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -id: cpp-functions-basics -title: The Basics of C++ Functions -sidebar_label: The Basics of C++ Functions -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ features, - functions basics, - c++ functions - ] -description: In this tutorial, we will learn about the basics of functions in the C++ programming language. We will explore the syntax for defining and calling functions, the concept of return types, and the use of parameters. By understanding how to create and utilize functions, you will be able to organize your code more effectively and improve its modularity and reusability. ---- - -# Functions - -## Introduction - -A function is a block of code which only runs when it is called. You can pass data, known as parameters, into a function. Functions are used to perform certain actions and are important for reusing code: define the code once, and use it many times. - -## Create a Function - -C++ provides some pre-defined functions, such as `main()`, which is used to execute code. But you can also create your own functions to perform certain actions. To create (often referred to as declare) a function, specify the name of the function, followed by parentheses `()`. - -### Syntax - -```cpp -void myFunction() { - // code to be executed -} -``` - -### Example Explained - -- `myFunction()` is the name of the function. -- `void` means that the function does not have a return value. You will learn more about return values later. -- Inside the function (the body), add code that defines what the function should do. - -## Call a Function - -Declared functions are not executed immediately. They are "saved for later use" and will be executed later, when they are called. To call a function, write the function's name followed by two parentheses `()` and a semicolon `;`. - -### Example - -Inside `main`, call `myFunction()`: - -```cpp -// Create a function -void myFunction() { - std::cout << "I just got executed!"; -} - -int main() { - myFunction(); // call the function - return 0; -} - -// Outputs "I just got executed!" -``` - -A function can be called multiple times: - -### Example - -```cpp -void myFunction() { - std::cout << "I just got executed!\n"; -} - -int main() { - myFunction(); - myFunction(); - myFunction(); - return 0; -} - -// I just got executed! -// I just got executed! -// I just got executed! -``` - -## Function Declaration and Definition - -A C++ function consists of two parts: - -1. **Declaration:** the return type, the name of the function, and parameters (if any). -2. **Definition:** the body of the function (code to be executed). - -```cpp -int main() { - myFunction(); - return 0; -} - -void myFunction() { - cout << "I just got executed!"; -} - -// Error -``` - -Note: If a user-defined function, such as `myFunction()`, is declared after the `main()` function, an error will occur: - -### Example - -```cpp -int main() { - myFunction(); - return 0; -} - -void myFunction() { - std::cout << "I just got executed!"; -} - -// Error -``` - -However, it is possible to separate the declaration and the definition of the function - for code optimization. You will often see C++ programs that have function declaration above `main()`, and function definition below `main()`. This will make the code better organized and easier to read: - -### Example - -```cpp -// Function declaration -void myFunction(); - -// The main method -int main() { - myFunction(); // call the function - return 0; -} - -// Function definition -void myFunction() { - std::cout << "I just got executed!"; -} -``` - -## Conclusion - -Functions are fundamental building blocks in C++ programming that help in organizing code, improving readability, and promoting code reuse. Understanding how to declare, define, and call functions is essential for efficient and effective programming in C++. diff --git a/docs/cpp/04_Functions/02_Function_Parameters_and_Return_Types.md b/docs/cpp/04_Functions/02_Function_Parameters_and_Return_Types.md deleted file mode 100644 index d416f9b42..000000000 --- a/docs/cpp/04_Functions/02_Function_Parameters_and_Return_Types.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -id: cpp-function-parameters-and-return-types -title: Function Parameters and Return Types -sidebar_label: Function Parameters and Return Types in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ features, - c++ functions - function parameters, - function return types - ] -description: In this tutorial, we will learn about function parameters and return types in the C++ programming language. We will explore how to define and use parameters, the different types of return values, and how to handle multiple parameters. By understanding function parameters and return types, you will be able to create more flexible and powerful functions in your C++ programs. ---- - -# Parameters and Arguments - -## Introduction - -Information can be passed to functions as parameters. Parameters act as variables inside the function. - -## Parameters / Arguments - -Parameters are specified after the function name, inside the parentheses. You can add as many parameters as you want, just separate them with a comma. - -### Syntax - -```cpp -void functionName(parameter1, parameter2, parameter3) { - // code to be executed -} -``` - -The following example has a function that takes a string called `fname` as a parameter. When the function is called, we pass along a first name, which is used inside the function to print the full name. - -### Example - -```cpp -#include -using namespace std; - -void myFunction(string fname) { - cout << fname << " Refsnes\n"; -} - -int main() { - myFunction("Liam"); - myFunction("Jenny"); - myFunction("Anja"); - return 0; -} - -// Outputs: -// Liam Refsnes -// Jenny Refsnes -// Anja Refsnes -``` - -### Arguments - -When a parameter is passed to the function, it is called an argument. So, from the example above: `fname` is a parameter, while `Liam`, `Jenny`, and `Anja` are arguments. - - -## Default Parameter Value - -You can also use a default parameter value by using the equals sign (`=`). If we call the function without an argument, it uses the default value ("Norway"): - -```cpp -void myFunction(string country = "Norway") { - cout << country << "\n"; -} - -int main() { - myFunction("Sweden"); - myFunction("India"); - myFunction(); - myFunction("USA"); - return 0; -} -``` - -Output: -``` -Sweden -India -Norway -USA -``` - -A parameter with a default value is often known as an "optional parameter." From the example above, `country` is an optional parameter, and "Norway" is the default value. - -## Multiple Parameters - -Inside the function, you can add as many parameters as you want: - -```cpp -void myFunction(string fname, int age) { - cout << fname << " Refsnes. " << age << " years old. \n"; -} - -int main() { - myFunction("Liam", 3); - myFunction("Jenny", 14); - myFunction("Anja", 30); - return 0; -} -``` - -Output: -``` -Liam Refsnes. 3 years old. -Jenny Refsnes. 14 years old. -Anja Refsnes. 30 years old. -``` - -> **_NOTE:_** Note that when you are working with multiple parameters, the function call must have the same number of arguments as there are parameters, and the arguments must be passed in the same order. - -## Return Values - -The `void` keyword, used in the previous examples, indicates that the function should not return a value. If you want the function to return a value, you can use a data type (such as `int`, `string`, etc.) instead of `void`, and use the `return` keyword inside the function: - -```cpp -int myFunction(int x) { - return 5 + x; -} - -int main() { - cout << myFunction(3); // Outputs 8 (5 + 3) - return 0; -} -``` - -This example returns the sum of a function with two parameters: - -```cpp -int myFunction(int x, int y) { - return x + y; -} - -int main() { - cout << myFunction(5, 3); // Outputs 8 (5 + 3) - return 0; -} -``` - -You can also store the result in a variable: - -```cpp -int myFunction(int x, int y) { - return x + y; -} - -int main() { - int z = myFunction(5, 3); - cout << z; // Outputs 8 (5 + 3) - return 0; -} -``` - -## Conclusion - -Parameters and arguments are essential for passing information to functions, enabling code reusability and modular programming. Parameters are variables defined by the function to receive the input values (arguments) when the function is called. diff --git a/docs/cpp/04_Functions/03_Function_Overloading.md b/docs/cpp/04_Functions/03_Function_Overloading.md deleted file mode 100644 index 0f3740269..000000000 --- a/docs/cpp/04_Functions/03_Function_Overloading.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -id: cpp-function-overloading -title: Function Overloading in C++ -sidebar_label: Function Overloading in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ features, - c++ functions - function parameters, - function return types - ] -description: In this tutorial, we will explore the concept of function overloading in the C++ programming language. We'll delve into how to define multiple functions with the same name but different parameter lists. By understanding function overloading, you'll learn how to write cleaner, more concise code and enhance the flexibility and readability of your C++ programs. ---- - -# Function Overloading - -Function overloading in C++ allows you to have multiple functions with the same name but different parameters. This enables you to create more flexible and reusable code by providing different ways to handle inputs based on their types or number. - -## Syntax - -```cpp -return_type function_name(type1 parameter1, type2 parameter2, ...); -``` - -## Example - -Consider the following example, which has two functions that add numbers of different types: - -```cpp -int plusFuncInt(int x, int y) { - return x + y; -} - -double plusFuncDouble(double x, double y) { - return x + y; -} - -int main() { - int myNum1 = plusFuncInt(8, 5); - double myNum2 = plusFuncDouble(4.3, 6.26); - cout << "Int: " << myNum1 << "\n"; - cout << "Double: " << myNum2; - return 0; -} -``` - -Instead of defining two separate functions that essentially do the same thing, it's better to overload one function. Here's how you can overload the `plusFunc` function to work for both `int` and `double`: - -```cpp -int plusFunc(int x, int y) { - return x + y; -} - -double plusFunc(double x, double y) { - return x + y; -} - -int main() { - int myNum1 = plusFunc(8, 5); - double myNum2 = plusFunc(4.3, 6.26); - cout << "Int: " << myNum1 << "\n"; - cout << "Double: " << myNum2; - return 0; -} -``` - -> **Note :** Note that multiple functions can have the same name as long as the number and/or type of parameters are different. This flexibility allows you to write more concise and expressive code while maintaining readability and efficiency. \ No newline at end of file diff --git a/docs/cpp/04_Functions/_category_.json b/docs/cpp/04_Functions/_category_.json deleted file mode 100644 index b28bbc33b..000000000 --- a/docs/cpp/04_Functions/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Functions In C++", - "position": 5, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about functions in C++, the building blocks that allow you to organize and modularize your code. We will cover the syntax for defining and calling functions, the use of parameters and return values, and best practices for creating reusable and maintainable code with functions." - } -} \ No newline at end of file diff --git a/docs/cpp/05_Arrays_and_Strings/01_Array_Basics.md b/docs/cpp/05_Arrays_and_Strings/01_Array_Basics.md deleted file mode 100644 index 7e8fdaa60..000000000 --- a/docs/cpp/05_Arrays_and_Strings/01_Array_Basics.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -id: cpp-array-basics -title: The Basics of C++ Arrays -sidebar_label: The Basics of C++ Arrays -sidebar_position: 1 -tags: - [ - c++, - c++ programming, - c++ features, - arrays, - c++ array basics, - c++ arrays - ] -description: In this tutorial, we will cover the basics of C++ arrays. We'll explore how to declare, initialize, and access elements in arrays, as well as discuss multidimensional arrays. By understanding the fundamentals of C++ arrays, you'll be equipped to work with collections of data efficiently and effectively in your programs. ---- - -An array in programming, including in languages like C++, is a data structure that allows you to store multiple values of the same type under a single name. It's essentially a collection of elements (such as integers, characters, or other data types) that are stored in contiguous memory locations. - -### 1. Declaration and Initialization - - **Declaration:** Arrays are declared using the syntax `type name[size];`, where: - - `type` specifies the type of elements (e.g., `int`, `double`). - - `name` is the identifier of the array. - - `size` is the number of elements in the array. - - ```cpp - int numbers[5]; // declares an array of 5 integers - ``` - - - **Initialization:** Arrays can be initialized at the time of declaration: - - ```cpp - int numbers[5] = {1, 2, 3, 4, 5}; // initializes the array with specific values - ``` - - You can also omit the size when initializing an array, and the compiler will infer it from the number of elements provided: - - ```cpp - int numbers[] = {1, 2, 3, 4, 5}; // size of array is automatically determined (5 in this case) - ``` - -### 2. Accessing Elements - - Array elements are accessed using zero-based indexing. The first element is at index `0`, the second at index `1`, and so on. - - ```cpp - int firstNumber = numbers[0]; // accesses the first element of the array - ``` - -### 3. Iterating through an Array - - You can iterate through the elements of an array using loops, like a `for` loop: - - ```cpp - for (int i = 0; i < 5; ++i) { - cout << numbers[i] << " "; // prints each element of the array - } - ``` - -### 4. Array Size - - The size of an array in C++ is fixed and specified at compile-time. You can use the `sizeof` operator to determine the size of an array in bytes: - - ```cpp - int size = sizeof(numbers) / sizeof(numbers[0]); // calculates the number of elements in 'numbers' - ``` - -### 5. Multidimensional Arrays - - C++ supports multidimensional arrays, which are arrays of arrays or arrays of higher dimensions. - - ```cpp - int matrix[3][3]; // declares a 3x3 matrix - ``` - - - Accessing elements in a 2D array involves using two indices: - - ```cpp - matrix[0][0] = 1; // sets the element at the first row and first column to 1 - ``` - -### 6. Passing Arrays to Functions - - Arrays can be passed to functions either as pointers to the first element or as references. - - ```cpp - void printArray(int arr[], int size) { - for (int i = 0; i < size; ++i) { - cout << arr[i] << " "; - } - } - - // calling the function with 'numbers' - printArray(numbers, 5); - ``` - - -### Key Points - -1. **Fixed Size:** Arrays have a fixed size determined at the time of declaration. Once declared, the size cannot be changed during program execution. - -2. **Contiguous Memory:** Elements in an array are stored next to each other in memory. This property allows for efficient access to array elements using indices. - -3. **Zero-based Indexing:** In most programming languages, including C++, arrays use zero-based indexing. This means the first element of the array is accessed using index `0`, the second with index `1`, and so on. - -4. **Homogeneous Elements:** Arrays can only store elements of the same data type. For example, an array of integers (`int`) cannot store characters (`char`) or floating-point numbers (`float`). - -### Benefits -1. **Efficient Access:** Arrays provide O(1) time complexity for accessing elements by index. This efficiency is due to the elements being stored in contiguous memory locations, allowing direct access based on the index. - -2. **Compact Storage:** Arrays store elements in a compact manner, utilizing contiguous memory blocks. This storage efficiency makes arrays suitable for situations where memory usage needs to be optimized. - -3. **Sequential Access:** Arrays facilitate sequential access to elements, making them ideal for tasks that involve processing elements in a linear order, such as iterating through a list of items. - -4. **Index-based Operations:** Arrays support direct access to elements based on their index, enabling efficient random access and manipulation of data elements. - -5. **Simple Syntax:** Arrays have a straightforward syntax for declaration, initialization, and accessing elements, making them easy to use and understand for developers. - -6. **Foundation for Data Structures:** Many fundamental data structures, such as stacks, queues, and matrices, are implemented using arrays as their underlying storage mechanism. This foundational role makes arrays essential in building more complex data structures and algorithms. - -7. **Support for Multidimensionality:** Arrays in languages like C++ can be multidimensional, allowing for the storage and manipulation of matrices and other structured data formats. - -8. **Parameter Passing:** Arrays can be efficiently passed as parameters to functions, either by reference or by pointer, enabling modular and reusable code. - -Arrays provide a versatile and efficient way to manage collections of data in programming, offering benefits that contribute to performance optimization, simplicity in code implementation, and support for various data manipulation tasks. - -### Conclusion - Arrays in C++ are fundamental data structures used to store collections of elements of the same type in contiguous memory locations. They are declared with a fixed size at compile-time and can be initialized either when declared or later. Accessing array elements is done using zero-based indexing, and iterating through arrays allows for processing each element sequentially. C++ also supports multidimensional arrays, enabling storage of data in multiple dimensions like matrices. Understanding these basics equips programmers to efficiently manage and manipulate data sets in their programs, laying a strong foundation for more advanced data structures and algorithms. \ No newline at end of file diff --git a/docs/cpp/05_Arrays_and_Strings/02_String_Manipulation.md b/docs/cpp/05_Arrays_and_Strings/02_String_Manipulation.md deleted file mode 100644 index 7863533c4..000000000 --- a/docs/cpp/05_Arrays_and_Strings/02_String_Manipulation.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -id: cpp-string-manipulation -title: String Manipulation in C++ -sidebar_label: String Manipulation in C++ -sidebar_position: 2 -tags: - [ - c++, - c++ programming, - programming, - c++ strings, - string manipulation - string data type - ] -description: In this tutorial, we will delve into string manipulation in C++. We'll explore how to perform various operations such as concatenation, substring extraction, and searching within strings. By understanding the techniques for manipulating strings, you'll be able to handle textual data effectively in your C++ programs, enabling you to develop more versatile and robust applications. ---- - -String manipulation refers to the process of performing various operations on strings, which are sequences of characters. These operations can include creating, modifying, parsing, and analyzing strings to achieve specific outcomes or to format text for display, storage, or transmission. - -## Using C-Style Strings (Character Arrays) - -### Declaring and Initializing - -```cpp -char str1[] = "Hello"; -char str2[20] = "World"; -``` - -### Accessing and Modifying - -```cpp -str1[0] = 'h'; // Changes 'H' to 'h' -``` - -## String Concatenation - -### Using C-Style Strings - -To concatenate C-style strings, you can use the `strcat` function from the `` library: - -```cpp -#include -#include - -int main() { - char str1[20] = "Hello, "; - char str2[] = "World!"; - strcat(str1, str2); - std::cout << str1 << std::endl; // Output: Hello, World! - return 0; -} -``` - -### Using `std::string` - -The `std::string` class in the C++ Standard Library provides a more flexible and powerful way to manipulate strings. - -```cpp -#include -#include - -int main() { - std::string str1 = "Hello, "; - std::string str2 = "World!"; - std::string result = str1 + str2; - std::cout << result << std::endl; // Output: Hello, World! - return 0; -} -``` - -## Substring Extraction - -### Using `std::string` - -The `std::string` class provides the `substr` method to extract substrings. - -```cpp -#include -#include - -int main() { - std::string str = "Hello, World!"; - std::string substr = str.substr(7, 5); // Extracts "World" - std::cout << substr << std::endl; // Output: World - return 0; -} -``` - -## Searching within Strings - -### Using C-Style Strings - -To search for a substring within a C-style string, you can use the `strstr` function from the `` library: - -```cpp -#include -#include - -int main() { - const char *str = "Hello, World!"; - const char *substr = "World"; - const char *found = strstr(str, substr); - if (found) { - std::cout << "Substring found at position: " << found - str << std::endl; - } else { - std::cout << "Substring not found." << std::endl; - } - return 0; -} -``` - -### Using `std::string` - -The `std::string` class provides the `find` method to search for substrings. - -```cpp -#include -#include - -int main() { - std::string str = "Hello, World!"; - std::string substr = "World"; - size_t found = str.find(substr); - if (found != std::string::npos) { - std::cout << "Substring found at position: " << found << std::endl; - } else { - std::cout << "Substring not found." << std::endl; - } - return 0; -} -``` - -## Additional String Operations - -### Conversion Between `std::string` and C-Style Strings - -- Convert `std::string` to C-style string: - - ```cpp - std::string str = "Hello"; - const char *c_str = str.c_str(); - ``` - -- Convert C-style string to `std::string`: - - ```cpp - const char *c_str = "Hello"; - std::string str(c_str); - ``` - -### String Comparison - -- Using C-Style Strings: - - ```cpp - if (strcmp(str1, str2) == 0) { - std::cout << "Strings are equal." << std::endl; - } - ``` - -- Using `std::string`: - - ```cpp - if (str1 == str2) { - std::cout << "Strings are equal." << std::endl; - } - ``` - -## Key Points - -1. **String Concatenation** - - **C-Style Strings**: Use `strcat` to concatenate. - - **`std::string`**: Use the `+` operator for easy concatenation. - -2. **Substring Extraction** - - **C-Style Strings**: Requires manual manipulation or additional functions. - - **`std::string`**: Use `substr` method for straightforward extraction. - -3. **Searching within Strings** - - **C-Style Strings**: Use `strstr` to find a substring. - - **`std::string`**: Use `find` method for easy searching. - -4. **Conversion Between String Types** - - Convert between `std::string` and C-style strings using `c_str()` and constructors. - -5. **String Comparison** - - **C-Style Strings**: Use `strcmp` to compare. - - **`std::string`**: Use `==` operator for easy comparison. - -## Benefits - -1. **Ease of Use with `std::string`** - - The `std::string` class provides a wide range of member functions that simplify string manipulation. - - Concatenation, extraction, and searching operations are more intuitive and less error-prone compared to C-style strings. - -2. **Safety and Flexibility** - - `std::string` automatically manages memory, reducing the risk of buffer overflows and memory leaks. - - `std::string` objects can grow dynamically, eliminating the need for pre-allocated buffer sizes. - -3. **Standard Library Integration** - - `std::string` integrates seamlessly with the C++ Standard Library, offering compatibility with many algorithms and functions. - - Functions like `substr`, `find`, and others provide powerful and convenient string manipulation capabilities. - -4. **Improved Readability and Maintainability** - - Code using `std::string` is generally easier to read and maintain compared to code using C-style strings. - - Operator overloading (e.g., `+` for concatenation, `==` for comparison) makes the code more expressive and concise. - -5. **Enhanced Functionality** - - `std::string` supports advanced features such as iterators, allowing for more complex operations and integration with other Standard Library features. - - Additional methods like `replace`, `insert`, and `erase` provide comprehensive string manipulation capabilities. - -6. **Cross-Platform Consistency** - - The behavior of `std::string` is consistent across different platforms, making it a reliable choice for portable code. - -## Conclusion - Mastering string manipulation in C++ is essential for handling textual data effectively in your programs. Whether using C-style strings or the more powerful `std::string` class, you can perform a variety of operations such as concatenation, substring extraction, and searching within strings. By leveraging these techniques, you can create more versatile and robust applications. Understanding how to manipulate strings allows you to manage user input, process data, and perform complex text processing tasks with ease, thereby enhancing the functionality and user experience of your software. \ No newline at end of file diff --git a/docs/cpp/05_Arrays_and_Strings/03_Character_Arrays.md b/docs/cpp/05_Arrays_and_Strings/03_Character_Arrays.md deleted file mode 100644 index 7c588d520..000000000 --- a/docs/cpp/05_Arrays_and_Strings/03_Character_Arrays.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -id: cpp-character-arrays -title: Character Arrays in C++ -sidebar_label: Character Arrays in C++ -sidebar_position: 3 -tags: - [ - c++, - c++ programming, - programming, - c++ arrays, - character arrays, - programming arrays - ] -description: In this tutorial, we'll explore character arrays in C++. We'll cover how to declare, initialize, and manipulate character arrays, including techniques for string input and output. By mastering the basics of character arrays, you'll gain a fundamental understanding of handling character-based data in C++, laying a solid foundation for more advanced text processing and manipulation tasks. ---- - -Character arrays in C++ are a fundamental way to handle strings and other character-based data. They allow you to store sequences of characters and perform various operations on them. Let's go through the basics of declaring, initializing, and manipulating character arrays. - -### 1. Declaring a Character Array - -To declare a character array, you specify the type `char` followed by the array name and the number of elements in square brackets. - -```cpp -char myArray[10]; -``` - -This declares an array named `myArray` that can hold up to 10 characters. - -### 2. Initializing a Character Array - -You can initialize a character array in several ways: - -#### Direct Initialization - -```cpp -char myArray[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; -``` - -Note the `'\0'` character at the end. This is the null terminator, which signifies the end of the string in C++. Without it, functions that work with C-style strings may not function correctly. - -#### String Literal Initialization - -```cpp -char myArray[] = "Hello"; -``` - -Here, the compiler automatically determines the size of the array based on the string literal. It also includes the null terminator automatically. - -### 3. Accessing Elements of a Character Array - -You can access individual characters in the array using the array index. - -```cpp -char myArray[] = "Hello"; -char firstChar = myArray[0]; // 'H' -char secondChar = myArray[1]; // 'e' -``` - -### 4. Modifying Elements of a Character Array - -You can modify elements by assigning new values to specific indices. - -```cpp -char myArray[] = "Hello"; -myArray[0] = 'h'; // Now myArray contains "hello" -``` - -### 5. String Input and Output - -#### Input Using `cin` - -You can use `cin` to read a string into a character array. - -```cpp -char myArray[100]; -std::cin >> myArray; -``` - -Note that `cin` stops reading input at the first whitespace character. To read an entire line, you can use `cin.getline()`. - -```cpp -char myArray[100]; -std::cin.getline(myArray, 100); -``` - -#### Output Using `cout` - -You can use `cout` to print a character array. - -```cpp -char myArray[] = "Hello"; -std::cout << myArray; -``` - -### 6. Common Operations on Character Arrays - -#### String Length - -To find the length of a string (number of characters before the null terminator), you can use the `strlen` function from the `cstring` library. - -```cpp -#include - -char myArray[] = "Hello"; -size_t length = std::strlen(myArray); // length is 5 -``` - -#### String Copy - -To copy one character array to another, use the `strcpy` function. - -```cpp -#include - -char source[] = "Hello"; -char destination[10]; -std::strcpy(destination, source); // destination now contains "Hello" -``` - -#### String Concatenation - -To concatenate two strings, use the `strcat` function. - -```cpp -#include - -char greeting[20] = "Hello, "; -char name[] = "world!"; -std::strcat(greeting, name); // greeting now contains "Hello, world!" -``` -## Important Key Points - -### 1. Declaration - - **Syntax:** `char arrayName[size];` - - **Example:** `char myArray[10];` - - This creates a fixed-size array capable of holding `size` characters. - -### 2. Initialization - - **Direct Initialization:** `char myArray[6] = {'H', 'e', 'l', 'l', 'o', '\0'};` - - The `'\0'` null terminator is crucial for marking the end of the string. - - **String Literal Initialization:** `char myArray[] = "Hello";` - - The null terminator is automatically added by the compiler. - -### 3. Accessing and Modifying Elements - - **Access Elements:** Use array indexing: `char firstChar = myArray[0];` - - **Modify Elements:** Assign a new value using the index: `myArray[0] = 'h';` - -### 4. String Input and Output - - **Input Using `cin`:** Reads input until the first whitespace. - ```cpp - char myArray[100]; - std::cin >> myArray; - ``` - - **Input Using `cin.getline`:** Reads an entire line, including spaces. - ```cpp - char myArray[100]; - std::cin.getline(myArray, 100); - ``` - - **Output Using `cout`:** - ```cpp - char myArray[] = "Hello"; - std::cout << myArray; - ``` - -### 5. Common Operations - - **String Length:** Use `strlen` to find the length (excluding null terminator). - ```cpp - #include - size_t length = std::strlen(myArray); - ``` - - **String Copy:** Use `strcpy` to copy one string to another. - ```cpp - #include - std::strcpy(destination, source); - ``` - - **String Concatenation:** Use `strcat` to concatenate two strings. - ```cpp - #include - std::strcat(greeting, name); - ``` - -### 6. Null Terminator Importance - - Every C-style string must end with a null terminator (`'\0'`) to mark the end of the string. Functions like `strlen`, `strcpy`, and `strcat` depend on it to determine where the string ends. - -### 7. Fixed Size Limitation - - Character arrays have a fixed size determined at compile time. Be mindful of buffer overflows and always ensure that strings do not exceed the allocated array size. - -### 8. Memory Management - - Unlike `std::string`, character arrays do not manage memory automatically. You need to ensure proper memory allocation and deallocation if you dynamically allocate memory for character arrays. - -## Conclusion - -Character arrays are a powerful tool in C++ for handling strings and character data. By understanding how to declare, initialize, access, and manipulate character arrays, you can perform a wide range of text processing tasks. These basics lay the foundation for more advanced operations and techniques in C++ string handling. diff --git a/docs/cpp/05_Arrays_and_Strings/_category_.json b/docs/cpp/05_Arrays_and_Strings/_category_.json deleted file mode 100644 index 65a15185d..000000000 --- a/docs/cpp/05_Arrays_and_Strings/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Arrays and Strings in C++", - "position": 6, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about arrays and strings in C++, the fundamental structures for storing and manipulating sequences of data. We will cover how to declare, initialize, and access arrays, as well as the various ways to handle and operate on strings, enabling you to efficiently manage collections of data in your programs." - } -} \ No newline at end of file diff --git a/docs/cpp/06_Pointers_and_References/01_Pointer_Basics.md b/docs/cpp/06_Pointers_and_References/01_Pointer_Basics.md deleted file mode 100644 index 9b457e236..000000000 --- a/docs/cpp/06_Pointers_and_References/01_Pointer_Basics.md +++ /dev/null @@ -1,287 +0,0 @@ ---- -id: cpp-pointer-basics -title: The Basics of C++ Pointers -sidebar_label: The Basics of C++ Pointers -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ programming, - pointers, - c++ pointers, - pointer basics - ] -description: In this tutorial, we'll dive into the basics of C++ pointers. We'll explore how pointers work, how to declare and initialize them, and how to use them to manipulate memory addresses and data. Understanding pointers is crucial for advanced memory management and data manipulation in C++, making this tutorial essential for any programmer aiming to master the language. ---- - -A pointer is a variable that stores the memory address of another variable. Instead of holding a data value directly, a pointer holds the address where the data is stored. This allows for efficient data manipulation and memory management. - -### Declaration of Pointers -To declare a pointer, you use an asterisk `*` before the pointer name. - -```cpp -int* ptr; // declares a pointer to an integer -char* charPtr; // declares a pointer to a character -double* doublePtr; // declares a pointer to a double -``` - -### Initialization of Pointers -Pointers are typically initialized by assigning them the address of another variable using the address-of operator `&`. - -```cpp -int var = 10; -int* ptr = &var; // ptr now holds the address of var -``` - -### Accessing Values Using Pointers -You can access or modify the value stored at the address a pointer is pointing to using the dereference operator `*`. - -```cpp -int var = 10; -int* ptr = &var; - -cout << *ptr << endl; // Outputs 10 - -*ptr = 20; // Changes the value of var to 20 -cout << var << endl; // Outputs 20 -``` - -### Null Pointers -A pointer that is not initialized to any address is called a null pointer. It is a good practice to initialize pointers to `nullptr` if you do not have an address to assign at the time of declaration. - -```cpp -int* ptr = nullptr; -``` - -### Pointer Arithmetic -Pointers can be incremented or decremented to point to the next or previous memory location. This is particularly useful when working with arrays. - -```cpp -int arr[] = {10, 20, 30}; -int* ptr = arr; - -cout << *ptr << endl; // Outputs 10 -ptr++; -cout << *ptr << endl; // Outputs 20 -``` - -### Pointers and Arrays -Pointers and arrays are closely related in C++. The name of an array acts as a pointer to the first element of the array. - -```cpp -int arr[] = {10, 20, 30}; -int* ptr = arr; // ptr now points to the first element of arr - -cout << *ptr << endl; // Outputs 10 -``` - -### Pointers to Pointers -A pointer to a pointer is a form of multiple indirection, or a chain of pointers. It is a pointer variable that holds the address of another pointer variable. This can be useful in various scenarios such as dynamic memory allocation, multi-dimensional arrays, and passing pointers to functions. - -```cpp -int var = 10; -int* ptr = &var; -int** ptr2 = &ptr; - -cout << **ptr2 << endl; // Outputs 10 -``` - -#### 1. Declaration of a Pointer to Pointer -To declare a pointer to a pointer, you use two asterisks `**`. - -```cpp -int** ptr; // declares a pointer to a pointer to an integer -``` - -#### 2. Initialization of a Pointer to Pointer -A pointer to a pointer can be initialized by assigning it the address of a pointer variable. - -```cpp -int var = 10; -int* ptr = &var; // ptr holds the address of var -int** ptr2 = &ptr; // ptr2 holds the address of ptr -``` - -#### 3. Accessing Values Using a Pointer to Pointer -You can access the value pointed to by a pointer to pointer by using the dereference operator `*` twice. - -```cpp -int var = 10; -int* ptr = &var; -int** ptr2 = &ptr; - -cout << **ptr2 << endl; // Outputs 10 -``` - -Here’s a breakdown of the operations: -- `ptr2` holds the address of `ptr`. -- `*ptr2` dereferences `ptr2` to get the address stored in `ptr`. -- `**ptr2` dereferences the address obtained from `*ptr2` to get the value stored at that address. - -#### 4. Example - Modifying a Value Using a Pointer to Pointer - -```cpp -int var = 10; -int* ptr = &var; -int** ptr2 = &ptr; - -**ptr2 = 20; // Changes the value of var to 20 -cout << var << endl; // Outputs 20 -``` - -#### 5. Dynamic Memory Allocation with Pointer to Pointer -Pointers to pointers are often used in dynamic memory allocation, especially for creating multi-dimensional arrays. - -```cpp -int rows = 3; -int cols = 4; - -// Allocate memory for an array of pointers -int** arr = new int*[rows]; - -// Allocate memory for each row -for (int i = 0; i < rows; ++i) { - arr[i] = new int[cols]; -} - -// Example of accessing and setting values -arr[1][2] = 5; -cout << arr[1][2] << endl; // Outputs 5 - -// Deallocate memory -for (int i = 0; i < rows; ++i) { - delete[] arr[i]; -} -delete[] arr; -``` - -#### 6. Function Arguments: Passing Pointer to Pointer -Passing a pointer to pointer as an argument to a function allows the function to modify the pointer itself. - -```cpp -void allocateMemory(int** ptr, int size) { - *ptr = new int[size]; -} - -int main() { - int* arr = nullptr; - allocateMemory(&arr, 5); - - // Use the allocated memory - for (int i = 0; i < 5; ++i) { - arr[i] = i + 1; - cout << arr[i] << " "; // Outputs: 1 2 3 4 5 - } - - // Deallocate memory - delete[] arr; - return 0; -} -``` - -### Function Pointers -Pointers can also be used to point to functions. This is useful for callback functions and implementing function tables. - -```cpp -void func() { - cout << "Hello, World!" << endl; -} - -void (*funcPtr)() = &func; -funcPtr(); // Calls func, outputs "Hello, World!" -``` -#### 1. Declaring a Function Pointer -To declare a function pointer, you need to specify the return type and parameter types of the function it will point to. - -```cpp -void (*funcPtr)(); // Pointer to a function that takes no parameters and returns void -``` - -#### 2. Initializing a Function Pointer -You can initialize a function pointer by assigning it the address of a function. You use the address-of operator `&`, though it can be omitted. - -```cpp -void func() { - cout << "Hello, World!" << endl; -} - -void (*funcPtr)() = &func; // funcPtr now points to func -// or simply -void (*funcPtr)() = func; -``` - -#### 3. Using a Function Pointer -To call the function through the pointer, you use the pointer variable followed by parentheses containing any arguments the function takes. - -```cpp -void func() { - cout << "Hello, World!" << endl; -} - -void (*funcPtr)() = func; // Initialize the function pointer - -funcPtr(); // Calls func, outputs "Hello, World!" -``` - -#### 4. Function Pointers with Parameters -Function pointers can also point to functions that take parameters. The declaration must match the function's signature. - -```cpp -int add(int a, int b) { - return a + b; -} - -int (*funcPtr)(int, int) = add; // Pointer to a function that takes two ints and returns an int - -int result = funcPtr(5, 3); // Calls add(5, 3), result is 8 -cout << result << endl; // Outputs 8 -``` - -#### 5. Function Pointers and Arrays -You can create arrays of function pointers, which can be useful for implementing function tables. - -```cpp -int add(int a, int b) { - return a + b; -} - -int subtract(int a, int b) { - return a - b; -} - -int (*operations[2])(int, int) = { add, subtract }; // Array of function pointers - -int result1 = operations[0](10, 5); // Calls add(10, 5) -int result2 = operations[1](10, 5); // Calls subtract(10, 5) - -cout << result1 << endl; // Outputs 15 -cout << result2 << endl; // Outputs 5 -``` - -#### 6. Typedef for Function Pointers -Using `typedef` can make function pointer declarations more readable. - -```cpp -typedef int (*Operation)(int, int); - -int add(int a, int b) { - return a + b; -} - -int subtract(int a, int b) { - return a - b; -} - -Operation operations[2] = { add, subtract }; - -int result1 = operations[0](10, 5); -int result2 = operations[1](10, 5); - -cout << result1 << endl; // Outputs 15 -cout << result2 << endl; // Outputs 5 -``` - -### Conclusion -Pointers are a powerful feature in C++ that provide flexibility and control over memory management. Mastering pointers is essential for advanced programming and optimization in C++. \ No newline at end of file diff --git a/docs/cpp/06_Pointers_and_References/02_Pointers_and_Arrays.md b/docs/cpp/06_Pointers_and_References/02_Pointers_and_Arrays.md deleted file mode 100644 index e95ba7d68..000000000 --- a/docs/cpp/06_Pointers_and_References/02_Pointers_and_Arrays.md +++ /dev/null @@ -1,214 +0,0 @@ ---- -id: cpp-pointers-and-arrays -title: Pointers and Arrays in C++ -sidebar_label: Pointers and Arrays in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ pointers, - c++ arrays, - pointers and arrays - ] -description: In this tutorial, we'll explore pointers and arrays in C++. We'll cover how to use pointers to access elements of arrays, understand the relationship between pointers and arrays, and explore pointer arithmetic in the context of arrays. By mastering the interaction between pointers and arrays, you'll unlock powerful capabilities for efficient memory management and data manipulation in your C++ programs. ---- - -In C++, understanding the relationship between pointers and arrays is fundamental to mastering memory management and efficient data manipulation. Pointers are variables that store memory addresses, while arrays are collections of elements stored in contiguous memory locations. By leveraging pointers, you can directly access and manipulate array elements, leading to more efficient and powerful programming techniques. - -### 1. Accessing Array Elements with Pointers - -In C++, arrays and pointers are closely related. When you declare an array, the array name acts as a constant pointer to the first element of the array. This allows you to use pointers to access array elements. - - -```cpp -#include -using namespace std; - -int main() { - int arr[5] = {10, 20, 30, 40, 50}; - int *ptr = arr; // ptr now points to the first element of the array - - // Accessing array elements using the pointer - for(int i = 0; i < 5; i++) { - cout << "Element " << i << " is " << *(ptr + i) << endl; - } - - return 0; -} -``` - -- `int *ptr = arr;` sets `ptr` to point to the first element of `arr`. -- `*(ptr + i)` accesses the element at index `i`. - -### 2. Relationship Between Pointers and Arrays - -An array name is essentially a pointer to the first element of the array. This means you can use array names in pointer arithmetic just like regular pointers. - -```cpp -#include -using namespace std; - -int main() { - int arr[5] = {10, 20, 30, 40, 50}; - - cout << "Address of arr: " << arr << endl; - cout << "Address of arr[0]: " << &arr[0] << endl; - - return 0; -} -``` - -In this example: -- `arr` and `&arr[0]` both give the address of the first element of the array. - -### 3. Pointer Arithmetic with Arrays - -Pointer arithmetic is particularly useful when working with arrays. You can increment or decrement pointers to navigate through the array. - -```cpp -#include -using namespace std; - -int main() { - int arr[5] = {10, 20, 30, 40, 50}; - int *ptr = arr; - - // Incrementing the pointer - cout << "First element: " << *ptr << endl; - ptr++; - cout << "Second element: " << *ptr << endl; - - // Decrementing the pointer - ptr--; - cout << "First element again: " << *ptr << endl; - - return 0; -} -``` - -- `ptr++` moves the pointer to the next element of the array. -- `ptr--` moves the pointer back to the previous element. - -### Example - - -```cpp -#include -using namespace std; - -int main() { - int arr[5] = {1, 2, 3, 4, 5}; - int *ptr = arr; - int sum = 0; - - // Using pointers to sum array elements - for(int i = 0; i < 5; i++) { - sum += *(ptr + i); - } - - cout << "Sum of array elements: " << sum << endl; - - return 0; -} -``` - -- We use `*(ptr + i)` to access each element of the array and add it to `sum`. - -### Key Points - -1. **Array and Pointer Relationship**: - - An array name acts like a constant pointer to the first element. - - `int arr[] = {1, 2, 3};` creates an array, and `arr` can be used as a pointer to `arr[0]`. - -2. **Accessing Elements**: - - You can access array elements using pointers. - - `int* ptr = arr;` assigns the pointer `ptr` to the first element of `arr`. - - Access elements with pointer arithmetic: `*(ptr + i)` gives the same value as `arr[i]`. - -3. **Pointer Arithmetic**: - - Incrementing a pointer (`ptr++`) moves it to the next element of the array. - - This works because pointers in C++ are aware of the size of the data type they point to. - - Example: - ```cpp - int arr[] = {10, 20, 30}; - int* ptr = arr; - std::cout << *(ptr + 1); // Outputs 20 - ``` - -4. **Modifying Array Elements via Pointers**: - - You can modify array elements by dereferencing pointers. - - Example: - ```cpp - int arr[] = {10, 20, 30}; - int* ptr = arr; - *(ptr + 1) = 25; // Now arr[1] is 25 - ``` - -5. **Pointer to Array**: - - A pointer can point to an entire array. - - Example: - ```cpp - int arr[3] = {1, 2, 3}; - int (*ptr)[3] = &arr; - ``` - -6. **Passing Arrays to Functions**: - - When you pass an array to a function, you actually pass a pointer to the first element. - - Example: - ```cpp - void printArray(int* arr, int size) { - for (int i = 0; i < size; i++) { - std::cout << arr[i] << " "; - } - } - ``` - -7. **Multidimensional Arrays**: - - The relationship between pointers and arrays extends to multidimensional arrays. - - Example: - ```cpp - int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; - int (*ptr)[3] = arr; // Pointer to an array of 3 integers - ``` - -### Example - -Here's a comprehensive example demonstrating these key points: - -```cpp -#include - -void printArray(int* arr, int size) { - for (int i = 0; i < size; i++) { - std::cout << arr[i] << " "; - } - std::cout << std::endl; -} - -int main() { - int arr[] = {10, 20, 30, 40, 50}; - int* ptr = arr; // Pointer to the first element of the array - - std::cout << "Accessing elements using pointer arithmetic:" << std::endl; - for (int i = 0; i < 5; i++) { - std::cout << "Element " << i << ": " << *(ptr + i) << std::endl; - } - - std::cout << "Modifying elements using pointers:" << std::endl; - *(ptr + 1) = 25; // Changing second element to 25 - printArray(arr, 5); // Output: 10 25 30 40 50 - - return 0; -} -``` - -- Arrays and pointers are interrelated in C++. -- You can use pointers to access and modify array elements efficiently. -- Understanding pointer arithmetic is crucial for working with arrays. -- This knowledge is essential for effective memory management and data manipulation in C++. - -### Conclusion - -Understanding the relationship between pointers and arrays in C++ and how to use pointer arithmetic allows you to write more efficient and flexible code. By mastering these concepts, you can efficiently manage and manipulate data in your programs. - diff --git a/docs/cpp/06_Pointers_and_References/03_Pointers_and_Functions.md b/docs/cpp/06_Pointers_and_References/03_Pointers_and_Functions.md deleted file mode 100644 index 4be6d08d6..000000000 --- a/docs/cpp/06_Pointers_and_References/03_Pointers_and_Functions.md +++ /dev/null @@ -1,241 +0,0 @@ ---- -id: cpp-pointers-and-functions -title: Pointers and Functions in C++ -sidebar_label: Pointers and Functions in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - pointers and functions, - c++ pointers, - c++ functions - ] -description: In this tutorial, we'll delve into pointers and functions in C++. We'll explore how to pass pointers to functions, use pointers as function parameters, and return pointers from functions. Understanding how pointers and functions interact is essential for dynamic memory allocation, efficient parameter passing, and advanced data manipulation in C++. By mastering pointers and functions, you'll elevate your C++ programming skills to a new level. ---- - - Pointers and Functions are two fundamental concepts that play a crucial role in dynamic memory allocation, efficient parameter passing, and advanced data manipulation.ointers are variables that store the memory address of another variable, allowing for direct access and manipulation of data stored in memory. Functions, on the other hand, are blocks of code that perform specific tasks and can be reused throughout a program. When combined, pointers and functions enable you to write more flexible, efficient, and powerful code. - -### 1. Passing Pointers to Functions - -Passing pointers to functions allows functions to modify the actual variables passed to them. This is particularly useful when you need a function to modify multiple variables or large data structures efficiently. - -**Example:** - -```cpp -#include - -void increment(int* ptr) { - (*ptr)++; // Increment the value pointed to by ptr -} - -int main() { - int value = 5; - std::cout << "Before increment: " << value << std::endl; - - increment(&value); // Pass the address of value to the function - std::cout << "After increment: " << value << std::endl; - - return 0; -} -``` - -### 2. Using Pointers as Function Parameters - -Using pointers as function parameters can make functions more versatile and efficient. Functions can directly access and manipulate data through pointers. - -**Example: Swapping Two Values** - -```cpp -#include - -void swap(int* a, int* b) { - int temp = *a; - *a = *b; - *b = temp; -} - -int main() { - int x = 10, y = 20; - std::cout << "Before swap: x = " << x << ", y = " << y << std::endl; - - swap(&x, &y); // Pass the addresses of x and y to the function - std::cout << "After swap: x = " << x << ", y = " << y << std::endl; - - return 0; -} -``` - -### 3. Returning Pointers from Functions - -Functions can also return pointers, allowing dynamic memory allocation and efficient data manipulation. - -**Example: Allocating Memory Dynamically** - -```cpp -#include - -int* createArray(int size) { - int* arr = new int[size]; // Dynamically allocate memory for an array - for (int i = 0; i < size; i++) { - arr[i] = i * 10; // Initialize the array - } - return arr; // Return the pointer to the array -} - -int main() { - int size = 5; - int* array = createArray(size); // Get the pointer to the dynamically allocated array - - std::cout << "Array elements: "; - for (int i = 0; i < size; i++) { - std::cout << array[i] << " "; - } - std::cout << std::endl; - - delete[] array; // Deallocate the memory - return 0; -} -``` - -### 4. Combining Pointers with Functions for Advanced Data Manipulation - -Pointers and functions can be combined to perform advanced data manipulation, such as handling linked lists, trees, and other dynamic data structures. - -**Example: Linked List Node Insertion** - -```cpp -#include - -struct Node { - int data; - Node* next; -}; - -void insertAtHead(Node** head, int data) { - Node* newNode = new Node(); - newNode->data = data; - newNode->next = *head; - *head = newNode; -} - -void printList(Node* head) { - while (head != nullptr) { - std::cout << head->data << " "; - head = head->next; - } - std::cout << std::endl; -} - -int main() { - Node* head = nullptr; // Initialize an empty list - - insertAtHead(&head, 10); - insertAtHead(&head, 20); - insertAtHead(&head, 30); - - std::cout << "Linked list: "; - printList(head); - - return 0; -} -``` -## Important Points - -When working with pointers and functions in C++, there are several key concepts and best practices to keep in mind: - -### 1. **Understanding Pointers**: -- **Definition**: A pointer is a variable that stores the memory address of another variable. -- **Declaration**: Pointers are declared using the `*` operator. For example, `int* ptr;` declares a pointer to an integer. - -### 2. **Passing Pointers to Functions**: -- **Pass-by-Reference**: Passing a pointer to a function allows the function to modify the original variable's value. -- **Syntax**: To pass a pointer, you pass the address of the variable using the `&` operator. For example, `function(&variable);`. -- **Example**: - ```cpp - void increment(int* ptr) { - (*ptr)++; - } - ``` - -### 3. **Using Pointers as Function Parameters**: -- **Efficiency**: Using pointers can make functions more efficient, especially when passing large data structures. -- **Modifying Data**: Functions can directly modify the data pointed to by the pointers. -- **Example**: - ```cpp - void swap(int* a, int* b) { - int temp = *a; - *a = *b; - *b = temp; - } - ``` - -### 4. **Returning Pointers from Functions**: -- **Dynamic Memory Allocation**: Functions can return pointers to dynamically allocated memory using `new`. -- **Memory Management**: Always ensure that dynamically allocated memory is properly deallocated using `delete` to prevent memory leaks. -- **Example**: - ```cpp - int* createArray(int size) { - int* arr = new int[size]; - // Initialize array - return arr; - } - ``` - -### 5. **Combining Pointers with Functions**: -- **Complex Data Structures**: Pointers are essential for managing complex data structures like linked lists, trees, and graphs. -- **Pointer to Pointer**: Using pointers to pointers (`Node** head`) allows for modifying the head of a linked list within a function. -- **Example**: - ```cpp - void insertAtHead(Node** head, int data) { - Node* newNode = new Node(); - newNode->data = data; - newNode->next = *head; - *head = newNode; - } - ``` - -### 6. **Best Practices**: -- **Null Pointers**: Always initialize pointers. Use `nullptr` to avoid dangling pointers. -- **Pointer Arithmetic**: Be cautious with pointer arithmetic to avoid accessing invalid memory locations. -- **Safety**: Consider using smart pointers (`std::unique_ptr`, `std::shared_ptr`) from the C++ Standard Library for automatic memory management and enhanced safety. - -## Benefits of Understanding Pointers and Functions in C++ - -Mastering pointers and functions in C++ offers numerous advantages that can significantly enhance your programming skills and efficiency. Here are the key benefits: - -### 1. **Efficient Memory Management** -- **Dynamic Allocation**: Pointers allow for dynamic memory allocation using `new` and `delete`, which is essential for managing memory in applications with variable-sized data structures. -- **Memory Control**: Direct control over memory addresses and allocation enables efficient use of system resources. - -### 2. **Enhanced Performance** -- **Pass-by-Reference**: Passing pointers to functions avoids copying large data structures, leading to faster function calls and reduced memory usage. -- **In-place Modifications**: Functions can directly modify data through pointers, which can be more efficient than returning modified copies. - -### 3. **Flexible Data Structures** -- **Linked Lists**: Pointers are crucial for implementing linked lists, which provide efficient insertion and deletion operations compared to arrays. -- **Trees and Graphs**: Advanced data structures like binary trees and graphs rely heavily on pointers for dynamic and hierarchical data management. - -### 4. **Complex Data Manipulation** -- **Advanced Algorithms**: Many algorithms, especially those dealing with dynamic data structures (e.g., sorting algorithms, graph traversal algorithms), require pointers for efficient manipulation. -- **Pointer Arithmetic**: Enables complex data manipulation tasks, such as iterating through arrays and managing buffers. - -### 5. **Modular and Reusable Code** -- **Function Pointers**: Pointers to functions allow for creating callback functions and implementing design patterns like the strategy pattern, which promotes code modularity and reusability. -- **Dynamic Behavior**: Passing function pointers enables dynamic behavior in programs, such as event handling and polymorphism. - -### 6. **Interfacing with System-Level Programming** -- **Low-Level Operations**: Pointers are essential for system-level programming, such as writing operating system kernels, device drivers, and embedded systems software. -- **Direct Memory Access**: Pointers allow for direct manipulation of memory, which is necessary for tasks like memory-mapped I/O and managing hardware resources. - -### 7. **Improved Debugging and Optimization** -- **Debugging Tools**: Understanding pointers aids in using debugging tools that track memory allocation and deallocation, helping identify memory leaks and pointer-related bugs. -- **Performance Tuning**: Knowledge of pointers enables performance tuning by optimizing memory access patterns and reducing overhead. - -### 8. **Leveraging C++ Libraries and APIs** -- **Standard Library**: Many C++ Standard Library components, such as iterators and smart pointers, rely on pointers. Understanding pointers allows for effective use of these components. -- **Third-Party Libraries**: Many third-party libraries and frameworks require or benefit from pointer usage for interfacing with their APIs and extending functionality. - -## Conclusion - -Understanding how to use pointers with functions in C++ is crucial for efficient and effective programming. By mastering the concepts of passing pointers to functions, using pointers as parameters, and returning pointers from functions, you can achieve dynamic memory allocation and advanced data manipulation. This knowledge will significantly enhance your C++ programming skills and enable you to tackle more complex projects with confidence. \ No newline at end of file diff --git a/docs/cpp/06_Pointers_and_References/_category_.json b/docs/cpp/06_Pointers_and_References/_category_.json deleted file mode 100644 index 8fd1b0042..000000000 --- a/docs/cpp/06_Pointers_and_References/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Pointers and References in C++", - "position": 7, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about pointers and references in C++, the powerful features that provide direct access to memory and enable efficient manipulation of data. We will cover how to declare, initialize, and use pointers and references, as well as their applications in dynamic memory management and function arguments, enhancing your ability to write efficient and effective C++ programs." - } -} \ No newline at end of file diff --git a/docs/cpp/07_Object_Oriented_Programming/01_Classes_and_Objects.md b/docs/cpp/07_Object_Oriented_Programming/01_Classes_and_Objects.md deleted file mode 100644 index 57020ed10..000000000 --- a/docs/cpp/07_Object_Oriented_Programming/01_Classes_and_Objects.md +++ /dev/null @@ -1,736 +0,0 @@ ---- -id: cpp-classes-and-objects -title: Class and Objects in C++ -sidebar_label: Class and Objects in C++ -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ classes, - c++ objects, - object oriented programming, - c++ OOP, - classes and objects - ] -description: In this tutorial, we'll explore classes and objects in C++. We'll cover how to define classes, create objects, and access their members. Additionally, we'll delve into constructors, destructors, and member functions, essential components for building robust and reusable code. Understanding classes and objects is fundamental to object-oriented programming in C++, enabling you to organize and encapsulate data and functionality effectively. ---- - - -## 1. Defining Classes -A class in C++ is a user-defined data type that encapsulates data and functions that operate on that data. The primary components of a class are its data members (attributes) and member functions (methods). - -### Syntax: -```cpp -class ClassName { -public: - // Data members - int attribute1; - float attribute2; - - // Member functions - void function1() { - // Function body - } - - int function2(int param) { - // Function body - return param; - } -}; -``` - -## 2. Creating Objects -Objects are instances of a class. They are created using the class name. - -### Syntax -```cpp -ClassName objectName; -``` - -#### Example -```cpp -class Car { -public: - // Data members - string brand; - string model; - int year; - - // Member function - void displayInfo() { - cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl; - } -}; - -int main() { - // Creating an object - Car car1; - - // Accessing data members - car1.brand = "Toyota"; - car1.model = "Corolla"; - car1.year = 2020; - - // Calling member function - car1.displayInfo(); - - return 0; -} -``` - -## 3. Constructors -Constructors are special member functions that initialize objects. They have the same name as the class and no return type. - -#### Example -```cpp -class Car { -public: - string brand; - string model; - int year; - - // Constructor - Car(string b, string m, int y) { - brand = b; - model = m; - year = y; - } - - void displayInfo() { - cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl; - } -}; - -int main() { - // Creating an object with the constructor - Car car1("Toyota", "Corolla", 2020); - - car1.displayInfo(); - - return 0; -} -``` - -### Types of Constructors - -1. **Default Constructor**: A constructor that takes no arguments. -2. **Parameterized Constructor**: A constructor that takes one or more arguments. -3. **Copy Constructor**: A constructor that initializes an object using another object of the same class. - -### Default Constructor - -A default constructor does not take any arguments. If no constructor is defined, C++ provides a default constructor. - -```cpp -class Example { -public: - int value; - - // Default constructor - Example() { - value = 0; - } - - void display() { - cout << "Value: " << value << endl; - } -}; - -int main() { - Example obj; // Calls the default constructor - obj.display(); - - return 0; -} -``` - -### Parameterized Constructor - -A parameterized constructor takes arguments to initialize an object with specific values. - -```cpp -class Example { -public: - int value; - - // Parameterized constructor - Example(int val) { - value = val; - } - - void display() { - cout << "Value: " << value << endl; - } -}; - -int main() { - Example obj(42); // Calls the parameterized constructor - obj.display(); - - return 0; -} -``` - -### Copy Constructor - -A copy constructor initializes an object using another object of the same class. It is used for creating a new object as a copy of an existing object. - -```cpp -class Example { -public: - int value; - - // Parameterized constructor - Example(int val) { - value = val; - } - - // Copy constructor - Example(const Example &obj) { - value = obj.value; - } - - void display() { - cout << "Value: " << value << endl; - } -}; - -int main() { - Example obj1(42); // Calls the parameterized constructor - Example obj2 = obj1; // Calls the copy constructor - - obj1.display(); - obj2.display(); - - return 0; -} -``` - -### Initialization List - -Constructors can also use an initialization list to initialize data members. This approach is more efficient, especially for initializing constant or reference data members. - -```cpp -class Example { -public: - int value; - - // Parameterized constructor using initialization list - Example(int val) : value(val) { - } - - void display() { - cout << "Value: " << value << endl; - } -}; - -int main() { - Example obj(42); // Calls the parameterized constructor with initialization list - obj.display(); - - return 0; -} -``` - -### Constructor Overloading - -Constructors can be overloaded, meaning a class can have multiple constructors with different parameter lists. - -```cpp -class Example { -public: - int value1; - int value2; - - // Default constructor - Example() { - value1 = 0; - value2 = 0; - } - - // Parameterized constructor - Example(int val1, int val2) { - value1 = val1; - value2 = val2; - } - - void display() { - cout << "Value1: " << value1 << ", Value2: " << value2 << endl; - } -}; - -int main() { - Example obj1; // Calls the default constructor - Example obj2(42, 84); // Calls the parameterized constructor - - obj1.display(); - obj2.display(); - - return 0; -} -``` - -## 4. Destructors -Destructors are special member functions that are invoked when an object is destroyed. They have the same name as the class but are preceded by a tilde `~`. - -### Basic Structure of a Destructor - -- A destructor has the same name as the class but is preceded by a tilde `~`. -- A destructor does not take any arguments and does not return any values. - -### Syntax: - -```cpp -class ClassName { -public: - // Constructor - ClassName() { - // Initialization code - } - - // Destructor - ~ClassName() { - // Cleanup code - } -}; -``` - -#### Example -```cpp -class Car { -public: - string brand; - string model; - int year; - - // Constructor - Car(string b, string m, int y) { - brand = b; - model = m; - year = y; - } - - // Destructor - ~Car() { - cout << "Destructor called for " << brand << endl; - } - - void displayInfo() { - cout << "Brand: " << brand << ", Model: " << model << ", Year: " << year << endl; - } -}; - -int main() { - Car car1("Toyota", "Corolla", 2020); - - car1.displayInfo(); - - return 0; -} -``` - -### Use Cases for Destructors - -1. **Memory Management**: - - If an object dynamically allocates memory, the destructor should release that memory to avoid memory leaks. - -2. **File Handling**: - - If an object opens a file, the destructor should close the file to ensure no data is lost. - -3. **Network Connections**: - - If an object opens a network connection, the destructor should close the connection to free up network resources. - -#### Example - Destructor for Memory Management - -```cpp -#include -using namespace std; - -class Array { -private: - int* arr; - int size; - -public: - // Constructor - Array(int s) { - size = s; - arr = new int[size]; - cout << "Array of size " << size << " created" << endl; - } - - // Destructor - ~Array() { - delete[] arr; - cout << "Array deleted" << endl; - } - - void setValue(int index, int value) { - if (index >= 0 && index < size) { - arr[index] = value; - } - } - - void display() { - for (int i = 0; i < size; ++i) { - cout << arr[i] << " "; - } - cout << endl; - } -}; - -int main() { - Array arr(5); // Array of size 5 created - arr.setValue(0, 10); - arr.setValue(1, 20); - arr.setValue(2, 30); - arr.setValue(3, 40); - arr.setValue(4, 50); - - arr.display(); // Displays: 10 20 30 40 50 - - return 0; // Array deleted -} -``` - -1. **Constructor**: - ```cpp - Array(int s) { - size = s; - arr = new int[size]; - cout << "Array of size " << size << " created" << endl; - } - ``` - - The constructor allocates memory for an array of integers and prints a message. - -2. **Destructor**: - ```cpp - ~Array() { - delete[] arr; - cout << "Array deleted" << endl; - } - ``` - - The destructor deallocates the memory and prints a message. - -3. **Main Function**: - ```cpp - int main() { - Array arr(5); - arr.setValue(0, 10); - arr.setValue(1, 20); - arr.setValue(2, 30); - arr.setValue(3, 40); - arr.setValue(4, 50); - - arr.display(); - - return 0; - } - ``` - - An `Array` object is created, values are set, and the array is displayed. When the program ends, the destructor is called, releasing the allocated memory. - -### Rule of Three - -In C++, if a class requires a user-defined destructor, it almost certainly needs a user-defined copy constructor and copy assignment operator as well. This is known as the Rule of Three. - -#### Example - -```cpp -#include -using namespace std; - -class Example { -private: - int* data; - -public: - // Constructor - Example(int value) { - data = new int(value); - cout << "Constructor: Allocating " << *data << endl; - } - - // Copy Constructor - Example(const Example& other) { - data = new int(*other.data); - cout << "Copy Constructor: Allocating " << *data << endl; - } - - // Copy Assignment Operator - Example& operator=(const Example& other) { - if (this != &other) { - delete data; - data = new int(*other.data); - cout << "Copy Assignment: Allocating " << *data << endl; - } - return *this; - } - - // Destructor - ~Example() { - cout << "Destructor: Releasing " << *data << endl; - delete data; - } - - void display() { - cout << "Value: " << *data << endl; - } -}; - -int main() { - Example obj1(42); // Constructor is called - Example obj2 = obj1; // Copy constructor is called - obj2 = obj1; // Copy assignment operator is called - - obj1.display(); - obj2.display(); - - return 0; // Destructor is called for both obj1 and obj2 -} -``` - -## 5. Member Functions -Member functions are functions defined inside a class. They operate on objects of the class. -### Basic Structure of Member Functions -Member functions can be defined inside the class definition or outside the class definition. When defined outside, the function declaration is made inside the class, and the definition is made outside using the scope resolution operator ::. - -Let's dive into member functions in C++. Member functions are functions that are defined within a class and operate on objects of that class. They have access to the data members of the class and can be used to manipulate those data members. - -## 5. Member Functions - -### Basic Structure of Member Functions - -Member functions can be defined inside the class definition or outside the class definition. When defined outside, the function declaration is made inside the class, and the definition is made outside using the scope resolution operator `::`. - -#### Example -Defining Member Functions Inside the Class - -```cpp -#include -using namespace std; - -class Rectangle { -public: - int width; - int height; - - // Member function defined inside the class - int area() { - return width * height; - } -}; - -int main() { - Rectangle rect; - rect.width = 5; - rect.height = 10; - - cout << "Area: " << rect.area() << endl; // Calls the member function - - return 0; -} -``` - -#### Example - Defining Member Functions Outside the Class - -```cpp -#include -using namespace std; - -class Rectangle { -public: - int width; - int height; - - // Declaration of the member function - int area(); -}; - -// Definition of the member function outside the class -int Rectangle::area() { - return width * height; -} - -int main() { - Rectangle rect; - rect.width = 5; - rect.height = 10; - - cout << "Area: " << rect.area() << endl; // Calls the member function - - return 0; -} -``` - -### Types of Member Functions - -1. **Simple Member Functions**: Basic functions that perform operations on data members. -2. **Const Member Functions**: Functions that do not modify the object. -3. **Static Member Functions**: Functions that can be called on the class itself, not on objects. -4. **Inline Member Functions**: Functions defined inside the class definition. - -### Simple Member Functions - -Simple member functions perform operations on the class's data members. - -```cpp -class Rectangle { -public: - int width; - int height; - - void setDimensions(int w, int h) { - width = w; - height = h; - } - - int area() { - return width * height; - } -}; - -int main() { - Rectangle rect; - rect.setDimensions(5, 10); - - cout << "Area: " << rect.area() << endl; - - return 0; -} -``` - -### Const Member Functions - -Const member functions are functions that do not modify any data members of the class. They are declared with the `const` keyword. - -```cpp -class Rectangle { -public: - int width; - int height; - - void setDimensions(int w, int h) { - width = w; - height = h; - } - - int area() const { // Const member function - return width * height; - } -}; - -int main() { - Rectangle rect; - rect.setDimensions(5, 10); - - cout << "Area: " << rect.area() << endl; - - return 0; -} -``` - -### Static Member Functions - -Static member functions belong to the class rather than any object. They can be called without creating an object of the class. - -```cpp -class Math { -public: - static int add(int a, int b) { // Static member function - return a + b; - } -}; - -int main() { - cout << "Sum: " << Math::add(5, 3) << endl; // Calling static member function - - return 0; -} -``` - -### Inline Member Functions - -Inline member functions are defined inside the class definition and are automatically considered `inline` by the compiler. They are typically small functions. - -```cpp -class Rectangle { -public: - int width; - int height; - - // Inline member function - int area() { - return width * height; - } -}; - -int main() { - Rectangle rect; - rect.width = 5; - rect.height = 10; - - cout << "Area: " << rect.area() << endl; - - return 0; -} -``` - -#### Example - Combining Different Types of Member Functions - -```cpp -#include -using namespace std; - -class Rectangle { -private: - int width; - int height; - -public: - // Constructor - Rectangle(int w, int h) : width(w), height(h) {} - - // Const member function - int area() const { - return width * height; - } - - // Static member function - static int compareArea(const Rectangle& r1, const Rectangle& r2) { - return r1.area() - r2.area(); - } - - // Inline member function - int perimeter() { - return 2 * (width + height); - } -}; - -int main() { - Rectangle rect1(5, 10); - Rectangle rect2(3, 4); - - cout << "Area of rect1: " << rect1.area() << endl; - cout << "Area of rect2: " << rect2.area() << endl; - cout << "Perimeter of rect1: " << rect1.perimeter() << endl; - - int comparison = Rectangle::compareArea(rect1, rect2); - if (comparison > 0) { - cout << "rect1 has a larger area" << endl; - } else if (comparison < 0) { - cout << "rect2 has a larger area" << endl; - } else { - cout << "Both rectangles have the same area" << endl; - } - - return 0; -} -``` - -## Conclusion -Understanding classes and objects is fundamental in C++ for object-oriented programming. They help in organizing code, encapsulating data, and defining behaviors effectively. Constructors and destructors manage object lifecycle, while member functions define the actions that objects can perform. - diff --git a/docs/cpp/07_Object_Oriented_Programming/02_Inheritance.md b/docs/cpp/07_Object_Oriented_Programming/02_Inheritance.md deleted file mode 100644 index 095e90e42..000000000 --- a/docs/cpp/07_Object_Oriented_Programming/02_Inheritance.md +++ /dev/null @@ -1,344 +0,0 @@ ---- -id: cpp-inheritance -title: Inheritance in C++ -sidebar_label: Inheritance in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - object oriented programming, - c++ OOP, - inheritance, - c++ inheritance - ] -description: In this tutorial, we'll dive into inheritance in C++. We'll explore how to create derived classes that inherit properties and behaviors from base classes. You'll learn about different types of inheritance, such as single, multiple, and hierarchical inheritance, along with the use of access specifiers like public, protected, and private. Understanding inheritance is key to building flexible and scalable C++ programs, allowing you to reuse code and create complex class hierarchies with ease. ---- - - Inheritance is a fundamental concept in object-oriented programming that allows a class (derived class) to inherit properties and behaviors from another class (base class). This promotes code reuse and helps create a hierarchical class structure. - -- **Base Class (Parent Class)**: The class whose properties and methods are inherited. -- **Derived Class (Child Class)**: The class that inherits properties and methods from the base class. -- **Access Specifiers**: Keywords that define the accessibility of the members of a class (`public`, `protected`, `private`). - -## Types of Inheritance - -1. **Single Inheritance**: A derived class inherits from only one base class. -2. **Multiple Inheritance**: A derived class inherits from more than one base class. -3. **Hierarchical Inheritance**: Multiple derived classes inherit from a single base class. -4. **Multilevel Inheritance**: A derived class inherits from another derived class. -5. **Hybrid Inheritance**: A combination of two or more types of inheritance. - -### Single Inheritance - -In single inheritance, a derived class inherits from a single base class. - -```cpp -#include -using namespace std; - -class Base { -public: - void displayBase() { - cout << "Base class display function" << endl; - } -}; - -class Derived : public Base { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - } -}; - -int main() { - Derived obj; - obj.displayBase(); // Calling base class function - obj.displayDerived(); // Calling derived class function - - return 0; -} -``` - -### Multiple Inheritance - -In multiple inheritance, a derived class inherits from more than one base class. - -```cpp -#include -using namespace std; - -class Base1 { -public: - void displayBase1() { - cout << "Base1 class display function" << endl; - } -}; - -class Base2 { -public: - void displayBase2() { - cout << "Base2 class display function" << endl; - } -}; - -class Derived : public Base1, public Base2 { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - } -}; - -int main() { - Derived obj; - obj.displayBase1(); // Calling Base1 class function - obj.displayBase2(); // Calling Base2 class function - obj.displayDerived(); // Calling derived class function - - return 0; -} -``` - -### Hierarchical Inheritance - -In hierarchical inheritance, multiple derived classes inherit from a single base class. - -```cpp -#include -using namespace std; - -class Base { -public: - void displayBase() { - cout << "Base class display function" << endl; - } -}; - -class Derived1 : public Base { -public: - void displayDerived1() { - cout << "Derived1 class display function" << endl; - } -}; - -class Derived2 : public Base { -public: - void displayDerived2() { - cout << "Derived2 class display function" << endl; - } -}; - -int main() { - Derived1 obj1; - Derived2 obj2; - - obj1.displayBase(); // Calling base class function - obj1.displayDerived1(); // Calling Derived1 class function - - obj2.displayBase(); // Calling base class function - obj2.displayDerived2(); // Calling Derived2 class function - - return 0; -} -``` - -### Multilevel Inheritance - -In multilevel inheritance, a derived class inherits from another derived class. - -```cpp -#include -using namespace std; - -class Base { -public: - void displayBase() { - cout << "Base class display function" << endl; - } -}; - -class Intermediate : public Base { -public: - void displayIntermediate() { - cout << "Intermediate class display function" << endl; - } -}; - -class Derived : public Intermediate { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - } -}; - -int main() { - Derived obj; - obj.displayBase(); // Calling base class function - obj.displayIntermediate(); // Calling intermediate class function - obj.displayDerived(); // Calling derived class function - - return 0; -} -``` - -## Access Specifiers in Inheritance -Access specifiers play a crucial role in determining how the members of a base class are inherited and accessed in a derived class in C++. They define the visibility and accessibility of inherited members from the base class within the derived class. - -There are three main access specifiers in C++ inheritance - -### 1. Public Inheritance - When a derived class inherits publicly from a base class: - - Public members of the base class become public members of the derived class. - - Protected members of the base class become protected members of the derived class. - - Private members of the base class are not accessible directly in the derived class. - -#### Example: Public Inheritance - -```cpp -#include -using namespace std; - -// Base class -class Base { -public: - int publicVar; // Public member -protected: - int protectedVar; // Protected member -private: - int privateVar; // Private member - -public: - Base() : publicVar(1), protectedVar(2), privateVar(3) {} - - void display() { - cout << "Base class display function" << endl; - cout << "Public Var: " << publicVar << endl; - cout << "Protected Var: " << protectedVar << endl; - cout << "Private Var: " << privateVar << endl; - } -}; - -// Derived class publicly inheriting from Base -class Derived : public Base { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - cout << "Public Var: " << publicVar << endl; // Accessible - cout << "Protected Var: " << protectedVar << endl; // Accessible - // cout << "Private Var: " << privateVar << endl; // Not accessible - } -}; - -int main() { - Derived obj; - obj.displayDerived(); // Accesses public and protected members of Base - obj.display(); // Accesses public, protected, and private members of Base via Derived - - return 0; -} -``` - -### 2. Protected Inheritance -When a derived class inherits protectedly from a base class: - - Public and protected members of the base class become protected members of the derived class. - - Private members of the base class are not accessible directly in the derived class. - - -#### Example: Protected Inheritance - -```cpp -#include -using namespace std; - -// Base class -class Base { -public: - int publicVar; // Public member -protected: - int protectedVar; // Protected member -private: - int privateVar; // Private member - -public: - Base() : publicVar(1), protectedVar(2), privateVar(3) {} - - void display() { - cout << "Base class display function" << endl; - cout << "Public Var: " << publicVar << endl; - cout << "Protected Var: " << protectedVar << endl; - cout << "Private Var: " << privateVar << endl; - } -}; - -// Derived class protectedly inheriting from Base -class Derived : protected Base { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - cout << "Public Var: " << publicVar << endl; // Accessible - cout << "Protected Var: " << protectedVar << endl; // Accessible - // cout << "Private Var: " << privateVar << endl; // Not accessible - } -}; - -int main() { - Derived obj; - obj.displayDerived(); // Accesses public and protected members of Base via Derived - // obj.display(); // Error: display is inaccessible due to protected inheritance - - return 0; -} -``` -### 3. Private Inheritance - When a derived class inherits privately from a base class: - - All members of the base class become private members of the derived class. - - This means both public and protected members of the base class become private members of the derived class. - - Private members of the base class are not accessible directly in the derived class. - - -#### Example: Private Inheritance - -```cpp -#include -using namespace std; - -// Base class -class Base { -public: - int publicVar; // Public member -protected: - int protectedVar; // Protected member -private: - int privateVar; // Private member - -public: - Base() : publicVar(1), protectedVar(2), privateVar(3) {} - - void display() { - cout << "Base class display function" << endl; - cout << "Public Var: " << publicVar << endl; - cout << "Protected Var: " << protectedVar << endl; - cout << "Private Var: " << privateVar << endl; - } -}; - -// Derived class privately inheriting from Base -class Derived : private Base { -public: - void displayDerived() { - cout << "Derived class display function" << endl; - cout << "Public Var: " << publicVar << endl; // Accessible - cout << "Protected Var: " << protectedVar << endl; // Accessible - // cout << "Private Var: " << privateVar << endl; // Not accessible - } -}; - -int main() { - Derived obj; - obj.displayDerived(); // Accesses public and protected members of Base via Derived - // obj.display(); // Error: display is inaccessible due to private inheritance - - return 0; -} -``` - diff --git a/docs/cpp/07_Object_Oriented_Programming/03_Polymorphism.md b/docs/cpp/07_Object_Oriented_Programming/03_Polymorphism.md deleted file mode 100644 index d1f7918c3..000000000 --- a/docs/cpp/07_Object_Oriented_Programming/03_Polymorphism.md +++ /dev/null @@ -1,289 +0,0 @@ ---- -id: cpp-polymorphism -title: Polymorphism in C++ -sidebar_label: Polymorphism in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - object oriented programming, - c++ OOP, - polymorphism, - c++ polymorphism - ] -description: In this tutorial, we'll explore polymorphism in C++. We'll delve into how polymorphism allows objects of different derived classes to be treated as objects of a common base class, enabling dynamic method binding and runtime polymorphic behavior. You'll learn about virtual functions, abstract classes, and the use of pointers and references to achieve polymorphic behavior. Understanding polymorphism is crucial for building flexible and extensible C++ programs, facilitating code reuse and enhancing code maintainability and readability. ---- - - Polymorphism is a key concept in object-oriented programming that allows objects of different classes in a hierarchy to be treated as objects of a common base class. This enables flexibility and extensibility in code, promoting code reuse and enhancing maintainability. - - -**Polymorphism**: Means "many forms." In C++, polymorphism is achieved through virtual functions and is of two types: - - **Compile-time (Static) Polymorphism**: Achieved using function overloading and operator overloading. - - **Run-time (Dynamic) Polymorphism**: Achieved using virtual functions. - -## Virtual Functions - -- **Virtual Function**: A member function in a base class that you expect to be overridden in derived classes. It enables the dynamic (run-time) binding of the function call to the derived class object. -- **Virtual Function Syntax**: Declare a function as virtual in the base class and optionally override it in the derived class using the `override` keyword. - -### Example - -```cpp -#include -using namespace std; - -// Base class -class Animal { -public: - // Virtual function - virtual void sound() { - cout << "Animal makes a sound" << endl; - } -}; - -// Derived class Dog -class Dog : public Animal { -public: - // Override the virtual function - void sound() override { - cout << "Dog barks" << endl; - } -}; - -// Derived class Cat -class Cat : public Animal { -public: - // Override the virtual function - void sound() override { - cout << "Cat meows" << endl; - } -}; - -int main() { - Animal* ptr; // Base class pointer - - Dog dog; - Cat cat; - - // Pointer to Dog object - ptr = &dog; - ptr->sound(); // Calls Dog's sound function dynamically - - // Pointer to Cat object - ptr = &cat; - ptr->sound(); // Calls Cat's sound function dynamically - - return 0; -} -``` - -### Key Points - -- **Dynamic Binding**: Virtual functions enable dynamic method binding, where the function call is resolved at runtime based on the object's actual type rather than the pointer or reference type. - -- **Late Binding**: The decision of which function to call is deferred until runtime, allowing for flexibility in handling objects of different derived classes through a common interface. - -- **Pure Virtual Functions**: When a virtual function is declared as `virtual` and set to `= 0` in the base class (pure virtual function), it turns the class into an abstract base class, requiring derived classes to override this function to be instantiated. - -- **Virtual Destructor**: Base classes with virtual functions often need virtual destructors to ensure that the correct destructor is called for derived class objects when they are destroyed. - -### Benefits - -- **Polymorphism**: Enables polymorphic behavior, allowing for code reuse and flexible object-oriented design. - -- **Interface Design**: Defines interfaces in base classes that derived classes implement, ensuring consistent behavior across different types of objects. - -- **Runtime Flexibility**: Facilitates runtime decisions on method calls, crucial for scenarios where the exact type of object may vary during program execution. - - -## Abstract Classes and Pure Virtual Functions - -- **Abstract Class**: A class that contains at least one pure virtual function. -- **Pure Virtual Function**: A virtual function declared in a base class that has no implementation and is meant to be overridden by derived classes. -- **Syntax**: Define a pure virtual function by appending `= 0` to its declaration in the base class. - -### Example - -```cpp -#include -using namespace std; - -// Abstract base class -class Shape { -public: - // Pure virtual function - virtual void displayArea() const = 0; -}; - -// Derived class Rectangle -class Rectangle : public Shape { -private: - int length; - int width; - -public: - Rectangle(int l, int w) : length(l), width(w) {} - - // Override pure virtual function - void displayArea() const override { - cout << "Area of Rectangle: " << length * width << endl; - } -}; - -// Derived class Circle -class Circle : public Shape { -private: - int radius; - -public: - Circle(int r) : radius(r) {} - - // Override pure virtual function - void displayArea() const override { - cout << "Area of Circle: " << 3.14 * radius * radius << endl; - } -}; - -int main() { - // Shape* ptr = new Shape(); // Error: Cannot instantiate an abstract class - Shape* ptr; - - Rectangle rect(5, 10); - Circle circle(5); - - // Pointer to Rectangle object - ptr = ▭ - ptr->displayArea(); // Calls Rectangle's displayArea dynamically - - // Pointer to Circle object - ptr = &circle; - ptr->displayArea(); // Calls Circle's displayArea dynamically - - return 0; -} -``` -Abstract classes and pure virtual functions are fundamental concepts in C++ that facilitate polymorphic behavior and enforce a consistent interface across derived classes. - -### Key Points - -1. **Abstract Classes**: - - An abstract class is a class that cannot be instantiated on its own because it contains at least one pure virtual function. - - Abstract classes are designed to serve as base classes from which other classes can be derived. - - They define a common interface that derived classes must implement. - -2. **Pure Virtual Functions**: - - A pure virtual function is a virtual function declared in a base class with `= 0` at the end of its declaration. - - Pure virtual functions have no implementation in the base class and must be overridden in derived classes. - - Classes containing pure virtual functions cannot be instantiated unless all pure virtual functions are overridden in derived classes. - -### Benefits - -1. **Polymorphism**: - - Abstract classes and pure virtual functions enable polymorphic behavior, allowing objects of different derived classes to be treated through a common base class interface. - - This promotes code reuse and flexibility by providing a standardized way to interact with objects of related types. - -2. **Enforcement of Interface**: - - Abstract classes define a blueprint or contract for derived classes, ensuring that all derived classes provide specific functionality. - - This helps in enforcing a consistent interface across a hierarchy of classes, making the design more robust and maintainable. - -3. **Modularity and Extensibility**: - - By defining abstract classes with pure virtual functions, you create modular components that can be easily extended through inheritance. - - New derived classes can be added to the hierarchy without modifying existing code, enhancing the scalability and extensibility of the software. - -4. **Design Patterns**: - - Abstract classes and pure virtual functions are foundational to several design patterns, such as the Factory Method pattern and Template Method pattern. - - They enable the implementation of these patterns by providing the necessary structure and flexibility required for dynamic behavior and object creation. - - -## Polymorphism with Pointers and References - -- Polymorphism is often achieved using pointers or references to base class objects. -- Using pointers or references, you can store addresses of derived class objects and call their overridden functions dynamically. - -### Example - -```cpp -#include -using namespace std; - -// Base class -class Animal { -public: - // Virtual function - virtual void sound() { - cout << "Animal makes a sound" << endl; - } -}; - -// Derived class Dog -class Dog : public Animal { -public: - // Override the virtual function - void sound() override { - cout << "Dog barks" << endl; - } -}; - -// Derived class Cat -class Cat : public Animal { -public: - // Override the virtual function - void sound() override { - cout << "Cat meows" << endl; - } -}; - -int main() { - Animal* ptr; // Base class pointer - - Dog dog; - Cat cat; - - // Pointer to Dog object - ptr = &dog; - ptr->sound(); // Calls Dog's sound function dynamically - - // Pointer to Cat object - ptr = &cat; - ptr->sound(); // Calls Cat's sound function dynamically - - return 0; -} -``` - -### Key Points - -1. **Base Class Pointers and References**: - - Pointers and references of a base class type can refer to objects of derived classes. - - This allows treating objects of derived classes uniformly through a common base class interface. - -2. **Virtual Functions**: - - Virtual functions enable polymorphic behavior by allowing derived classes to override base class methods. - - The actual function called is determined at runtime based on the object pointed to or referenced, rather than the type of pointer or reference. - -3. **Dynamic Binding**: - - Polymorphism with pointers and references uses dynamic binding, where the correct function implementation is selected based on the actual type of the object during runtime. - - This flexibility allows the same interface (base class methods) to exhibit different behaviors depending on the derived class implementation. - -### Benefits - -1. **Code Flexibility and Reusability**: - - Polymorphism with pointers and references promotes code reuse by enabling the use of a single base class interface to manipulate objects of different derived classes. - - This reduces code duplication and promotes modular design, making the codebase more maintainable and extensible. - -2. **Enhanced Modularity**: - - By using base class pointers or references, you can design systems where new derived classes can be added without modifying existing code that interacts with them. - - This modular approach simplifies code maintenance and reduces the risk of introducing errors when extending the system. - -3. **Run-time Flexibility**: - - The ability to determine the function to call at runtime based on the actual object type provides runtime flexibility. - - This is particularly useful in scenarios where the exact type of objects may vary dynamically during program execution, such as in polymorphic collections or in handling user interactions. - -4. **Polymorphic Behavior**: - - Polymorphism with pointers and references supports polymorphic behavior, where a base class pointer or reference can be used to access specific behaviors defined in derived classes. - - This supports the principle of substitutability, where objects of derived classes can be used interchangeably wherever the base class is expected. - -. -## Conclusion - polymorphism in C++ empowers developers with the ability to create flexible and extensible code through the use of inheritance and virtual functions. By allowing objects of derived classes to be treated as objects of a common base class, polymorphism enables dynamic method binding and runtime polymorphic behavior. This not only enhances code reusability but also improves code maintainability and readability by promoting a modular and hierarchical class structure. Understanding and effectively utilizing polymorphism is essential for building scalable and efficient C++ programs, enabling developers to craft robust software solutions that can evolve and adapt to changing requirements with ease. \ No newline at end of file diff --git a/docs/cpp/07_Object_Oriented_Programming/_category_.json b/docs/cpp/07_Object_Oriented_Programming/_category_.json deleted file mode 100644 index bf9bdb1fa..000000000 --- a/docs/cpp/07_Object_Oriented_Programming/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Object Oriented Programming in C++", - "position": 8, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about object-oriented programming (OOP) in C++, a paradigm that organizes software design around data, or objects, rather than functions and logic. We will cover key concepts such as classes, objects, inheritance, polymorphism, and encapsulation, providing you with the tools to create modular, reusable, and maintainable C++ code." - } -} \ No newline at end of file diff --git a/docs/cpp/08_Exception_Handling/01_Exception_Basics.md b/docs/cpp/08_Exception_Handling/01_Exception_Basics.md deleted file mode 100644 index af8ecef2b..000000000 --- a/docs/cpp/08_Exception_Handling/01_Exception_Basics.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -id: cpp-exception-basics -title: The Basics of Exceptions in C++ -sidebar_label: The Basics of Exceptions in C++ -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ exception handling, - exception handling basics, - c++ exception - ] -description: In this tutorial, we'll cover the basics of exceptions in C++. We'll explore how exceptions provide a mechanism for handling errors and unexpected situations in your code, allowing you to gracefully respond to exceptional conditions. You'll learn about the try-catch block, exception handling syntax, and how to throw and catch exceptions. Understanding exceptions is essential for writing robust and resilient C++ programs, ensuring proper error handling and improving overall program reliability. ---- - -Exceptions provide a robust mechanism for handling errors and unexpected situations in C++ programs. They allow you to separate error-handling code from regular code, making your programs more readable and maintainable. - -### 1. **Exception Handling Syntax** - -In C++, exceptions are handled using three keywords: `try`, `catch`, and `throw`. - -- **`try` Block**: Encloses the code that might throw an exception. -- **`catch` Block**: Catches and handles the exception. -- **`throw` Keyword**: Used to throw an exception. - -Here's the basic syntax: - -```cpp -try { - // Code that may throw an exception - // Example: if (some_condition) throw some_exception; -} catch (ExceptionType1 e1) { - // Code to handle ExceptionType1 -} catch (ExceptionType2 e2) { - // Code to handle ExceptionType2 -} catch (...) { - // Code to handle any exception -} -``` - -### 2. **Throwing Exceptions** - -To throw an exception, use the `throw` keyword followed by an exception object or value. This can be any type, but typically, exceptions are objects of a class derived from the `std::exception` class. - -Example: - -```cpp -void mightGoWrong() { - bool errorOccurred = true; - if (errorOccurred) { - throw std::runtime_error("Something went wrong"); - } -} -``` - -### 3. **Catching Exceptions** - -To catch exceptions, use the `catch` block. The parameter of the `catch` block specifies the type of exception it can handle. - -Example: - -```cpp -try { - mightGoWrong(); -} catch (const std::runtime_error& e) { - std::cerr << "Runtime error: " << e.what() << std::endl; -} catch (const std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; -} catch (...) { - std::cerr << "An unknown exception occurred" << std::endl; -} -``` - -### 4. **Standard Exception Classes** - -The C++ Standard Library provides several standard exception classes, all of which are derived from `std::exception`. Some commonly used ones include: - -- `std::runtime_error` -- `std::logic_error` -- `std::out_of_range` -- `std::invalid_argument` - -Each of these classes provides a `what()` method that returns a descriptive error message. - -### 5. **Creating Custom Exceptions** - -You can create your own exception classes by inheriting from `std::exception` or any of its derived classes. - -Example: - -```cpp -class MyException : public std::exception { -public: - const char* what() const noexcept override { - return "My custom exception occurred"; - } -}; -``` - -### 6. **Best Practices** - -- **Throw by Value, Catch by Reference**: Throw exception objects by value and catch them by reference to avoid slicing and ensure polymorphic behavior. -- **Use Specific Exceptions**: Catch specific exceptions before catching general exceptions to handle different error conditions appropriately. -- **Exception Safety**: Ensure that your code remains in a valid state even if an exception occurs. This often involves using RAII (Resource Acquisition Is Initialization) to manage resources. - -#### Example - -```cpp -#include -#include - -void mightGoWrong() { - bool errorOccurred = true; - if (errorOccurred) { - throw std::runtime_error("Something went wrong"); - } -} - -int main() { - try { - mightGoWrong(); - } catch (const std::runtime_error& e) { - std::cerr << "Runtime error: " << e.what() << std::endl; - } catch (const std::exception& e) { - std::cerr << "Exception: " << e.what() << std::endl; - } catch (...) { - std::cerr << "An unknown exception occurred" << std::endl; - } - return 0; -} -``` - -### Key Points - -1. **Exception Handling Keywords**: - - **`try`**: Wraps code that might throw an exception. - - **`catch`**: Handles exceptions thrown within the corresponding `try` block. - - **`throw`**: Throws an exception, which is then caught by a `catch` block. - -2. **Throwing Exceptions**: - - Use `throw` to signal an error or exceptional condition. - - Exceptions can be any type, but using classes derived from `std::exception` is common. - -3. **Catching Exceptions**: - - Use `catch` blocks to handle specific types of exceptions. - - General catch block `catch (...)` handles all types of exceptions. - -4. **Standard Exception Classes**: - - Derived from `std::exception` and include `std::runtime_error`, `std::logic_error`, `std::out_of_range`, and `std::invalid_argument`. - - Provide a `what()` method to return a descriptive error message. - -5. **Custom Exceptions**: - - Create by inheriting from `std::exception` or its derived classes. - - Override the `what()` method to provide a custom error message. - -6. **Best Practices**: - - **Throw by Value, Catch by Reference**: Prevents object slicing and retains polymorphic behavior. - - **Use Specific Exceptions**: Handle different error conditions appropriately. - - **Exception Safety**: Ensure code remains in a valid state even if an exception occurs. Use RAII to manage resources safely. - -7. **Example Structure**: - ```cpp - try { - // Code that might throw an exception - } catch (const SpecificExceptionType& e) { - // Handle specific exception - } catch (const std::exception& e) { - // Handle other standard exceptions - } catch (...) { - // Handle all other exceptions - } - ``` - -Understanding and implementing these key points will help you write more robust and error-resistant C++ programs. - -### Conclusion -Understanding and effectively using exceptions in C++ is essential for developing robust and resilient programs. By leveraging the `try`, `catch`, and `throw` constructs, you can handle errors and unexpected situations gracefully, ensuring that your code remains maintainable and reliable. Proper exception handling not only separates error-handling logic from regular code but also enhances the overall quality and stability of your applications, making it a critical skill for any C++ programmer. \ No newline at end of file diff --git a/docs/cpp/08_Exception_Handling/02_Try_Catch_Block.md b/docs/cpp/08_Exception_Handling/02_Try_Catch_Block.md deleted file mode 100644 index 430989ebd..000000000 --- a/docs/cpp/08_Exception_Handling/02_Try_Catch_Block.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -id: cpp-try-catch-block -title: The Try-Catch Block in C++ -sidebar_label: The Try-Catch Block in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ exception handling, - exceptions, - try catch blocks, - c++ try catch - ] -description: In this tutorial, we'll focus on the try-catch block in C++. We'll explore how to use this powerful construct to handle exceptions and gracefully manage errors in your code. You'll learn about the syntax of the try block for monitoring code that may throw exceptions and how to catch and handle those exceptions in the catch block. Understanding the try-catch block is essential for robust error handling in C++ programs, enabling you to anticipate and manage unexpected situations effectively. ---- - -Exceptions provide a way to react to exceptional circumstances (like runtime errors) in programs by transferring control to special functions called handlers. A try-catch block is used to handle these exceptions. - -### Syntax of Try-Catch Block - -The syntax of a try-catch block : - -```cpp -try { - // Code that may throw an exception -} catch (ExceptionType1 e1) { - // Code to handle ExceptionType1 -} catch (ExceptionType2 e2) { - // Code to handle ExceptionType2 -} catch (...) { - // Code to handle any exception not caught by above -} -``` - -### Components - -1. **try Block**: This block contains the code that might throw an exception. If an exception occurs, control is immediately transferred to the appropriate catch block. -2. **catch Block(s)**: These blocks handle the exception. You can have multiple catch blocks to handle different types of exceptions. The `catch (...)` block is a catch-all handler for any exceptions not caught by the preceding catch blocks. - -#### Example 1 - - Division by zero error: - -```cpp -#include -using namespace std; - -int main() { - int a = 10; - int b = 0; - try { - if (b == 0) { - throw runtime_error("Division by zero error"); - } - int c = a / b; - cout << "Result: " << c << endl; - } catch (runtime_error &e) { - cout << "Caught an exception: " << e.what() << endl; - } - - cout << "Program continues..." << endl; - - return 0; -} -``` - -1. **try Block**: The code inside the try block performs a division operation. If `b` is zero, it throws a `runtime_error` exception. -2. **catch Block**: The catch block catches the `runtime_error` exception and prints an error message. The `e.what()` method provides a description of the error. - -#### Example 2 : Multiple Catch Blocks -```cpp -#include -#include -using namespace std; - -void testExceptions(int value) { - try { - if (value == 0) { - throw runtime_error("Runtime error: value is zero"); - } else if (value < 0) { - throw invalid_argument("Invalid argument: value is negative"); - } else { - cout << "Value is: " << value << endl; - } - } catch (runtime_error &e) { - cout << "Caught a runtime_error: " << e.what() << endl; - } catch (invalid_argument &e) { - cout << "Caught an invalid_argument: " << e.what() << endl; - } catch (...) { - cout << "Caught an unknown exception" << endl; - } -} - -int main() { - testExceptions(10); - testExceptions(0); - testExceptions(-1); - - cout << "Program continues..." << endl; - - return 0; -} -``` - - -#### Example 3: Handling File Operations - -```cpp -#include -#include -#include -using namespace std; - -void readFile(const string& fileName) { - ifstream file; - - try { - file.open(fileName); - if (!file) { - throw runtime_error("File not found"); - } - - string line; - while (getline(file, line)) { - cout << line << endl; - } - - file.close(); - } catch (runtime_error &e) { - cout << "Caught an exception: " << e.what() << endl; - } catch (...) { - cout << "Caught an unknown exception" << endl; - } -} - -int main() { - readFile("example.txt"); // Ensure this file exists or change the name to a non-existing file for testing - - cout << "Program continues..." << endl; - return 0; -} -``` - -1. **try Block**: Attempts to open a file and read its contents. If the file cannot be opened, it throws a `runtime_error`. -2. **catch Blocks**: - - The first catch block handles `runtime_error` exceptions. - - The second catch block (`catch (...)`) handles any other exceptions. -3. **Resource Management**: The file is properly closed even if an exception is thrown. - -#### Example 4: Custom Exception Handling - -```cpp -#include -#include -using namespace std; - -class MyCustomException : public exception { -public: - const char* what() const noexcept override { - return "My custom exception occurred"; - } -}; - -void riskyFunction(int value) { - try { - if (value == 0) { - throw MyCustomException(); - } - cout << "Value is: " << value << endl; - } catch (MyCustomException &e) { - cout << "Caught a custom exception: " << e.what() << endl; - } catch (...) { - cout << "Caught an unknown exception" << endl; - } -} - -int main() { - riskyFunction(10); // Valid value - riskyFunction(0); // Custom exception - - cout << "Program continues..." << endl; - return 0; -} -``` - -1. **Custom Exception Class**: Defines a custom exception class `MyCustomException` that overrides the `what` method. -2. **try Block**: Contains code that throws the custom exception if the value is zero. -3. **catch Block**: Catches the custom exception and prints an error message. - -### Best Practices - -- Always handle exceptions at the appropriate level in your code to ensure robustness. -- Avoid using exceptions for control flow; they should only be used for error handling. -- Clean up resources (like file handles, memory) before an exception is thrown to avoid resource leaks. - - -### Key Points - -1. **Exception Handling**: The try-catch block is a fundamental part of exception handling in C++. It allows you to manage errors gracefully without crashing the program. - -2. **Try Block**: This block contains the code that may throw an exception. It’s where you anticipate problems and write code that could potentially fail. - -3. **Catch Block(s)**: These blocks are designed to catch and handle exceptions thrown by the try block. You can have multiple catch blocks to handle different types of exceptions. - -4. **Catch-All Handler**: The catch (...) block is a catch-all handler that catches any exceptions not handled by the preceding catch blocks. - -5. **Exception Types**: You can catch specific types of exceptions (e.g., `runtime_error`, `invalid_argument`) and handle them accordingly. - -### Benefits - -1. **Robust Error Handling**: By using try-catch blocks, you can ensure your program can handle unexpected situations without crashing. This makes your code more reliable. - -2. **Improved Code Readability**: Grouping error-prone code in try blocks and handling exceptions in catch blocks can make your code easier to read and maintain. - -3. **Resource Management**: Exceptions can lead to resource leaks (e.g., memory, file handles). Using try-catch blocks allows you to clean up resources properly in the event of an error. - -4. **Flexibility**: Multiple catch blocks provide the flexibility to handle different types of exceptions in different ways, allowing for more precise and meaningful error handling. - -5. **Enhanced Debugging**: With exception handling, you can provide more informative error messages and logs, which can be very helpful during debugging and troubleshooting. - -6. **Separation of Concerns**: Try-catch blocks allow you to separate error-handling logic from the main code logic, leading to cleaner and more modular code. - -7. **Graceful Recovery**: By handling exceptions, you can often recover from errors and continue executing the rest of the program, providing a better user experience. - -### Conclusion - -Understanding and using the try-catch block in C++ is crucial for robust error handling. It allows you to anticipate and manage unexpected situations effectively, making your programs more reliable and easier to maintain. -By mastering this construct, you can write C++ code that is more resilient and better equipped to handle runtime errors and other exceptional conditions. \ No newline at end of file diff --git a/docs/cpp/08_Exception_Handling/03_Throwing_and_Catching_Exceptions.md b/docs/cpp/08_Exception_Handling/03_Throwing_and_Catching_Exceptions.md deleted file mode 100644 index 0940f4716..000000000 --- a/docs/cpp/08_Exception_Handling/03_Throwing_and_Catching_Exceptions.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: cpp-throwing-and-catching-exceptions -title: Throwing and Catching Exceptions in C++ -sidebar_label: Throwing and Catching Exceptions in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ exceptions, - exception handling, - throwing exceptions, - catching exceptions - ] -description: In this tutorial, we'll explore throwing and catching exceptions in C++. We'll delve into how to use the throw keyword to generate exceptions and the catch block to handle them gracefully. You'll learn about different types of exceptions, how to create custom exception classes, and best practices for exception handling. Understanding throwing and catching exceptions is crucial for robust error management in C++ programs, ensuring reliability and resilience in the face of unexpected situations. ---- - -Exception handling provides a powerful mechanism to manage errors and unexpected situations within your programs. By throwing exceptions using the throw keyword and catching them with catch blocks, you can effectively handle and recover from exceptional conditions, ensuring robustness and reliability in your code. - -#### Throwing Exceptions - -Exceptions are thrown using the `throw` keyword followed by an exception object. The object can be of any type, but it's common to use standard exception classes or custom exception classes. - -```cpp -#include -#include - -void mightGoWrong() { - bool error = true; - if (error) { - throw std::runtime_error("Something went wrong!"); - } -} - -int main() { - try { - mightGoWrong(); - } catch (const std::exception& e) { - std::cout << "Caught exception: " << e.what() << std::endl; - } - - return 0; -} -``` - -In the above example, `mightGoWrong` function throws a `std::runtime_error` exception when an error condition is met. The `main` function catches this exception using a `catch` block. - -#### Catching Exceptions - -Exceptions are caught using `catch` blocks. Each `catch` block can handle a different type of exception. The `catch` block that matches the type of the thrown exception is executed. - -```cpp -#include -#include - -void mightGoWrong() { - bool error1 = true; - bool error2 = false; - if (error1) { - throw std::runtime_error("Runtime error occurred"); - } - if (error2) { - throw std::out_of_range("Out of range error occurred"); - } -} - -int main() { - try { - mightGoWrong(); - } catch (const std::out_of_range& e) { - std::cout << "Caught an out_of_range exception: " << e.what() << std::endl; - } catch (const std::exception& e) { - std::cout << "Caught a generic exception: " << e.what() << std::endl; - } - - return 0; -} -``` - -In this example, the `mightGoWrong` function can throw either a `std::runtime_error` or a `std::out_of_range` exception. The `main` function has `catch` blocks for both types of exceptions. - -### Custom Exception Classes - -You can create custom exception classes by inheriting from the `std::exception` class. This allows you to define your own exception types with specific messages or data. - -```cpp -#include -#include - -class MyException : public std::exception { -public: - const char* what() const noexcept override { - return "My custom exception occurred"; - } -}; - -void mightGoWrong() { - throw MyException(); -} - -int main() { - try { - mightGoWrong(); - } catch (const MyException& e) { - std::cout << "Caught custom exception: " << e.what() << std::endl; - } catch (const std::exception& e) { - std::cout << "Caught generic exception: " << e.what() << std::endl; - } - - return 0; -} -``` - - `MyException` is a custom exception class that overrides the `what` method to provide a custom error message. The `main` function catches and handles this custom exception. - -### Best Practices for Exception Handling - -1. **Use Standard Exceptions**: Whenever possible, use the standard exception classes provided by the C++ Standard Library. -2. **Catch by Reference**: Always catch exceptions by reference to avoid slicing and unnecessary copying. -3. **Specific Catch Blocks First**: Place more specific `catch` blocks before more general ones to ensure the correct exception is caught. -4. **Minimal Exception Handling**: Only use exceptions for truly exceptional conditions and not for regular control flow. -5. **Clean Up Resources**: Ensure that resources are properly cleaned up in the event of an exception, using RAII (Resource Acquisition Is Initialization) and smart pointers. - -### Conclusion - -Throwing and catching exceptions in C++ is a powerful mechanism for handling errors and unexpected situations in your programs. By understanding how to use the `throw` keyword, `catch` blocks, and creating custom exception classes, you can build more robust and resilient applications. Remember to follow best practices to ensure your exception handling is efficient and effective. \ No newline at end of file diff --git a/docs/cpp/08_Exception_Handling/_category_.json b/docs/cpp/08_Exception_Handling/_category_.json deleted file mode 100644 index 7f274c3a4..000000000 --- a/docs/cpp/08_Exception_Handling/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Exception Handling in C++", - "position": 9, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about exception handling in C++, a mechanism for managing runtime errors and ensuring robust, error-resistant code. We will cover how to use try, catch, and throw blocks to detect and handle exceptions, as well as best practices for writing reliable and maintainable programs that can gracefully handle unexpected situations." - } -} \ No newline at end of file diff --git a/docs/cpp/09_File_Input_Output/01_File_Handling_Basics.md b/docs/cpp/09_File_Input_Output/01_File_Handling_Basics.md deleted file mode 100644 index eacd50c6c..000000000 --- a/docs/cpp/09_File_Input_Output/01_File_Handling_Basics.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-file-handling-basics -title: The Basics of File Handling in C++ -sidebar_label: The Basics of File Handling in C++ -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ files, - file handling basics, - c++ file handling - ] -description: In this tutorial, we'll cover the basics of file handling in C++. We'll explore how to open, read, write, and close files using the standard library's file stream classes. You'll learn about input and output file streams, as well as the functions and methods for manipulating file data. Understanding file handling is essential for C++ programs that need to interact with external files, enabling you to store and retrieve data efficiently. ---- \ No newline at end of file diff --git a/docs/cpp/09_File_Input_Output/02_Read_and_Write_to_Files.md b/docs/cpp/09_File_Input_Output/02_Read_and_Write_to_Files.md deleted file mode 100644 index 0ae80e31a..000000000 --- a/docs/cpp/09_File_Input_Output/02_Read_and_Write_to_Files.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-read-and-write-to-files -title: Reading and Writing to Files in C++ -sidebar_label: Reading and Writing to Files in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ files, - c++ file reading, - c++ file writing - ] -description: In this tutorial, we'll explore reading and writing to files in C++. We'll cover how to use file stream classes to open files, read data from files, and write data to files. You'll learn about ifstream for reading files, ofstream for writing files, and fstream for both reading and writing. Understanding how to read from and write to files is crucial for data persistence and interaction with external data sources in C++ programs. ---- \ No newline at end of file diff --git a/docs/cpp/09_File_Input_Output/03_Working_with_File_Pointers.md b/docs/cpp/09_File_Input_Output/03_Working_with_File_Pointers.md deleted file mode 100644 index 77d2ecc94..000000000 --- a/docs/cpp/09_File_Input_Output/03_Working_with_File_Pointers.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: cpp-working-with-file-pointers -title: Working with File Pointers in C++ -sidebar_label: Working with File Pointers in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ files, - working with files, - c++ file pointers, - working with files in c++ - ] -description: In this tutorial, we'll explore working with file pointers in C++. We'll cover how to manipulate file pointers to navigate through files for reading and writing operations. You'll learn about functions like seekg, seekp, tellg, and tellp, which allow you to control the position of the file pointer. Understanding file pointers is essential for advanced file handling tasks, enabling precise control over file I/O operations in your C++ programs. ---- \ No newline at end of file diff --git a/docs/cpp/09_File_Input_Output/_category_.json b/docs/cpp/09_File_Input_Output/_category_.json deleted file mode 100644 index eda83c9c0..000000000 --- a/docs/cpp/09_File_Input_Output/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "File Input and Output in C++", - "position": 10, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about file input and output in C++, the processes for reading from and writing to files. We will cover how to use file streams, open and close files, and perform various file operations, enabling you to efficiently manage data storage and retrieval in your C++ programs." - } -} \ No newline at end of file diff --git a/docs/cpp/10_Standard_Template_Library/01_Containers_in_STL.md b/docs/cpp/10_Standard_Template_Library/01_Containers_in_STL.md deleted file mode 100644 index 924c1dafa..000000000 --- a/docs/cpp/10_Standard_Template_Library/01_Containers_in_STL.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: cpp-STL-containers -title: STL Containers in C++ -sidebar_label: STL Containers in C++ -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ STL, - c++ standard template library, - c++ STL containers - ] -description: In this tutorial, we'll explore STL containers in C++. We'll cover the different types of Standard Template Library containers, including vectors, lists, deques, sets, maps, and more. You'll learn how to choose the appropriate container for your needs and how to use their various functions and methods. Understanding STL containers is essential for effective data management and manipulation in C++ programs, providing you with powerful tools to handle collections of data efficiently. ---- - -## Introduction - -Containers can be described as the objects that hold the data of the same type. Containers are used to implement different data structures for example arrays, list, trees, etc. - -## Types of STL Containers - -- **Vector:** Vector is a class that creates a dynamic array allowing insertions and deletions at the back. - Header File: `` - -- **List:** List is the sequence containers that allow the insertions and deletions from anywhere. - Header File: `` - -- **Deque:** Deque is the double ended queue that allows the insertion and deletion from both the ends. - Header File: `` - -- **Set:** Set is an associate container for storing unique sets. - Header File: `` - -- **Multiset:** Multiset is an associate container for storing non- unique sets. - Header File: `` - -- **Map:** Map is an associate container for storing unique key-value pairs, i.e. each key is associated with only one value(one to one mapping). - Header File: `` - -- **Multimap:** Multimap is an associate container for storing key- value pair, and each key can be associated with more than one value. - Header File: `` - -- **Stack:** It follows last in first out(LIFO). - Header File: `` - -- **Queue:** It follows first in first out(FIFO). - Header File: `` - -- **Priority-queue:** First element out is always the highest priority element. - Header File: `` - - -## Choosing the Right Container - -Here are some general guidelines for choosing the appropriate container: - -1. Sequential containers are used to store elements in a linear order. They include arrays, vectors, deques, lists, and forward lists. - -2. Associative containers are used to store elements in a key-value relationship. They include maps, multimaps, sets, and multisets. - -3. Container adapters provide a different interface to an existing container. They include stacks, queues, and priority queues. - -Understanding STL containers is essential for effective data management and manipulation in C++ programs, providing you with powerful tools to handle collections of data efficiently. diff --git a/docs/cpp/10_Standard_Template_Library/02_Algorithms_in_STL.md b/docs/cpp/10_Standard_Template_Library/02_Algorithms_in_STL.md deleted file mode 100644 index 09b6e288e..000000000 --- a/docs/cpp/10_Standard_Template_Library/02_Algorithms_in_STL.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: cpp-algorithms-in-STL -title: C++ Algorithms in STL -sidebar_label: C++ Algorithms in STL -sidebar_position: 2 -tags: - [ - c++, - programming, - standard template library, - c++ STL, - c++ algorithms, - algorithms in STL, - c++ STL algorithms - ] -description: In this tutorial, we'll explore STL algorithms in C++. We'll cover the wide range of algorithms provided by the Standard Template Library, including sorting, searching, counting, and manipulating data. You'll learn how to apply these algorithms to various STL containers and how to leverage their power to write more efficient and concise code. Understanding STL algorithms is essential for optimizing your C++ programs, allowing you to perform complex operations with ease and efficiency. ---- \ No newline at end of file diff --git a/docs/cpp/10_Standard_Template_Library/03_Iterators_in_STL.md b/docs/cpp/10_Standard_Template_Library/03_Iterators_in_STL.md deleted file mode 100644 index 5459578dc..000000000 --- a/docs/cpp/10_Standard_Template_Library/03_Iterators_in_STL.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: cpp-iterators-in-STL -title: C++ Iterators in STL -sidebar_label: C++ Iterators in STL -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ STL, - standard template library, - c++ iterators in STL, - c++ iterators, - iterators in STL - ] -description: In this tutorial, we'll explore STL iterators in C++. We'll cover the different types of iterators, such as input, output, forward, bidirectional, and random-access iterators. You'll learn how to use iterators to traverse and manipulate data in STL containers. Understanding STL iterators is crucial for effective data manipulation and for leveraging the full power of the Standard Template Library in your C++ programs. ---- \ No newline at end of file diff --git a/docs/cpp/10_Standard_Template_Library/_category_.json b/docs/cpp/10_Standard_Template_Library/_category_.json deleted file mode 100644 index aa3fdac31..000000000 --- a/docs/cpp/10_Standard_Template_Library/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "The C++ Standard Template Library", - "position": 11, - "link": { - "type": "generated-index", - "description": "In this section, you will delve into the intricacies of the C++ Standard Template Library (STL), uncovering the powerful tools it offers to enhance your programming efficiency. You will explore the various components of the STL, including containers, iterators, algorithms, and function objects. By understanding how to effectively utilize these components, you will be able to write more concise, efficient, and readable code. Whether you are managing collections of data, performing complex operations, or simply aiming to streamline your development process, mastering the STL will be an invaluable asset in your C++ toolkit." - } -} \ No newline at end of file diff --git a/docs/cpp/11_Memory_Management/01_Dynamic_Memory_Allocation.md b/docs/cpp/11_Memory_Management/01_Dynamic_Memory_Allocation.md deleted file mode 100644 index e3c5d5c1a..000000000 --- a/docs/cpp/11_Memory_Management/01_Dynamic_Memory_Allocation.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-dynamic-memory-allocation -title: Dynamic Memory Allocation in C++ -sidebar_label: Dynamic Memory Allocation in C++ -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ dynamic memory, - memory allocation, - c++ dynamic memory allocation - ] -description: In this tutorial, we'll explore dynamic memory allocation in C++. We'll cover how to use the `new` and `delete` operators to allocate and deallocate memory at runtime. You'll learn about managing heap memory, pointers, and avoiding memory leaks. Understanding dynamic memory allocation is essential for creating flexible and efficient C++ programs that handle varying amounts of data dynamically. ---- \ No newline at end of file diff --git a/docs/cpp/11_Memory_Management/02_Memory_Leak_Detection_and_Prevention.md b/docs/cpp/11_Memory_Management/02_Memory_Leak_Detection_and_Prevention.md deleted file mode 100644 index affb64e71..000000000 --- a/docs/cpp/11_Memory_Management/02_Memory_Leak_Detection_and_Prevention.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-memory-leak-detection-and-prevention -title: Memory Leak Detection and Prevention in C++ -sidebar_label: Memory Leak Detection and Prevention in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ memory, - c++ memory leak detection, - c++ memory leak prevention - ] -description: In this tutorial, we'll explore memory leak detection and prevention in C++. We'll cover common causes of memory leaks and techniques to identify and fix them. You'll learn about tools and practices such as using smart pointers, Valgrind, and careful memory management to ensure your programs manage resources efficiently. Understanding memory leak detection and prevention is crucial for writing robust and reliable C++ applications, ensuring optimal performance and stability. ---- \ No newline at end of file diff --git a/docs/cpp/11_Memory_Management/03_Smart_Pointers.md b/docs/cpp/11_Memory_Management/03_Smart_Pointers.md deleted file mode 100644 index 4cf44b741..000000000 --- a/docs/cpp/11_Memory_Management/03_Smart_Pointers.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-smart-pointers -title: Smart Pointers in C++ -sidebar_label: Smart Pointers in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - smart pointers, - c++ pointers, - c++ smart pointers - ] -description: In this tutorial, we'll explore smart pointers in C++. We'll cover the different types of smart pointers, such as `std::unique_ptr`, `std::shared_ptr`, and `std::weak_ptr`, provided by the C++ Standard Library. You'll learn how to use these smart pointers to manage dynamic memory automatically and safely, preventing memory leaks and dangling pointers. Understanding smart pointers is essential for modern C++ programming, enabling you to write more robust and maintainable code. ---- \ No newline at end of file diff --git a/docs/cpp/11_Memory_Management/_category_.json b/docs/cpp/11_Memory_Management/_category_.json deleted file mode 100644 index d6a5d8e7f..000000000 --- a/docs/cpp/11_Memory_Management/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Memory Management in C++", - "position": 12, - "link": { - "type": "generated-index", - "description": "In this section, you will explore the critical topic of memory management in C++, gaining a comprehensive understanding of how memory is allocated, used, and deallocated in the language. You will learn about dynamic memory allocation, pointers, and the use of smart pointers to prevent memory leaks and dangling pointers. Additionally, you'll delve into advanced topics such as memory pools and garbage collection techniques. By mastering memory management, you will be able to write robust, efficient, and error-free code, ensuring that your applications run smoothly and effectively manage resources." - } -} \ No newline at end of file diff --git a/docs/cpp/12_Advanced_Topics/01_Templates.md b/docs/cpp/12_Advanced_Topics/01_Templates.md deleted file mode 100644 index e09c3a5b2..000000000 --- a/docs/cpp/12_Advanced_Topics/01_Templates.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: cpp-templates -title: C++ Templates -sidebar_label: C++ Templates -sidebar_position: 1 -tags: - [ - c++, - c++ advanced, - programming, - c++ templates - ] -description: In this tutorial, we'll explore templates in C++. We'll cover the basics of function and class templates, allowing you to write generic and reusable code. You'll learn how to define and use templates to create functions and classes that can work with any data type. Understanding templates is essential for writing flexible and efficient C++ programs, enabling you to implement powerful and type-safe abstractions. ---- \ No newline at end of file diff --git a/docs/cpp/12_Advanced_Topics/02_Multi-threading_in_C++.md b/docs/cpp/12_Advanced_Topics/02_Multi-threading_in_C++.md deleted file mode 100644 index a701e8e9e..000000000 --- a/docs/cpp/12_Advanced_Topics/02_Multi-threading_in_C++.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-multithreading -title: C++ Multithreading -sidebar_label: C++ Multithreading -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ multithreading, - c++ advanced, - advanced c++ topics - ] -description: In this tutorial, we'll delve into multithreading in C++. We'll cover the basics of creating and managing threads using the C++ Standard Library's threading facilities. You'll learn how to spawn threads, synchronize access to shared resources, and handle concurrency issues such as race conditions and deadlocks. Understanding multithreading is crucial for building high-performance and responsive C++ applications that can take advantage of modern multi-core processors. ---- \ No newline at end of file diff --git a/docs/cpp/12_Advanced_Topics/03_STL_Advanced_Topics.md b/docs/cpp/12_Advanced_Topics/03_STL_Advanced_Topics.md deleted file mode 100644 index 234eb59cf..000000000 --- a/docs/cpp/12_Advanced_Topics/03_STL_Advanced_Topics.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-STL-advanced-topics -title: Advanced STL Topics in C++ -sidebar_label: Advanced STL Topics in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ advanced, - c++ STL advanced, - c++ STL - ] -description: In this tutorial, we'll explore advanced topics in the C++ Standard Template Library (STL). We'll go beyond the basics and dive into more advanced concepts and techniques, such as custom allocators, advanced iterator usage, and STL extensions. You'll learn how to leverage the full power and flexibility of the STL to solve complex programming problems efficiently. Understanding advanced STL topics is essential for mastering C++ programming and writing high-quality, maintainable code. ---- \ No newline at end of file diff --git a/docs/cpp/12_Advanced_Topics/_category_.json b/docs/cpp/12_Advanced_Topics/_category_.json deleted file mode 100644 index ef7c404a1..000000000 --- a/docs/cpp/12_Advanced_Topics/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Advanced Topics in C++", - "position": 13, - "link": { - "type": "generated-index", - "description": "In this section, you will dive into advanced topics in C++, expanding your knowledge and expertise beyond the basics. You will explore sophisticated features such as template programming, advanced topics in STL, and C++ multi-threading. By mastering these advanced topics, you will be equipped to tackle complex programming challenges and develop high-performance, cutting-edge C++ applications." - } -} \ No newline at end of file diff --git a/docs/cpp/13_Debugging_and_Optimization/01_Debugging_Techniques.md b/docs/cpp/13_Debugging_and_Optimization/01_Debugging_Techniques.md deleted file mode 100644 index 6f3acba05..000000000 --- a/docs/cpp/13_Debugging_and_Optimization/01_Debugging_Techniques.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: cpp-debugging-techniques -title: C++ Debugging Techniques -sidebar_label: C++ Debugging Techniques -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ debugging, - debugging techniques - ] -description: In this tutorial, we'll delve into debugging techniques in C++. We'll cover various strategies and tools for identifying and fixing bugs in your code, including using debuggers, logging, assertions, and debugging libraries. You'll learn how to effectively diagnose and troubleshoot common programming errors, ensuring your C++ programs run smoothly and reliably. Understanding debugging techniques is essential for any C++ programmer, empowering you to write robust and error-free code. ---- \ No newline at end of file diff --git a/docs/cpp/13_Debugging_and_Optimization/02_Profiling_and_Optimization.md b/docs/cpp/13_Debugging_and_Optimization/02_Profiling_and_Optimization.md deleted file mode 100644 index 1ac7e0bd1..000000000 --- a/docs/cpp/13_Debugging_and_Optimization/02_Profiling_and_Optimization.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-profiling-and-optimization -title: Profiling and Optimization in C++ -sidebar_label: Profiling and Optimization in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - profiling and optimization, - c++ profiling, - c++ optimization - ] -description: In this tutorial, we'll explore profiling and optimization in C++. We'll cover techniques and tools for analyzing the performance of your code, identifying bottlenecks, and optimizing critical sections for speed and efficiency. You'll learn about profiling tools, such as profilers and performance counters, and optimization techniques, including algorithmic optimizations and code refactoring. Understanding profiling and optimization is essential for writing high-performance C++ applications, ensuring they run efficiently and scale to meet demanding requirements. ---- \ No newline at end of file diff --git a/docs/cpp/13_Debugging_and_Optimization/03_Code_Quality_Assurance_Tools.md b/docs/cpp/13_Debugging_and_Optimization/03_Code_Quality_Assurance_Tools.md deleted file mode 100644 index 247a72307..000000000 --- a/docs/cpp/13_Debugging_and_Optimization/03_Code_Quality_Assurance_Tools.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-code-quality-assurance-tools -title: C++ Code Quality Assurance Tools -sidebar_label: C++ Code Quality Assurance Tools -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ code quality, - c++ debugging, - c++ code quality assurance tools - ] -description: In this tutorial, we'll dive into code quality assurance tools in C++. We'll explore various tools and techniques used to ensure high-quality code, including static analyzers, code formatters, and code review processes. You'll learn how to use these tools to detect potential issues, enforce coding standards, and improve code readability and maintainability. Understanding code quality assurance tools is essential for producing reliable, maintainable, and bug-free C++ code, helping you deliver software of the highest caliber. ---- \ No newline at end of file diff --git a/docs/cpp/13_Debugging_and_Optimization/_category_.json b/docs/cpp/13_Debugging_and_Optimization/_category_.json deleted file mode 100644 index d6baf70b6..000000000 --- a/docs/cpp/13_Debugging_and_Optimization/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Debugging and Optimization in C++", - "position": 14, - "link": { - "type": "generated-index", - "description": "In this section, you will learn the essential techniques for debugging and optimizing C++ code. You will explore various debugging tools and methods to identify and fix errors efficiently. Additionally, you'll discover strategies for optimizing code performance, including profiling, memory management improvements, and code refactoring. Mastering these skills will enable you to write faster, more reliable, and efficient C++ applications." - } -} \ No newline at end of file diff --git a/docs/cpp/14_Cpp_Best_Practices/01_Writing_Clean_and_Maintainable_C++_Code.md b/docs/cpp/14_Cpp_Best_Practices/01_Writing_Clean_and_Maintainable_C++_Code.md deleted file mode 100644 index f6eec40af..000000000 --- a/docs/cpp/14_Cpp_Best_Practices/01_Writing_Clean_and_Maintainable_C++_Code.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: writing-clean-and-maintainable-cpp-code -title: Writing Clean And Maintainable C++ Code -sidebar_label: Writing Clean And Maintainable C++ Code -sidebar_position: 1 -tags: - [ - c++, - programming, - c++ cleam code, - c++ maintainable code - clean and maintainable c++ code - ] -description: In this tutorial, we'll focus on writing clean and maintainable C++ code. We'll cover best practices, coding conventions, and design principles that promote readability, simplicity, and extensibility in your codebase. You'll learn how to structure your code effectively, choose meaningful names for variables and functions, and document your code properly. Understanding how to write clean and maintainable C++ code is essential for building software that is easy to understand, modify, and maintain over time. ---- \ No newline at end of file diff --git a/docs/cpp/14_Cpp_Best_Practices/02_Performance_Optimization_Techniques.md b/docs/cpp/14_Cpp_Best_Practices/02_Performance_Optimization_Techniques.md deleted file mode 100644 index c6175e34d..000000000 --- a/docs/cpp/14_Cpp_Best_Practices/02_Performance_Optimization_Techniques.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-performance-optimization-techniques -title: Performance Optimization Techniques in C++ -sidebar_label: Performance Optimization Techniques in C++ -sidebar_position: 2 -tags: - [ - c++, - programming, - c++ best practices, - coding best practices, - c++ performance optimization - ] -description: In this tutorial, we'll delve into performance optimization techniques in C++. We'll explore various strategies and methods to improve the speed and efficiency of your C++ code. From algorithmic optimizations to memory management techniques and compiler optimizations, you'll learn how to identify bottlenecks and apply optimizations effectively. Understanding performance optimization techniques is crucial for writing fast and responsive C++ applications, ensuring they meet performance requirements and deliver a smooth user experience. ---- \ No newline at end of file diff --git a/docs/cpp/14_Cpp_Best_Practices/03_Exception_Handling_Best_Practices.md b/docs/cpp/14_Cpp_Best_Practices/03_Exception_Handling_Best_Practices.md deleted file mode 100644 index 39c11ec25..000000000 --- a/docs/cpp/14_Cpp_Best_Practices/03_Exception_Handling_Best_Practices.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -id: cpp-exception-handling-best-practices -title: Exception Handling Best Practices in C++ -sidebar_label: Exception Handling Best Practices in C++ -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ best practices, - c++ exception handling, - programming best practices, - exception handling - ] -description: In this tutorial, we'll focus on exception handling best practices in C++. We'll cover guidelines and techniques to effectively handle exceptions in your code, ensuring robustness and maintainability. You'll learn about when to use exceptions, how to design exception hierarchies, and how to handle exceptions gracefully. Additionally, we'll discuss resource management and exception safety guarantees to prevent memory leaks and ensure program stability. Understanding exception handling best practices is crucial for writing reliable and resilient C++ applications that can gracefully handle unexpected errors and exceptions. ---- \ No newline at end of file diff --git a/docs/cpp/14_Cpp_Best_Practices/_category_.json b/docs/cpp/14_Cpp_Best_Practices/_category_.json deleted file mode 100644 index 0411b1d62..000000000 --- a/docs/cpp/14_Cpp_Best_Practices/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "C++ Best Practices", - "position": 15, - "link": { - "type": "generated-index", - "description": "In this section, you will discover the best practices for writing clean, efficient, and maintainable C++ code. You will explore guidelines for code organization, naming conventions, and documentation. Additionally, you'll learn about effective error handling, resource management, and design patterns. By adhering to these best practices, you will enhance code readability, reduce bugs, and facilitate collaboration within development teams." - } -} \ No newline at end of file diff --git a/docs/cpp/15_Next_Steps_and_Resources/01_Further_Learning_Resources.md b/docs/cpp/15_Next_Steps_and_Resources/01_Further_Learning_Resources.md deleted file mode 100644 index 8b6841143..000000000 --- a/docs/cpp/15_Next_Steps_and_Resources/01_Further_Learning_Resources.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: cpp-further-learning-resources -title: Further Resources for Learning C++ -sidebar_label: Further Resources for Learning C++ -sidebar_position: 1 -tags: - [ - c++, - c++ next steps, - programming, - c++ resources, - c++ further learning - ] -description: In this tutorial, we'll explore further resources for learning C++. We'll provide a curated list of books, online courses, websites, and communities where you can continue your C++ learning journey. You'll discover resources tailored to your skill level, from beginner to advanced, covering various aspects of C++ programming, including syntax, data structures, algorithms, and advanced topics such as concurrency and optimization. Whether you're just starting out or looking to deepen your C++ expertise, these additional resources will help you enhance your skills and stay updated with the latest developments in the C++ community. ---- \ No newline at end of file diff --git a/docs/cpp/15_Next_Steps_and_Resources/02_Advanced_C++_Topics_to_Explore.md b/docs/cpp/15_Next_Steps_and_Resources/02_Advanced_C++_Topics_to_Explore.md deleted file mode 100644 index eb5bbf768..000000000 --- a/docs/cpp/15_Next_Steps_and_Resources/02_Advanced_C++_Topics_to_Explore.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -id: advanced-cpp-topics-to-explore -title: Advanced C++ Topics to Explore -sidebar_label: Advanced C++ Topics to Explore -sidebar_position: 2 -tags: - [ - c++, - c++ advanced topics, - c++ further learning, - c++ exploration, - c++ advanced - ] -description: In this tutorial, we'll explore advanced C++ topics that you can further explore to enhance your skills. We'll cover a range of topics beyond the basics, including template metaprogramming, advanced STL usage, concurrency with C++11 and beyond, and low-level programming techniques. You'll learn about topics such as move semantics, perfect forwarding, lambda expressions, and more. Understanding advanced C++ topics is essential for mastering the language and becoming a proficient C++ programmer. These topics will help you write more efficient, flexible, and maintainable code, and they'll open up new avenues for exploration and innovation in your C++ projects. ---- \ No newline at end of file diff --git a/docs/cpp/15_Next_Steps_and_Resources/03_Community_Forums_and_Support_Networks.md b/docs/cpp/15_Next_Steps_and_Resources/03_Community_Forums_and_Support_Networks.md deleted file mode 100644 index 260122e14..000000000 --- a/docs/cpp/15_Next_Steps_and_Resources/03_Community_Forums_and_Support_Networks.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: cpp-community-forums-and-support-networks -title: C++ Community Forums and Support Networks -sidebar_label: C++ Community Forums and Support Networks -sidebar_position: 3 -tags: - [ - c++, - programming, - c++ community forums, - c++ support networks - ] -description: In this tutorial, we'll explore C++ community forums and support networks where you can engage with fellow C++ enthusiasts, ask questions, share knowledge, and seek assistance. We'll introduce you to popular online forums, such as Stack Overflow, Reddit's r/cpp community, and the C++ tag on GitHub Discussions. Additionally, we'll highlight C++ Discord servers, mailing lists, and social media groups where you can connect with like-minded developers and stay updated with the latest trends and discussions in the C++ community. Engaging with these forums and support networks will not only help you solve coding challenges but also expand your network and enhance your C++ learning experience. ---- \ No newline at end of file diff --git a/docs/cpp/15_Next_Steps_and_Resources/_category_.json b/docs/cpp/15_Next_Steps_and_Resources/_category_.json deleted file mode 100644 index 1e7db1097..000000000 --- a/docs/cpp/15_Next_Steps_and_Resources/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Next Steps and C++ Resources", - "position": 16, - "link": { - "type": "generated-index", - "description": "In this section, you will find resources to help you continue your learning journey." - } -} \ No newline at end of file diff --git a/docs/cpp/_category_.json b/docs/cpp/_category_.json deleted file mode 100644 index aea9cefaf..000000000 --- a/docs/cpp/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "CPP", - "position": 4, - "link": { - "type": "generated-index", - "description": "CPP(C++) is a powerful, high-performance programming language developed by Bjarne Stroustrup in 1983. It extends the C language with object-oriented features, allowing for both low-level memory manipulation and high-level abstractions. C++ supports multiple programming paradigms, including procedural, object-oriented, and generic programming, making it versatile for various applications. It is widely used in system/software development, game programming, real-time simulations, and performance-critical applications. C++ offers robust standard libraries, enabling efficient and effective code reuse. Its combination of efficiency, flexibility, and rich feature set has made it a staple in the programming world." - } -} \ No newline at end of file diff --git a/docs/cpp/basic-syntax-and-structure/02_Variables_and_Data_Types.md b/docs/cpp/basic-syntax-and-structure/02_Variables_and_Data_Types.md deleted file mode 100644 index db27271ae..000000000 --- a/docs/cpp/basic-syntax-and-structure/02_Variables_and_Data_Types.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -id: variables-and-data-types -title: Variables and Data Types -sidebar_label: Variables and Data Types -sidebar_position: 2 -tags: - [ - c++, - variables, - data types, - programming, - c++ variables, - c++ data types - ] -description: In this tutorial, we will learn about variables and data types in C++. We will learn about what variables are, how to declare and initialize variables, and the different data types available in the language. ---- - -# Variables and Data Types in C++ - -## Data Types - -C++ is a strongly-typed language, meaning every variable must be declared with a data type. - -### Primitive Data Types - -- **int**: Integer type. -- **double**: Double-precision floating point. -- **char**: Character type. -- **bool**: Boolean type (true or false). - -Example: - -```cpp -int number = 10; -double price = 9.99; -char letter = 'A'; -bool isCppFun = true; -``` - -### Derived Data Types - -Derived data types are created from fundamental data types. - -- **Array**: A collection of elements of the same data type. -- **Pointer**: A variable that stores the memory address of another variable. -- **Reference**: A reference to another variable, often used in functions. - -Example: - -```cpp -int numbers[] = {1, 2, 3, 4, 5}; -int* ptr = &number; -int& refNumber = number; -``` - -## Variables - -Variables store data values and must be declared before use. - -### Variable Declaration - -```cpp -int age; -char grade; -``` - -### Variable Initialization - -```cpp -age = 25; -grade = 'A'; -``` - -### Combined Declaration and Initialization - -```cpp -int age = 25; -char grade = 'A'; -``` - -## Conclusion - -Understanding C++ variables and data types is fundamental to writing efficient and effective C++ code. By mastering these concepts, you can work with different types of data and create dynamic and robust applications in C++. diff --git a/docs/cpp/basic-syntax-and-structure/03_Operators_and_Expressions.md b/docs/cpp/basic-syntax-and-structure/03_Operators_and_Expressions.md deleted file mode 100644 index c9b530c37..000000000 --- a/docs/cpp/basic-syntax-and-structure/03_Operators_and_Expressions.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -id: operators-and-expressions -title: Operators and Expressions -sidebar_label: Operators and Expressions -sidebar_position: 3 -tags: - [c++, operators, expressions, programming, c++ operators, c++ expressions] -description: In this tutorial, we will learn about operators and expressions in C++. We will learn about the different types of operators available in C++, how to use them, and how to create expressions using operators. ---- - -# Operators and Expressions in C++ - -## Operators - -C++ supports various operators for arithmetic, comparison, logical operations, etc. - -### Arithmetic Operators - -- `+` (addition) -- `-` (subtraction) -- `*` (multiplication) -- `/` (division) -- `%` (modulus) - -Example: - -```cpp -int sum = 10 + 5; // 15 -int difference = 10 - 5; // 5 -``` - -### Comparison Operators - -- `==` (equal to) -- `!=` (not equal to) -- `>` (greater than) -- `<` (less than) -- `>=` (greater than or equal to) -- `<=` (less than or equal to) - -Example: - -```cpp -bool isEqual = (10 == 10); // true -bool isGreater = (10 > 5); // true -``` - -### Logical Operators - -- `&&` (logical AND) -- `||` (logical OR) -- `!` (logical NOT) - -Example: - -```cpp -bool result = (true && false); // false -bool orResult = (true || false); // true -``` - -## Expressions - -Expressions in C++ are formed using operators and operands. An expression can be a combination of literals, variables, and operators. - -Example: - -```cpp -int x = 10; -int y = 5; -int z = x + y; // z = 15 -bool isTrue = (x > y) && (z != y); // true -``` - -## Conclusion - -Understanding C++ operators and expressions is fundamental to writing effective C++ code. By mastering these concepts, you can perform various operations and create complex expressions in your C++ programs. diff --git a/docs/cpp/basic-syntax-and-structure/_category_.json b/docs/cpp/basic-syntax-and-structure/_category_.json deleted file mode 100644 index 3441fe8f2..000000000 --- a/docs/cpp/basic-syntax-and-structure/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "The Basics of C++ Syntax and Structure", - "position": 3, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the basics of C++ syntax, the details of how the language is structured and the data types and operators that make up C++." - } -} \ No newline at end of file diff --git a/docs/cpp/basic-syntax-and-structure/cpp-syntax-basics.md b/docs/cpp/basic-syntax-and-structure/cpp-syntax-basics.md deleted file mode 100644 index 98ca5c996..000000000 --- a/docs/cpp/basic-syntax-and-structure/cpp-syntax-basics.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -id: cpp-syntax-basics -title: Basics Syntax and Structure of C++ -sidebar_label: Syntax and Structure -sidebar_position: 1 -tags: - [ - c++, - syntax, - structure, - programming, - c++ syntax and structure, - c++ programming language, - c++ features, - ] -description: In this tutorial, we will learn about the syntax and structure of the C++ programming language. We will learn about the basic structure of a C++ program, C++ syntax, and the rules that govern the C++ programming language. ---- - -# C++ Syntax and Structure - -## Introduction - -Understanding the basic syntax and structure of C++ is essential for writing effective C++ programs. This guide covers the fundamental elements of C++ syntax and how to structure a C++ program. - -## Basic Syntax - -### Hello World Example - -The simplest C++ program is a "Hello, World!" application. Here's what it looks like: - -```cpp -#include - -int main() { - std::cout << "Hello, World!" << std::endl; - return 0; -} -``` - -### Explanation - -- **Header File**: The `#include ` line includes the input/output stream library, allowing us to use `cout` and `endl`. -- **Main Function**: The `main` function is the entry point of any C++ application. It returns an integer value (`int`) indicating the exit status. -- **Output Statement**: The `std::cout << "Hello, World!" << std::endl;` statement prints the specified message to the console. - -## Comments - -Comments are used to explain code and are ignored by the compiler. - -- **Single-line comments** start with `//`. - -```cpp -// This is a single-line comment -``` - -- **Multi-line comments** are enclosed in `/* ... */`. - -```cpp -/* - This is a multi-line comment - that spans multiple lines. - */ -``` - -## Data Types and Variables - -C++ supports various data types such as `int`, `double`, `char`, `bool`, etc., and allows the declaration of variables using the syntax `datatype variableName;`. - -```cpp -int age = 25; -double salary = 50000.50; -char grade = 'A'; -bool isEmployed = true; -``` - -## Control Structures - -C++ provides control structures like `if`, `else`, `for`, `while`, and `switch` for conditional and looping operations. - -```cpp -if (age >= 18) { - std::cout << "You are an adult." << std::endl; -} else { - std::cout << "You are a minor." << std::endl; -} -``` - -## Functions - -Functions in C++ are declared using the syntax `returnType functionName(parameters) { ... }`. - -```cpp -int add(int a, int b) { - return a + b; -} - -int result = add(5, 10); // result = 15 -``` - -## Conclusion - -Understanding the basic syntax and structure of C++ is foundational to becoming proficient in C++ programming. By mastering these concepts, you can write efficient and reliable C++ code for various applications. diff --git a/docs/cpp/home.md b/docs/cpp/home.md deleted file mode 100644 index 8086d20f8..000000000 --- a/docs/cpp/home.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: cpp-home -title: C++ Tutorial Overview -sidebar_label: Overview -sidebar_position: 1 -tags: [C++, overview] -description: In this tutorial, you will learn about the C++ programming language, its features, and its applications. ---- - -C++ is a high-level, general-purpose programming language that is widely used for developing system software, application software, game development, and more. It is an extension of the C programming language with additional features such as classes and objects, inheritance, polymorphism, and templates. - -## What we will learn in this tutorial? - -In this tutorial, you will learn about the C++ programming language, its features, and its applications. You will also learn how to set up a C++ development environment on your computer and write your first C++ program. - -## What is C++? - -- C++ is a high-level, general-purpose programming language. -- It is an extension of the C programming language with additional features such as classes and objects, inheritance, polymorphism, and templates. -- C++ is designed for system programming, application development, game development, and more. -- It is a statically typed language, which means that variable types are checked at compile time. -- C++ supports both procedural programming and object-oriented programming paradigms. -- C++ code is typically compiled into machine code for execution. - -## Features of C++ - -- **Object-Oriented**: C++ is an object-oriented programming language. It supports the concepts of classes and objects, inheritance, polymorphism, and encapsulation. -- **Statically Typed**: C++ is a statically typed language, which means that variable types are checked at compile time. -- **Compiled Language**: C++ code is compiled into machine code for execution, which can result in high performance. -- **Portable**: C++ code can be compiled and executed on different platforms, making it portable. -- **Memory Management**: C++ allows manual memory management using pointers, which gives developers more control over memory allocation and deallocation. -- **Standard Library**: C++ provides a rich standard library that includes data structures, algorithms, input/output functions, and more. -- **Compatibility with C**: C++ is compatible with C code, allowing developers to use existing C libraries and code in C++ programs. - -## Applications of C++ - -C++ is used in a wide range of applications, including: - -- **System Software**: C++ is used to develop system software such as operating systems, device drivers, and firmware. -- **Application Software**: C++ is used to develop application software such as desktop applications, business applications, and productivity tools. -- **Game Development**: C++ is widely used in game development. It is used to build game engines, game logic, and graphics rendering. -- **Embedded Systems**: C++ is used in embedded systems development. It is used to build embedded software for devices such as microcontrollers, IoT devices, and automotive systems. -- **High-Performance Computing**: C++ is used in high-performance computing (HPC) applications such as scientific computing, simulations, and data analysis. -- **Graphics Programming**: C++ is used in graphics programming. It is used to develop graphics libraries, rendering engines, and graphical user interfaces (GUIs). -- **Financial Applications**: C++ is used in financial applications such as trading systems, risk management software, and financial modeling tools. -- **Compiler Development**: C++ is used to develop compilers, interpreters, and language tools for other programming languages. -- **Networking**: C++ is used in networking applications such as network protocols, servers, and communication software. -- **Artificial Intelligence**: C++ is used in artificial intelligence (AI) applications such as machine learning algorithms, neural networks, and AI research. -- **Multimedia Applications**: C++ is used in multimedia applications such as audio/video processing, image processing, and media players. - -## Conclusion - -C++ is a powerful and versatile programming language that is widely used in various domains. It combines the features of procedural programming with object-oriented programming, making it suitable for a wide range of applications. Whether you are a beginner or an experienced developer, learning C++ can open up opportunities to work on exciting projects and technologies. In this tutorial, you will learn the basics of C++ programming and how to get started with C++ development. Let's dive in! diff --git a/docs/cpp/introduction-to-cpp/_category_.json b/docs/cpp/introduction-to-cpp/_category_.json deleted file mode 100644 index c65ee3fc4..000000000 --- a/docs/cpp/introduction-to-cpp/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Introduction To C++", - "position": 2, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the basics of the C++ programming language. You will learn about the many features that make C++ unqiue, you'll learn how to install it on your machine, and how to write and run your first C++ program." - } -} \ No newline at end of file diff --git a/docs/cpp/introduction-to-cpp/setting-up-your-cpp-environment.md b/docs/cpp/introduction-to-cpp/setting-up-your-cpp-environment.md deleted file mode 100644 index b4deb4829..000000000 --- a/docs/cpp/introduction-to-cpp/setting-up-your-cpp-environment.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -id: setup-cpp-development-environment -title: Setup C++ Development Environment -sidebar_label: Setup C++ Development Environment -sidebar_position: 3 -tags: [c++, setup c++ development environment] -description: In this tutorial, you will walk through all the steps of setting up a C++ development environment on your local computer. ---- - -# Setting Up a C++ Environment - -## Introduction - -Before you can start programming in C++, you need to set up your development environment. This typically involves installing the necessary software and configuring your system to compile and run C++ code. - -## Steps to Set Up C++ Environment - -1. **Install a C++ Compiler**: - - - For Windows, you can install MinGW or Microsoft Visual C++ Compiler. - - For macOS, you can install Xcode Command Line Tools or use Homebrew to install GCC. - - For Linux, you can use your package manager to install GCC or Clang. - -2. **Choose a Text Editor or Integrated Development Environment (IDE)**: - - - Choose a text editor like Visual Studio Code, Sublime Text, or Atom, or an IDE like Visual Studio or CLion for C++ development. - - Download and install the chosen editor or IDE from their official websites. - -3. **Set Up Compiler and Build Tools**: - - - If using an IDE, configure it to use the installed C++ compiler (e.g., GCC or Clang). - - For text editors, install C++ language support extensions or plugins for syntax highlighting and code completion. - -4. **Install C++ Libraries and Frameworks** (Optional but recommended): - - - Depending on your project requirements, install any necessary C++ libraries or frameworks like Boost, Qt, or OpenGL. - - Configure your development environment to include these libraries in your project. - -5. **Verify Installation**: - - - Open a terminal or command prompt and type `g++ --version` (for GCC) or `clang++ --version` (for Clang) to verify that the C++ compiler is installed and accessible. - -6. **Set Up Environment Variables** (Optional but recommended): - - - Set up environment variables such as `PATH` to include the directory containing the C++ compiler and build tools, allowing you to run C++ commands from any directory in the terminal or command prompt. - -## Conclusion - -Setting up a C++ environment is crucial for C++ developers to compile, run, and manage C++ applications effectively. By following these steps and choosing the right tools for your needs, you can create a well-configured development environment that enhances your productivity and workflow when working with C++ code. diff --git a/docs/cpp/introduction-to-cpp/what-is-cpp.md b/docs/cpp/introduction-to-cpp/what-is-cpp.md deleted file mode 100644 index 585f7e029..000000000 --- a/docs/cpp/introduction-to-cpp/what-is-cpp.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: what-is-cpp -title: What is C++? -sidebar_label: What is C++? -sidebar_position: 1 -tags: [c++, what is c++, introduction to c++] -description: In this tutorial, you will learn about the C++ programming language, what it is, its features, and its applications. ---- - -# Introduction to C++ - -## What is C++? - -C++ is a powerful and widely-used programming language known for its versatility, performance, and extensive feature set. It is an extension of the C programming language with additional features such as classes and objects, inheritance, polymorphism, templates, and more. C++ is designed for system programming, application development, game development, and other domains. - -## Key Features of C++ - -- **Object-Oriented**: C++ is an object-oriented programming (OOP) language, allowing developers to create classes and objects that encapsulate data and behavior. -- **Statically Typed**: C++ is a statically typed language, meaning that variable types are checked at compile time for type safety. -- **Compiled Language**: C++ code is compiled into machine code for execution, resulting in high performance and efficiency. -- **Memory Management**: C++ allows manual memory management using pointers, giving developers control over memory allocation and deallocation. -- **Standard Library**: C++ provides a rich standard library with data structures, algorithms, input/output functions, and more, facilitating software development. -- **Compatibility with C**: C++ is compatible with C code, allowing developers to use existing C libraries and code in C++ programs. - -## C++ Development Ecosystem - -C++ has a comprehensive development ecosystem comprising various tools, libraries, and frameworks: - -- **Integrated Development Environments (IDEs)**: Popular IDEs for C++ development include Visual Studio, Code::Blocks, and CLion, offering features like code completion, debugging, and project management. - -- **Libraries and Frameworks**: C++ has numerous libraries and frameworks for different purposes, such as Boost for general-purpose programming, Qt for GUI development, and OpenGL for graphics programming. - -- **Community Support**: C++ has a vibrant community of developers who contribute to open-source projects, share knowledge through forums and blogs, and provide support to fellow developers. - -## C++ Editions - -C++ has evolved over time, leading to different editions tailored for specific platforms and use cases: - -- **Standard C++**: Also known as ISO C++, this is the standardized version of the language maintained by the International Organization for Standardization (ISO). - -- **C++11, C++14, C++17, C++20**: These are versions of the language that introduce new features and improvements, enhancing productivity and code quality. - -- **Embedded C++ (EC++)**: Optimized for embedded systems development, EC++ focuses on efficiency, low-level programming, and resource-constrained environments. - -## Conclusion - -C++ continues to be a preferred choice for developers due to its versatility, performance, and extensive ecosystem. Whether you are building system software, applications, games, or embedded systems, C++ offers the tools and capabilities to meet diverse development needs. Its object-oriented nature, strong memory management, and compatibility with C make it a robust and reliable language for a wide range of projects. diff --git a/docs/cpp/introduction-to-cpp/why-learn-cpp.md b/docs/cpp/introduction-to-cpp/why-learn-cpp.md deleted file mode 100644 index 9e530479b..000000000 --- a/docs/cpp/introduction-to-cpp/why-learn-cpp.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: why-learn-cpp -title: Why Learn C++? -sidebar_label: Why Learn C++? -sidebar_position: 2 -tags: [c++, why learn c++] -description: In this tutorial, you will learn about the many applications of the C++ programming language and the benefits of learning it. ---- - -# Why Learn C++? - -## Introduction - -C++ is a powerful and widely-used programming language with numerous advantages that make it a valuable skill for developers. - -## Reasons to Learn C++ - -- **Versatility**: C++ is a versatile language used in system programming, game development, high-performance applications, embedded systems, and more. Learning C++ opens doors to diverse career opportunities. - -- **Performance**: C++ is known for its high performance and efficiency, making it suitable for applications that require speed and resource optimization, such as real-time systems, simulations, and games. - -- **Compatibility with C**: C++ is compatible with C code, allowing developers to leverage existing C libraries and code in C++ programs. This compatibility enhances code reusability and integration. - -- **Object-Oriented Programming (OOP)**: C++ is an object-oriented programming language, emphasizing concepts like classes, objects, inheritance, and polymorphism. Learning C++ helps developers master OOP principles, which are fundamental in modern software development. - -- **Memory Management**: C++ offers manual memory management through pointers, giving developers fine-grained control over memory allocation and deallocation. This level of control is beneficial for optimizing resource usage and performance. - -- **Strong Community and Resources**: C++ has a robust community of developers, forums, libraries, and frameworks that provide support, resources, and tools for C++ development. Being part of this community can enhance your learning experience and accelerate your growth as a developer. - -- **Industry Demand**: C++ developers are in demand across various industries, including finance, gaming, automotive, aerospace, and technology. Learning C++ increases your marketability and opens doors to exciting career opportunities. - -## Conclusion - -Whether you're interested in system programming, game development, high-performance computing, or embedded systems, learning C++ offers numerous benefits. Its versatility, performance, compatibility with C, strong community support, and industry demand make it a valuable language to learn and master in today's competitive software development landscape. diff --git a/docs/dsa/Hash/_category_.json b/docs/dsa/Hash/_category_.json deleted file mode 100644 index 93424d3c3..000000000 --- a/docs/dsa/Hash/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Hash", - "position": 15, - "link": { - "type": "generated-index", - "description": "Hash is a data structure that maps keys to values. It uses a hash function to compute an index into an array of buckets or slots, from which the desired value can be found." - } -} diff --git a/docs/dsa/Hash/hash.md b/docs/dsa/Hash/hash.md deleted file mode 100644 index 398b6dd33..000000000 --- a/docs/dsa/Hash/hash.md +++ /dev/null @@ -1,150 +0,0 @@ -# Hash in DSA (Data Structures and Algorithms) - -Hash in DSA (Data Structures and Algorithms) is a function that takes an input (or "key") and produces a fixed-size string of characters, which is typically a unique representation of the input. Hash functions are commonly used in various applications, such as data indexing, password storage, and digital signatures. - -![alt text](image.png) - -- A hash function takes an input and applies a mathematical algorithm to generate a hash value. The hash value is a fixed-size string that is unique to the input data. It is important to note that even a small change in the input data will result in a completely different hash value. - -![alt text](image-1.png) - -- Hash functions are designed to minimize the occurrence of hash collisions, where two different inputs produce the same hash value. However, it is still possible for collisions to occur due to the limited size of the hash value compared to the potentially infinite input space. - -- One common use of hash functions is in data indexing. Hash tables, also known as hash maps, use hash functions to map keys to specific locations in memory, allowing for efficient retrieval and storage of data. - -Hash functions are also used in password storage. Instead of storing passwords in plain text, they are hashed and the hash value is stored. When a user enters their password, it is hashed and compared to the stored hash value for authentication. - - - -Hash functions are an integral part of digital signatures. They are used to generate a unique hash value for a document or message, which is then encrypted with the sender's private key. The recipient can verify the integrity of the message by decrypting the hash value with the sender's public key and comparing it to the computed hash value of the received message. - -Overall, hash functions play a crucial role in various applications by providing a unique representation of data, enabling efficient data retrieval, ensuring data integrity, and enhancing security. - -## Implementing Hash Functions in Different Programming Languages - -Here's a basic example of how to implement a hash function in different programming languages: - -Python: -```python -import hashlib - -def hash_string(input_string): - hash_object = hashlib.sha256(input_string.encode()) - return hash_object.hexdigest() - -input_string = "Hello, World!" -hashed_string = hash_string(input_string) -print(hashed_string) -``` -Output: `2ef7bde608ce5404e97d5f042f95f89f1c232871` - -Java: -```java -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -public class HashExample { - public static String hashString(String inputString) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] hashBytes = md.digest(inputString.getBytes()); - StringBuilder sb = new StringBuilder(); - for (byte b : hashBytes) { - sb.append(String.format("%02x", b)); - } - return sb.toString(); - } - - public static void main(String[] args) throws NoSuchAlgorithmException { - String inputString = "Hello, World!"; - String hashedString = hashString(inputString); - System.out.println(hashedString); - } -} -``` -Output: `2ef7bde608ce5404e97d5f042f95f89f1c232871` - -C++: -```cpp -#include -#include - -std::string hashString(const std::string& inputString) { - unsigned char hash[SHA256_DIGEST_LENGTH]; - SHA256_CTX sha256; - SHA256_Init(&sha256); - SHA256_Update(&sha256, inputString.c_str(), inputString.length()); - SHA256_Final(hash, &sha256); - std::stringstream ss; - for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { - ss << std::hex << std::setw(2) << std::setfill('0') << (int)hash[i]; - } - return ss.str(); -} - -int main() { - std::string inputString = "Hello, World!"; - std::string hashedString = hashString(inputString); - std::cout << hashedString << std::endl; - return 0; -} -``` -Output: `2ef7bde608ce5404e97d5f042f95f89f1c232871` - -Please note that these examples use the SHA-256 hash function as an illustration. Different hash functions may be used depending on the specific requirements of your application. - -## Example Questions with Code in Python - -Here are some example questions with code in Python to help you practice implementing hash functions: - -1. **Question:** Write a Python function to calculate the MD5 hash of a given string. - -```python -import hashlib - -def calculate_md5_hash(input_string): - hash_object = hashlib.md5(input_string.encode()) - return hash_object.hexdigest() - -input_string = "Hello, World!" -md5_hash = calculate_md5_hash(input_string) -print(md5_hash) -``` - -**Output:** `3e25960a79dbc69b674cd4ec67a72c62` - -2. **Question:** Implement a Python program to find the SHA-1 hash of a file. - -```python -import hashlib - -def calculate_sha1_hash(file_path): - sha1_hash = hashlib.sha1() - with open(file_path, 'rb') as file: - for chunk in iter(lambda: file.read(4096), b''): - sha1_hash.update(chunk) - return sha1_hash.hexdigest() - -file_path = "path/to/file.txt" -sha1_hash = calculate_sha1_hash(file_path) -print(sha1_hash) -``` - -**Output:** `2ef7bde608ce5404e97d5f042f95f89f1c232871` - -3. **Question:** Write a Python function to generate a random salt value for password hashing. - -```python -import os -import hashlib - -def generate_salt(): - salt = os.urandom(16) - return salt.hex() - -salt = generate_salt() -print(salt) -``` - -**Output:** `a5f7b9c8d7e6f5a4b3c2d1e0f9e8d7c6` - -Remember to customize these examples based on your specific requirements and use appropriate hash functions for your application. diff --git a/docs/dsa/Hash/image-1.png b/docs/dsa/Hash/image-1.png deleted file mode 100644 index c0b6d612e0469a3954482eec888501ccd28deca7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22802 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 )Seir|J8XE@HJ8ErqpvtoSwV> z<@;{Zz`cx%Xig^#IowxLvnW|_%muF-H(bbba|y#0OdlC(|DCrr)~CV5SOlUJxu$KDI~^aij}Ljy|_N zlKUQgC<7#`=3Vdsk1e##iANK)8*{*23o9BGDk5XvhW;Z0G;y+Ifn!#+6UH2(#N=P) z4tCBp+s?x)EjbPoOJSzQ%Rs9sTCHiY9#4fAwGKeVXs)`~T7$0~9k!Ot<0SV=R!>n@ zO>wKTq&h9EcdiG;ZFTbbd;9oA-QEAEh#2-w%kT{^f1~6NO2ZgTz&zUeX zg6G$i*pQE|v>T@(7m0!c|4d zjj8(U;^Cg2t*wfg*fH$eTLOk`pgVw$9}n-DN6E_0)xe4tEBCp`i(lPU#Y7kZA3g}% z+m~z#f;t6cNT6JU2N+fZSmKv#d8CjLlI1`*s?JB+BUMU5;xB$ZxkIqB4eCWqvfgBwNB zLybE@L}OJ=l{#{DV`HYl2j~)T?ne^tU&Pz1t?RlFvbuji#N2A9`ME+SpJrs>+Ik^(V4N5zZqEDTu(^Yqx#x4{aWhE`sinFqC}7sKiOmdm)J-)=O{kqh7MY0gc!}E z)|2P^6$J%kI#T&S9$dkT_PlJ)@_1zqEE{$>Y+fL8F;&c?~b)pYw(z@dVU zgZJ4IAxJ~#=M8D~7J2JcX>p3jEOCN3IXDJqW@ey_7#|;piUj(Hnwp8Q!6YS-Lft?> zKyWPu8^i6SSUbHdMR_h3Yu` zoSrKfDV6>#KDhl*PGgK?6=SRs_U4OMYeF_(UUzi>5hjOd4EP&|=ooMdsg81Pstp#E zI5mMqCZ0QLRSakBGAa2>uCAF&p(V}-3L+NPyv>dFV6pT?6pb5=`l`%Y&BITtw`>p$ z6)Pig6&>WL$9QN*pZlz5TwIgb84eZ$Kel_G55*4dGbVgZ%c{3)W)-)&(N9x24E|yY zvie9Vv5kKXDUzsFpSHKROFzL}8>i)d15CGv^VCv>d|>M)GJpOcWEcC7RP^eB)~%X8 z6Q43?s_M+Y~4l``MtsuPHt`=7$}?e#+b<_$FXRc zT3Nx#L|{}#@=J5kzsA2P3GhfU{PzLBaM{UD)Kq689YDhjVPs|y&F{JAWk-ctQdagk zBqU1u`+Id}5EqBa7J#=jA?4TOFCAcCq#Yc1D)Lh5w5=`>n0rq(WPr;Vomgexb^RmW z!&49|z(7zhLQTCy_F8>5`3YT!hN@zz*Nq|}R-s)JlD#t$q5%j=Wp5(FdadDofcHc` zMWf2x##M$tsufunHDC_*cLt^j6|F_!dc4HmT-&LeiA6 z1E>Y$D3b+OlO5rsdT)%&CkLf<8Lzc&qEm`nvAsX`%uQnkO|rU_RhE$k7~lkLIz6-9 z!t^iu44V2+A61I{n&TU(2);fL#t!LmJ~Ywy}uinATPjrQHMbWgIc7COgmR!;JN0aG?xwx>GX=?} zWF{~LWg^WUdUbwz3D}Yz$^Vhn@UB$b*wRy6Wy>#+cU#xndejr>8O^JI ztE$@w=J9ee@+5U;949`|1m&!O|Lo)o`KIFE$)Dd;Rg~E9g4){XEjP8_V|gDuKrQ%b z0gw0Rnz#~^iZ3ahWA)yj#i-Xd+AYTmjO}`RXBQJZf^v>zSpYh+ox*)*wg$R(sF*+i z`~K_d#f*)#lz0E%Nlm3uJOZMVrQ9uol}!nWb}Cey{d;cyt$GF1UITm5;wrMD4jX>m zq*J)rKmuT8W&keW$DsRp=)Hl;VJ^-mzp-g!q(~Aqqd76)F+If6H+b}JXLFGImwny( zGcLgomDKwo(p+1L9OXrwoou;3a_@%+dzqb`FJzfLt)$8k6Ulfcms)ydw=`Y(F*6`* zWW2iVg`(Z-`Wbz{OF+C55CIT^W5vH`(w`2vE1RHbV+lW4jP zO2t(L3&TedR+g5ZKYe<+FQ-_C{FsgoYI0VcYRA~4_n!qj8uYx5VoFOL06}O$%~xXj zIneK(-w@k1B{Qk-ncuVNM&UvW#WBY-UQFa=ecJBpr!um7lJ~7@@r_T|KKomR#I4Fp zv*4ilgA5b_0gTRqTwLXah4Os#jjO+2fdgl*Vlx4RgcY~g+mB09F=h09B;VS}pBvb( zr`KJa3j~hyRhz0l)$13r#{)Ln?vuGBsB`i%-94MPMWu<|H3PD@>Ayecs(=>pRFT%$ z(YWm7Ec@4i}^o#sb zwO2!(t)*4J$QV%6Rdws^M(0-lwPgNvJX)ahzVPD&&v9Q>F!# zx=bSBCuyp;UTVS@!?+j+gPcq*nW@O)t zu#Z!_7=ziB%MD*kvSPU$^Me8pnb+zjmyl6|-OiloIx;~P-=O$LI&`UKlX>Zt>XAF%1FZw&1mR-Y8N}| zl_j(bs{7~c>>WKlAd2K6-9B2XJ}4@1;`Qe}*)Q2yGMnk^s#lBfYM`_@kBM_D{7Fr= z{Gg6bG$Gvo9#8xW1P69Q37c7~)S2=pBWfnE;;(*$3eJE6Ss(gNFk2|$C@3w(&B;4J zP9EGCEsX1lpMmQRT1!wFF$xJ$Xk1@=8i7-n`3a-ERHyoC-KeSVA28kU@$v$-_a#A@ zeu?@Pna-Ji>pgK3E3#x|;?VX5EX+BJb>bS2b6~Tf`dVVv6jCT@>Lx_#sVk}klC(Hf zl42u8YJ@3Jl9GIV`_{6Pjj@-F*~;=AY_jm(fAstq6cjrW2D^a2w3Wq9Hybn46Gro$ z)pP}O)PhK6d+^I~^1snkg=3b&8{M(7sn=5%rCBT zGPX<#RMtQdM)n&6=WXkQy;DzHz8+cl^2bJ|1wK>Yqxy^CROQvUSSC?+#YFj1hW5VQ z*<@v80DNt()muQj5PtHu(FCe8 zLe4n~dxwY&HWDwXoSD3hyq-|p2^w_2TzkZoZ#H;SV~FT!ZcU?LW`h$PN8`D`=+*O= zQk;*72yCUq&1R^EWiPO7{uPvYpUfTAU=>byxlV02|L*e;vA+0C&D=ulI;;@a@3GPK zj4|YmM${HNVS9#SYa3DukJW&36pO)ex>zcG6=eqtA19}=g#|jo`|xmiQ`2P>3Qq)~ zG|AD8zqbl2l=X#hq4KgaG4*R-9jyrBIvF|#yF*DyxmK`&fN%-4(H|1h&;b<+W*fv0 z`FG)0U_yoNB%)7hJJs+^3-w+`5gJb(=Qr>Gq4}4vMS5W~Acc6c>~lL1G+otqC%3Pl ze{4z+*ZD?70@`vw$DIXeD2tXO_DWU0oQ}5gQf-tQvqnb}5!9oM{j@@0B@vd`NBBuB zeeL~&!$1}hN=^$3{14)tu3o9Isya{!ly3Ypu5N!~< z%01k4UdspdN`>@D1-+6Fb&DrHV1K?W{Ki<+gs!{2iJ!TfBI$t>E5WjXkB`#vv-!>y zEWxK}VMrZj*Rg>{4__oDkrh@}eUTtGxPv*5(SN@ndVo&wJMQwK=%l3oimN*456}GA zeR|^#iiWKIR>iN8%{EN4U+Vpq0GkPTJ^|JYvx(~JM2QSISr@=WPOvQGaz2Dj@O1Vr zbV+=D5i{>jpl=UnH2NrN2x21vG9I>cXBU^deaU}!+ihF(f*%NtUjJrW_?EJ^AYZ8d zk;CR;spp9MArOo9}(=YA(H#X?qZ6nxro5Mbr@d*Bsl-j@_tPww)mMkO( zxz;?ULVIFc(Q{f)zt3ZoB%(wX#LcQhZHWegaxJT5BtH^~e-aLQs4I~P6tp_w6A2Xf zYa60;w_gd~#l{FGs>2m^`qx`BcP-6TOa`(#)_~^&^T!yTvEd(eiTM%Z66x;t$2?;TZvme>y2 zDq|swPrvq8St6T&dwx#_^gO582tojk7!l!SZqD%K4+wHV77l&TnOV7}@Zb~>#=#I1 z#*-areQADuMt$ngnhy(;gF*QF6inqGDWab?qr_-#6mouV_ z)mkUH+k8LDt+T&0zA7zgQf3(ZBhI_ylZZ1dJX(ehlY+Xzl!` z==LU=0tYD+jGz(OSX&bw{50*EO)#LZ5V3>ORUsr3g8TG>3KRL2%!N@C@y~qrdkCsx z{wTkF*O+;qX0S2xW1qS!nQCG%x8UwQSRY6Bzz?6QcI!D=K1!c#DO>yzWx6b69T6Um z?*9*z8I4Xc8hW+6JNOZJ#}51pn0a`We|*IzVxUtp1!7V&!s38v@p z1quu=uY0>4jfk2+-U13uy7Psr2V$yCm9b6S0eg8a?enLCmRHtG0w^jIBnL0K2nZHH z4c723uZiVmgK&!te`%VnSJvLi3GuqPakxk0&o+3(Jcs&0a1Qd)P!euXI0FKh3ZK~+ z(<)8j5h3Bq>gs8m)#2IfvEGy1f`Z}x{4NvpkqsxYS zvE{QaL#dwF2F!1-M)!4oTFc?63Ng3o71bR!?z32r{#20sO506-ztqL?n{{f*Il0M$ zL8*le)E{iD=`do2hYb+{n}}#^W+wblG5J@2Qv1RgAl%*D>c;3dioNeC%fIpPsL9QJ z_y1Dq6g{c)iPY<{4f=DnhOKJv9sw@CU2DhLsecibtCWlQ_(c6PifHJP_8dEiH|iw# zb6DtsSxQ4hSDitTzbmu`m5lWFupjCb7TA<|-9(=M2`th_UB>v$uPyH|K!v}BYr6co zv;3hcjVaOzD-@5!5{8tB@1}Zq1s5ep{dC%;d#&j<{ zTkDn#zHWZ(E(r7bFc*FGtjlI(Yt4d10(`hV+UhNa#nw~R_YmIK)p@~a->=b?ubGE5 zEID}!uqcGWzYc^1K8i0OJR%`cQdDGMV*1aZK}~xe*j3?=e8H_|Hmv%cTiJw5*@Ut% zu>=M8R6?C6+EWM-!4x~$FS6)jD9XrKEVYUI?J5yNE*U+>u-rw3Tjg|lx?kXPM+~_^ z)PgIk$7q4iKX-Sx7d;=c=r*lK`Ufu*4k~^F9A?t$`R(%q)2iTfy!)kC624d3%&CJp zX2$0es&1Ap_m~?e#&u5TS9B`3OUx+{P-sjrlQ@5!TK7z+lv78q%2&ujn-<0%V1MG| z%r7j22$g3fTKsFJmRu7s5u2IuvEz5|8x-|=NJ(s(V@;4}&BXNA z7;qsQKX||C4Nu~q&AVe)Z$=Q9Nu?_(?$kEWF*Z>U@Kf`ZvI){XIyKPJe1peKP94Vi zj*MHGKTF`LGRgt_r_s8K0x@9?t(!~+hjb^$Z<;qPuLSN!3Gw_s`zI-G7WnQDxlslb zgzB0Rh#>(m$~j&LxDr2mWhhZ-$wC@9nUm&Ycy#P1>J?M;$i}1dcqr9HzoyH898;qf z+y$RyyW?!WG&{z?2;mR5p0@TS$m}7Hq_ncq)zA=eE&AyY{tX@p8Pz#;(ZEBOdx2eK zWc1x$;L)+GniNNHLiMfG{s}T72okt8OQbjy6%`lXM@I+IU-%ZqbB9&W0x?3&d(-u2 zjr(L+6fHpsUhISy@!BqT1UKe%W^b(Oaoy1g9tbDhiJxH0I;qmGx*WEt8Tyj0zsGKu zsi=07SsT3kC=2Sc$fX4@tH*(1?-G(q^l@K2`sl1iXm-}j*E2jeWYOtb89Du@EOWKC z+jZSlNz`Q7+TSRS?FH_hEISsx;i0>$_E^z^zPT_XGih-6{p)rtt$8Egv%l8=Ij7hu zxSuQ2XXn?S6cIb+6UEMMZL(c?w3gQ&bHs-TzZ-a+aFZD-_vVxM`aKRg$ z1Z8q|cbw6eAdN7r1>Q$m1pcu@tGygvR6_doyd)0hCl@kiQ6?+U`5LP>innyMhyrEms>VI7qfm?f?!;NgdrG0 zKr~W^%#)U2_k!mOA4MzfdcL>eHpy%a0zVy8{DxyKn5`M^U}%Wdy2Bm3k7JbXcTE1~ zWPks3x1Fr>gxcU~%14{OgF?mLh5Pz0XO1;of0o*+qm)Gb1gplzctX zj<(fQ{;LJmv!~q)z9&AfAPhw&O(8=1CuB{*~1txvZI(8V8{ zs6dX%*}adTrhx9<(tZSCYF}IoqaKpqAk34Yd;g#Jf`3}>Q9xc^-p$UFEl7<6p)a?>DDZv)vZ3sW^DL8z+$6m(=JS z=k8I}$&jNGof$-Q#g5fQ=hP|@Ncv^~=oIxg*X1jtTfqdXs>!ncpzE1GY!<1Vz>g!d zXJm2W{S+G3G7u`K*^#q~agv@lnsxUFc&QN(V0cE^HE7D!Ahwyup7>_2cKJIhF=q(1K!?TOi|lc9F#-Q*TO)NDg;X|}VPiN;H1bwjU00ESlz`}GQcLjh^U@w!EmewT2V$l2T6R%U` zT;nNX&xg@0_4R2E-p6n4NyGjgnd}&#j=IgmSwBNTe-yB^xERZu7A16r+1flECkZ_qb9$egezk!e^&Az|#}?Xr=cq`N897Tzo@B2z$2*_T}SdSTjjuVw zhk~HuGBYznK;Rb;0CrkL{!caG!wkvr<&_mSUvqAZW*NE-1GyBxjbRv!Q%5r61pgzo zR+04^u`AW%?hxqc7FJzn^Q{UA3+uhQIJsRYo_pZErywln+gy1(aFX z#6V-rtW$khAcThS9+r=v>cxh@JUE-R=y8(NWBa-~rjY=_3^{q{#Fl#rZdRXG9o^N{ zAw38*27nzebmWeg$%5byIl10>*Vwf7pgzJ(p>CZzlZL=-wonPb*;a+uD4`j!XP!nn znpVXFfZ)fECz(e02nbM-fw~1Oo+V=QvR}EVs2qrTGTH9-DYk+^8ssSqc-RshN8a7sfknb58Q3(lEsO0NJxHO&lV{UFHJ*@Xs zYPv?Vq%vFWGLeyyL9usxc0Tvw!}9&6&J5SP#$g5XjVoa2fKdgDF6d8bZ=|?nD1{(4 zsWW}~bsVb~7`UMkBm_qC%LntsfYf*&@kI> z9&|%&0jnISAmazHZ4?^a1@!A2Rq-Qgk&niQ%pe z=^syd?vZ?^2L?JkG&g>7e-Q>YHaK?9)VQ!AAb>3rjQDSW*O)AKlUfc+-D$5AotDIz zaw`%Da?u*Q`yX-QmDlsdd6;1VAVMQ!kTAQZdpULhL}4Jv9RK$Z;=49BAR$NZW}K1h ztCgu~Y(zxS6Xd%QJ}8Z=W&iB^Q#g1G?8YF};4f!}-~>6^ z{dHP7ID@VZ@G8ZE!rna;Awv>QQ|K@)U2{AKr6G*zLFNam8<3K~b$@UGJOZ%JmVPlw zG29UH3W07Z=(-R;%)ZJCQb=bz?B@B;2LeLXh!j&!;;nlj)g9`rky4+;4B`9!;xaZp zjoJ4$_t@QVrSy}vkr6I7b`ei?jtD!F$Qu}Qa0x1^D5XZmXenrqj|u_OOBhv~bIAm% zJMdLIJ9FJ$elZ9XY+rbqAcGSG8IOb{Bp&lELAOu}sdrjpVq$7)aSBh8HUd*gC~x#o z!r%=9P{&u9ZZewNuW#6*BNGJ<+;FWorCF%; zE`^5(q@`g7il!+*t{Z5qAmJyBLI@M#H+09LI}b{!KuA-QF5V!-lRosf&gf$7eu)j7 z`pvB^I1{{nEt*?SRdl1|C%@bjDg7M-Iph0xagb9XyodQ~l|v8rW6Zz>P`$6L1cnKr zzfGczlmbjC6EpMe#k*74Z{kN*k{j4*{H1dd<|!C3p7nEEWRcsea2ZD)lU%})sVG`8HkID)S+|kNYC43j~O^LG2wB2>4ty+L1&?hy4}E>>RN*C zjhlx@#zG(B;Oy*dz1IZ@HekU>92JvnXe9Xg-8Gzi!oUC(w6Upa zZ#P=X(ogvM>UCKM9 zU@QX{3n;`^PfOpobpk!f%4+L>t&!z5fj>+3oyPlsd6$=$cXo!_|7ajX67ErDWk5%< zv9d1P@;E%$(}0mh2B=lUO*6WR9{B1*y9uJn&d-5t@@$C3Y`R+{&DPbGhmH=pa~+gI zeyIxI4nt@15I;~-QO&^gFI%@Obl z3D3-+pDc8~N&{dxkj}z-NZ2h7p6hyD>uiEW*$*#g=jVMNZ9ptc3EFPQpH2|MK;5!Zr!@T`(X~#j}7%Bm$V_=-Y z(hL_DR5P&nLb6^e^cJDp4G*y?!F>Em29@+-1Kxm{DrTTTB}lOl-ov2Z#mQ;!%oAo? zPoFAkYPy4;FEf(&^5b{x18KwJ%94^daF0DcM?{W1Bi_LrK=R13)-o&N!&sj`9|rkZNGoFD!N==DAB+#^ z(>xa;@ly^1=)RPJ%|sLwJ8Nqo)qf=~-(bHK3=aqb0u*7u+3D!*1=AAx-;n?Kus^`@ zYh?u?8?O8S)$P%K!@p6VTs|P~8XXxjxDj?4+&l+nU5LU1+>e>r%JMSoi|_oQKZ0z|ifpv~HY6=-nvu>80e(rx}8=FbnJVGy)0+Y&s`fOislhLVz!A4Z+y zx}8)6(COa-=uphCl=n$D_^~6?K!XCwRA3YUl_qR|uJ#cbC*KuIrDM<9VxByNUVItSyF;%6G7Zvh( zRjTtgH;y)Ds=vPohPf$`$Uc{+d%%D)o~r7OPF*QgK|oj*HP4DWDwC6YNVBlLqoQzQ z5;D2$C7oA6-p|F8tfkOBXHSUo7rGptUS6+g2Q7XLm{^5eA0Boxl4lEcgYLzAXA>FB z?#Dg-UtDBFn;MZvt<7jW075g3ZHRdAx&0 z^#%r-sSffqU%m-GeL65a3{b|{q@+!-%D^hk}CL%%g5kV=udD|dWGJf@{6QI3!;CaiSpE@r2$OG|* zu-PbklRbLm8q2q9vp$_Q@D}vwK(Rx=qVhM0?^^mU)P3f5mD2y|5e%gxr9O&80)`LG zpE?p7>3fKNtuJKp-719)>fH$R_ zC`J2aK#`e1DTk9WG{CaBf}+%Y~cn|iap zl*UG3h=alLdU&YoXAm!u0ex>O4I3b$!?w1oL@3zp$q7X*;F|vq4l*(@qz$bdJp0zG z&klK9IJmfkcLo@g6L$(`WnW+|5k!Cf9Hyc?N)Qu0I>J3CiR$@5-ws0qyl8s2Cna)U z%JA1|8YQFoGWy2bQ$gY~3|)rR9yTR~!?1aT+< zQ5^O|{61q2lSq1;AX02nJ0V_KaDfOHRo1RIn`|^u@5IKcO`)MVRL?v0TsT|nQU%Ef zuQJ6*!L=CNf7dXp!1RJ1w=1NVe6;i+B#3rjTMw-y4@z8-@3AT)?lWj5WzIYn8+eZN zB{@0%ou(fsQ9rZc+~UP(CJNRX#T^D`PQw*=p@aq*wb{kR z0}$aF!dB1YbL|Pn;Zj=Uo_(helu~I5wRLrO5O(+W)&Nc!c>k>o-2voLK#3PJOZ8Yr zW}L5TOKq?+HObm%%xLCe@>SsTa*8*_)w9|(J#axwOD=EFb_0r|-L##M`D( z-cxWmpkWI=MG{6#D=JH04?Mb%*BJl8@HZvp&I`gm78K>aah~%@H2agoDJQ9g_;Nd8 zMFw!e8C2F6yDdyNa~=Q0jZ!KpO-M|+htTEMY{;P8*gk!LfFO|gN=#V!-R9LIO(JrG z)uhL^?+}s2#qu&&(_+i=RB&!J9Y))Zxl&KT)^8M{7uCArn!0>|W;)x!1asn~~?lrhrxqoVGlMM5(bQn2hBmKWx?os@^(F7%4pokWdU_8JAr zQAZjrL>-eV5BGCB)hsXAo{jf?Jt0>f$Sbgc6mi&{p4Gh6XjTvwZ*SddE0}O$<;bPz^^>oQAirXBi zp8ZKYzh^g7I<^UCd?;5lGc)`972s3^6(@`q-~=otApsU|N|whdixEC=J{k`Ez9?=) z4HEN(tjdD}A=qlGxX!h}I{=2k$!aI`r?YUp(oWBNvi(O&-p1VgJ|^aLiAe}hH?6D+ zUQ(V8vCkOoP$1m^vla?oII}P^GQv^)jTgb)_IB{W~(k%EIDr@Cdl_OEJSj)|2?e5B(;k zC{e>gaW|6+tz%zkYUs3^mXiH+y{?@5eYJ@4G3XU$_-iwE2XtxY4vObb8`ya`F?{t+ zov&jB{-ixD#-PImyF>smkGE!bXUfStI@t_M)Rl>++NMorgnxmj6)mQ1;b0?CE4FZA zZ4LML(w_0jmEUJegi|^}Dk8hHac%o+r;X`|qIkFgk^Nqov6Fn&NDwS_$%#@1$Om5~ecap*{ZgcPqDV zLa(rXePd=|43fkWFk&}UY-VSK+@^Q?dYNdIepqtR3oxBTEs>-f?$l|Z+gk^mbw9F& z`VzdPVB357@;!LIfWHa#BtQwFZwDe_AZuU7jpl#6zi37f02?9aj}79)Q%~Xk$--g_S=bx zwP;9BYxA<@8I!$D*()1s?lU}IQjwwS>KSqwB3}y5CH^pbA{L)J-bOL9U0&|A zd~m9b2@}pGtUPDPE`xq9<)#DEqf>jQ%`0dKp!!CrQ|A=eXqLN6z7^~K`kcvZp7fSc z^KX1SF)ogfoP2w0%SvDW8#v&>)ILA|B{mkQ|4j>f3c-EE&L$N=z9%Cm@9pfY^1iBu z1p>-KI3;5SLNX$dqf--R>Y>4Q@1FnOp555I5p+l6Rs;Cp^o@#%>0M=Dvp51BBBI!#u|FbZ#J6oRmqbpdE zATt8j7ut7&S@*!UNm2Zv{YIX3~QjWc+J^ z9wG|EnkYylE9G^ovd~`P{MK&^=4*s3Y-yeN+KpE9vm8i5gr^Ap{#_&d3e{Y zCo3akVt~Hx&s-&JaUifHW6zTWFgd`i!+;OO3E;(nM!tjD->jF3#(@6An>&X?#T(dU z4?NSw^eV;FRG_xz#M7`p#-RvJV9^E96CxraBw8(RZ%+>lz}GU(3<(+LdU`WZ0unSf zcNsrz&R7_=QR@D~f{-@jF&nF*Y%}H1vQx%zM8+a<1`t_RqBrengEa7OUo;d#Vus;PP&3(-rTs)z^m{KC#y~ zf1i>q9QTqF?N9JkWBpi7s;J|ai+^uW`K|J>eYi%X$q2Z=INhql0>yUW_BRNsv5!P( zqfVY!0EES)l$RYNCRXLn&DnEa0i^(k+g#r^JY~mU54xY=X-?KHF6FrprSfIlO)75} zjeN*Ryolipe@je0!1L4Ut?nCL-VHv`FcfuE4r^i3W}8xKgoW=TXR&!haL&1oG`G!6 zTFa(;_u($JL)4EDcUR$?Sl#<-u|LAi1xzd}OwM2p zugkHRgr${&!slRF7A#W#bJS{SX!r*N5a8iKs7(TsS&9kOyk79kGe0~i$E&KUpi2VS zmKW}atI021s%vUiQb5(U4TmDEr~N`O$c88hjSYT^)`36;3D#)BLl4tQ)-m_PIJv_a zwVB=9#}w3}xAuQ>{%>z`Z2C7K!MLLX6#)Ug`jpom@eEN|SaA%Jw)~onpwWE!Lql0Y zb$i`vze2QWOnX~|V%yNjs8GAgcaixnHWIuol^&g4Bb%0Qty{yx5|a4LJjaQJIMAAR zS9#`=3Zkl07)rSGvVKkrCgUz=_l?QRM!s7oK4Hw&&~YRtCXbZmr!ZayjyfeJPm**7 zq!fQztr5x}i&Ro*SvW9wv`z8bdZN%?eJBD9Yo-~pELQMIqm9*o)1+;&*1I?AimDoS z`<_sZ4iD8pOzy_(URXqTj+0})E~U@oyk^S%!vW*QEKoWrp z*+j($unP7fSLL(*u+7bGH605BcmIJ!*obEf8?N0UViET4gzM7LOEJ(}1IE^)B)ZPO z23w6W22h_DqLN`udpYjdfotJdX z-%V5+tYR8cqmSA1^p{l6!0`6bVF5RaFnKE6oW#i1?^#?fAwk?$v{DsRCrf+KJs7o8 z+C8q3%~HtfQ6+9(%I#y@ILQ>~UPedqB%fLP^9ynrIk_sRpA=ZUy|x>cBdO{7q!S`$ zed*VXpzr2-2$p7lk;tRguGE{_s@hyt(`{6wru^FULZ2~Ga<8~P!qZcff*HG_^lIxY zffhnk9?Ra0UHVVTy~5Yc%eIIjO%>aU5}(2@1^lHg-oD$~UR&5Z1y>J{0WrdZMX8xU z*Wv0}u~ARr%;4;J{F{Aq$>X9l74+)Y(`7aJ=>!O|;w_UgJ*I7KsQZ63+e2B_9NWGI zU&ACjvU9OvoMVrWyXQWV2$-56@)gcXoSd8@qM|VQHO@FQ(!!zKF*7lNVZIn37oZ{N zlpu$z^Vxlhus0;+-)eL4zLtZ1iRmv z-E))^BV#I@14V4rIYZ?F4FKR0r#70iPHZ!lr>&?$PY{yBSv|+VWa8unCL4}_!+)Q9 zo^?5gZ*V6t6Ey9_mWM605u~zCfLY>xGkbzaj8JZ=)6U%KN8@63jxBo%vKK}RMdpzG z?827HR{1sJcuXGhzOzx0JRb#6VP_7QgMn&b?>-dg*hu$8=2{m2&hDa?yp*HGc??vmcfObZK0sEF|C`{EBCu;i6@>Nz@Q z4?Ge{o6T%Jll6$%r7@!9xk8d?h2!FqoB!kR^rOM@u%CL|n-C@GsZ`paVREeiffPuH z!qCiz1h|}>wMZICNVnj4_AEOq%NX;xDhAg~K$8?x5>mP$&!YHY{~8Y;mQHnfKZJ&* z`kdx}qog2W)f*7ybXX3Z6aq;MoN8gX2eBzOfFDYx39@AQoR($)Cdql*TE!=jr4y(e zzN7ZHqnF9jVkfuI2J=Cw76j>15$O_XDQS@IzLVege_z}e*Wnm4 zhKB?D?6uZjYtHBSJSqAUAdioaqBJ#K24kf*EY0N z<3)kWt9)$Y9nbG`9ykV32VHo0;p0^*3m*zU zecWILK$EWUb%3I&Yf32R{(ANZj>Ly8De1Rh!m+OClW11ra%g^0p%E%}XK;=SdN?)d_aHa75}NjBKZJRn zKpQFoY>RK5!DSBT3*a|*X&E*ca3^=aeEG7p34t+hufv6T1=YR*IMfZqNs0<*w=33_ znPl$4@XKTQeH?*d=(#v_j>$0)Lg-M1=k6j7`F)UNzG;0v_O4wU!)@NC*1+DiitvP?sP~G~mjY#=w z`lA%Ed&(>Ib+-4~*la=o8eRkkq{>Kr#tiui0e-{FRhd@K&I)X#Oqni3$?6&-qhPW%EjP6Y_-0!5!d1Mx zvpypZW`F8GV)76rAA+N;-3e}n~&mR%#0k^S~at?mN@EeQq=5<^DTYqJsGErgW|ckuMz z!Kukz5gJuKq)_(S?$%LIde4+iY2(PrC-;&=-^B7)s_x(E?M_y1$2|=yjD1k&u}3t5 zBcQ=@siLMfOA)bacs!}jy$0GDC`|Ekan*n*XC+g3c-GFk62;DL1A!oA=mU%P5e%=P zjJ-ZySp>Pv?$o}|9uQIx?MJ*f{xxS|jkirk(YwROUvl zNQPL0-~KPWwGr@+HIy(rWox(=ikR^vLpT{|mY@y#Y@*Oi$Nk%nv`%&8I&tNju1r2+By%QYo7g zx=(@)xjat|44~Q!{1C`7&{b9ay0qI?QFJ@B05cFmuucy*JiQER=Uu<8e6Picw3v+| zJ2!Bw@tB&m$ivb8Gig8FBx^@lj7KXdNr)Ys1qo79Q-&%koB{$b9EBEie7gUqcqq`s z79q3Ka&>TU07Ol|%m@wJv!S1~;abUt&WD+m?q8$L+D|i=b95E+2BA}G22uln-hfUH z{OWLFjG2~mKoP(W4s3nS&7gN9T{&-X1>#Sjn^VP+iaKz*4KmV8!t9C!`Jj7c76*n4CQEIu03h zz(rvfDIt;Zws+*6jyO%$zU8j_{lu=W&Q92bd{jy$BPQmR!&-zkGJv+`{{F>83kytO ztJ5nHcU=a(1IbVk0`f*nlN)EdUM&}<0grR4*2MybY&bdR3uk9I8LHXXuvcC$PuLsh z5_|bcao5rXOJ4Bk=*Yv@_xy^@gta)e5dqvT0Egz~-PLq0IVS=wUF*hV^Vts0{s5W| zC*kC(b!bt!RAzp0F_7w#xJ`b7-U1YJyE{8x-rf&iZv}{v%!|D|+kub%>evZQ{@5wT z(pZsMHz4~#PD)i-S^rA0HK*$;m1#3kP%qVIp-6I4QoG4I2(yevVUp5jd9TOnv4R>2 zcvFy)16d0#AOn0C8w;$Ed1qk~+xDBkkeGopjzVx&O#=E1)EsVXemn{ZU!w?tGDlCE zaBTlr!v;kNwC}`?zS0LhU|_fe$Mf^g9>v)=e(nu{;0%t{f&v0kvZ2dm5s?g!OiZ$Y z0x1C*%TV=(LJDXqoP}tTcF1-z`LTa-C>Lk~K<(^ow-50W0`(e8&ak09jd)wbZ_hjpi*)657jfT$n@+-Q`H7&V4Adl0tZ6=5;Djp$f*^F2Z3VoGc`YOv>VkoNZE0EKynt<0 z9P7-#YHSZL1#&D5bl2+mg5TBxdDW@C4E}Y?Z|PXVho_tdT1~n(&abzcAq$IAE4Pl% zpk>?I)# zprGw&|F2(CH`t@HK1ZM4GN^N1@ud>%S_sSQtI#gy!NH9n!IZ5N$<==H1g0tQ74hIF ztP7wd3BgJQ4fv~E4yY^X=;(mLA+{sughhQnGfSGGg^~CvoTj`zJP-&Vn49s8A*sUU zvRRQxE*>5)2NK$rvPG@&i|o7?^ksJTnQCuzUAJ|i32$y}ENSi<8iqeG#gZ5k;{l$yuy z^i4c1v6F?*3IJOtpk0^y-qHejnP6SlbZxKy(j59g-VH4uCk*o{EEm4ZO3 z*ysv6TEJOml^kJ^UWvVf1Gp@iBHV(dxQ{TL>uiF;`&afrc>sE{=9`rPS(a{gjRnV& z^}Nbr_XINM7GHvn2e78m-BPLpjB}HpkXU(j?*QosV-A71!nh|Vj|~sYQ7x4HWQZ1Y zaK(_s#0UiRH{vD4U4vSGhO#tlWy1fa!WQF#x2e0>cK$a8F8S9&Nw%Rtz^CWs=D<;ESf zA?S=!OUcz{Nq`+S{vaott*V!F$7iDfGcq+PBo=*i@XvgakB%Ra?6;(7$5y)2^eilY{PHyhX-tG&xK>`|)%Bk-1 z%+I=cp)5j??D3s|Su<+(^F3m~g-gJ_`3^J-5LpNTW2SydAk=}>J*tJ$xg_*}2R}c> zWFbL22LXrjCg~JpZL$~Rplk$yF6ac)@hR;rZ4Di&ESmS_%?VQb7beL&qQ8rIA4Hqn z%U_P({!mf^;8GmKvuDq?mIs(_ykaB^zl9ONy+HW-0JmO#x*GI`h_9g50{K`-25>Pz znFmpVGvDg$1B`X7bXzS3_oGJBSC)2Mt0x%4)8D^u0%|UB!5-efgO?Grx*?M7sWDO`OL{SCAMEMhWQwRi<+ zW?>+7>Ref^iZ!OVVCMu2GleWzTx2-GnvImyEka&R%P*kI%qx%tVKo5gmZcsFz z1)ADUPTR0rAP}&a0`?5V2PIl9n0%Nrp;Y{o6_E_DRgui0iy%#lGvD$Mg?$K!l%)i< zKZG8wu5NhIN6x{?0`7GbotW3G#sk^Vw>vE$W&59-1o7a}Bh2ttc*|G8G;Ao0EcWOy zF8Bix)>eUEn*>WY@7tE`46bq`@#nE6c+(^1I=^!ig5lo1w+yeL01QqZh`Nyj?EE4`^s(!2I>+k0MJFI}+*W=vd>vNoV_SvrGk? z6fl`VPtWO%18WbH?}MCAgO*~;+SLJsIt@KfQveemkRly^IKqt3m9!^4{h3M#7i zBJTJC2kwuotO{T$2e3q!vd3ZAMfn0Al63PR7w$h<_~5T!u;;plfTA~u59u$;XWj{8 z?9d&e=j1bCs>2x@;;s+~5c}(9PLaY!7(QH6?X&x&zBS5oLXopInrzTY?`-en;3$pj zFab&%WiL{r$E3szQ+~|GHrt55Qh>PD2`F8GgU8$hjKzT&d{kmTSSc zJ6a#p`DgGEytMKr$RK=^GtJ3!F`XP@dgJAf98JUnpYKe_B@;139*se;l(D`21^^ln z2*4#eSXj=e&xD7hKmb5Vk6YAY39GiPDlR4n;|naiGXi8X`i(cc3@ zlVeJkUQ^}3UHyOz`#ZY(FAX?2i&|8+k4*%Bes?m+9(a_i{y+H?7UBrfUBKiiO|_uO z9vp@r@Rbf-G8z=2Xb52ayNCi`SRRhU^%Vk%!0R0x7b#j>OVzieQ7)Cr{9RiK5oNf% zycH06daIDCLD>y{9s^RCP?}ICThfrCL?%Q4c5d-{N=+uKLV*lW^U?4(cpqz&uT=oA zP;IwUPS3F0(y;U84ZMvZX==KF#>Fqnwpjg`(KLuTEDJLbcPuZwfhDkk&ob;@m0pQf z!S58wU`prf5puj|PJp~qC6QF4X}g7Sr|%nATFQxP5x;e%TwXQ)|7>ue8wM6QEVSV3 z`1cRg35FCkSfsRQ$6pzDJFgtNy5%_q1z0U*J3G#ZuMM8NFm2)#a)%Fy*edI)nznOZ z?UH*v{+3fqyidlVUoo^Phb+k^mgS}`gy*|IHFauC(aBKQ{e(xWtJH;sHr`%Iw6ssJ z2j^0bK|=DrC|w3sN+uFyXA|QhgS;-Ae;(H)MjIHawJz<-7i?@UJsJ9)E;{$ctKzuj z_gz56#6RH=zGJ5UV%@01N?X~`Nmn-h(QPd32((LgYb`@@NkYhgZ?1uacDWLD2!bY$ z*AfsA&~Oo|uuiV$(+uduyr30(w?HH{g zK2g7S+mEfio+zcO7yP=IYzZk&jJ3*4QZ$DaMI5U})9FS%h%F(>&dv!FgU4Cr`!g<} zs!Pk|$3DFyTun|!_H${s14+S=9FXUAI(&d1F5Q;5R$6n(Rr~34L00+j1SjUpK09UM zUn{uj`7dbNk`+G!NLzQ;A!qr^K_rJazWsR9rI%{ZHp^~-i*{h2h5!EfbHOMZF+~Ak z$2rFnsqYS)0^@rtn&-z|BT6Zmml@Odwze937t2&hIM|B*d_G*3$mbBha302FeH(23e(h#{^!>4Cila#eE(dqHwhw+4tghVh8gb?P=vVgdi5H( zUYiLWt-;XK2lb1)q5)bG&*fh2<3`^<*P6cW>Jc8TxhIw${T>$FKX4X7)qOg_KydLh za0PM_5@E!|otRF&8+!P!_eQYHkf4D3i$Sq-v~Nq(^@jUnE?=u^iUTJn4w=Q~9E{GE zorhFTsTl(qK>Sou!OO4!$b%qi@qcyB~?ljiU~8jlcx;c zC#zy8R>Kp|ijRtewc-J?j*?8w?mb}Ahqg^SOeI>P~LXN>COPrZX6s;l@JK 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 diff --git a/docs/dsa/Heaps/_category_.json b/docs/dsa/Heaps/_category_.json deleted file mode 100644 index c9f03476e..000000000 --- a/docs/dsa/Heaps/_category_.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "label": "Heaps", - "position": 10, - "link": { - "type": "generated-index", - "description": "Heaps are a type of binary tree-based data structure that satisfy the heap property. They are commonly used to implement priority queues and efficiently find the maximum or minimum element. Heaps can be either max heaps or min heaps, depending on whether the parent nodes are greater or smaller than their children. Operations like insertion, deletion, and retrieval of the maximum or minimum element can be performed efficiently on heaps." - } - - } - - - diff --git a/docs/dsa/Heaps/heaps.md b/docs/dsa/Heaps/heaps.md deleted file mode 100644 index 8035806d3..000000000 --- a/docs/dsa/Heaps/heaps.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -id: heaps-in-dsa -title: Heaps Data Structure -sidebar_label: Heaps -sidebar_position: 1 -description: "Heaps are a type of binary tree-based data structure commonly used in computer science. They are often used to implement priority queues, where elements with higher priority are dequeued first. Heaps have two main variations: max heaps, where the parent node is always greater than or equal to its children, and min heaps, where the parent node is always less than or equal to its children. Heaps have efficient insertion and deletion operations, making them suitable for applications that require efficient priority-based processing." -tags: [dsa, data-structures, heaps] ---- - - - -## Python - Heaps - -Heap is a special tree structure in which each parent node is less than or equal to its child node. Then it is called a Min Heap. If each parent node is greater than or equal to its child node then it is called a max heap. It is very useful is implementing priority queues where the queue item with higher weightage is given more priority in processing. - -A detailed discussion on heaps is available in our website here. Please study it first if you are new to heap data structure. In this chapter we will see the implementation of heap data structure using python. - -![alt text](image.png) -## Create a Heap - -A heap is created by using python’s inbuilt library named heapq. This library has the relevant functions to carry out various operations on heap data structure. Below is a list of these functions. - -- heapify − This function converts a regular list to a heap. In the resulting heap the smallest element gets pushed to the index position 0. But rest of the data elements are not necessarily sorted. - -- heappush − This function adds an element to the heap without altering the current heap. - -- heappop − This function returns the smallest data element from the heap. - -- heapreplace − This function replaces the smallest data element with a new value supplied in the function. - -## Creating a Heap -A heap is created by simply using a list of elements with the heapify function. In the below example we supply a list of elements and the heapify function rearranges the elements bringing the smallest element to the first position. - - -**Python - Heaps** - -Heap is a special tree structure in which each parent node is less than or equal to its child node. Then it is called a Min Heap. - -If each parent node is greater than or equal to its child node then it is called a max heap. - -It is very useful is implementing priority queues where the queue item with higher weightage is given more priority in processing. - -A detailed discussion on heaps is available in our website here. Please study it first if you are new to heap data structure. In this chapter we will see the implementation of heap data structure using python. - -**Example** -``` python -import heapq - -H = [21,1,45,78,3,5] -# Use heapify to rearrange the elements -heapq.heapify(H) -print(H) -``` - -## Output -When the above code is executed, it produces the following result − -``` python -[1, 3, 5, 78, 21, 45] -``` -## Inserting into heap - -Inserting a data element to a heap always adds the element at the last index. But you can apply heapify function again to bring the newly added element to the first index only if it smallest in value. In the below example we insert the number 8. - -**Example** - -``` python -import heapq - -H = [21,1,45,78,3,5] -# Covert to a heap -heapq.heapify(H) -print(H) - -# Add element -heapq.heappush(H,8) -print(H) -``` - -## Output - -When the above code is executed, it produces the following result − -```python -[1, 3, 5, 78, 21, 45] -[1, 3, 5, 78, 21, 45, 8] -``` -## Removing from heap - -You can remove the element at first index by using this function. In the below example the function will always remove the element at the index position 1. - -**Example** -```python -import heapq - -H = [21,1,45,78,3,5] -# Create the heap - -heapq.heapify(H) -print(H) - -# Remove element from the heap -heapq.heappop(H) - -print(H) -Output -When the above code is executed, it produces the following result − -```python -[1, 3, 5, 78, 21, 45] -[3, 21, 5, 78, 45] -``` -## Replacing in a Heap - -The heap replace function always removes the smallest element of the heap and inserts the new incoming element at some place not fixed by any order. - -**Example** -``` python -import heapq - -H = [21,1,45,78,3,5] -# Create the heap - -heapq.heapify(H) -print(H) - -# Replace an element -heapq.heapreplace(H,6) -print(H) -``` - -## Output -When the above code is executed, it produces the following result − -```python -[1, 3, 5, 78, 21, 45] -[3, 6, 5, 78, 21, 45] -``` \ No newline at end of file diff --git a/docs/dsa/Heaps/image.png b/docs/dsa/Heaps/image.png deleted file mode 100644 index 1e9381c813e4d075886b21e1103a819a4812fd6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149934 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 a3 zG22c7+ zmyA^p(AfUBQgpJJjS&80KoekrkC%q4>T9;(-LmHg%m0`1Ah}Y8p57vhge|k@QC00Y zU3LID|AUTY%S@+JBkRn)>D!V8hVz-N@#Vl!hz^#y5(u^2At*oY30OCj> zdV)G@&H(Cp2mmQ7selY#$Py%W%t@U@U{bh-Z%R4 zQZuc|`2dh3#e|qoOKCL&iK2+Nq_31z(ld1j`nG?`gs`Zw)1o|7L1T}GK+7`c~P}FL1_+(TfAS&Xm%Le&q;BEKK{x{lZ+r*kmWu&PqAs1 zGO4a_2hY&k1r7QWDr0LonC%VIG^c|+y1n;tQNZc$hpeOhIjUNU<+6|*VJW%shKS<8 z)q-wX-%-m6>w%CpWMjjLRlC>tj6_f;&QOZO$ADEtkrei*qgtDoEHU_Y-TiCAFr{dqZP z2|yLRG>!UwT^45$?#GXU4UR{P+6!;bd-(4+%DniGU_TLFH}(MQ01##)%^+vNUU+QX z8a^+6Y;2lmg^p5_zxE-45j@xP#E%Xtwbn!Yx3>WDooY=3T`mpZ-zRy=jU@qu+vCRL z!_8nwnJC%JK0vZ%^WObN=t@f4_6CnjrWuyosXjX_?ov!|=gw1&(0Z`~$c${rws69gg$S&(hP#q9Uu6nvN z!hI{fs9XePD?0;V+>cUW+OSWbkMhgY7C;wGRtTD3$`N*=2p9~H#cKfHj5+dTIBgH1 zS53%dp&-o$0af3GWsW9{WEd!G+FX;RaE-}i{Qz`eCuwn;6(Yf@^U;kUKD++DRv?i# zHss`sK{4DM_*ecyocMqDyn^zccXp?3=qx<#0xP{#i_ZA(3!YME9q*ig5J z;9-hCA=e&6HUmr9lC>at*Q|IY?vCItdVG#TZgS3$MOxE^OzQ4JmWB|zmb-NTFRM1_ zxSSYiLdUrcaHYh#$YIb;LGugMmIj-T~D8bSImu zlA4m?1^o_(qd>4JYF|1_O15(yrg*BC9XVvhs zDvHX|<6i^S`?CfV`ue+hfJ6c~8f}1wn7Z5Z*MT%u@lZgp24BMGIf;wS}l3XGo0bEayURO^1WnN}^DZiIspH2BUk#aCp3&hR{tWLC7C*%=j4b$+j-WXP9sQV1! z=}&&Be3{rrN}Qtm1tP^2erl^Cx8`c6w5X{FJ#G^|Q_zDgr;r3C?tL?_aJnw1p7g>q zsn`&zWKtdNqOF2-jL;_2ONsEhcCyh$HSY+DI>T-vKx$-o9LObe(-tcX@LCkOKtJXE zf!?N!;nfv8zr|@VLPY)+*^4Dn=%1!>Jh@Pw=KFiv47w82s;h~tgyYMnzAL}bLFSU_ zEBA(`)k`S5#R6`TE}QEP`lZxub;bsuKRO-X&Jit}4N~D@dj#5cC50QUq`=MG?@!9jkUlgioid9<1o^KG!_yJvua9@D9iL%GZbY?to+j zFPi3=yp{4Tvva)*Knyvgnx0E+{xC(67~5v;`j=n{5kHN z;j`NAaNUp%pFceB7LkZIf`>^Cza)@R2NzS0_{z!Yk^kce!_w4N#Ncy!dnvVI>r z`0<~#HG`h?jbl)m=_)Z{#l=KWV@j$7NPO}v^Fhszrf1_fRIXWU^dyu2iI=~$Jv=YQ zn{+RR>j!Y-4?5m!AbV$m`BU9IwI2Q?<%pm@vx#Qq^fRc*xN+gFN;N!{*Ze|fjueHh zBBQNo;3R@65+#rS)P&QGtK?{^5SdHqrL}h&M<^CB<|U`NC4fZw#hf>7zhkr^O}h26L_NWUYZjfOeC|tdqxcKNUVwX9^{Aa*CE=ho4)LA=S}&0O(E)4O@_+_6vH*jr_k36qt2&v z3H&4jYODXc^9x8eI#_!V*?gMvu8vEN7ME%O8@3-4q5fjlAiX>gz@rF;pvaaJqmhsd zEKHRdfVS%b3=xi&8M|AJhirI8?Q!X6iix!;a^8dx4!4P8_GRJP$Ku8G)Vkd8rY7*! z59;)Hw*M_{VqB$cCsfJi^wD{_J7RNxDG${ZVP4l{JqGrJ{=EsO~FrX zsmo-LlotYq`crEcA58A~SG5c3Syw%r4u;P!h}op!l3_U>PcQ^#oIw=xxUwHDMR) z@yE#k7|E1m0Nk$jDN4PzM?77N&rCa}k9t~Y$W@p^N)6cG;BxYWt3}mYKx^k}l2cMI z`Vv+~e4k!RWz4Na)Xk_nEA-rhjw5>G8ZURrI5mo{y_;tg>B+<1RPTi!tBF^;TfyXN z01AaaXqe)FM98eTZRM=L_rN{`za#u@r9fA~c-`!(V} zk0d2N!i_4WXIkWRvCohY8OEtZOlq5Rjqd_#tS)+c^qQ7&$HhGh-841RGhwpN%>K_| zJJrJPr5D`J^t^-}QM~N^3zOLRJ)iWKWA$Cb72~Q$zcp%2FBMgl=-7pO?Th%Y8nRWk z;@-nQ`zN_M9ie0HPF=k6Ev?ge` z^As_|)ws_qd12VDMflPLXHo(R8naS=o<=)KCl4Rqww}apvR&>62_azjTnm^7-^{+F zmzlOdnAnE7FOi@TGpJ}bTy09aH_GYezV`=-fyoDT~C@&RK6>G}g5^?sO zm{UBf+36#+$Fi9MbR$mrJM>TCj;-L68Vgk{t6lb1yMS)OQ3166Vflq1Z#0g9b zC41VrGo@Lj3I({~^7)mp+B*+mE8#pFg!Mz?CL50)O$RziYqq9bnkBlnf4hY{{cV&3 z=!1HAi!Y3~T@xacnu{~XcX`)zHd^tvkFTDT>mI|I!ZGc+3Mlmk4~=6|{ndJ2(X91M z8alh*<9yTeG!nj{$eAQsQ`$$*ZN5pBcmKO>P$vbeyjp2=&63V7saP|vZ)Sm}%T&YY zaHQp_LYU_MuU8>$q<#uCjlDOJXPl3ORU6D?tbBpylBd{eKj1oA6}s?jeBZ1jI!n&KiN3u?VA8Qw&y7_{Ba<(;yX{} z?_R(?W*+wt!U9fhjZX&f5~f$eF_^B+gbf>6`{w))T3nCg+dnr7kL+VTNtK79AUKtE zq|El8b#DzXZe!Rq+6M`ZjEN^4BExUE(#^Fpsf+9ME$?+KG8ip%@oOuphTjM0;Lg^= zoTV%slL}ny;?oD@{@P|9*Q=@P+bTZU=p+w2MX`c#4vC(iO9sat(;&9X`M+Jn!}C$P zJFkTmILdLK#x7x8Iz`_DKygc=(@Yp|-}Pfk!cl2Ox79QAlK~Cq#>4!wbTS}9k`^a= ztX?L|9ifNx={|TI#WXu2#Ly^K%d}g-LTqa!4SU{OoidY)SxdXiR=VaaD22Uqd{Xq~ zFH6*3E}3y#g+_kFFI9eqS-LdE&=!6JG?Ii%w~e$r?XF$jxBnU`9G_Wzxir#bwnlTL ztXpor9n?y&1&dE(nd3%n&+Zl!dt;bkjam>Z{I?xf&?1R7qS2n z1mrO#GLu3hkPfUyzzw; zJZt*1F{$3OB0g<-^~v4x#>ve zURi58%*=6$CJJ>1$H(cjnSx)G;3&dYjzeSPAhbzfSXf8p~^HYn%f zFk&-)kd>lQyhM|b5C;ot;nN1I( ztEFP~iQW}7K9Uv^3sW7+Kn>rk3%6S9`AIC5drsQoHE_PAOJsMaXaV5mxl_fVu#pO3mu!LxQT z>0o^U-m)H3#p?jD5=uXC`~cJ`G%+Ag8nuM z8dgWmh2k<- zyJR+DFUT=;#lh@m7^Z1yhr(6+on`XUTuU%U>Tex2Y*L z2z2k@_ol9zN~{XJ!XEG1#>NJ8-acYBgDg!Z3ytmx7`%VcNJcjUP@y68E#gS9odP&B zJY+x0oY>KfCQ1Mt3u`#I=xa*SLc;neY9U_6mTlfzLM5y_(%^6Y^&bb~6q3J^TbP^EHSRMB_JWR@x6ZCTX;gtq^9P+^Gj0bCbIK4J{~ZI#dd-}5 z3cnX0>x`cRWY-}Cx`obRm!%E$X4 z!Y{iExk{g_O(5x88D8mcM=MQatI) zj{MnDR7?$X=eJP)dp|0ETX{vFZ0QuX1&1+d-^gb#5L}vd_VIy-xZQ70q#n71tLB@0G4OhxO-wd_1ROwcoBMD_!F zqH=Nq^i637x>63o;Cf}p@$(lsQPT}yZk*uB@S4VVfz$F`Nn{^XaSbeji;3wA8!qmL zoZZWf#xud*_iQD!I8w;{zpbSCuWzY?Glf4!d3$@S>UzYzJv|+uS5;AAI&XuAHKSS$ z#c%H)T+cSOK?l`d*8{qXE^A@l-p_O5bdQhZiHCTNI!+w=1g7qWE?%^L-n|~##O9m3 zxDNIia7uI2uN`}8XO+|KgJ9bNoIGcTtFZJ z!l%C(a&xARdWgL&S@7TmzQ7K-{hcTzt!6`d`CMIHeHSlYRmat6s#Lq}+p)=7(2}z-!0gYg={fb%KE_!5JeIcu8Ak+_Rc;b3jAh;0M!}|>ZSUj=^fr+PY9cLB6f`3> z?#Jh~2>W(B9P+uqHHG1@)ffXOL2XU?FMiYBYTMWD2GHia8yYTlbku~YYo%9e>YAK} zC_T)i$S%=Gwyzwg^MZ)H?ra5n@ok#qRaCnFB4R&vV>?~2Ubb1+(rZ)&zCDGuK6-Qp zqKAcr?Gj&A6KCvB{*M1jn)EJ(=H~>rBS3rJAKjy>wj`bPV>gl)7w9(j=(sS*nT4}8 ztclw6zk5sbtPeQO>^ZZmO7qNV`?uPCFxeMcp!^Ln))nm`+aox6C+#xe>G`12A%^n# z5EpzMQC8}CQ0ZL;wm_jiXfsXjXHvv5KsM+vn`N6FH zsCTb@cpzmu%^KRPH$aTEC!h#krEh&a_hCgapdnR=p^mPU;&;=V0k$jkdUkiKXTz)J zboo?!@=ilHhh%nJ5{HK>M7I2ftVkD(Fup5Z@iLM1&;GMq6)_e5Y6RgJ{;ai8$M9)B zZ5PcP6WgEHYkqMNZ5M ziM9qHAt6WzB2og<-Q6JFEz;c}t#AP8?(PQZZt3ps?(VvCzI&hRAALZW^Ugc7W9_}y za^bVx_bjP`RoO6GN@(0Cu+j$;H<4tqI?qR4JUUqJWoIi9_&LR!nsV-c`{InP;ax)Y zPvpJ*Oc&N(Y7{J>&C2Z$f2|%~$os%jx|Y5Q#*!?M>x_7u-FCeNYl5^jtG9oR6G&G* zAy1$_cHC@gnELGP?JYkZIYGkYGDU1Y`tj5PpQFX!Z^Hkv+x>Pk*3^N?en(b3VkVr~ z49a^Uv41BNl@}bUe>~R0=x`l;yaC3F!~9}37d<=rQ!zty*Ef~aX&@8O=DC3$8E(K0svdD8XHe!q&Vq1lPQne9{h$kxAw=pv*Ige0Im z7~tc5V{czpi!oqNmfpX-^L)NvhJ@8Dxkxr~5E_Bxap#{p&kiLerH<#LgFsKq^W$-6 zAa>1anRoHAFvv?Jm{QOm!n68Q^G5Hdus^hDDlB@Ql{_QQ{k$s#AJJeVKYC+UX`^$} z(}VgR9E0afrz-+iqwrYea3huQT;(t$m55jso}1CBHpW2163)NH3v`mmRb3lAb2L||sBsN|nWHM?RT^w4iU4630RGeYKOq_bZ7rV(!y)eb* zX}0cF94uMQTGBIJG;c9eKMWe&%SxBDiZ7YeUa|1t2IYW3-=N;TmfI1lMXbrtF?4~$ zg*p(!9FssAZ?_V;h6`ia7s{X;R>b(RYv%59|G4GZL!bx5{VB=GgXeDZR|F;$Dp6LZ zI6350@iAO&S-qGgjJIDCY9qXdlB25!Npq?iF8a@y0;`#6X69(bx|3QYrSz+*+a*iM_{r7mbiCy8c=t{q#r;an;nN>5 za7c*6ry`>YX4(=h085gJmcu0IbX@=q=UNSpWtnv~SBYWSq;_%%&!u;7V8Xj11U@HR z!9-emE^LN2JlgPto%krM{`?aEE?aOqc8d2txinNHyUJ$0tKq0V5bbPKlwkMr&YmOq zup3;pWGfe9ae0npZNQBL&X7*k;34q89;@_$e$UGmGT7+HL0s>j0km{89lTA@YWY(k)dd3Yk{;=)6>L8(9V((VGJx`x%O4- zR33MD!tE5-qq!7Y%`sSS0B0 ztoe>Nw5H8oKzzx#XjmbY%A;jrcfT2{Q!qJd6Z96vq4zO=ZwKuQW6sC%Muu0Ry z$--C=+J=jzq0+R5YX*WoF#E<=0{E5c#aCc?Ldb%{v{q+lXPN4^h%7z3z#MP+epr6A zZ(qi#YZfxDjLK%s-@03a)5>uZCGzO9-0W@|8Q$`EXqCung#zbo>HskU$BJ7bpFH65 z^3tm55{qzSE76JtH~8RYvF7y-j0y<=Zt=em%ND|ftb@}9y_aYLF4sp|ii+<;yUPmB zv9-@83g>}$cDXvpKN_!AFZTMp5&|uCcP9_ibph_J;_5nRHdJFii|#KJqKy$Vbp0`B ze7CQ!kKY>(9OR#C{_giz^cz$!M6E#>_i99U>}9evt6tYz2V}_>kH@RypRBY^Yr6)cojsfnV`E~L39{avFui)1+ea6``sG;c(9Ym^Fw;-d@XcZ)$I^kn z{mhKkjXKdA5eezI=~`Q$rzf0ve{V0W0^9-nqWB;ZaTGtj-Uw2_p4O#il+66|WTmf9 z!m$YD<&N8ME_r}-?m4(Pq!6yhi}9+es<-S&t)&DKz?98Z#TXiwsUG-XYk!7l+H_)` zZw)GlQlQ6lcqmV*rSY*BR_iF?~U|^yFx>p=R^y*jYCn4xFU9RW{!M^&fRH*z201{%z+fQ7zwY6+G zZ+}z?YjF4Ob(U0CUX*ozB8G6C4=_qeN$uL>I+=s5oJ)*>%?%gRAJ368O`HcYC>JmY z$aLkVtP>F}pPoZ+CxKQ-?GG!trHaty*8jeT;V+#I1&J-lX~8q% zb1)@K*Fav~n45KwH5%BBKqFM=jdu>6vckf`MB%N-^dQx9RQjw&71J9@_IzmNsc@f< z&-F7beeh5&4J#>vy7Z-v z+i7QGW1}_Oz)0}rjtcr-uMdjf`hVB%VsBEC8xDOIpdGC?NhOsZCyQ7LT0qPQe)3&l z=LlqTMlrXXN~2i0inqTLTgUBWgcXr0D+8WXNui84?B}q?W8K zl8-1gZrCytqaFwoW;)K!x8pLrQt-|fqoN>6QpkUA3zqw(SG3tNeSB>-TfX_9-D^B) zNAmIU2^WJQ80@y~A{Uo;cYpk=+W}ALwCJFst)0T5Cp7fx#9I*bA+(;R&KF9lYSK(! z?2bc8^w0$WFgP_a5han0R{HVYj7ZNMq&LId*GVoVb|xk!BUSV zF&c%`_gq{~>nt}om2#-GIY#T{7*v%?=eq6}*T55^a$k(ZP;0>O^Of@bB1n`4^IL2~ z-gKWrS(%u=C9(vg3BZ3~HdQ1+*PY3;P5O#($qxNJbGyZWHt;{={k9Y|iMG-wPBM1c zb1Z_5vjKF4`Q6X6=G9ZnK6(!UvJ!&nBaFjbg79_EPxpa=fu!Q{H7MyKuWp7OP@qrv z;kRibrrdk5WB1p`GVpa^d!~!j#uit*FC_D%~nZwNOgRdlE+DB6~+pu5VL z8f(Cg8{7;+Qb-sy=mT%xhl7{D-S(qSY|K>$NCmzUZU8>Ra#bp?&%g=s?NfXL=VhJ! zVWM=pRHxLE(PQQJo2#QmywGlqV~yYIs;mAPJGOPes3Tl%v}a@xO_};(r;vihGU?gn z-gkbd%R^Fix!kJ)r$Cnc-{1Bc{6;?0lr?KMo`(~`%cJkWiGPXY_r&^jtl16j!AC!Y zMs>k&$sCs%fixVK6AEwM;>ap1`$DoGH3>Al{sJ!&tL@^CW(&+T7B)5+Izl5KxaXpJ zhV3{=aNf`amS5l)+}IMW2CufyN7j{vvHtRN6B8Gw-2@l{mMxE0!Fa4+BE^CGc?)*Z z=Ht%{^0~t+e+;q$)|bAh1lmeU*(h8SXorXBy*QL#zq$bDGI?(T4xee2UoJGIlj5<~ z2p~utWO2PRcPKpqMiN{}bblE17)RC5;t~3EI7=S)76Lu)*Nd^q$;ByMfAHjfz4Qu$ zU16I*^B2m<&li_cEdgdMUm=&{BZ}|OY%SA#%&Wus>vkksGy!b@s^W7x=4~Ud-hxwU zT!`S`_C1cnp@1XtCwS-yMl5<0tJKNxuULWH&kyI2u!iI2hO{)k!(p#!Bx@$ff zU3hxm&>(wzrk5`o$E7)o)6zZzxXjmhI~sB~hV#}Jm@agI6z8q@_I80PMtW^#@V+{7 zu5Q9edi5EaPP_2HYzj^7cMt#+w*(sHyDN*DrVzmk{1*qs>UcQo>FIGKcNN0LU4Y>v zHmp=ZYH!mHUu0mnfMp)nXIRb5d)?#}L1Odq`k-RC;86_`5fSHZ1vu}IM~YbnlO5m# z08pJrphpmuyAs5nVkGS&Th;50UR=YWIP_j2Jg@NUh@OG}IGK01g>fQAelrO1JHy@wJ>FmPG!n`6sTQ00{)PO|8mQi3-b% z{Ts$Gx_ukPYjE2#*}7o(^GZtzc-+_sH-Kx7=W(x}H8(6i!`@MihNx2>EVn#^dkw-3 zfQ8OiTOj!ekQ0NYJ*t^Z*&1bMIAq%R+Hii4vd z+{H)n3$Nf)!Gnc*JX<09u7ZLBksutKS%cVjP{*UJqSD>$9>!>&6WahBE${)Rxiy1{ ztoM%|?*qY0D~Q=l1;ORoKmY$O-HJCV4>>KZih3KyWG^B~;$Y4Zd;>^GV`+6h`3nIQ ztbPIwnwzjNL+ZuKtE;byYnF&0nl8K93c1po&MAbtyN$Fil0{QBRyqPbVAQD2Wc*7K zE9g5KVOSQ+2DzN&Se7^_&6U&{wnGqrC47wfhqx@QhF|rK;r?P5xSYqUc~6nN;eBmzew{QtKZEp)G|l&{O(g+_VP8V&E;y~(+4ebQ;iCkPXI6-&qntIH5k_5RRxeI4Y1nVwCEhlQNl{n1~lFqT$33x8ru~ z20i;6kcm>MFXI#W3Rch{s|QSgg4ka^Kk80v0!?c*dF0H{*xcL=7+)|Hn+4rCFpLDP zcn+`lzXHvzX{5TR_m7N5LjW)XuF(~wUDV^KZd8u>^0VO7rEtZgot1h%n$4CQ?3I`n z8U2=is1^lgT4>#mURg_v+jgS|{8C>u2HOp>$XOAM1j3D?ilGDsgMeQBAIsXW-fCG7Q3R}wqzfVt zKHm;|0*8SC0>d}h9H)4Iou;)klSc6!%qnn^(C>m^ZP}gG#rlO=bQa)zu37fbaJK?v z&bjgwzEC11j>|?s3oVh~`2%<+BX~k64h_Y9ykAegTl%y&P2l-JPq;Dc`D6zSI1{cg zf#y!su_JhcEg^INBx5#{l9Iqh0ZBaA7mx~(q5H=iuc_^=O)Cq_k%%M0yxPN0q%3W; z?F_(#x;4-vz%l+N^-h=}zNn<68JPdciYq2uDUM`iNn*FFRjG_2I>Gd?xl|vta^Rw@ z*@Ad#M{bw)z&-a^+=!>&vaRE}Kd1nX@)sI|$yk=JudgbVZv)fGqf?+Z)Og>3Owr+L z)~Hmy>g#(%_uNn58Fxn1tNZ56tK%7swB0W!Az{B?zfo3FLh$;PD0A}Io7=G($8PuK zzZgut(l~s2Ul;*7`Pe-KL=V_fag(ECGc#=9m@xlJWwRmbwgI_!#mnaB6uFkX!a_W- zBp3#AIjov40dR8@*V-cRxXGCu^0~+Wnpp1&RzQ7;!(nf%rG+mT$Z?YrBQ|vCC=*A= ze>lwGbfgJtdO1BKCNx3NC+w8<7b3d9I=lx434kA|o=?D^srMndk+h;V+fC3WBqU6H zKPqWBQm?Zm9Rd}aU($dxsms*Vl;>u}oA+TAH8<7c4tU{3OIE=|jhoY&VD(r28F`MP z&8xn6AbiF`@e`I4a)3!T-1-Ba&S+@~5Mqz-g1U;|Cl|5guiM+(h0C2BsyDmWp?5yx zyNaAmi?;pL{jsz%Um`(*4eq;YIhBHhu-t`96G$z12{)!RtOk2~<&55`cD&-%!mo99l8^fBM3`N&_^>2tJK`z9!~Wf6~=xiaCdd6p`sEiojaO?$ z0k(=5l4Li;4sOwdM>22*BfoRdKvzR;?TwY^Js#l(NDe^i3OPq6wx1>#D$D$QmF*|AoCrpz6VFHdXmVlS0bYewIkj0xg{L_Wy_N zrICpLG~*X_;{|T$Cg+#2^S(?XixhzE_6keu7cCtWKkNQxsXO}$I(OumaFtZL&;_7) z#BmD(I3shf9g0C`-~M!I3&_V12p{jSmusw2=eDrMzZ*yHiCH)T#{)fgL+smV0$9}Q z6Jx2c$MidVR)!ENYt1ER>d<3QOzPewnq#QjboSU8Nr!|%4Hn=e0Ej5HYmkk*Uv(1< zXYvq*LXIXVFhatB9l3jaTCXKIBzu#S;Q?+%NFQe0;{|4I9Ulh`fzqC+Jo)RzF~UT2I=MO3ra0e-Eu ztbyk%V&sQNKC;;-0RBb$T2cM^PZ5-=?i&vWvv7Y4BW`d^OiVKX^&w#z zR!t7ThijMCTNk)HW{6blDNp9v&yTz$j zaao#9F0ucv*y9Z;Ea<8{QV_bvnq~Vi#Lj+akpW0QqD}1U z$6+D#cvX3^tn5lYVSfolg*5*LHs@h!XUje9J77=p25zS(G(U>(|rL%a%yNMUj;EJ2xHz8or2X* zMHQB0BTz|h_}VeVZaR8pnehFggzzco5g+J@CD5Y{)O3UL-$=-QRVe6T0FchF)cTbg zO$erNdO49iJN1aZdO$8@Cw;GnK-%S%_)_Y|YjG<&%s*KIWm|#PMASJjUzt=y5%mVK zuc{BXC&vs)qa`r0v0HA|0!5)J-sB5fn?6{R`5vM|1$pk^~@NX zqs^`BxMRziNn0dw%_6&T2l8uM8c)XkGuDa{H^%#z-}|3%n?WyDos|@rzq8yea(Gi6 z6^DxR0GJdx2}2UfG7^CO4en!jT=Jo(7SsGJmws6?pP5=+ZFrN^PO3E4UCq^$AAf9I1#CUdcfxJ0A6$8~l*_0}O=OBYb`ZNGmP; z{6h3S8h)Oxfml|A8)gOA;f1X7iI-$(o9KU3bZLHgB=P4}RjdkyD z*mpr$d|0S`Xx70(NmXDVZg3O~PcQH7hmHIY?%}yb)Q`A@2@jZ+T1y+m+>K~us3?q! z+71n3X7^D;)N79?hmoE*jmJITSpKwC)ILUV<%z5CTsV6jIn6Sly3A&lxwStyr-oO> z$YT7Z*y6^1^Ec}D5tNEFR|I?Ee08gEN&9;3#%uLl0x;*-I+x}zZG@7-I^0X2XEa;U zmU9O|vdhYBdcp`HVIX~R{jWNev)K?w-d;AKHX&_QVK`V1FqX+A;l;m>GjIHA-12G~ zSl94y;4*?ljkci~Ejrc}`e zcr+yJbiI53(!~*`&^@txtL8ozhA7{(*l6)n$3zvgpwY3rqy19wadE?O#~@$tLwtiO=L$NpuwO*@631LYeGxDrAGc{S{wGCtd?=#J(b6~ zJq@?xr6y3CAcZV|PAG+(Z}d2CMHzBo+1f|{;Z)3;Ga3%m9@X!|6M~{?xq7jmoOtEI z7;mLsXx+o)g8(4EdA~4oai7OZAQCHL#1?Qg?M*SYMrt7MNA^5 z#iuT=8ExU__9S=*`LC;gM$^~J;LSOVR8)=CRrfGB6&?jfI|v%a@&XdCOkz8o=O5cf z{a=+g%^as^21~@gQoFZg(}2Oh`m72o^lg2Si8(J$%0p0b4^dZqI+*d&&a~CJt32tb zyKfmN(1&7pI9xa}$?LMAhI-RC=#cMQEw2-~O)LpRp6V{&NCmA}m>`QZU7OCNq z4;M3;O

    qsd$oaWJ}&mYL}8UXP!F`jv%TOcM4u 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 x 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 NYe97%6sbLZ^*;_J)2sjh diff --git a/docs/dsa/Kadanes.md b/docs/dsa/Kadanes.md deleted file mode 100644 index e4eda5b2d..000000000 --- a/docs/dsa/Kadanes.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -id: Kadanes-Algorithm -title: Kadanes Algorithm -sidebar_label: KadanesAlgorithm -sidebar_position: 2 -description: "Kadane's Algorithm efficiently finds the maximum sum contiguous subarray in a one-dimensional array. It's a dynamic programming technique named after its creator, Jay Kadane." ---- -## Kadane's Algorithm: - -- **Purpose**: Finds the maximum sum of a contiguous subarray. -- **Time Complexity**: $O(n)$ -- **Space Complexity**: O(1) -- **Use Case**: Optimal for solving maximum subarray sum problems in linear time. -### Simple Explanation -Kadane's Algorithm: - -1. **Initialize**: - - Set `maxSum` to a very small number (e.g., negative infinity). - - Set `currentSum` to 0. - -2. **Iterate Through the Array**: - - For each element in the array: - - Add the element to `currentSum`. - - Update `maxSum` if `currentSum` is greater than `maxSum`. - - If `currentSum` becomes negative, reset it to 0. - -3. **Result**: - - The value of `maxSum` at the end of the iteration is the maximum sum of any contiguous subarray. -### Code - -Input: arr = {-2,-3,4,-1,-2,1,5,-3} - -Output: 7 - -Explanation: The subarray {4,-1, -2, 1, 5} has the largest sum 7. - -### Python -```py - - def max_sub_array(nums): - max_sum = float('-inf') - current_sum = 0 - - for num in nums: - # Add the current number to the current_sum - current_sum += num - # Update max_sum if current_sum is greater - max_sum = max(max_sum, current_sum) - # Reset current_sum to 0 if it drops below 0 - if current_sum < 0: - current_sum = 0 - - return max_sum -``` - -### C++ -```cpp - // Kadane's Algorithm to find the maximum sum of a contiguous subarray - - #include - #include - #include - #include - - int maxSubArray(const std::vector& nums) { - // Initialize max_sum to the lowest possible value and current_sum to 0 - int max_sum = INT_MIN; - int current_sum = 0; - - for (int num : nums) { - // Add the current number to the current_sum - current_sum += num; - // Update max_sum if current_sum is greater - max_sum = std::max(max_sum, current_sum); - // Reset current_sum to 0 if it drops below 0 - if (current_sum < 0) { - current_sum = 0; - } - } - - return max_sum; - } -``` - -### Explanation -Explanation: - -#### Initialization: - - -`max_sum` is initialized to `INT_MIN` to handle arrays with all negative numbers. - - -`current_sum` starts at `0`. - -#### Iteration: - - -Traverse through each number in the array: - - -Add the number to `current_sum`. - - -Update `max_sum` to be the maximum of `max_sum` and `current_sum`. - - -If `current_sum` becomes negative, reset it to `0` to start a new subarray. - - diff --git a/docs/dsa/Matrix/_category_.json b/docs/dsa/Matrix/_category_.json deleted file mode 100644 index d8a0abc0d..000000000 --- a/docs/dsa/Matrix/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Matrix", - "position": 9, - "link": { - "type": "generated-index", - "description": "In data structures and algorithms (DSA), a matrix is a two-dimensional array consisting of rows and columns. It is often used to represent a grid-like structure or a table of values. Matrices are commonly used in various algorithms and mathematical operations, such as matrix multiplication, graph algorithms, image processing, and more. They provide a convenient way to organize and manipulate data in a structured manner." - } - } - \ No newline at end of file diff --git a/docs/dsa/Matrix/image.png b/docs/dsa/Matrix/image.png deleted file mode 100644 index 71f730ab9b90a075e5c72bba81097a7357fe8a31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18033 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 Y;Q#yr206S7UVs?rpV51%YajN%0E!-Uk^lez diff --git a/docs/dsa/Matrix/matrix.md b/docs/dsa/Matrix/matrix.md deleted file mode 100644 index 27040b09c..000000000 --- a/docs/dsa/Matrix/matrix.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -id: matrix-in-dsa -title: Matrix Data Structure -sidebar_label: Matrix -sidebar_position: 1 -description: "A matrix is a two-dimensional data structure consisting of rows and columns, where each element is identified by its row and column index. It is commonly used in various fields, including mathematics, computer science, and data analysis, to represent and manipulate structured data. " -tags: [dsa, data-structures, Matrix] ---- - -**Matrix Data Structure** is a two-dimensional array arranged in rows and columns. It is commonly used to represent mathematical matrices and is fundamental in various fields like mathematics, computer graphics, and data processing. Matrices allow for efficient storage and manipulation of data in a structured format - -## Components of Matrix Data Structure -- Size: A matrix has a specific size, defined by its number of rows and columns. -- Element: A matrix’s row and column indices serve to identify each entry, which is referred to as an element. -- Operations: Scalar multiplication and the operations of addition, subtraction, and multiplication on matrices are also supported. -- Determinant: A square matrix’s determinant is a scalar number that may be used to solve systems of linear equations and carry out other linear algebraic operations. -- Inverse: If a square matrix has an inverse, it may be used to solve linear equation systems and carry out other linear algebraic operations. -- Transpose: By flipping a matrix along its main diagonal and switching the rows and columns, you may create the transpose of the matrix. -- Rank: In many applications, including the solution of linear equations and linear regression analysis, the rank of a matrix—a measure of its linearly independent rows or columns—is utilized - -## Applications of Matrix Data Structure -- Linear Algebra: Matrices are widely used in linear algebra, a branch of mathematics that deals with linear equations, vector spaces, and linear transformations. Matrices are used to represent linear equations and to solve systems of linear equations. -- Optimization: Matrices are used in optimization problems, such as linear programming, to represent the constraints and objective functions of the problem. -- Statistics: Matrices are used in statistics to represent data and to perform operations such as correlation and regression. -- Signal Processing: Matrices are used in signal processing to represent signals and to perform operations such as filtering and transformation. -- Network Analysis: Matrices are used in network analysis to represent graphs and to perform operations such as finding the shortest path between two nodes. -- Quantum Mechanics: Matrices are used in quantum mechanics to represent states and operations in quantum systems. - - - -## Representation of Matrix Data Structure: - -![alt text](image.png) - -As you can see from the above image, the elements are organized in rows and columns. As shown in the above image the cell x[0][0] is the first element of the first row and first column. The value in the first square bracket represents the row number and the value inside the second square bracket represents the column number. (i.e, x[row][column]). - -## Declaration of Matrix Data Structure : - -Declaration of a Matrix or two-dimensional array is very much similar to that of a one-dimensional array, given as follows. -``` python -# Defining number of rows and columns in matrix -number_of_rows = 3 -number_of_columns = 3 -# Declaring a matrix of size 3 X 3, and initializing it with value zero -rows, cols = (3, 3) -arr = [[0]*cols]*rows -print(arr) -``` - -## Initializing Matrix Data Structure: -In initialization, we assign some initial value to all the cells of the matrix. Below is the implementation to initialize a matrix in different languages: - -``` python -# Initializing a 2-D array with values -arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; -``` - -## Operations on Matrix Data Structure: - -We can perform a variety of operations on the Matrix Data Structure. Some of the most common operations are: - -- Access elements of Matrix -- Traversal of a Matrix -- Searching in a Matrix -- Sorting a Matrix - -## 1. Access elements of Matrix Data Structure: - -Like one-dimensional arrays, matrices can be accessed randomly by using their indices to access the individual elements. A cell has two indices, one for its row number, and the other for its column number. We can use arr[i][j] to access the element which is at the ith row and jth column of the matrix. - -```python -# Initializing a 2-D array with values -arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] - -# Accessing elements of 2-D array -print("First element of first row:", arr[0][0]) -print("Third element of second row:", arr[1][2]) -print("Second element of third row:", arr[2][1]) -``` - -## 2. Traversal of a Matrix Data Structure: -We can traverse all the elements of a matrix or two-dimensional array by using two for-loops. - -``` python -arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] -``` -```python -# Traversing over all the rows -for i in range(0, 3): - # Traversing over all the columns of each row - for j in range(0, 4): - print(arr[i][j], end=" ") - print("") -``` - -Output -``` python -1 2 3 4 -5 6 7 8 -9 10 11 12 -``` -## 3. Searching in a Matrix Data Structure: - -We can search an element in a matrix by traversing all the elements of the matrix. - -Below is the implementation to search an element in a matrix: - -```python -# Python code for above approach -def searchInMatrix(arr, x): - # m=4,n=5 - for i in range(0, 4): - for j in range(0, 5): - if(arr[i][j] == x): - return 1 - return - -x = 8 -arr = [[0, 6, 8, 9, 11], - [20, 22, 28, 29, 31], - [36, 38, 50, 61, 63], - [64, 66, 100, 122, 128]] -if(searchInMatrix(arr, x)): - print("YES") -else: - print("NO") - - # This code is contributed by dhairyagothi. -``` - -Output -```python -YES -``` - -## 4. Sorting Matrix Data Structure: -We can sort a matrix in two-ways: - -- Sort the matrix row-wise -- Sort the matrix column-wise - -## Advantages of Matrix Data Structure: -- It helps in 2D Visualization. -- It stores multiple elements of the same type using the same name. -- It enables access to items at random. -- Any form of data with a fixed size can be stored. -- It is easy to implement. - -## Disadvantages of Matrix Data Structure: -- Space inefficient when we need to store very few elements in the matrix. -- The matrix size should be needed beforehand. -- Insertion and deletion operations are costly if shifting occurs. -- Resizing a matrix is time-consuming. diff --git a/docs/dsa/Matrix/problems-matrix.md b/docs/dsa/Matrix/problems-matrix.md deleted file mode 100644 index 1801abef2..000000000 --- a/docs/dsa/Matrix/problems-matrix.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -id: matrix-problems -title: Matrix Practice Problems -sidebar_label: Matrix Practice Problems -sidebar_position: 2 -description: "A matrix is a two-dimensional data structure consisting of rows and columns, where each element is identified by its row and column index. It is commonly used in various fields, including mathematics, computer science, and data analysis, to represent and manipulate structured data. " -tags: [dsa, data-structures, Matrix ] ---- - -## Sort the given matrix - -Given a n x n matrix. The problem is to sort the given matrix in strict order. Here strict order means that the matrix is sorted in a way such that all elements in a row are sorted in increasing order and for row ‘i’, where ```1 <= i <= n-1```, the first element of row ‘i’ is greater than or equal to the last element of row ‘i-1’. - -**Examples:** -``` -Input : mat[][] = { {5, 4, 7}, - {1, 3, 8}, - {2, 9, 6} } -Output : 1 2 3 - 4 5 6 - 7 8 9 -``` -## Solution -```python -# Python program for the above approach -# driver code -v = [[5,4,7], [1,3,8], [2,9,6]] -n = len(v) - -x = [] -for i in range(n): - for j in range(n): - x.append(v[i][j]) - -x.sort() -k = 0 -for i in range(n): - for j in range(n): - v[i][j] = x[k] - k += 1 - -print("Sorted Matrix will be: ") -for i in range(n): - for j in range(n): - print(v[i][j], end=" ") - print("") - -# THIS CODE IS CONTRIBUTED BY Dhairya Gothi(dhairyagothi) -``` - -## Output -Sorted Matrix Will be: -``` -1 2 3 -4 5 6 -7 8 9 -``` -**Time Complexity:** O(n2log2n), O(n*n) for traversing, and O(n2log2n) for sorting the vector x, which has a size of n2. So overall time complexity is O(n2log2n). -**Auxiliary Space:** O(n*n), For vector. - -## Program for scalar multiplication of a matrix - -Given a matrix and a scalar element k, our task is to find out the scalar product of that matrix. - -**Examples:** -``` -Input : mat[][] = {{2, 3} - {5, 4}} - k = 5 -Output : 10 15 - 25 20 -We multiply 5 with every element. - -Input : 1 2 3 - 4 5 6 - 7 8 9 - k = 4 -Output : 4 8 12 - 16 20 24 - 28 32 36 -The scalar multiplication of a number k(scalar), multiply it on every entry in the matrix. and a matrix A is the matrix kA. - ``` - -```python -# Python 3 program to find the scalar -# product of a matrix - -# Size of given matrix -N = 3 - -def scalarProductMat( mat, k): - - # scalar element is multiplied - # by the matrix - for i in range( N): - for j in range( N): - mat[i][j] = mat[i][j] * k - -# Driver code -if __name__ == "__main__": - - mat = [[ 1, 2, 3 ], - [ 4, 5, 6 ], - [ 7, 8, 9 ]] - k = 4 - - scalarProductMat(mat, k) - - # to display the resultant matrix - print("Scalar Product Matrix is : ") - for i in range(N): - for j in range(N): - print(mat[i][j], end = " ") - print() - -# This code is contributed by dhairya -``` -## Output: -``` -Scalar Product Matrix is : -4 8 12 -16 20 24 -28 32 36 -``` - - -**ime Complexity:** O(n2), - -**Auxiliary Space:** O(1), since no extra space has been taken. - diff --git a/docs/dsa/Queue/_category_.json b/docs/dsa/Queue/_category_.json deleted file mode 100644 index 667dc3fce..000000000 --- a/docs/dsa/Queue/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Queue", - "position": 11, - "link": { - "type": "generated-index", - "description": "A queue is a data structure that follows the First-In-First-Out (FIFO) principle. It is similar to a real-life queue, where the first person to join the queue is the first one to be served. In programming, a queue allows you to add elements to the end and remove elements from the front. This makes it useful for implementing algorithms that require a FIFO ordering, such as breadth-first search. Queues are commonly used in operating systems, networking, and other areas of computer science." - } -} diff --git a/docs/dsa/Queue/image.png b/docs/dsa/Queue/image.png deleted file mode 100644 index c6b3b46398c11eff81677de25ec2a314233cbe49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27089 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 hv;X4+FK -#include - -class Queue { -private: - std::vector elements; - -public: - void enqueue(int element) { - elements.push_back(element); - } - - int dequeue() { - if (is_empty()) { - std::cerr << "Queue Underflow" << std::endl; - return -1; - } - int front = elements.front(); - elements.erase(elements.begin()); - return front; - } - - int peek() { - if (is_empty()) { - std::cerr << "Queue is empty" << std::endl; - return -1; - } - return elements.front(); - } - - bool is_empty() { - return elements.empty(); - } - - int size() { - return elements.size(); - } -}; - -// Example usage -int main() { - Queue queue; - queue.enqueue(10); - queue.enqueue(20); - std::cout << queue.dequeue() << std::endl; // Output: 10 - std::cout << queue.peek() << std::endl; // Output: 20 - std::cout << std::boolalpha << queue.is_empty() << std::endl; // Output: false - std::cout << queue.size() << std::endl; // Output: 1 - return 0; -} -``` - -#### Java Implementation - -```java -import java.util.ArrayList; - -public class Queue { - private ArrayList elements; - - public Queue() { - elements = new ArrayList<>(); - } - - public void enqueue(int element) { - elements.add(element); - } - - public int dequeue() { - if (is_empty()) { - System.out.println("Queue Underflow"); - return -1; - } - return elements.remove(0); - } - - public int peek() { - if (is_empty()) { - System.out.println("Queue is empty"); - return -1; - } - return elements.get(0); - } - - public boolean is_empty() { - return elements.isEmpty(); - } - - public int size() { - return elements.size(); - } - - // Example usage - public static void main(String[] args) { - Queue queue = new Queue(); - queue.enqueue(10); - queue.enqueue(20); - System.out.println(queue.dequeue()); // Output: 10 - System.out.println(queue.peek()); // Output: 20 - System.out.println(queue.is_empty()); // Output: false - System.out.println(queue.size()); // Output: 1 - } -} -``` - -### Complexity - -- **Time Complexity**: - - - Enqueue: $O(1)$ - - Dequeue: $O(1)$ - - Peek: $O(1)$ - - isEmpty: $O(1)$ - - Size: $O(1)$ - -- **Space Complexity**: $O(n)$, where $n$ is the number of elements in the queue. - -### Example - -Consider a queue with the following operations: - -1. Enqueue 10 -2. Enqueue 20 -3. Dequeue -4. Peek -5. Check if empty -6. Get size - -**Operations**: - -- Enqueue 10: Queue becomes [10] -- Enqueue 20: Queue becomes [10, 20] -- Dequeue: Removes 10, Queue becomes [20] -- Peek: Returns 20, Queue remains [20] -- isEmpty: Returns false -- Size: Returns 1 - -### Conclusion - -A queue is a fundamental data structure used in computer science for various applications where the FIFO (First In First Out) principle is required. It is simple to implement and provides efficient operations for adding and removing elements. Understanding and using queues effectively can help solve many algorithmic problems. - diff --git a/docs/dsa/Trees/Trees.md b/docs/dsa/Trees/Trees.md deleted file mode 100644 index 289ac50a8..000000000 --- a/docs/dsa/Trees/Trees.md +++ /dev/null @@ -1,415 +0,0 @@ -# Trees in Data Structures and Algorithms - -A tree is a widely used data structure in computer science that represents a hierarchical structure. It consists of nodes connected by edges, where each node can have zero or more child nodes. Trees are used to represent various real-world scenarios and are essential in many algorithms and data manipulation operations. - -![alt text](image-1.png) - -**Here are some key concepts related to DSA trees:** - -1. **Node**: A node is a fundamental building block of a tree. It contains data and references to its child nodes, if any. In a binary tree, each node can have at most two child nodes, referred to as the left child and the right child. - -2. **Root**: The root is the topmost node of a tree. It serves as the starting point for traversing the tree and accessing its elements. - -3. **Parent and Child**: Nodes in a tree are connected in a parent-child relationship. A parent node is the immediate predecessor of its child node, and a child node is a direct descendant of its parent node. - -4. **Leaf**: A leaf node is a node that does not have any child nodes. It is located at the bottom of the tree. - -5. **Binary Tree**: A binary tree is a tree in which each node can have at most two child nodes, the left child and the right child. Binary trees are commonly used in search algorithms and binary tree traversals. - -6. **Binary Search Tree (BST)**: A binary search tree is a binary tree in which the left child of a node contains a value less than the node's value, and the right child contains a value greater than the node's value. BSTs are efficient for searching, insertion, and deletion operations. - -7. **Traversal**: Traversal refers to the process of visiting all the nodes in a tree in a specific order. Common traversal algorithms include in-order, pre-order, and post-order traversals. In-order traversal visits the left subtree, then the root, and finally the right subtree. Pre-order traversal visits the root, then the left subtree, and finally the right subtree. Post-order traversal visits the left subtree, then the right subtree, and finally the root. - -8. **Balanced Trees**: Balanced trees are trees that maintain a balance between the left and right subtrees of each node. Examples of balanced trees include AVL trees and red-black trees. Balanced trees provide faster search, insertion, and deletion operations compared to regular binary search trees. - -9. **B-Tree**: A B-tree is a self-balancing search tree that can have more than two children per node. It is commonly used in file systems and databases, as it provides efficient disk access and supports large amounts of data. - -These are just some of the key concepts related to DSA trees. Trees are a rich topic with many variations and algorithms associated with them. It's important to understand these concepts and their implementations in different programming languages to effectively use trees in your programs. - - -## Types of Trees - -![alt text](image.png) - -1. **Binary Tree**: A binary tree is a tree in which each node can have at most two child nodes, referred to as the left child and the right child. Binary trees are commonly used in search algorithms and binary tree traversals. - -2. **Binary Search Tree (BST)**: A binary search tree is a binary tree in which the left child of a node contains a value less than the node's value, and the right child contains a value greater than the node's value. BSTs are efficient for searching, insertion, and deletion operations. - -3. **AVL Tree**: An AVL tree is a self-balancing binary search tree. It ensures that the heights of the left and right subtrees of any node differ by at most one. AVL trees provide faster search, insertion, and deletion operations compared to regular binary search trees. - -4. **Red-Black Tree**: A red-black tree is another self-balancing binary search tree. It maintains balance by coloring the nodes red or black and applying specific rules during insertion and deletion operations. Red-black trees guarantee logarithmic time complexity for search, insertion, and deletion. - -5. **B-Tree**: A B-tree is a self-balancing search tree that can have more than two children per node. It is commonly used in file systems and databases, as it provides efficient disk access and supports large amounts of data. - -## Basic Operations on Trees - -1. **Insertion**: Adding a new node to the tree at the appropriate position based on its value. - -2. **Deletion**: Removing a node from the tree while maintaining the tree's structure and properties. - -3. **Search**: Finding a specific value or node in the tree. - -4. **Traversal**: Visiting all the nodes in the tree in a specific order. Common traversal algorithms include in-order, pre-order, and post-order traversals. - -## Implementation in Different Languages - -Trees can be implemented in various programming languages. Here are some examples: - -- **Java**: Java provides built-in classes like `TreeNode` and `BinarySearchTree` to implement trees. You can also create custom classes and use recursion for tree operations. - -- **Python**: Python offers flexibility in implementing trees using classes and objects. You can define a `TreeNode` class and implement tree operations using methods and recursion. - -- **C++**: C++ allows you to create tree structures using classes and pointers. You can define a `TreeNode` class and implement tree operations using pointers and recursive functions. - -- **JavaScript**: JavaScript provides the flexibility of implementing trees using objects and classes. You can define a `TreeNode` object and implement tree operations using object-oriented programming concepts. - -Remember to refer to the specific documentation and resources for each programming language to understand the syntax and details of implementing trees. - -## Implementation in Different Languages - -Trees can be implemented in various programming languages. Here are some examples: - -- **Java**: - -```java -class TreeNode { - int data; - TreeNode left; - TreeNode right; - - public TreeNode(int data) { - this.data = data; - this.left = null; - this.right = null; - } -} - -class BinaryTree { - TreeNode root; - - public BinaryTree(int data) { - this.root = new TreeNode(data); - } - - public void insert(int data) { - // Implementation of insertion - } - - public void delete(int data) { - // Implementation of deletion - } - - public TreeNode search(int data) { - // Implementation of search - return null; - } - - public void inOrderTraversal(TreeNode node) { - // Implementation of in-order traversal - } -} - -public class Main { - public static void main(String[] args) { - BinaryTree tree = new BinaryTree(5); - tree.insert(3); - tree.insert(7); - tree.insert(2); - tree.insert(4); - tree.insert(6); - tree.insert(8); - - tree.inOrderTraversal(tree.root); - } -} -``` - -Output: -``` -2 3 4 5 6 7 8 -``` - -- **Python**: - -```python -class TreeNode: - def __init__(self, data): - self.data = data - self.left = None - self.right = None - -class BinaryTree: - def __init__(self, data): - self.root = TreeNode(data) - - def insert(self, data): - # Implementation of insertion - - def delete(self, data): - # Implementation of deletion - - def search(self, data): - # Implementation of search - return None - - def in_order_traversal(self, node): - # Implementation of in-order traversal - -tree = BinaryTree(5) -tree.insert(3) -tree.insert(7) -tree.insert(2) -tree.insert(4) -tree.insert(6) -tree.insert(8) - -tree.in_order_traversal(tree.root) -``` - -Output: -``` -2 3 4 5 6 7 8 -``` - -- **C++**: - -```cpp -class TreeNode { -public: - int data; - TreeNode* left; - TreeNode* right; - - TreeNode(int data) { - this->data = data; - this->left = nullptr; - this->right = nullptr; - } -}; - -class BinaryTree { -public: - TreeNode* root; - - BinaryTree(int data) { - this->root = new TreeNode(data); - } - - void insert(int data) { - // Implementation of insertion - } - - void deleteNode(int data) { - // Implementation of deletion - } - - TreeNode* search(int data) { - // Implementation of search - return nullptr; - } - - void inOrderTraversal(TreeNode* node) { - // Implementation of in-order traversal - } -}; - -int main() { - BinaryTree tree(5); - tree.insert(3); - tree.insert(7); - tree.insert(2); - tree.insert(4); - tree.insert(6); - tree.insert(8); - - tree.inOrderTraversal(tree.root); - - return 0; -} -``` - -Output: -``` -2 3 4 5 6 7 8 -``` - -- **JavaScript**: - -```javascript -class TreeNode { - constructor(data) { - this.data = data; - this.left = null; - this.right = null; - } -} - -class BinaryTree { - constructor(data) { - this.root = new TreeNode(data); - } - - insert(data) { - // Implementation of insertion - } - - delete(data) { - // Implementation of deletion - } - - search(data) { - // Implementation of search - return null; - } - - inOrderTraversal(node) { - // Implementation of in-order traversal - } -} - -const tree = new BinaryTree(5); -tree.insert(3); -tree.insert(7); -tree.insert(2); -tree.insert(4); -tree.insert(6); -tree.insert(8); - -tree.inOrderTraversal(tree.root); -``` - -Output: -``` -2 3 4 5 6 7 8 -``` - -Remember to refer to the specific documentation and resources for each programming language to understand the syntax and details of implementing trees. - - -## Operations on Trees in Python - -Here are some examples of tree operations implemented in Python: - -1. **Insertion**: - -```python -class TreeNode: - def __init__(self, data): - self.data = data - self.left = None - self.right = None - -class BinaryTree: - def __init__(self, data): - self.root = TreeNode(data) - - def insert(self, data): - if self.root is None: - self.root = TreeNode(data) - else: - self._insert_recursive(self.root, data) - - def _insert_recursive(self, node, data): - if data < node.data: - if node.left is None: - node.left = TreeNode(data) - else: - self._insert_recursive(node.left, data) - else: - if node.right is None: - node.right = TreeNode(data) - else: - self._insert_recursive(node.right, data) -``` - -2. **Deletion**: - -```python -class BinaryTree: - # ... - - def delete(self, data): - self.root = self._delete_recursive(self.root, data) - - def _delete_recursive(self, node, data): - if node is None: - return node - - if data < node.data: - node.left = self._delete_recursive(node.left, data) - elif data > node.data: - node.right = self._delete_recursive(node.right, data) - else: - if node.left is None: - return node.right - elif node.right is None: - return node.left - else: - min_node = self._find_min(node.right) - node.data = min_node.data - node.right = self._delete_recursive(node.right, min_node.data) - - return node - - def _find_min(self, node): - current = node - while current.left is not None: - current = current.left - return current -``` - -3. **Search**: - -```python -class BinaryTree: - # ... - - def search(self, data): - return self._search_recursive(self.root, data) - - def _search_recursive(self, node, data): - if node is None or node.data == data: - return node - - if data < node.data: - return self._search_recursive(node.left, data) - else: - return self._search_recursive(node.right, data) -``` - -4. **Traversal**: - -```python -class BinaryTree: - # ... - - def in_order_traversal(self, node): - if node is not None: - self.in_order_traversal(node.left) - print(node.data, end=" ") - self.in_order_traversal(node.right) -``` - -Example usage: - -```python -tree = BinaryTree(5) -tree.insert(3) -tree.insert(7) -tree.insert(2) -tree.insert(4) -tree.insert(6) -tree.insert(8) - -tree.in_order_traversal(tree.root) -``` - -Output: -``` -2 3 4 5 6 7 8 -``` - -Remember to refer to the specific documentation and resources for Python to understand the syntax and details of implementing trees. - -Practise more and more ........... - diff --git a/docs/dsa/Trees/_category_.json b/docs/dsa/Trees/_category_.json deleted file mode 100644 index 90071153a..000000000 --- a/docs/dsa/Trees/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Trees", - "position": 13, - "link": { - "type": "generated-index", - "description": "In data structures and algorithms (DSA), a tree is a hierarchical data structure consisting of nodes connected by edges. It is a nonlinear data structure that represents a set of elements in a hierarchical manner, with one node being designated as the root and the remaining nodes forming subtrees." - } -} diff --git a/docs/dsa/Trees/image-1.png b/docs/dsa/Trees/image-1.png deleted file mode 100644 index b7e53cda5e3ba4a0c1d7b295e959bbdee6ffdaf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132100 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 (6pzPaVR@4=pPb7qJ0<+F3f2+7diLXPuA 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 - -```Python showLineNumbers -def fibonacci(n): - if n <= 1: - return n - - a, b = 0, 1 - for _ in range(2, n + 1): - a, b = b, a + b - return b - -# Test the function -print("Fibonacci of 5:", fibonacci(5)) # Output: 5 -print("Fibonacci of 10:", fibonacci(10)) # Output: 55 - -``` - - - ```cpp - #include -using namespace std; -int fibonacci(int n) { - if (n <= 1) return n; - - int a = 0, b = 1, c; - for (int i = 2; i <= n; i++) { - c = a + b; - a = b; - b = c; - } - return b; -} - -int main() { - cout << "Fibonacci of 5: " << fibonacci(5) << endl; // Output: 5 - cout << "Fibonacci of 10: " << fibonacci(10) << endl; // Output: 55 - return 0; -} - ``` - - -``` jsx showLineNumbers -public class Fibonacci { - public static int fibonacci(int n) { - if (n <= 1) return n; - - int a = 0, b = 1, c; - for (int i = 2; i <= n; i++) { - c = a + b; - a = b; - b = c; - } - return b; - } - - public static void main(String[] args) { - System.out.println("Fibonacci of 5: " + fibonacci(5)); // Output: 5 - System.out.println("Fibonacci of 10: " + fibonacci(10)); // Output: 55 - } -} -``` - - - -``` jsx showLineNumbers -function fibonacci(n) { - if (n <= 1) return n; - - let a = 0, b = 1, c; - for (let i = 2; i <= n; i++) { - c = a + b; - a = b; - b = c; - } - return b; -} - -// Test the function -console.log("Fibonacci of 5:", fibonacci(5)); // Output: 5 -console.log("Fibonacci of 10:", fibonacci(10)); // Output: 55 -``` - - - - - -In this example, we use dynamic programming to efficiently compute Fibonacci numbers. We create a memoization table to store the computed values and avoid redundant computations. The recursive function `fib` checks if the value is already computed in the memoization table before computing it. This approach significantly improves the efficiency of the algorithm. - - -Dynamic programming (DP) is a powerful technique used in computer programming to solve complex problems by breaking them down into smaller, overlapping subproblems. It is particularly useful when the problem exhibits optimal substructure and overlapping subproblems. - diff --git a/docs/dsa/algorithms/Greedy.md b/docs/dsa/algorithms/Greedy.md deleted file mode 100644 index 7baf470ff..000000000 --- a/docs/dsa/algorithms/Greedy.md +++ /dev/null @@ -1,261 +0,0 @@ ---- -id: greedy-in-dsa -title: Greedy Algorithm in Data Structures and Algorithms -sidebar_label: Greedy Algorithm -sidebar_position: 6 -description: "" -tags: - [dsa,data-algorithms , Greedy - ] ---- - -The Greedy algorithm is a simple and intuitive approach used to solve optimization problems. It follows the greedy principle of making locally optimal choices at each step to find a global optimum solution. -![alt text](image-6.png) - -To implement a Greedy algorithm, follow these steps: - -1. Understand the problem: Identify the objective or goal you want to achieve. - -2. Define the problem as subproblems: Break down the problem into smaller, independent subproblems. - -3. Determine the greedy choice: Make a locally optimal choice at each step that leads to the overall optimal solution. - -4. Verify feasibility: Check if the chosen option satisfies constraints and requirements. - -5. Update the solution: Include the chosen option in the current solution. - -6. Repeat steps 3-5: Continue making greedy choices until the problem is solved or the desired solution is obtained. - - -### Types of Greedy Algorithms - -1. Activity Selection: This algorithm selects a maximum number of compatible activities that can be performed in a given time frame. It prioritizes activities based on their finish times or other criteria. - -2. Fractional Knapsack: This algorithm solves the fractional knapsack problem, where items can be divided into fractions. It selects items based on their value-to-weight ratio, maximizing the total value while considering the capacity constraint. - -3. Huffman Coding: This algorithm is used for data compression. It assigns variable-length codes to characters based on their frequency of occurrence, with more frequent characters having shorter codes. - -4. Dijkstra's Algorithm: This algorithm finds the shortest path in a weighted graph from a source vertex to all other vertices. It selects the vertex with the minimum distance at each step, gradually expanding the shortest path tree. - -5. Prim's Algorithm: This algorithm finds the minimum spanning tree of a connected weighted graph. It starts with an arbitrary vertex and greedily adds the edge with the minimum weight that connects the current tree to a new vertex. - -6. Kruskal's Algorithm: This algorithm also finds the minimum spanning tree of a connected weighted graph. It sorts the edges in non-decreasing order of their weights and greedily adds the edges that do not form a cycle. - -7. Coin Change: This algorithm solves the problem of making change for a given amount using the fewest number of coins. It selects the largest denomination coins first until the desired amount is reached. - -8. Interval Scheduling: This algorithm schedules a maximum number of tasks with overlapping intervals. It selects tasks based on their finish times or other criteria, maximizing the number of non-overlapping tasks. - -These are just a few examples of greedy algorithms. Each algorithm has its own specific problem-solving approach, but they all share the common characteristic of making locally optimal choices at each step to achieve a global optimum solution. - - -### Advantages of the Greedy algorithm: - -- Simplicity: Easy to understand and implement compared to complex algorithms. -- Efficiency: Provides fast and efficient solutions in many cases. -- Intuitive: Follows a natural and intuitive thought process. - -### Disadvantages of the Greedy algorithm: - -- Lack of global optimization: Locally optimal choices may not always lead to the globally optimal solution. -- Suboptimal choices: Locally optimal choices may not result in the best overall solution. -- Limited applicability: Not suitable for all problems, especially those requiring a comprehensive approach. - -Note that the Greedy algorithm may not always be the best choice. Analyze the problem and consider other approaches for the most efficient solution. - -**Here's an example code using the Greedy algorithm:** -#### Codes in Different Languages - - - -```Python showLineNumbers -def knapsack_greedy(values, weights, capacity): - # Create a list of items with their values and weights - items = list(zip(values, weights)) - - # Sort the items based on their value-to-weight ratio in descending order - items.sort(key=lambda x: x[0] / x[1], reverse=True) - - # Initialize the total value and total weight - total_value = 0 - total_weight = 0 - - # Iterate through the sorted items - for value, weight in items: - # Check if adding the current item exceeds the capacity - if total_weight + weight <= capacity: - # Add the item to the knapsack - total_value += value - total_weight += weight - - return total_value - -# Example usage -values = [60, 100, 120] -weights = [10, 20, 30] -capacity = 50 - -max_value = knapsack_greedy(values, weights, capacity) -print("Maximum value:", max_value) - -``` - - - ```cpp - #include -#include -#include -using namespace std; - -struct Item { - int value; - int weight; -}; - -bool compare(Item a, Item b) { - double r1 = (double)a.value / a.weight; - double r2 = (double)b.value / b.weight; - return r1 > r2; -} - -int knapsack_greedy(vector& values, vector& weights, int capacity) { - vector items(values.size()); - for (size_t i = 0; i < values.size(); ++i) { - items[i] = {values[i], weights[i]}; - } - - sort(items.begin(), items.end(), compare); - - int total_value = 0; - int total_weight = 0; - - for (auto& item : items) { - if (total_weight + item.weight <= capacity) { - total_value += item.value; - total_weight += item.weight; - } - } - - return total_value; -} - -int main() { - vector values = {60, 100, 120}; - vector weights = {10, 20, 30}; - int capacity = 50; - - int max_value = knapsack_greedy(values, weights, capacity); - cout << "Maximum value: " << max_value << endl; - - return 0; -} - - ``` - - -``` jsx showLineNumbers -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -class Item { - int value; - int weight; - - Item(int value, int weight) { - this.value = value; - this.weight = weight; - } -} - -public class KnapsackGreedy { - - public static int knapsackGreedy(int[] values, int[] weights, int capacity) { - List items = new ArrayList<>(); - for (int i = 0; i < values.length; i++) { - items.add(new Item(values[i], weights[i])); - } - - Collections.sort(items, new Comparator() { - public int compare(Item a, Item b) { - double r1 = (double) a.value / a.weight; - double r2 = (double) b.value / b.weight; - return Double.compare(r2, r1); - } - }); - - int totalValue = 0; - int totalWeight = 0; - - for (Item item : items) { - if (totalWeight + item.weight <= capacity) { - totalValue += item.value; - totalWeight += item.weight; - } - } - - return totalValue; - } - - public static void main(String[] args) { - int[] values = {60, 100, 120}; - int[] weights = {10, 20, 30}; - int capacity = 50; - - int maxValue = knapsackGreedy(values, weights, capacity); - System.out.println("Maximum value: " + maxValue); - } -} - -``` - - - -``` jsx showLineNumbers -function knapsackGreedy(values, weights, capacity) { - let items = []; - for (let i = 0; i < values.length; i++) { - items.push({ value: values[i], weight: weights[i] }); - } - - items.sort((a, b) => (b.value / b.weight) - (a.value / a.weight)); - - let totalValue = 0; - let totalWeight = 0; - - for (let item of items) { - if (totalWeight + item.weight <= capacity) { - totalValue += item.value; - totalWeight += item.weight; - } - } - - return totalValue; -} - -// Example usage -let values = [60, 100, 120]; -let weights = [10, 20, 30]; -let capacity = 50; - -let maxValue = knapsackGreedy(values, weights, capacity); -console.log("Maximum value:", maxValue); - - -``` - - - - - -This code demonstrates the Greedy algorithm in action by solving the Knapsack problem. The goal is to maximize the total value of items that can be put into a knapsack with a given capacity. The algorithm selects items based on their value-to-weight ratio, choosing the most valuable items first until the knapsack is full. - -### Conclusion - -The Greedy algorithm is a powerful and intuitive approach for solving optimization problems. It follows the principle of making locally optimal choices at each step to find a global optimum solution. - -The advantages of the Greedy algorithm include its simplicity, efficiency, and intuitive thought process. It is easy to understand and implement compared to complex algorithms, provides fast and efficient solutions in many cases, and follows a natural thought process. - -However, the Greedy algorithm also has its limitations. Locally optimal choices may not always lead to the globally optimal solution, resulting in suboptimal choices. It is not suitable for all problems, especially those requiring a comprehensive approach. - -In conclusion, the Greedy algorithm is a valuable tool in solving optimization problems, but it is important to analyze the problem and consider other approaches for the most efficient solution. \ No newline at end of file diff --git a/docs/dsa/algorithms/_category_.json b/docs/dsa/algorithms/_category_.json deleted file mode 100644 index 3055c678d..000000000 --- a/docs/dsa/algorithms/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Algorithms", - "position": 14, - "link": { - "type": "generated-index", - "description": "Searching algorithms are a set of techniques used to find a specific element or value in a collection of data. They are commonly used in computer science and data analysis to efficiently locate desired information." - } - } \ No newline at end of file diff --git a/docs/dsa/algorithms/backtracking.md b/docs/dsa/algorithms/backtracking.md deleted file mode 100644 index 9d15acdfd..000000000 --- a/docs/dsa/algorithms/backtracking.md +++ /dev/null @@ -1,223 +0,0 @@ ---- -id: backtracking-in-dsa -title: Backtracking in Data Structures and Algorithms -sidebar_label: Backtracking Algorithm -sidebar_position: 1 -description: "Backtracking is a technique used to solve problems by exploring all possible solutions." -tags : [dsa,data-algorithms , backtracking] ---- - - -## Backtracking in Python - -Backtracking is a technique used to solve problems by exploring all possible solutions. It is especially useful when the problem can be broken down into a series of decisions or choices. -![alt text](image-3.png) - -To implement backtracking in Python, you can follow these steps: - -1. Define a function that takes the problem and a partial solution as input. -2. Check if the solution is complete. If it is, return the solution. -3. Generate possible candidates for the next step. -4. Iterate through the candidates. -5. Make a choice and update the solution. -6. Recursively call the function with the updated solution. -7. If a valid solution is found, return it. -8. Undo the choice and continue with the next candidate. -9. If no valid solution is found, return None. - -Here's an example implementation of the backtracking algorithm in Python: - -```python -def backtrack(problem, solution): - # Base case: if the solution is complete, return it - if is_solution(problem, solution): - return solution - - # Generate possible candidates for the next step - candidates = generate_candidates(problem, solution) - - # Iterate through the candidates - for candidate in candidates: - # Make a choice and update the solution - make_choice(problem, solution, candidate) - - # Recursively backtrack with the updated solution - result = backtrack(problem, solution) - - # If a valid solution is found, return it - if result is not None: - return result - - # Undo the choice and continue with the next candidate - undo_choice(problem, solution, candidate) - - # If no valid solution is found, return None - return None -``` - -You can customize the `is_solution`, `generate_candidates`, `make_choice`, and `undo_choice` functions to fit your specific problem. - -Remember, backtracking explores all possible solutions, so it can be computationally expensive for large problem spaces. However, it is a powerful technique for solving problems that can be represented as a series of choices or decisions. - - -### Example: Permutations of Letters - -The task is to find all possible arrangements (permutations) of a given set of letters. - -### Explanation: - -**Function Definition:** - -We define a function permute(letters, current_perm, all_permutations). -letters is the original set of letters. -current_perm is a list to hold the current permutation being built. -all_permutations is a list to store all the final permutations. -Base Case: - -If all letters have been used (i.e., len(current_perm) == len(letters)), we've found a complete permutation. -Append the current_perm to the all_permutations list. -Recursive Exploration: - -Iterate through the remaining letters in letters. -For each letter: -Add the letter to the current_perm. -Make a recursive call to permute with the updated current_perm and the remaining letters (excluding the chosen letter). -After the recursive call (exploring possibilities with the chosen letter), remove the letter from current_perm to backtrack and explore other options (avoiding duplicates). -#### Codes in Different Languages - - - - - - ```cpp -#include -#include -using namespace std; -void permute(vector& letters, vector& current_perm, vector>& all_permutations) { - if (current_perm.size() == letters.size()) { - all_permutations.push_back(current_perm); - return; - } - - for (size_t i = 0; i < letters.size(); ++i) { - if (find(current_perm.begin(), current_perm.end(), letters[i]) == current_perm.end()) { - current_perm.push_back(letters[i]); - permute(letters, current_perm, all_permutations); - current_perm.pop_back(); - } - } -} - -int main() { - vector letters = {'a', 'b', 'c'}; - vector current_perm; - vector> all_permutations; - - permute(letters, current_perm, all_permutations); - - cout << "All permutations:\n"; - for (const auto& perm : all_permutations) { - for (char c : perm) { - cout << c << ' '; - } - cout << '\n'; - } - - return 0; -} - - ``` - - -```Python showLineNumbers -def permute(letters, current_perm=[], all_permutations=[]): - """Finds all permutations (arrangements) of the given letters.""" - if len(current_perm) == len(letters): - all_permutations.append(current_perm.copy()) # Append a copy to avoid modification - return - - for i in range(len(letters)): - if letters[i] not in current_perm: # Avoid duplicates - current_perm.append(letters[i]) - permute(letters, current_perm, all_permutations) - current_perm.pop() # Backtrack - -# Example usage -letters = ['a', 'b', 'c'] -permute(letters, all_permutations=[]) -print("All permutations:", all_permutations) - - -``` - - -``` jsx showLineNumbers -import java.util.ArrayList; -import java.util.List; - -public class Permutations { - public static void permute(char[] letters, List currentPerm, List> allPermutations) { - if (currentPerm.size() == letters.length) { - allPermutations.add(new ArrayList<>(currentPerm)); - return; - } - - for (char letter : letters) { - if (!currentPerm.contains(letter)) { - currentPerm.add(letter); - permute(letters, currentPerm, allPermutations); - currentPerm.remove(currentPerm.size() - 1); - } - } - } - - public static void main(String[] args) { - char[] letters = {'a', 'b', 'c'}; - List currentPerm = new ArrayList<>(); - List> allPermutations = new ArrayList<>(); - - permute(letters, currentPerm, allPermutations); - - System.out.println("All permutations:"); - for (List perm : allPermutations) { - for (char c : perm) { - System.out.print(c + " "); - } - System.out.println(); - } - } -} - - -``` - - - -``` jsx showLineNumbers -function permute(letters, currentPerm = [], allPermutations = []) { - if (currentPerm.length === letters.length) { - allPermutations.push([...currentPerm]); // Append a copy - return; - } - - for (let i = 0; i < letters.length; i++) { - if (!currentPerm.includes(letters[i])) { - currentPerm.push(letters[i]); - permute(letters, currentPerm, allPermutations); - currentPerm.pop(); // Backtrack - } - } -} - -// Example usage -let letters = ['a', 'b', 'c']; -let allPermutations = []; -permute(letters, [], allPermutations); -console.log("All permutations:", allPermutations); - - -``` - - - - \ No newline at end of file diff --git a/docs/dsa/algorithms/bitwise.md b/docs/dsa/algorithms/bitwise.md deleted file mode 100644 index f1b6884d9..000000000 --- a/docs/dsa/algorithms/bitwise.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -id: bitwise-in-dsa -title: Bitwise Algorithm in Data Structures and Algorithms -sidebar_label: Bitwise Algorithm -sidebar_position: 1 -description: "" -tags: - [dsa,data-algorithms , bitwise - ] ---- - -Bitwise algorithms in Data Structures and Algorithms (DSA) involve manipulating individual bits within an integer's binary representation to solve problems efficiently. These algorithms use bitwise operators like AND, OR, XOR, NOT, LEFT SHIFT, and RIGHT SHIFT. They are fundamental in low-level programming, encryption, compression, and optimization tasks due to their direct manipulation of data at the bit level. -![bitwise](image-7.png) - -### Explanation -Bitwise algorithms operate directly on the binary representation of numbers. For example, the bitwise AND operator (&) compares each bit of two numbers and returns a new number whose bits are set to 1 only if both compared bits are 1. Other operators work similarly, manipulating bits to achieve various outcomes. - -## Advantages -- Efficiency: Bitwise operations are extremely fast, as they are directly supported by the processor. -- Low-level control: They provide granular control over data, allowing for optimizations not possible with higher-level abstractions. -- Space-saving: Bitwise operations can be used to compactly store and manipulate data, reducing memory usage. - -## Disadvantages -- Readability: Code using bitwise operations can be hard to read and understand, especially for those not familiar with these operations. -- Error-prone: Small mistakes in bitwise operations can lead to significant bugs, as the operations are very low-level. -- Limited applicability: Not all problems benefit from bitwise optimizations; their use is somewhat niche. - -## Application in a Problem -Consider the problem of finding the unique number in an array where all numbers except one are repeated twice. A bitwise XOR operation can solve this efficiently. - -**Example** -Given an array: [4, 1, 2, 1, 2], find the unique number. - -## Step-by-step: - -- XOR all the numbers in the array. -- Repeated numbers will cancel each other out because n XOR n = 0. -- The result will be the unique number, as n XOR 0 = n. - -## Implementation: -```python -def findUnique(arr): - unique = 0 - for num in arr: - unique ^= num - return unique - -arr = [4, 1, 2, 1, 2] -print(findUnique(arr)) # Output: 4 -``` - -In this example, the XOR operation is used to find the unique number efficiently. This showcases the power of bitwise operations in solving specific types of problems with minimal code and high performance. - - -Bitwise algorithms leverage the fundamental operations of bitwise logic to perform calculations directly on the binary representations of numbers. This approach offers a unique blend of efficiency, precision, and low-level data manipulation capabilities that are unmatched by higher-level algorithmic strategies. While they excel in specific domains such as cryptography, data compression, and systems programming, their utility is somewhat specialized, and they require a good understanding of binary arithmetic to be used effectively. \ No newline at end of file diff --git a/docs/dsa/algorithms/image-1.png b/docs/dsa/algorithms/image-1.png deleted file mode 100644 index 90eb9cb3061b6b19df7670dba24721861db49d19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101433 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 IzIyk602OvNp8x;= diff --git a/docs/dsa/algorithms/image-10.png b/docs/dsa/algorithms/image-10.png deleted file mode 100644 index 8b3c8d715659930e748e182c4ff2bff447ab68ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29394 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 diff --git a/docs/dsa/algorithms/image-2.png b/docs/dsa/algorithms/image-2.png deleted file mode 100644 index e9a423c7dd84cb6132de0abce5e8bd68cf046a63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49311 zcmeFZhdb5(|38kbWN)&QBnb)0-pTHm$qv~vGLF4>LS)aZtYmM;D6+CQ$tGm)@4eUi z^H2P)>-TtFudA!0kwrG;}Up40z(xW}1JhhWNdgV6Jo?7D5f=QN$wXdV2@TDi4GqmF01fRF9`ad5Lv!XvLt8gQLla6w zL!+`!sZ$e%A7C3llaoff`uAT(V_qyga@}5D#}N&U5cThW^e(%6Q+PVsQ)vl=>*VHz zj-%ewq}#Y&g-7~RM_6V-p0}^R`@`xP{o~uWZ+)vtg^Dq2>vs#h@`K&in}?bWWpga` z6-?`%$<|rr+RG63I+|>k6hIokg%J951_41)hwZ`c1lmK6Pn@4v-pW%0iyIy&&*LVnKt-#XEj`fu%( z2mNm?oBaR3WWE26ghIjP@c-TB^S|Gz=TnF({&FASF$=Cp;{M;> zNQyT2B8C6+fC1;6Y$e6fmOAKlQs*t7Diz17&R9P@^J(wMgqob(IP(YJsA{)R+n+_{ zb;@ZUcqTX0iDZc?i(;f@&&DT3&m~Izc$}b)$E-I-kB{A`UplnrB$V1}IIw+GZc2c{ z#l&be_?uU zmniCoO3&xc6TV0&r?8gxb<jenuX$JpFNFkfd|t5<^Hc=F#maBm#6aH@aVab{!eiO<1u1I4 z5+k3hUaM#O=FJyXc2?3*Q{L-$&Q^Nc@6?dxb()~Axqe)6!+m_drs93NoNQ-3)oBx_ zp7iNtEic{caKhYI+{bDD^tM}P8Ry%#Z<|loi$+E?dcGizV;l)9{!%p`cXTm&NAQN2 zA4FJHPBLEZ1T%UaquYf`3CAmV{{4POz;=4)1nDb|_DoVN#@rL>;o;$ZjAA@IJT%l| zHsF8qhsR`<&D7!M=4RwgflqmP za1HrrM*?}_9uBRqq&$gwUNpilAn@;vl{R12Avi`XE6pmdPZ68bSgX5Y8?Jgai#>W2 z|J`(XWku|C^;XXp#UaI9^)hqsP9nwl+SGg}kDs49YOSYSibhTkr|hmSny-$wT%OQI z@^;d7?VcbrRacjLljlt$6aM{x8=kShS&F2YMyySQtiw^1iM@R{Bg5IwFhW(zUzkmMxfy=zSynJ}*Qmcn8 zCCx&T-Y?J)w@cMmJGZTM-2`^On|`g{<>^N0(a}*}Uf#;eikzI>jX+5z;^U90(q*5b zVMRr)AGlXcY#zARJp8E0ma2Rw_B;G4!r*kLCX=gRlo3lAPkfo8X9{3{J9F= zq|vj}i%SFt1wM96#j{-XW5GtAM~uyy{WZG9vvtlJ$#zW>Gcz;e<31bW(#Jy%baZ?r z8=?)GLzpUONYS1z?>r}FXY~yXsyVG*zkY3Jw>_jHrj)C`U_ZXskWO~nBz?@X61J7Q zmDR@1PMKzrL*L7>m)ieUjnmrux$Wo9m!)z<2i zj%^&cv&6hpKShe}gw1Wsp=0r;mhr?4!iHs!^(}%wL-Msbg`&tJWuF%e8*+!pW`_t~ z;A`u=%ER_YUssBXiXtQ;dc5M_%JfkYwr8uMkBxU{a!tw9#sOWIL}Ke+gL$ukWeUOP zYO{*krlzLyawwV?USiV*baNI{vFf862fe*YC~ml+ZIAowRMplVo~NB&Hh;du9$-(0 zlZ#emb4$s^-EpDHBh7rurBQ!wc9swmV~4U#;6?H1$u)+k#np@alVj&to|OhYuDSZR z+fYihU%a?S8UEo_WK@(;)R1K*@m+;nbuu!t>}=RZ+;oKgp&pI;^)n@78#iy>9I>RJ zdEQB_&RMBjtj8tC5~Iq_M~x2$KYMVs|Hm^~=TMs|+!%*Gk46T|xisB<=G=C4wW1Nl zA?aH>+|=hEXR-vml5Q|tR!(+ycAlQr5x4Ov9azlcV_~49xOIz1*VipMDU(xDkWIy` z0X_vnpVPBpyAuDV4V4yLnX#?bEk1N_9GWr}G>XuE*{Cm9igPSTjyF-|+1DS~88aIS zZO-S!&B@7Wr7v}9X=!nBQ6cxeavo}dyUl&V+Qrn=6p2K-yStm2vC$EBEjmaSmkV?+ z@&0^h!B%c_GbY!i{$;TyRN;jfQ{Im;F)`^M%L^hLa*_mBwp^wh=%hI{C{9g!nR>pw z|NeXb-{Rxl--%w_t$8!Q@8wGJf=sTKI7_#ffsqmRX9lB+Tc>uUXgbm5?&<02@v&>^ zm`4+aF5TQ|L8D#(YQag!b8GTZ0ORD=;kR${{K+yTEw8UAl5bo(RZO&-?Vlibq8Cil z%?)k_pVf1#DuC=hRbUB2q&d<-!HhP?$ou#eZj(s}B_awD%b=86`_G5DL3q8G* zloaV$9zU@%#+PHgD|?Olc4lVFi_v0UJM*oL9!Ibd2P)z8005|;(bv~MJVC-y50q^E z@_FS3w!SI;MqK9Z=~EAV9=`W+-X{s(AA6Qmmu@uoaz_LPVrksYJ3={@+QdJ$g*IVH zAtRn)ggZ7~73q$9_x5@%+{Csvzb|(+^kwJz1+bXgfB*jduYUebXg$f_4`jzj`8eXoKATgCywTmIU0TKxNZet(+v<iS z_fwA1laGhTp|c(L-Kp5ckeG8lY>DvUs8>3zhEO^@&$g;FRpAUmHM19_!wdBCB0v^W zyr4)EUc2$DOkDFaRz>ur^zGl?&h*Z%t~+<`sI)V*-x|1^`*SFdZhCbAxpzait}b40Z};Bg zvH)WC4uBddd*Vz!ct*IiIYVo?xwrXd{F(do18?2BC15wpr?fX^*9`SiMy1$@x&YDb zJfmBz$q`R&^4;{Wu$6m_zv@Sf?q=Z`Jy$QS<)o=g>9kKfTV9 zkepb{d!XKU`Bh~{y~OPp3pIP_`0Qg^P0&KLU}g(9(kPn3+|}ky;nJHEIN$7);Uya^ z0&^P&a7;@Ln)SI7hzJP_M>r5G?+m1Gy9hJ%n^oXCH>AZL?Gp$)*r}ZB%}foUkL=y7 z&!ZX%UHSX#=2rQ=LwsNDgLsvOOU#2pEbm|9g5~!{N^kLHA>Iyqdi=4=;U6yRJcxDa zI!Qk>+1?AqvOir^{v1Z7hv+ZYW31;@X`Z)<;BOo~FOMT7l+GJcJ7ja!RrsioJL`RQ zffOxGvS2*>7XLP}f90C5&x%`7QBkBU>I)}|JA=}AivK)Xp7o6~FT;mVH}#)dMs9-#8jT>K{cY#G?d~d%zD`k!B#cp|A#KWciM@77K zLu2RTt=JEKd8apFb0(9iNRP}CdH0g_Z)kL(8S212I6K;=3YTHUn%v@F5l-&)I$g_y zif6GPHB4KbKV!SSy`49-X2Ewl+3lt*{G<}c;hMwIaD4u2F3Y)8uj;+IDYARS%|)2Y z%3`BKR>uVr*<^H~Q4tFpjQlL+iMyGo8)xlfbowt{BXvKXlPC}PzfQ7`Q`w%_qoYUh zcfa1yEM^pX6tPmUjdXvTpNIT4mAdPYC${l*&Aw0OfUbu^3}N^8m)w4RPgm69zPre` zxuS!xJHhT;e3W9}>u4zTkIpVarCE}DI~N^NEHYJbne~3#5kEw#msuRItY-RY@{^-s z`}=Ox<(p# zxb|&AyFNICguyB)&o8_TUOv>14&(m42rHJ# zMMZWZ!!wL0zpU4|D0bT(Es{A1Ele2Qn3rw~NmXV4eRNhXkj|PKK8nA2>ws=|qcB9; zb962G1}27JOxprCLnN&c#(JgAO|7C+(IBdkol+bO^z)sFE};fJ2|CM(dF!rQsyG;g zBAhqro|isc-ap*sNmNOV&+8IPsVKyaCca5gcb<4mj*nf=$TZ{Z=aKf?iMP{w3MzM3 zR~M97fL#C3KEXIaSTx{%PReI_LvT6SYXe3{LNi7~kB)>(M=Uis;>{`m02zJ3!tjNz zh~Nn1w<3R*(6baDA0HVB+)9ljUc9b|e!aZ}4G)jrQ!@U0&ReK`m+0){q?9`}s^ z+h4c13f7k|Ki8a+dd-^Wg6sVs((1m3CSqb@5*EEi$8x4kU1f9R-gt3w0qBVJ)r(?E zM6ai4`s*a%g$X?XYm`+~fd2fVO72}A9iS%Z%+?bMrj)g8TxVw3Vg3lk)O%1P7LW7tR85)k&!E z4qgu_RVdvwkQ=xF?1288=NKbpyE;3w23Ki5F2vj0)`v|{WAs536yAz!-7jAQC zXsBf7J4LoZ`qP|0pY=<%I4Ls&#y1Y^d4IpDg&zWEKeFbd#rbam>x8248*g2SEq2Yx z-P+pP(h@J2bd~XlvU9YruWxzTtNC@#Bx*O${+qiVbo;SQU-< ztzrbxx0qqvo2nw<0_;qD@5jm>bj{UG@AYoCyc6xzZ`?@4FmAC|uKM@wBa^D{CfNda z8cc`y$U@tXkB@tk1*9^GzlK>)MRhI0^9C)*dzPM#3R$mf7HJe~mQMrC3hQ7wranyF zs4Jr*3zg=hRmvLzHgF(r&d9)9h?D&{kG%TzfN-^xueRF6TsKQ34wV!Qm z7wi&g+v<$s4cy`t6%|ccY<&^mvjkVZv9S>f$p#%jM|%2>IUIk9a_woj z*DqeY(AU>|?jSx}7O9Z?b8wIZFLdujxZz#i`*M&K5G}%OaWTf_xXGOkbd?wC1qilS zU_n3yXKbme+6D&)0r3$M654x|GYpI|gm);n_v(+nKNK#VvDMg`A-4g4Fm7Ryj@Wo;YIJ6V?p$^Z<*j?d(u41)4=WoFe^uXBR<6 zKGD0I0F8DxT|m3Iy7ZW;(m=ar2X~m^g{$znIB@{vwf3J3^crZqK*{ z)3P?Fi^~kJ!tXyb^*9`X%!EVC2|Y#~Kt!RejEs!HMcLZg0(?|D<`B_t%tM|eo@ep) zEtPJf;2$bV%6W5C9sF)sfSqa)of}X8yFcwidsrZlUuPXCe)4!4u17#t^-3 z`rU}b#@4o^xY+l-gbZAoT?+gZY8slmP{iK285?5+-f#`M^C#Yj8qSipHzOOyR|TdK zv~9-DBY^Iwr$WcnON8*WgP;NgN2)SB3tD2)2wortA*QK*+1wcHiqTPpT++Yq1&QsG zd~cO28H)dY^O(-~4q-o8Po*}eUxZQT0vr1rJ+=_CLXj=@yD8vs-j6@p+okJgqB@M( zBgT;Di6YnTVQc1uVWZIR$150kUpP0nmMg8ZkM_TycXIqt$#m5`RyNyo)K0 zKD;Aq(1ImKoN1{Yg?%wq)!5W@d2uvnXJfO#0|!Ya&8s<@$7TGT;VD#bj(C24{BdU^o^!c_x1ILy-lAwa&?VXts^5!`P+K{D{n0zdRRSxT6in$kWEVVr08 zooTG7@ZSnxC-!XGN>wT>|$*gK1Mb4{LCm!8Ke@+|C*)N}N{r=VaR92_7xD!+c+hbP$B z*)96A2oY?wJI~zHDw*FDjE=rkd`7D*TdX-XIcZs``;E7zZ4Gi@4o18Z^o9DV@H(ct~yQNti7CR#s+IQ^#kZq84uEOQi)Y8&W#}2;B7QG-C zR6eqCFz>@s_!wBsQg?i9Z7rNnq^MX*x5zFQ=t)~s)gTkaS8fR^^L}h_+hZfwg*yhn z0+z!R2?r6j|FNDc3JUE{T-VRqVp}dAz-LWO+qaLTHk>>?8}+zuDMp6d@h4lF(eg_+ z&%p&QL~xAru3AH*NJ>ldvL>boG#saw3~_I4s;Y8va{3B&r=sGTn6qGbfa|q3JAk~Q z(#Bq1m)-IADk>@-K71%2ka|qcUL@walL2S3NF$&W8tL$G+}yUoix*Q96B5Ii{kWBc z^N217;uPrh?mP1m9Py{C+0mDq{g?P|ovEp*51P;4I6G5>>%2;^XPQq5wrXl__C7n@ zf<^_D3{y%KMBug0wYnu68yjNhJ1A&Vqu6P*3^c~nHAIPvKW(dth=>vr5-z;1+S}X5 z$H#M@C6v6Z=jY}9t6B4{G&wp(%qO)dEZ->0_{qtIS0ajArXQEvc(7}6cVnzntZIP7 z8_|aQX7mwz=)0Oj#f(x~+;9)`px`?#l zuvNxBrck>YXr=21r{E^Rfd$E9K4vjRL{RYfSNMav8QV-%A4f`jY_W^|p#^ukj;>y_ zJ!m38eHBJ|NJAAB6`9stVZY7&d%qxJ%F4%^+@FEqR|9z`vfSPG!$Ei)i&Cl@t%ZYQEaOIs-_uwPhnbq{p>#bT&wk z(!XL=NqbssAR~G`UJp)s;WP)e!m|CHfM zFXg!xzpbEC?22FQd0+OkYpOa$j$_fzDgf&1_SMnHn)0&-*sx82a1M2lN3^#8|{lXsGV_l(+ z!JeuDLH6J7n5wo*P{@ssr)aO+k>#mK93`7z|mrt6QgQzyecEZ7Y|>I=UDo-6}84AV;FmJSV3mKx$H~ zY31%t8*2GG*w7aBM2m;Zdd;@_3=V_6V1(XGsQ!!1Dd@Pxn$T#QKu-5K`V+5^dvfBo zN-1%|N{kDx3ph77OJ-~ZXbIZefu3DnUV@VE<>VCbnOT%}`C-%MJ>8KEf^n|0@-j1O z6Ho&|1dNfNUt{u1Rn7xx=jE79^;858HCaggkG{UPCN~{ffA@QcYeW`r>8ev z>H)cYdVP52IZYSW(W+U-d81ToH?g<3*ZVlw8amUDl9DV%0Ao~mfs&a!+FRtm^@i5?e(0gN z+ZOEWXPUgPE)BW0b#xvJ3Idh~;uB=VWIVj(5=iXdD*o|OFdPngS>AjQVJV{^g@u}w zCH`A9oF036Y!m!wh7z%+0uDS6PMRCc7{21gnrDCNw~?ZAr>E|@>P8Vtii+)vyQaLM zJluxumX&xb5=spvnniHGpR&cmD+yYw#Jx2l$r2{`_*tCEaO%(>hY0+RKXc6n9PuHz zB-Vm5xF&qbN~@b~)P2);FCLG#hKNC!nx4MVWovSzNDJ7M zXu4d*-%u%J4b`s{jru~&>bY$YoQ|$`#V)&C>WdYmj9MQhE9Hc#)zXJb14PIkM7v%& zwPngngBM7wQH0=_^E%tQla73^$i^&vo)adKo1go>>A?Ns62QTqnGGkQkX9DjhjdxN zpn$J?5-Wk>- zPk4o@kIH!uUe*N^gt(rv zKmKl3@vVi~f3fZlfR52oO}1FKH41ZX3)O6&{La=^^gr2@91t{;do4H;~sF7&LZkazN{= zFR8DuKSL3TP1iWw`lz`4=JD!HmW^m8Mi;*KttA_OwzeM85(xLY)Hl}GZ@4k63ykP7 z(!GaLp;-h*;5fnY0Vp4ENUZri_Lh|b_z>4`ER%o!{P}!0+IxC(GOTM67-&xT)2&QZ z3*Z-F-%|Dfv7%5?8bPqvz{6od3Qoo3Jm-BrDRx;NmF_4C!1w!|bYRYgNe^l$KS#Wm z39tasW0Pb@KInx-+>r1z(uH5(7Jp#(zaCEgZRhQRuac6|E6}O=U$B!iiGrp-NUO$4 zNkv5kWEXsmX{L90yf!^OJ-e<*Yis=I^YRyjV?pCgY?duO0rd2Q!A25`oGl-MZbu1H zXN3S2E+gVr!Jy5`A5~^0wJbb2KR^HRLy`BRuniN@-o*rsFWE0v>c3$>PT|o764j|q zzz}DcNz)S(zAFB=uImW&?}2$#IwqAb<;mCZ4nA*b)9E^#l}OoZc}So+U5h73(b(_v zR^Z=5N!)R0)Q9cvqrQK6*|aDKZo)P{U5~oWpVF)^w4-PW2+)K2o+G}4>;zScI{J&8 zf2*NrdOElqFJH>MzsV&J-3k)}Kq?2p)t3^oo?X~_{IpQC=a?{W7ilw_#JyLv*YQDMQY zj95xu#|y#vSwIRT^+~OW?)t#Fac?AyWSdsRlqCMucJr5D+ip!mL&Wu8`}vRP?BJpZ z0hj}oN;z+LYk)P2*3@3oxbUuW=s$!+4cH*(jU`oVqQP6wM;6xZ?x&@f>!lzA%HjZy zZZF{}xc)~5wAu0T7BUR2+oadyJc0ef%36L%jz{p!O}KKXVQ%{YVDrQ3W)UGFQc0%B z97zp;MCqP~G(tECfrsN5Qp}9Pt~zeyLO0DaRYRm%*hLbPlchZHd7C)eA`F_}ZqHWFd4ZtkOMCmrTPUbnC3-sA+KH*D z;7AKT;$Fd{a{FbRb~ism*p9EStrZ>x3eiQ0O44PF;Qh060a`7B_V9{wvfwT?K; zFPrDIWYADq_e$Gp0%m3`_*Ap>3J`{9tqnJVQL991uR<-HZ!$94RqBFDtGXuHvNJ#5 z;yiOxz&4*Wk!pW3z7s1M(g6vTA}n(z+dpwJHETD?E;8t1=bRaA*f`lO}r z0-M~PsXu~t5O@35iD%U-{|gL8TkzWdA?VrJg(zzB_{eD6pRv? z-J5Cl_I7hS0g59Sv#_2y_6j`J*RMl)f;hj&8b`0w3pYH zlnk^dP_!T$0d$5~zf)Jz=5_Vd#ra;p5$3(#d3(X>Etl%*>gNUIS)(f5O9e81-x1uO z;oriO;Lac<@EN*WTR|^7A4~)%xrtC~DH5Jgi zAkgD1L?2M9YVBJto^Ogs51BrJ!cc`@LP_8{2D}pPntMNj6#exYY$x!Maflc)$jN!y z-qa$&SZ+16-&Rri4G{53abK%zW+2P7az|(-wm5yRHogj#t1St8f2{ z1JOjv#+b;m>QVHi*ovszB!E~7NJTYrojsv{=}oO3VG*7UQgDbum3Dsb1Vp6i=Uqqv9zAiaeSyW#C%IYE4*@dWk z6muAcdEfRCYR_K-XM>^dc3WGjG7cNnEN0ie?zKUFf4Or%Ic(m_5N-1C4yY8z=HP}e zOz-aQT8)+blXzg?$=;j1Zmvb(^qM~zSXvE2;~Em%vXa)gcoo$e)aHnusbB9xkT&;P zpnSxVSy1T9vjj>Sd3zhY7G|>W zWfwVp_Q0SC34q`$Jz=wV-jJ`GyQ^z{9iIc^J0YMCu1OpjBWq5uK~3pM5ORHj2|Y?G zD*b(Zg@&E>Cb%DpjHsbiqTdJDE)EWZdkvDAWgr|i zHO+1x4faHj2PQFxeZ^BYC!YqnSt=3xy4tX&qLNZCP?%dZ3_?ZP#M|CZP6&>8j(9wl zFx)CY{5=T|ydii7rax}rpsGi%5b~NYnxqCC&W+OMS!m|Y(SLPWB+qr?wNeIOg_PkZ z{VIJ~e+V(M{{H@3b_DfAFEMNW8i8G1{qh2H`NrXiz3#E*kD_0=4!p^Q#kL%f8BV-E~A+|qsaG;_KKYrjh zgbh)d>5Pt#YqOIVY8I^~BI=&0cI{1adU!d}3nWd&|Awzdsco7afyB-#ix`@pIy>c!vzg93}dVVcb7K;wk%TNJ7ZCx-#)V;Y_lz`DdN``%Ye$ zrPu&}!VoA~0mN_!;}x(pu}(8%w1m#;TZ&}ev@%u2 z>&demP>eX=G4ZW6gkA~SKy;IaCbVl2&OcBgVv5I}1>?9OrA+>W+jMuYVR8rc-@7ec z$U;fH(DwX!tBbSU?hC-$kAm{!+D}4LDZqH^-8fzE`mIWm>eHkM{;v|58`g+Uk@1tl zX0lXnc1Cf#dug}-@&L;XIe?A1$azzgcPBl>=Fj#vNZ!WfiBK6V0<;&|U>kdoI-^BTEnHkQZ6?XOXU%b1 zVqR+swcIH=f2H=NuFRVM434W06N!fwW8N`!uDyZRN$%w1LPqk52bC8)82jd6R8W_V zn}xUm4AQT2dJX%zATmv~iNp(_r_PHP{>#|s&0}Tnr?w73{r~faE2)dvT6*c*{{Gjn z-$U=lUHNEbD(@3g(XFb!EgaiW&4RpU*`EG@vClZ}v37?CF)Jet4IqIUuZz>NE*Fga z5dkH*#*QE;?d%Y{tk6)93N8Vq{ih457hsy`Doyq+y@7uKNfrf_R&VVmFEFKdnS ztp@{eP*(WSqg=!tmAD>>jK!b1&r+3F=I6yVitim5q+C~t%wS>)-Z|df4 z-)Rg+Um!{e%kG_0Vp>`npq&>aO>LnnzU(+(9^c{6FFzj1ExgE@lyis~z{I5T!BA$j zg}i3$cf&=dTc7@Tvyw_|?)a$?2+V!UYikMM>;rlAf%i!d?0a?v{$wR~?2IThtbV@X zb${WoZuAxkFfG6FgWw@?N_gsGc{Ahv4FYP8TY-^4R92Rk4d37Tyqi-Y`!P18|3`0c zL6`+=IwXPs-?q002!$}#GsaPcZ_b>b3%8-ITdH8z^u4ZX7Lp^5q9?_iu%^`WOBZuF zr~4vj(e79F-ClS9>o2k2w9pK^s3>J2AC+BI*eGoBiM3mV%b+QukSkzN8S|$>iTUUE zOYf|F6tLIN-sPnvCaQ*Bk$uYSU+FRBefI3xfjd19Gv*G+2%uQz313nX6-cmB{3W!< z86@zVq@>UiKAZjJKI?tuIow`2-Wki#4y1jFkUYaMTYPT=B10b`kGAe=*q|bm+T?z~ zvEF8wB>pmIY6~)l=~J-!%hx_f!J4YF*Ade;E}*iGjmhichh$`ZttC{e%=YD zZN0v+(tcm^_v6^_!yC@X2Q}JdkGT!sIysTk5zT6p<6(}&^Mh{C?+jY_(Ux!yBF|$l zf@*A8ViFS*k2fp&%ep{sf#5DA9wFYyM*dI#$AT>kBs|T475PeQYA9qTO6_~St z%ymT5qorB$oZGo*GswX7Logq$-OOzem;O6gc|LyqK1!kj_)%@`bLju59z1n2=ESe~jq4dC2)`b&fX;j zBabE+^Ju*@LjyvnjPHMQ7rvWN+KGpWfsXmLU)wokZvLHGx)n8c;SJ^)F=~8OeB2># z*Answ?BOpWnwVQG{YHFqn_d13hP5bjndmo}s=!TTOo%w%Xe8D_Htih8imINRr(BV3 z$eLeEQxn3k?d_RD;VS{^+PGM^%zo8znZA<)n;`SxIZ9Ju2mBrKrDG1wh{F?@7n z?`GIo;zF{Am)cwk7G*O_aME_|mwIRl>dC@%Roop-Sq2dPNDePt8}#3g`VP(P_n5hS znYxN@JT0JO#prDPOH)4|j=pwf z#PsvJZ}1)ZF^(b3ZmqPR&yz9I_ykV(3$Pi`mjPeQVHkv?6uHPCl)r@IZftKnl-KM;N z=T+I;7aiOY3=sknGrS^}EpmZ-Cqt3iQIMZW@4qF5?I%}9XhMse&5_b~ zqh52^G6>_o;Bw0DUWEa_Fe?QTUs;33bDEL$Rl4P8rs*v5PsG-)&T$db?Vy0DbAOTx z43h-n>We$O^LuS!P9|(0;5RI}6l^ohPBlme00KgAU}*vuz5M&db8lO<~kPP_VWz&Tvkfxuv2i1@pc<(^77}nsIA}mAA9=$d}K` zdHyVqII$Hg#9JR=Ra2h#M?P;j%5ocKl~lj<-hZalUL>(c}Oj`%0IqCsO` zRoC%@uW^*(^1S>VnAORTvi4rraqLsqa7PH>czRP$qOj=8%KH}SipGjemM91m)D0lY zl(9&o_S~6C(!$!r1mzL1AWZoIPkou#r=11inVZ-T+SuSDdr5;eo#&D@)giODR53YZ zEU(TFR*vKIqNF;4G_Ez1Jnb}*S*+nm6YCdfBPk7x#m@8&7U1zTkrC@{o^w0!x-D#=gs+9YK`UY|XhMxww~I88Z^ zr}rVKQB&OU3KC4{U2QU&7;e{)=d8Y+3qqe3j?+lBaqO7Ci#>dJ&HbO&A}TsNK3)SZ zM|U?K#~V*k15QduI-Fj4AREWl7&t^@-Tpc%Atvc7;Vpd6cZtu1oL=?sL~G1p{M7yC z*G$pXetmA~6_)&P0Of5jKIBH9om2LZRBws*NWF5e89+7ZuQWxpjp87}uIfHk%H_C> z*dh9LFXX!k1q=Ww=T%f!<4Dw1ym0R$8&R!1y3;*BGO>>k)3_+W$W(D>H&l@B82N%u zbIZXsi)yuC4r7XOP#)i3J)1#oJaBa^mQ*TgG2{NPfcYhv&NU;al~CTM&lXFLDJ!Kc z7GaC~fNRoLic3rFK4K8iQC#x{&S3%r6t? zV-^~2VO$y(hUngt1p|^zAqPBhtp}9h@jb6XC|al_3P{`;#g6CwjRMUd;au;e&)-e? z9!+)+JFLFYo5Wk+3F=>XcV zklKk;AYe=deh#scXq%GU%%tm|g+_{_4v5@7g6OJ<OVfrAU0?fe*beD+KL!)ykFh==jX{(*uAlMpMr3TP~;;;E6yMfSzD5P>3 z(%2R;ib`kr@d*fMaU~F-z;qfY@r%Z4rTtdKAz*cEuVt4jf2z|QvtA>&jNjG!`2KEn zZqvL*DS@DPA?H%9T}aa1Q0>us3JgVf+9OYb7Y0!1q^h`h%l)gtYP;0AWO?U{Fn&;1 zM;qM*+Dh7X5W5vN&$af*pvA_WmspSNDC6W`}LF5eGA?Ao)bD+#!(pB=j~+{@RJ zIg9@oMSnD$e?7pz?|EQ`L*@@B;d*GiAZshCs6YwUEe^VFXcViRVrQEVe_J3__vjCzHMqd2z1%?&HD7GmsTExpnNnrn2lAPHp!6s*wXBrUV_Wq} zq?9l@-UVpwdiwf75l;~I7hc}=GqN5*Nue$*beN)EQB2rT*EI|!qseX3bj9->+RoJe zE-KvDh`%Qm>y2Np{m7H>j;+Dy$gjWLVrUBQI*iLz*~N>We-|ZEx#dc#>UC~UCYr<+ zD*IhF+ri%cUC$D?)$bERLW(N2s2V(-qWkt~ni#p9#hCMbly$yOJdDf6%S?MKg18p& z7T@v|DPU2j@p0_8-4`#iSx7cI(rn8fY5=b>m&?>2Wbt<6tldIOqJLG4ITY z9oeCnbS3d%+uhGm%45!h?*sC}1N16&vEH`%NXq1|e-c{}m9XP$;K5~Vd#s$R&b~Y1 zlS6W@A^A; z)jigIW(QV6w4VW8%AF%VO#L2&d>4N;_lsXKfe3w}^> zaq+|i_*G}fr^H_)vLBbh)Y(m;sOKEi!Pg5}sD=jN$BzpF zO8Q=#{3`S5#tBL-kdC2s`{b_8gOBH^|8h)5NeALo=N{tovz;Lu5F?!_i)Q z-yLLek=4W2Z;%AeRAo=^H>iDsg(6M+e%g6Fh(e(t`012|dIr<7FnJ0l*X99o48JxR zJhS7ukok$KM(~h@y7zuR2VWBwXzD)H^CmAXbJ@aeqCx|{;rU93=8ss~*w{oyN1KQr z&@e`BPpvs|t7GUecQ_7QsZBnhvZrDf9d$W*m}+L}dI&fpVA?3aXnFZ;yV)DYlFB+m z9q7Af{A3@T_5sxZC$3G|H5SPHmP>k0$a%?eS0Oj)!n7V2&J4a_Y04h_WX%b*bC?$h z+K@=&5Jf8>jvIk#*;Vv{SX>uAR@?!e2vLWel96veHH#=hrNRA4>izWQmkKpmSTxC8 zr|Vd1D!pmjP6M+|@$vBi_s6ia)IU1N7x}aww#Ub*u{&GSI=JVd8lU`KlFjxd|7)^c zXz4jIH3j+Dpg+scv`RD&j0Y+jystztn7Ns_O)No!bo|`^KqND#47|<7UBOencl)&X z*wg|ZOWhO{pS?!^ayc1AMMg4P`<$073U(OBgn*QX_iF9V%!@JSn0QEmztGWX{eh2} zqAWmLU=!6&ygmrI9ZVH!lX!(Ca7SviQ1r$sx^;=XZ;;68je|JWM|Ir4c3oLXTaUkm zSM;fTwaagGW2wrNnotRA&p$B))A`?YuHkrQBelyo)H6SpJ3-Q|bEq~5{S$k(x&0C( zJS?!88W0}4=*pqyN$>wBIzb4S+k?5?clGLj5h5M|0Z2YU0w!%z9`F8!arwWT7$~Tj zy2UK%n8hVX(e(Zmp0{M%WVo0x)6l3NEt|d0rxrK|LL=nst}Umq7ag|e80E8;l$L_) zwhgu3M!fQ|M0pW(!C7>k4_d!jij<7? z8T0_#nYt0%YB=yJKOSpk7Q&{68PcXE{Q?9+>F+bniI$f#gI?fDxzux9&m#BXp~P}* z>?_R=42E&i8-Z=GARqwNOJSX=HFQ~@6Ly7*`Hxu}iNrz=A68UVeZn9LsRQK^(!k&( ztBuvLfbBU3V7hSa3$QNrw{zl7ig)cCi1an7(9ir4@O_ybh2~3K3tZ+C-!-8 zBb$z);*}1ZKe+nfo=CUOuL;l`Y9KmTg3b$#RH=q!ygW}#renZr0c-B-l+AF5p)I~y z6(r}RM_^z`NMWH_uBAUV7|aFH)_2 zbm#JK)xLngJIPmI3|v2j6B&JYL}7^9UI0?=qUmCd3=rG|cMPVGAxH{a=SeCd?K}Nn zZ*i!yEapMsRB~dM5Z4k3A_2`8B`n0_eOW+4h);v!^4WaYStT_Dhr0Ez$LRbWS>A|< z2>H9Z2vDw`eCvjk}*NdG`mOBAx4AOnM0md}U(qI29rLC((He1*vSSPDX# z(ku)1)JnuKVgk|BNBzNqDYsH@LZ%z-WKK*Pfkw2 zj=gfuRfhp7)q8R3S<%o3z<7a9`h7|eQ>`ud>2q+nAa5``GqdF+G-!cPfTj(jq>#3O z1>>Y9#lZ=OUlqx^OXO3eT=VryA$5y(g-2o0j<2>Bc9}?jhyqjPvEBJhRM}?xenf86fXNb8k&fO31s||2#!D8J8cQtfXrd zjc67H(o_x`>DD{jdGb`)~ThNHiUc*K-(H<>BGk9Uq>2rdI#~QS$JMXmnGU z%EBdylpQe*)aJxyc4p^Gts>>}v-rMaQ3^BJA|j17HLG=hAUId43sWwDAZ7v}sR(?^(cH!=Wub;b{?^5X*guf6WTS4i66zy7kt6j)(KLd&b;7!8 z#1f3U;gNZO~=4k!tO;jO^+ zg0G_xyF6Y5z{{vY5IG0|X_#Gbblih)9XNp~W7&j}d!bCYyemvVkoBy+@YMC+?ocYv zTaIYyDqO{nE}h$k&h{@qocIX~#X^n;(_n3%kRoGlo%iN8nRjxcW#9enjJz3S1i~78 zO^G%COI*>G+uCw5L>r7V zJa+Fr9kDD~fddR9%D{(UJ`6tJyZb16>Ik9Es$gA+x(4$zkYuLUAUHINMgY}A5X^}? zTe@ej!5Y4z179XUvJo!L616CuJ*dd`P(a`<7;O-VePq0?L9TV{JW-KNZE;}BMNOR01_pz^ zHZF!b*iD8CrkW^ZvK_ncSkx;s0K)M^wazE!!I4=(`{P;p=hBfQA)*avLy5U_M{*?Vu zAS4Gw{79bOy<#&ZAzHTzrnL7AxHvB0_W=DD21f1-(vD&+?g*BQ!W-=KU+*Ysqkn+R zgu=;$3m^yJh)Y|*zI>-Cn3_WJ;U_Q4f^sPE;{Xgbh)==!v7jP=+N`g?q6GXWYpBvzkz#0 zI@{6L*8tz>W6dP?Knk3Up9&OM{?!H)W;Y(-#KGah;uIRfqPYn)c^)2=QjdzRp0VK+ zewKaXWKVoyq=8~la-;Z0)96e>{DcQEM7!XM;#c@5`VgIwzJT{QV54EH+v+p5w*Av$ zs{o|@{F%dkBYj++dF;e;}J^Zk~QC{8tC~q+)fcM*q<+h-8dv z^nVb(?E3;vVv{a_(7(MoUEWXB1U-uDx|^-Q^a0DE#BmUW8{Ze9i7*0EiiBUEjBE5g z)*ge}-XM#n2!ALDKYf6Nq@bVxDE^w$eU`Z`V|#T8xxtAmOJoIO0CpHx0gTyA4Go{z z?+{^dK-K6i3Vr4dTGgPd-wGB9AX95g5>w&<4&tVlY$SLyaP~*CiW{voITJ}Bdj4H5B+|f7IJL)!P3kH8|v#L?*0+G&mBqP zqO)&M=}{GTeiZP~0NU#3W39kf0Khj2|14E8Z&+no5l6$?RXbMu7HJ>VY!bTlQU(%t}nkyt3iD};l7BwB!n zcJvB-zs4Ypu(AUAea;E-4@{=IQjELoi#z+0Kz}n?V;i_f6*#nW0)X(GDtCtWW#F~m zfKLN5c@6R^&;JyT;6m^1?cLrk|1(0LMfRSA?d!qwNKlCe&Auyy%(a(|jmpzX#-|f+y>;! z;h`H4ezfNEOx`mvIB3K&n$es8MK~W8fO`t$w}!mLw%l#6(ck+<9=@{nH;$$4?To;C zH2@f%Y`=Z{O{Pv_jnWr{W*Sg3(0+caW?MJ)xeGVEbU$T*cHt8%Ym^~rMy>*jfQX3u z)%g+F5spBW%Yeu}tsmjIa4j(?f!VUhQ&Us7IT?yT|9KD@=MBUJF^XnDuPL~}v8uzZ zw{+mU+soi{ALCNren}``<0mOxMh5r_`Npalhmw8aIF^sEB8V18zscq1AedG;xm+7m@I1p$o^h?dl{VF552+Ve70@dmjA{2!Zzg(dzxx%K?d%m-`Q&nJE>Lj^@d{_4Yqlo**q z6^d5LvXqU95nH~oT>^HmG6aOF_!R#T7)I^k#@)!%d;_HeW$|=?{LTQ;!EqTm_xYc_ zOsj9F@v&3|4^GFcYB5$QX%F$CJk8Dpj1<;Ev*B@RHu)JgFPor8>GBT!t@@8rZ z;O5{d0a4b3otzsDJ9mcq3Zof<2>15*e)oWRwO&Xy2-(2dlACa>JE9?O1EA%Wli4Um zAkL(m_yXbv7C9VZme>w770U~tPvP1EPlTT|V*C`Ci||8W9m85h!J3@D+CIVbMD)ea zl6kLyDF;ya0PL2n9uId>SIJFwUF?3v(Zc$z;-ViF8B&zb@$buQh?p(CA57%zr0${R ziB^VwsjtT~umV&pn=)XPoGEasm^1O3Yyd0eaM^?(7&%YAylT>RxV!7cOm zlJxWh*BAK9P+I|+E(e->NeU=u(~7_<1O5jfT+a3#Dt;VyfTJGxNS$Q^ol>kIMdvubpt)`}4}>u5=NAaW_d9GL+ZQUMdsR@OeaF;SLx1Z7 z)i1XitD1jyqjVoxjX&i0efwJ}jYZ)g%Yz?Ul6ZYJ&p9sv`vCw;;I{+FOJJu{po#zc zG0O8ZDK&ecpn_a3Nj{U4SU&~>nsSzcsZnnxu5mBTYMA!VU~(oPl>y=Voc{@Z7!*{? zKqtRIr>fMX?|#+&Qt06a!v>cXuoaqIRz7?w#Xxc+L;>u-_5$D_;6Gjffdv508gUn> zA0`q%c>7e~@vsayNqYDK_U?5;kZQ1{rFl(GZ+o06a9N*aY8e6pxOd^^e<7^#u{VLQ zxf4l#2j2-ErT6HIj380hP?jiu9KE17%3)_E@(`|8A%{LpE%cw~Dn1;4`Lz8-Vv;iS zFVT#}f?EI_zo23Py7(!OMY1@#hZF=}6N`(B0D79YTp-lU3rTPoJy1*eJ|G)G=xnz8 zuk^iG7a-bLIk@+G&qQHkagjw~Zj{O7>uSe{TrQWorih;AN;O7|(wPw`oqdQ-l2M{43H#cfC@jJDo~E&By#?doftEYDh6co&7j}{QYYMhe-Fps5?A?p_ui|mxq|~D4=GdJ!{VUx z%|n=GH%R}o0A~T#HeucakX>FHFY;(!eWH^sRV{cd1k*gu2=CZ^ST(kbbs9O?{Uzs$ zTfIJNJ6Kvlz@MZgnX84&myXSi@=Nc6r*_BF-uJM8d(A@)iP7jY-U?Ugb1L#JI za&CjW47EO;Dun;^c{w=T52gWIo21##J+aoYDzH@DXeBTwjpo6_{~S8Z90WkiqcFGB z+WbCAH{hGW(*Q~x=>w*Y*&}LgFHH5cg=sP~GR*%ff0)Kg_B%T`?%c8fJ_!Iba%lhv zxRV%RY7mF`A``+-`Y-+lTmXLjc*-xu^1jC$@Z^6|2c4UX09a#LtpH3Vz?p{}*X|ED z_|QSYWzP~Mbg~f6xTyTfM>XRB9qB|WBv zG?juiWD12`4tH;i?qanBoFlpwC~pCi>n0&3Bov%e@<#~BU1^T{-ari^32b0gkm7bJisMM%#fm4Am;2?CCR@=_>m5L|Na;oFHXPS z|D@W(>%yzv^RwJn&v=-}NybqcX~elOYp)x;r+_R31#+O=4-c(-6_BO*8{|!oC830E<@id zF#>?n1NkE`>WN+8F!0;u`Dr03Ab?aU82x1m2fGNwIrYyujYIe!v)k~2?7C`cuy_|jOMCJ6y}`G% zBvHi;?iKL1VD+;`-xsQ0f^@g_EWNeO{zacPIOpXgidd~qp98$+@ng%h)wMNFij}y? z;P4z50vj9-noHBF@zYbW6o^!b<5N%Sj{a`Zdl^1na=Xt#nF-hW(_Mt2BhVf$-|ax` zWv_+Nc)S~|h|Q;%e9jtX%GrtQ+ma<=;lv5dxDM~L2;+SA{anmJ$(R$X{6Je%eBNpW z-+e#~p7?{H_FZ!D)JH?V=_!+V#zHBAxiFbqJGeeC2Zgu!%g;W&f1@=lXJ#w*rr^9r zJwGX&OYK+s{N<}T(wk4;@(89D`A9}iFIsOdZq5R)vw=c09a!1{D*OCu=ep@;d+stl z@BkF1hT@!h&t990xpEuxU;YGbcTNfkgP60_=tq7NzURIPw=YX&H@;?o_3kGS@ad+X6feC@n)-) zp0ZuicWANqUoi>(Q?2jb^)Q0RUHD}M9R4AKs^RjifBeL(W^m7Wv`onygNkWu|4{FF z+tKknSW)1XRy3j;%i}S|!B;mFGV=E5PYqKvo0PQPMyssUfBysm_=-!H5 zX{qtHu<_3|Kjr`GL*WbjDgaBas9DOOwfAI6F7ow!VaX|`+GdF8S)FmXLf(t1T2NpV zOx4=c;E@!5G*4dDi(&1^U%oYXA4ke|AJ;L;W@>>caS>DrxHsdKq5I>4^CQXct52(F zK47z(?o_XDdVYUVaBk1UUqYs(;zIYRp`&cMgYD$>p3M?4dnEX$zC6l~W#1JeoaA+C zlc?u%fG+=)zuU09knz#f^i&l)J!#xTHEkg_k-el=39Gc# z!toMQ{G8t!PD~Ur3!4)ufiLJTX!w(h+`f+f5M5O+ zTH$zu=5ws?BCU&m?AarYybt_JVWTF3&p#h>OqwTFl{&FVT+s>im|$?*%(XTMAD)(U z$gRB3O3W}irqa1Ky~$qL*1S`aCrd1(YaGS z!tjn)_?EcVYtVxWMkGe!ZV>gpjL?;?BRb3%+Ah%8@zSGz8)ow4z#%X&5L6pM!YnRa z{N@U@)0y$5{T#zbl5Cu^Q|uqGyLF zScOpjs`l0_Sh*Jnlwt&PfQ4pAcPUtix zo<^23Bj@)Pkp6(e7HEHzXqV(@j=B3wGk(bhNrb@XBE?OOwek{`@&)^V_UnKq3O0=l zsL$zMNqvrm`kT?&HH)-tQo*=UMcZ1epmTQRG=7WBc)7VvL0%?2?BcVb+T zk~g;vPbdjcI1iL^%(l6|*7{ohKcOEFWfV!c?3pu+;mv>Q8LtL%_Sp}#QO7vZ(r$Ej zg%D;{5ZqT_x%c**RR?-4s}b}yArm|T_Par^Qv zM(YgMl?=+`b85Pw)u-Q<9H)0ivF#gs%g@=lLqJ~-a614N>DF^_bd=YjzC%+aROl2t zRDFMD$)_b&0Q&PA*p}eh{g<&dn1gCRG^Mn;s){sHf&T?jS^rxeMRFMyO%92<=R}@P zPEJ72d2^V3Ju*6~#Y5R4OeHL0*y01~1kxMxTxu;ej$E?MQGTU+faPK?^=7axPKjlGjS|dz{fXbdX834DFlQfOCfYzU^T~q;9N;_!1pXE1yC?bnGI3T{WX9In zxk~fXbZg)ZP?@EW&=7=zau28s{?|PMVGZO}kncU`pP-iK(lBjPqdEcz4iJXvmw|>N z=m8WTXsD@uV&HB`0mj~pw#`RR_MSaXZvoPx$p=AgOsHf$!(eFKDNk}=@%j64FW^NX zOaoGaU#Aea54i>)?g9C})5WYs`@6I$pg;~v)d4-s?)s$w7StT5A#MKK8bk?xCB2eg zIgLC8;JsDe?SeQ7l*HrS{k#Wku@9=yn66aU*HkLo)^L(J)J=gL zC=T-S^%z9N1cIxO1wuJ1OG}`faXI?)3&avyH{Ys9sDkpaaM4TXM22UEN z9=JDB*zq-JTG)z{WnC*1$P_UESOGCaQc{w`bUi3Mgeo6B%`z&=%>|a_OR3hu3{T6D zYflxubthHVjUQS(@8JLWs&u(g3=1|fAhiFAl7I{^HI;h%uD{jJBQ0+7NSw}qT%pi) zE0t-ro@}nCntfkbkP)bB;8h8h1_a+mhK7c^y4{x5n4*f0xw(5#L%bGMqL}bLq`>GQ zAhV+d6t{$zJr;UQOqrla0nFXrPoNetgASErj_-NWag4Ll+9yi+G6odofJ|IW?41XJ zc@oeq;~Vp9^&a*)sKAAqR_Q{? zddvk=cqMpjO2okm707p$i15;du?3O}hAu^kJAV*jTDn8({nocve38q4&KK%iya*KXEd{KBTl|gg((65xwQ`oJE>*y3I7b*hcP^(ITBD`T z=6P@B{1Ej?($}Eyu&`r<$gG-%gO}Uzgw1!354FN38Q9q@{~jgv5wxol zc+-Qqf-#w$XTWeC?4v2Q9-8x6o41#nZAXv(XIBm$yZ>)X|Np?Mf0iueoU*yaIC_Ck zvp33v2nA&=%toSx%05PUOKJ9s*8lkL^q?<-m~9R)P$F7zd!Xt9;QPShU@zsW_IKMU z<(l?H~+E2n}vFdXx*9+KvYR9^fl2nkNUjnPFVq{WF0 zE>MF~{o+uS)Ee#ZlBOYHNpecUdtDgGhp_fsFJYUsLJy<}IO_O%)K`AEkWk+alhUPO88f0qBf}Z z(ezo#OdAu_T#O94UK(Hn-c2MTgrt0fYL=5K*Gr56pPi>qwsSHLDh`kBrxK7=jq3_9 z-J#9s%%h4^GQ2*#gY_n7kw?vU{%uDrG!#}&v3buQ2er{-o>3{1hdPgZ{VJ5ZheJ$p zPhLOc!apF8oAF?;m^m|wwDNJpogQWUiMUw*uh>(64_=w>80SGZ`{c0ICC}?iGPy?e z@6^l90fQT{_4KU|n7AUL@L(LI2`pbz1LYL(XHsP!Lj61Mqm_C)GuPX3Dr8W|Q#7me zF%JI8ayp)R*wgZ78OlB~*Nts04keSNuVS7|xPLf84=c4QM^mI=G$g(iIr|7yD?JNB zwt068%ZDNN@Ayr#ddr$}qX^Zr1|*JxhjWcfWqc<*=;IHferFc^J!IYA%NhlfBbmrl z7nL51UYU~|L_oZw3DrM0N8LkRa+t{UM7WaeGcyY9{T!eV!?FfT`H;h>nbxlo5Y+hU zswAS_hcGBO)H8S+P}UFFomgCcPSKUjPFEulPkzOKW10Y^6O{S zAWKD&dB7;AAeA0ssso+ zrTd1S{FU}oR*($WVFKpA`>t(d-EaFA>uRQxxOz5^f>mqS)uG5`Ke2=!_6H%$!ae@S zPIo;jHjeBUyfy!D+s4$}6ZT*MCaU4@0tc4n69-qsO08WhW?vFd3S06eTdqQjh$sdtt$N;~UN_}Jck%Icy2Y95<=j`oa;b7p6oM^& zvxwVM4sXh1t(|kuc~EV{IGPqMU)B`9kP zDP*{o+r9(ASXOXCQ|6!9!IKN$^o8fjmz?OUFo88sj-u5qStFmNLU^HtizUQRqt&bH zGzHEMSK+;wF{*KyE>8Bzyi)hg>~6-3;X~zHpArf|2s>FLBj5T7)5V6#y%>xRcPj&n z=FGsTMZg?N;U4vyY-ndV(u;rIYthuJr+wj@Yc!iEvbv`GQTcde^zrRuu-_2+K6|3k_Ip8BiB4;B9hQo*z zZ7>&bz_@JMuZCS5Iph*zA^lkhk;V#x6zR~`fw>D3?2oa5LTP1oH$txBm`0(3I#Hm=m!j{wdjK78Vnp4 zSfwcxCS*~;pV$xCkuywILdJ=R8*nJjoTtU*<$iy~mm05Ggq&lOPEvJ2i(?C!A+`pW zOypD1xHefj@eGlo^i@eHRmEwj#&Fxh*i;h*(di-*#t{V?@4ETEw}pjyrSqA%1_hY( zPzg{rfoNqDD=*Sch?Ei`!aHoJl5nxKH$u#nxATgWf>4u1v5aAhVYXx}XkF{KJDmJ?inJ!BI?sUE|Q;|3-|t)T*{ zf;^~9w~DE)$*$v^dsg!Cdy<`9s#*NsQk0~+*py(F{oAzfH;@)6EXpD+_3-=AtXy-mi-=-$1g*J~slN5ACHHbGxMm#5uyCjezxVHbv*-|$ zZsR8*LCrEb4&fnjhxPv7l~qhXV(7wEH;_VCgo@ux+oD{uBl72=p-cM#6;m6vhE`9g z0%>BP>~Wu^B&>ASw?6=E|+}<0BNOq0^6}l)iX{OULpz1O^%Q4h&j9Q?oLU=gjR)xML24>01x{R1bfKHY(euOHI!t zk?>j-TBmJpP7fOpjKx>&ey5t>3rXzhR!$hCR57z@2ifeJYOm27uUKa{1*NWjB$UWB ztI#}VtgWli2g};Qgkc>_!6LVm$H<2-h6*jCVHjJ{rxhAOr7EfCyk`+1g=R5h-@D{cD`D;G z!flkisf+>rx88Ha{;s7jl38=}Inr+P*OZdd#*~)J#@;Jz`DTjbrsrHcUS>eV8mED-dSBP?xgtoBAq(?w2iG2=uA$J^G!-443Am~3p>pOBjs6{%VAVH8 zj*i=uj{d$U7r=@m9F)K>7e|O=lUAjeT|$R~);T<%@UsjFgx=!q`}jP0Y2WYZGm21e zs;O-ZIN5HoERm9w+^9G8#qvvj@jcSF|G7gA?T_z^yBZI?ykB}34H59Era>cy3b z;&#@&G#rk-Q=+5aFTSuZ)!9q+6=~r=lO47f`AlnD0^F-QHaGi0?yq0*3Q(a+EH6qMUN7__0B$e)bH{@`p3_p&CJJ_uYp`p zBF3leMF~Cq_MKbEPd$6j#r(XyU~4CqSZqG*_1oS6yLvwluPhEW7+v9GdNUj~T=7Hd z%`T=hjq!t`3X`I9b=1 zWwpB2X?_BLlXej`Y1{Mf8au0zm~Qtihq*o2NlX^pcs3h$YlL5|V>yF1tY>zCB4yRg zN7SVefNGA-wOY!b?^vVj37GMuqJGt-( zGcOsgvEQl=_{DQ(^6GH@q+czMF&5W{1LP+)H^s+(LRkX%DWqb1TL zr4Y>8idwYyywcxtDA1PSc@>hs{^`@RgOS$rO`jsYtA+54jSt#Q24z|?ZrrI6EhU~2 zB9k$}c`b_7$Lv;*?=c73ToZ7a=Dvl|ArwrJ$~+VwzEzJDgUlp7KuElN%&s<8#bT^R zzECm=GhOdp;AVKSl>O~|zhvk7IQvF%+}|2!?M`q%0t`hskO0B*1Yt@TX1+YGHcnxA zseifuIOI{lvOc2~T0>?uewb25^Akd7BjM!+p2@u*UBg|3@!8|Y!<556p5=eN3~0rC z@w@&9ZrTZ1YJ9w9Uzo1lR9)?>%dG>G1r4*|>BAV}a`20adslE24n}j^NZ$?mT%Ry zjeEb6-w1Z-HeUC%uROa~T`hZK!XB>m-Xx;I~9ph(N>=z!$8reCL zSoyuzyAXW0Yfh;&qNjkPn@v`M-8ne^Vah|P2s{Dx!e!hGxZ9)|G-P*KK9@OOU@&m; zQjkRl6-S)j2toD)?6aSKVhxGwj0j2i_u>4>8S6LQ-fZ>IFRVRsyszdnHpY*p?mCc& z{wbT?|8ssV%as*@MlERZ%6BfME-(I?&}?`CgPouMCSHgO3~)G~xfhP)2;Go)P;}aI zaF&d|N!r&C2z>5EWr~abz7g|Nt2804mhZKzOqzR(6F(ik;%pl=5`^Yz(#P(12Y(;` zuB-cI=(n@lzS0*JrDIvdt~Mz2i6VY<{TRsT^Wzqr*3M2L0W~Hx{#MV+b+kY9-Bcd8 zUd!m*EZrqt6y%B^9O7U>+!aIShcVxBDkw-`Al_x($Rx!VtY35HFMuMRssAf$dfJKX zY*-VtBta%*b;)zgcCtD=&%UP^9kO}eFA#qa9caT|FGikyGe61qr3V&|;x*^0M^oR6 zsh2Hm9s0vtvBkhhZ*>saugo1!%iNKzTC`fxpO)U#B-yp1;=0$%G4)byXQ` zbDX-VkP(iME8s60q-`ZCej&g$bp35MzqNEWVL56)MAafMw;1FC*)oP*&bSUO+A=WS z9mcV87c(E9&(AqeB$tJ12>hblT-PGJG zZel14tNx)1rHN8pDzskzvr%_PQ+bM7tX&!go1UF~>vcQKDF)Ye$iBUfB9uBe2kSvaYVsf^Ec~t7F= zx=u0?;c^vZk=CF!XpC-B>{&JVn!+Hh7(*3oKQ%L(W5~_OsH5|n_}cNNJuN+}f2I2U z^KQmiHB~jKJxzm{>peFSH0*cOTm8a6i;6DwR4hc`L1Y z7T47yJPTozPtt;ze=HtRVtFzky_KNDD%oSm&bqSV>GY_T-j8P`PmxwuBH{FwWGd<2 z?04Se4JD-l%cf@vSr2hu1kTeZ+it02gs*zcO#^R?U2QLnZz_LnOVoD2A(+-Z93(~m zR=PdGPp0`J9u_!ysr%Hu*O7o_ahWKB=cDwNd(xOK?KcHs4)htu@p={GCQEJ>R6Mc$ z`!jH_*W^tO&UGr#pPQR<)Qaid3#b{k8X_?yoJ65jc+Z&i_5m~O&xYv&r-(p{5 z250q*crR-CBry&QTV%zxpXL;*n~Aw+h1jBZw)_40^B?b!9o;N0VyTobvOmYP1nZao zvWIi!CrB7w>A#-snzaisT}DAWmhU=o10_>P zdX~{G#O9gGoDW|XoFJt)I1D8@+!kT}CN7->9hZOM2`9eUf6kd2-=-mWC@&?+B5RK4 z@~i!ovmHD`S(!yWLm6+e(RXE;a=Eii-Ln!XojjlKL!ahVIn2#Ya}z8OAnbg9?s$Sf z*4+R^^Kivw{j^>@NtA5p-Q0=l6eS|8s;k!pM(B|u^XQ|8)GE#Xkun>crH>UINuJ6+ zkUlEuHby)~DLM8!_w4l1qS-cFudFsnr_T1sLkwb5H(3HCJGQnn0TtS1XtTZN!U~;m zO%?|0uaW@H)=cehj_Xt-n|;{wWC4jq%Idw@r4ju|a?1=VE*hDVKlb?y0#U9qq~0Gf%|=j$ zD0FZDD;XY|dP!44(<}NcW&LCmCB@mK4);VP7?HYqI$xEod<8MHGSlinO8okD= z2smYQn4awx>wgmITlruwDThZh+#U~oG$Qy&i0nQhI$u$75lr+*RB>g8d&v>PhCHTS z>codjuNmng$E{8hsFCYcLSMhXA!aLyGU@$hTG&?VS^IoV?YwI`=gA@FcH7CLho*Y? zEP`sTOvmnD6~sHx$nw<3)@m(BSt@iBX_u6PS+ChHCCMSRn&jk{#a?Cf>h&`_2A)Y;Ib5@QQv zB>Qk`>4w0Rb42$}bwsmv)7aaiTheB>7ffWayaR98G5%RYmHT^Uqc}+UVN}1FIpK@_ z4Q4Zhvht#;&PHq5!&C?d+P=%WZlfU2Wp51(j#O1&E@DSxv6dqfs?a2Uf8cOUvU?Wv zZ(ysHMl6+0&H3PO{gPjQJGXbc+Kf5rV$Ri~2(MKr=j1~@q68R4FQd;QpRt4^dmuYU z=POHJOwN*d)s)&_oGq=IW?}CeuKR4xwj^fG%wVLiglYN|S+3uiq=mKBa}^BKBl7oD zkM}ACxZ$Q+++zusu?GUIWEoBVZF-MMGVsE!BJTDOij@^gt?kf>y_x1NFL$ue9MTem zRo>xX&tJ|UeG&Nc#IQnWSD*f3EL&XG2oFc`Wp08DnOWBSFu4&Xz81Uf+4KTcW;G$H zDfp>-iD>Yy|5Mi|1^GVJ-dovm53)^1*hfq!V1-7s@WG>#lJAnRhoy?*tYz z>i3*X1%$f4;!0fMY&QW5%Y;D3^46%iB3g-*ioeh;+0c9`JQ&V&szw*mS z<$cB@8bp*F1#5cW%+ELNY}Xp70V*ue`Z1PmKzCeN6@`m`kehu$XU-i-h*BtLRtw+D z&Ql|B{#i||nX#)87~@w~%{ABQ+^JlzN`_p(Dt7Mvh~(+<@3hm1@aTG&=tFC}vaFQ) z)*Nb`mirdc-kyb>yppY(o0=4#)SsD3FRyT5U>gZFW{Iy_?6h~G?;xbL4B2C{lKuF* zdealV+|iS>ALITnZ1Le)dl3~F2{tEH+7D&li242dSiO37_pH>8TSP)1LQe}u^t^wb zQqmDo6;L4~B0X6@y6KTtW?7^UbTLN`)fOpXG875j_ns}vHLu)fANkg1Adi+C&e528 zeB|?Gj@8s$*P&^oOuMnb<)^Ea=H8x{8xJ)m9;naMhlc z8*lmt{`Jv6GcG^W*m@kRjKbZghO6Ebe5aD`MPY4o9OF#BGYI)kl@UDy~ z7*${cWmqTnsoj`uX}z4_lP*tsIP{K>VLu+@Cu|wh@(hzLb+D(jzj=5%G8Zr9Gcj^M zGFjL2xN!RRnb|u{6%;Q%yxl^TEWX{HY`wc6b^XoNS@@ooO+LSA3N9&p!Fw=g#O^8? zbFssTLyDt2j49lsa5*1h$ ziSI;)BrxEo3mp4}2SEiPsSIWcK`rkKaR<9ysLk?i>t-3GDHV$>>K~URn762ZV=$Y3 zTifp=KDohbN&cJ9VLGLo%FnWLq|iviMO_otU&$|MNSgGK`5!=kFS}ny5yv%ACyyt1=s;&{g|Uk|KAN>oc{hf7{IjR<8O4AC+w> zuup6s8u?Mdxk5>(n9|$xDKy=ktFT{)#jLWJ#ukp>ol8w@AQ$i#XDqAh>)vb=TNWx7 zq0t1NLJ+RvYe-3m19nxD-OutZ?11S(RJh#jsrBCm1;JmQ8gY{)9KQ=;E#P3Z){rJ< zl}>ZDYd)rxHWXw3IzMIb?_dE(@yOyBQt6Vl zs~5y$Av6_g5E{!gR>Nt|e7R??NYyl4`VxK9#E8T6QZ370Ul#5ubG^xR6K7ovTW0qW z1*IkTrfFlO7c}$PJ>MtoCaNTPPsB(xB*K4yDQ0bHH5dL}u31Izmf(YT1rF%^4sjXl zq38&FE`}tco^TFyx_wYPg-5KkI+`ThFVc23s1SpDTSw)Ky#Zm}s(||RZiH`;#Eg+d zB4KFzC-dH&IwRwEG}w#~5+I42+ey!$#f<$t(R^)=LWx<0wZ(+TK`|SH0*cedM;~fb zJ{q|qVl8+S`@k|xaW8$AjY%FfCk!U`Y0=JOHVn^Kf>K*0+O%kuGtw~#ErKb`W_h6x z?^Ux-e8udr?ha$TsgzlG*+j(-K(ouCWQOaNO^jvVvU#PbDmu$NHYaC}@U-7}o;j$^ zn2E%Ti)du^jvvhjDxSV`xD2ORr)tk52mK6Z7D~dqWBF1mls=^~S52 znzrA)aU^~6Oks8;H{(|Rm$N)@)8)w~+vZ=#xVL|A=z`6uWd0{WFlOuvH3V)=Ae)t6 zMn9<=YM7nf$0PbB11a1c_qA2tH+^|1UNAr!yd`Xt3VC`Xw7!d7q*EzV;7uv z_2&=3q}QKs+KtKk!49PKGJyICbCkr44z za2=^2K^w(E6dW$c%-o4VAPP+OjDPN*6>F8ve)E*^sF!i6v`u3tZO9UZh{ag?y1UOf zXUH-8UQGfa@QM~pHS2;d>=Cw9#%ZH0pk-`athkJEG)Q{H)bSg!B1)KOq_RJ5F8Xea zLZ`})yiZ=6)0lK5B3`Y~ynWkw9Tn$v@gpw-3H_4q)y%pVkz;X^`+!MVpBFiWjkR*( zg)9}agFeKwo@ivkvKdrfhMF($ckWXto8CUp-7euATBUMC1Op{svm(tk(oL*Rbz`mg zuqp7;)YY}i7pmGt{V=%%lu3MA*2M-#JAv$(pD-R`wWHjz%eqkYo^?{HX?kVD==$zR zzaA)0%BfJ;d1rOvxxvkqQPY=PY(nU6a$a>;t^yN?=9lc=I6P+MffvarXLT9-f6b!d z8ud`M4kq}tiO~pORF=%}J)Azp`h^$;{V4KPm{}4SPUy!c7Wb$9tgFykfhE8)Vo7EF z_m=PU?nl`uWq$N|tbyZUdYMt(RAMK=*(RS%lena$wH~GSv1_T;V9fRRPofe;T^C)x zO09v<)k9-U$}+%^;Q|Zi;Pmy%j1R-AXismG$D~pGk+D3-haG+KokTA5C9kZ^e@4+b zMAyghIx7aj)H70;h+@Vty;eFeVTsy5@{CSIA9bQrND1!Lc^uosuycH|*AbNMybQR> z88euf>}4Afl|G&CT?uuQu!m5U9PU;HO(Ap^04wq)aiT%D9F}pS&_xrXW^Ztn1QZnd@j4OjR~z9|5khb zY-RaMDys^rP!29*fgZh)75}kMjYeWp5O_@rmVgW^xI)d!o=VZ5q%hbg{sclQFbHve zjaRUDEZFGzuQuNStgF_(V?NcKh3-B+*GdPjg*fEUbPvxeY)(+J#i2oSW#L~Fb;fV=0^Cs7*At%J^5+o-_wNun5Jct;kjn9|vZTuP@8)al zGS0j~*SpyX+I2n%nV((^I$L37Oe1B)Q`%>oQxG&`^2fFMP)+U3e3$YBC%N;=5OSaP zw5(ET8M%)C*|X_(Yt_q*2T^6J0Wh+dZ#nbZPfM{V6i;8YVjj@JIDJ=U>&UrFX${?Xj_4jaThf;$<>~RrQwtjk3!kKO>QYSJsR}l54~0P@6-=7`@o++Ue-%W+@Hw5{CPa zDE%8_K8m!6Q=&dkQcdAH)FX>}xiA#CG3b2)fyZv>X&V4E7sAZu;B%EEG zbwN69!Xhq?V_7fXxN}0j?1?2RF8Uc4#F_Yp%NYl6r>eC)cW+fRY^gEPMV#ScK96|z zrtfA|M$UG0NWbs|b!)--%MPqD3bk+Sbgp zA3hj62(UaeTNMNAvvuSf5LJXig1NCSE~CN_cz8sFUhUHFjYorLgU7QoDBTl zVwucVN#mtuSh?6(xABwfMf*RYkX)*~3@RVs;rC`e#Z%k)yD9F&rJ3Lvw9@OIPsf%z zd7r4g3qvm<7?>HV_y+H@h)!RiiA)H z(aGXxBli*KoNHHFEa|SRUW4D0vSv=s`?se0`BNVf_RY(pq~Clu*6v0PFJ-|MGMo{S z>aD-4?hgO)U~74I&aD3drx=-KlL$K!!3M-uU%I85y&VJQ;Rn%%=G_!fU^@g58a!Z?Y z{=h&+RKygXWgWKY^0U~T@zBHX{b^^uu_G}f?X+=5=1XMLYEPQdGU>!|2VFK)kns;8 zS-d&f8P|GVzSC`<_7J$jecNAm=*eGT^2(Jihdz41P_Oq%^%OE(3JG0ID^wW_<(KXR z1t|>suc-?Ps`VY-G2PRWegmO@hPxZx66!9iufwZQ2sb_li^p>=sj<8OZF9v z7ujcHl(I|k({__}{ovXe_q(@;HfpELJ#^n`QO(LL>|?TN}_r>{}n zV#4;e1@-=%(8~?2jS3I=;La5s}CYA-`ZzW;)sYRpfRufEq4#|uKfAV%= zc_Ml{H6#_0ni@e(#hGt@JK48(sxDI-WBr@EMX{_Yu2Wy8gzi2J?azA^hRei_p}79g!j88aq&_>-QVHZq27wK^|!h&0=p4EZQy zavrncu~o7fcxL85gGE`pY;I?_#V>c(GZR@l<#(|q9}4Xw79QZh3=HTIXQR|KXYSrK44c z>-uwcQe`}@2!79SZ#l8pO%I7TuUgN_y-HrtYY}_WH*s{s6}pPb=b9zH2&WE$9jqEp zM5mv}B)%(`JPS;MmUzay;a}e;$;tHGz`R4PP*kJE0o1q)HU`FMm+GBOS zG1>(aoiKdnd=jGy(fYuf+2D)5BOg~AQ($xo%TfjNl{`?eKK3*CmG^z+XGAiQMSO$TFe5=66mHb6s^j~s@pTR1AASPgd=8%bLIR`{wOeAb zSg@D^Xr_Oa5k8zEqOF2f32?#K-XlK8nNOpW^6lUIJ#cHKIFoy8x2BuD-EI6X|11{t z49WepLhc%6J_&-d$V!i7f7P^p!@ZxbP7rS{1xN^=n!P|rMl_U)A4Lg zRZpZbr%gr%?s@fsC3PQ`cDrweh`y8YmQs zI}~>*?h@RscySF@++ADT-62r4xEGfer$F%Fv;<1=;tqFz|G8i8hr5}9Oqg9VXU}<$ z?0KK3ZD%Ugi-|dcaL&p)s&2*sG%O;3lK7G8mX(@s1OR`u86Ep{hkqa7p8~SgW96g< zfqJSE@;2~h)V|`EIII0HKUD9A^FiC*UAfZssM98U?SXCSeo4aE(EF82>R`X)mgFr} zpyvydhww4$m49d2pW5iBV2ov+zGIv5qzj@6f@XQn-T!=Nm4m;~H zxK{Yzt99$V&gyf8dPFOy9Qunx5B*CN&63A#O6-j22zO?`hFbD|sBSwsp_hav|@-o-Uc1x3qZBUQYI^Dc}%|ZnedXti$YlEMk8{p&E zSmmfl8-E-_!)wnOe|zUoGotgkT3q@E1C+6z^$zKb$6xz8wo8uKYH|-AWk0R9C-LND zA4K;yS)RTLmw8%5u`|meA%ZscO~Xxl=*3TgW*c%cb;4q$;YZ?4!?;{E%Mj z7+I6wLUUL3B0@_Z+gw?{2TUY;`G>~8Q_k97wu?3%e}zLs&fMAYl}G3kJlBW_(mO2% z$fhcjlW~B#UCG%)I^XF_XLhvNU65q1rVS(i2(<0#^qJ*?ztP@YUl%2)RyA^Cy0wZ1Lm$L*$m zsCLgz|4Zn{Z;N-C%9Wq@Ki0t3K3P{}KvI(S1n+w}0^MK(Gob5j<78pHF8MnRh6qxg zKV2S1xZXYZ56{?teE>DQl5UOE1n(Sd}-*@Av7*pG0I-~4qnE{ zS`NK@2tRWZ&QmjL%1MopPmj&m#YxFvaHgXRC-B!+Qid!%pGE$|gFNw!DY^i$Z*_I~ zQS$lX#ovT8*z00-d;8Hfj^{4n7qrun@e`H!%4`2t`>0i?(OY{7sx7%&#P2|wmYn?djntSM}cAt zgH`QTHJOJbl|ycpw@0dni(!b)Z4cEcdO8TNour+8OS2~m=N|O5nYCf;Q^>S;f7iF- zM+qN#%bW(q*Rd+-V9i-^Xbm`?p4BRc9m>^hkj30`P=@pKihw z*wIAdhtppx@tbLrVy_CR+V*33UVg@~W6+vtT$=7B*`yBd8}9f(_U}bck-^UclaEd_)Jja?SUF+be}{_yYN7Ew0BIJeP#fL8Fc=Je<_B0P05KP!Jb8YE zzKErd0}YlTr7Yvr%q}B{i2%7oe@6hdu-oV6w znzJ|P%GT4)*VodLDK}%3{0_C1 z8B!`P1B%FW7q0won{uz%7+_!i_s+B1Edu;kqGdGuZ#3eH>UDp5wnwNAjnA?Ddf$yY zRQ#T6f8|n$G~EOrFa(u4v@ITZttRbXFcQQ%G40e86ci|KoCIYN`eU2nCJgZ9d08I1tv-WlW*-9AT{rMky-&AGXU8G5>NjlP6A+q zSD(VRPDepK7=64zxV=Y0l$=$eHV@UV`1_I@8|Llwk( z8-*7yPd}RiZtc@F0J&0~Ymq*V>(7|BSyYF%Tw3K;7EH5r1;i$xT|U z|B5;@ikQUR-*vTgKxT-;cPxV187}R+TCVxjES`%2JM8Q0>i(xS1@ZBD0$h*C$Vh-h z0vNd3@nz6xA<1dE)+9aTGAgVQj@;Fp#6owDXa6>}FIc2&2P7S?CjCRkGn8PX zh>a+*yr|MiAZ2cBc8k6>04bAXCchcvy&KdV{TZN{hNk$92`=;tFR-9vbe#LKf)Qz* zpVSHp192#?*3a*IJHgs0ZAmL6asNd=?nulU@L>&d$Kb)O#Y~VJZZlAEI_m*9>~j!# zk#XtlU!U%eo}yOJw8jZ{K82gJpXO|sVGoIEsZoFCxOR>j49N~FAUF0M!SEFx`UFn zJmrV$d9i&?1q0LX&v<)fy}R+_qs+BRiA9LC=?uv%ZxihZa^2WnNMGOFdV)|TSFSZY zJDf);FP#VZkwR?y?pG20vH;8&Kq)`G0$|Nff?Hh!ZI-0b(b2me{=UBL^ZNx)+b->F zD-*S24_&wD43(NBT z;D(Zlwq3Cm;n)k2yy+jAsI2+pWMc;*kWG?ea**ajo}*mPo~WGOmqrq@4^qVMBo3nx zV<)Bbh60~EA3R?utkDn~z4@X0XjwSD4n7mZuR@XKXG-^(S3X1sWvKoYiLL%#wU&?n zlW(wWVo{nfqtxLGseO5DOKLS&PiM^7>UTvOHzW?jxT{#|zc=&1emP%LMf)kFUrM72 zN3q5nTwMR5KW%Jm0Ds~#V|}iFa4@h5|349Bo!;S!DxjDKAY%aUvqrz+wKM=WaBN$J zhFrI>^We&-o<0QH&7oqY`V!S3%>H=Z{Bqcs(j?!%OFR)NV_5CY#s0Cbu5HP>ciGX^ zg@wm2sn)=8DhVlNNV$9Q#2ciM!!M7yJH*uI>$*R$5wgYibn0r>f4;dpYt%H$f~1gw zM65_a$(&UyUqnM3OEHae%Gx+!!#&P6&oO>?i{jjfhhgR1HHuDGLTK0s?zIb#88hGx z82M$-lOAKEeZ+#Yk@!7-n%&e^0Ecr7Ks^ zD%9>PDCBFR7>z@sZtMtWNKD@;dcK2iJzu9AwFTUrN8WYrYgd`D6VdjTcDDrv1p(Yc zpgcCaybpzmeZ0Fj01ZiB-}CydpX3}rfXh{>;_83&0Fb}{w{WVuw|V+2kV(x>jI&*6 zt>q!(pjZQecSOY#pK)7H%30LO*_c+3l|yOG?DwFz(73N)xw4NNd(FRpjZM z_P;>jcL3it{4}8aE0Fph^@(3x8VzijzBzp@WFC6e|ME5MpTpejsD&%*_gn}6!<6cmZ<|Wn@hj;B|;L{@i2RQ`7 zR3?vQEECj;m9-i*lp_N)=8I?7pV8JlwCBG<{94 z-lY)AdN_?crCSFEmdnz=V_&c%?(xVBk=ryt7SwVpk(nuQ$Wo!znLG4tU#qLr6GGqM z{&%y*=*Xy^rv4u=RpSL7dJo0GsO;*MXo5)YW;H%OQ`(A+Nw-4asu*3l#KOhAB$DPKJxU~of=rUlZx>QFW97=wTfcHd`Sy--nUM@&3@-1<%8 z`AOfX=4bY_v`r>$;06KGvRS3~@j+Yv-Ra8(G~{U%V1Ggg8qdE|F{IM3MZTT{D>;3& z@1aSR{5v?81oy884~r@3%soFEGZou9IXI;;FbM?y$&N{wdE)47r*E7inafCw2c1Vl zF3zOKJ9bq5miIMJ{)^#|l2b0YPS2UK+{N7ww&aX0TViOOsXq+7cW=*=12@H%^&0qe z&1o#_sN_Jd7vzf#*@n9ePGF-`Kd61sZ9D{`2KjMkNK}sOGbW}N_AR_7IS3J>g1^f+ z;^WaO5Zo0xF&eF@uf&r#lC}+W$ zm=NZxVPqb~U{Bt=GT|fuPzhie##itjK&1!_%4rPBKrCoq+i(#|f|FRVr&@S{kC>_d ztze+USRFUIQA*2yAjCMiO%Rg!O{{v<1?E7oWnxk=ZM=?(7z($P@T2)l6NZ+0#Sc}} zF!O(z^M&>G2Oe(Lf&Tkqp0=FX=$Q_9GRQ8zU2AJ~j)3{x*Y&Mbxo%!jJ_JIF5sb4$ zHMN3=_m+O)V6;UZ!e&)MV22c{}o zIAnDAS8;fD{D;BMJXMqr)fw9%1q@Ze%PnRuKLdpNI;Hgk@tI3jble~c=5$$$cNmlqUPG<8uGhFwUpnuJQZJs$|n9Gz_+da{=q z54|gKZ8&QmJ2n(|M6fgR9FojC+@^6{w|d+GzDZGT5yT~_84e0TlpD!OOg!f5yZv)h z6as9E*;9wA3ymr&l9z+OdlJ@uTBheXoXGRVh?FVU&dtdYPI3(7nmoP=Q1+PlY-zh> zBo7NG^$Y5M)c3HAE58b#wef>O=^IjBoHr`gA-Gh1Juy!!v1#o*#>o;!i4^I_G z97wo&yzeiAJi$FibpxyH@7pBxC&L2lg>u6(*fE?L?0;FXYo{|N5SLTnO6eV;JC83- zO&{Ek=(WR+Mb~Ze4cKtgI}kk=G*t5U{p=47T6cT{OrGT$C=B}V27dP>$Y{~^??p;NG_p$b)tZY=y zx{8Opo+O+mJ&)>jW=Ry#i-O6!B>G{MjZL4NG(za{0?}(WTNsX?15>R~)QKP~mSPLs z9@@S{_1P_R`OnU>BK5O$oso82|I_uu%LA0!{NXvE+{|%7u~w;a-qhT@-{<&GA~}HI z9hH1s$@Jwk&!M2c5Z9M1LG@T>l4$t}*|UjDLvUzYbtilc2)mDcfQ=B|_V)I`NT)bT z_E6@FCTF%rp{RhQq@;iVFwg{;Gyj1(tp&_?M2uTN@|GQ+LomBuS+n$S(mv;4b|4@K z9n#XG>`I9=zLBQbV*b+3WrE;#Gd*`day_C~vzGX>o33F~3@=mJodDpK7frJcy?T9K zcb}<=zLTYiHDhI>Pz*)$IHmf$2+1f|)I~ONBd~>m3Qtx?t_z13%Xi;fO|Bp5dIqp3 z5!fDFy)Uo`tPF%N`2st`z(KWIu8%t#?SMtBcQ#d&y|xiAzof_@J%`Z3N^Ftqyw(q$Po0jP+F?t+#3Zil1<$_J zCjO`AYZ&lS@2wjeq-E3Z>TG(HD2#y+*hhX~;0?5*++2~QCv|`b2C$=G4d#Gc9{LB~ zn>s#u^Z+dE0$$4!ZZ&}?)pumlM%*Ez<%}`z z?`U!vaF*lgqFiS|#gi@L=j|GD^APXjr8;u+pzAiDR^_=rmpfJSmBi{$plhA`MloN)%_UrlYy4nneT0kMUn7Ss7@1nDQL}Xlm}+Wk*+ZYM7G=JO2?>3uN%ra% zFZc88wlR9rt9*L8%J07$-6{w^tm96oU2dtgRd_e-w3FHH7X@ zxUK)$HPrKYeZ~A~8;4|iveU>>5n~L!`33v$C^{B8_@@85i_f%m%i~GuK|aRWmD#yH z-KR`;Mv77&1ZFMFt$(R8Hx&`zGFe$RGkO@i*%&%h!)LiZ6n7gZ7kNpS*BS{-y z*K};D-am2Jjpiy<=ynQA3VC;8HpU=JYgXy12yDdroQ(PsnV2In4Ujpe4_ya*^Q`f< zTUn<^Bu^1t@T`}*k4^eFve&J{g)oE-`{^W zB?PNC@4p*{=^NH4^cvOcl1_YDs%?#euA=uMnS=J=dpT@nOELC0R*s~8muR0dUk6Gz zEjbD1>!eeMxZUBr{3>aak$V!h_wByP)|a@u^(}flX{mv^J`KLy9rxc|NEQ~_Pft&# z7}VV#!7-oV1BXXP;+4NRW?12`oF%5!9Y7 z)LjTnl?2{XG*SnI^lDWtRhOrkb3UvtB2Q0Wq0P1Q9{Y7?dKutSI?Rb;?Em1#9Qk7m%Ac(aEophtZ<}X^K4&nahK}hgp~ciI)UaW?(J|gw;R8LPc(k%EJ|ME=My zmd71QcGK0;oTr4jz)- z7aso@?9BQBe!19kd9>v)%k^SDaIyMjnSzM<3Bfs1PZV_c*V{T!wc%Zj4CU==jawC1 zH6XgT&o-b~iVl2wb;5O}-@kI_#VoHicuq@>v>I*o*BPG=l$1_+EeUag8G(`r}(rBntdX;2t43!dsx|i;-(PoAZ?C5Uzk>m62iA7-gGz%Osf&+*+w6Q zOaK8u(C$GCVXKCQD;>c%&qtR#^`dXluXKOLXejxowR>N&s z!escP9P2Sw5oXD>wb*5J4K0!s7YcNB_qP14=5RDIabLG~6J(y8poi^vfHHn|(oJI_ zW7U-SlKTAKnaC=rseZ%<3lZyevVj#1$i3TjbwZQtm=#6&d(~2thn|e0hy?0Gyj+AI zM_)_o<}%M&Qe=(WUpu|g_DMTvV&l??yHkR{SeG}&=*<(b{sri(Zves@A0J<(dLe+O z9|rSa%GRNN_R2N0RUeVfSS07iv14{ZRk5_;KS1Is7Be|~cC))f?P*>5z|_HP_)__) zlm?+nf2D#|ux3^0jaujnbWjSHxY|1}w@}jeS&WCPu6C=xdwt)hC_^QX$Xpoc@(fJm zvHfUjK>twp$5r#*mPr$nCj9nn#g?JgrKYClAc_au1Y7Mr&rRrhVy=*u5V#ICx737v zwXwEGl|;+91IzUNm86m(K#IywbOXl>Am~|$Dxr+feGkvTN6c${b!3nL`bVfVh>k7( z!6(Q+#)mEXrh?J7C8cdii%?!mw@SBq@nB(Lq5HHCaCT(^p%OTH%_nWM`DdmVWX6Oh8+gfpG!+gmAFa14Qq=ErMI z^dIn(5(I5+E0$nFr<=X)&3&7v*JiL%P-hT(_frJaPEMq8XFHwChW4Kr*Sk!F)fM}? zS|^_eg^XyYKSQy5)_4p?pEGPJ&Jg5(?d5*nSbmGH88B0Q#u7@N!2)-RYF3mUaW&$M zVL|)M5;t8S($d(-&Bq5gn*lE#K=A_%%|EyqN_tD`3Sy(@yW0x#NGJ0xxn;ZlJbcoQ zi>wp#R(d9Onhzawwm#1GG1 zU#oY|pZJJ2DVt}1SYlqh94JF#WB?~$Ph%i7`t<=|&F;eIC3Rmbt4b2%MpWLh(NDII z@4|?M7-i>3az?LH9%BkCUw?Rq8DEf4^p=IMWzYYADrW%h7*E0#a{D`a4_Z_NfdJ6* zZd0cvQct>t{A51b^hoZQUw%pG2ar9-I)a}}!P6n`345b`-UM#=7;^L>vD|tHit+09 z{Z6g32t&%z_FVWPNyeO+#3b2*g5N|pzA4Yau1v8LlXpo`{J{j$Z67)jk)`V zK5{MU0v6^8qtjI3QpQ0t2+%|wMh0jIkK1mV9(k*rO>bUFs-9B2N)Rhm{Q1{7m^s%N z$q;@zulQN!mmt|?nV+KDPkm7F2z_0XOY4c0Ep=uL2u^EOMV2<^oCwea`(`+JNs zC5%zRtUR=;yT;NbayFn`NM2xCw7F1NOc~iqxrbPOvb;5*6*1xLt_Khu+>(;eNtLSF zRkl-b!2O6h3_b1((Gd2y{%2)pFrq@0_60ft#N4l5QH2ICRz$0SGz=v|c1^h1HUHF9 zCu#yIm2otM*iDdir%hfpI4`_ZiP|@IB$VI8B8m-{|PmyQq z`Jud!yvw1o5C2@)EN@e!u^6!#h@*?u9Wf<5R407pSoOmw5}lYOzPB5x&!TbR=W z$n$4MM1!{WG3Kld`to<%=gUNmZsor`s<%n(1$>$Evci!WA5<=Ya+7_|&LOd(eQh6V zNid}xRn+9R!HMI)cfg7Tt2I1H$+5=z~Z$n zi*IU6-qAIuRa|#kN=Pc<;TqWF<&ET+wG-StIM&n{8ygR6i@YONR5<9{`$49pPJ(mH zxj8!3-5{2mKuvo-YOaf5X8d-q>9-X^Ad>Mi>>*MRMq7FH5`Vpr}V~)`Dx)-RFo@J1u-S$g=ktav z0Y1z740{YxDJl|gn$M)l3CeKm27NOc`+{$v1*{B{?PP16F0r1u)?(`p(Dk^j6m z!erxc23xRP?mG^YS4+V1gU6g@0IKP zJsKJjCXYJ4T*s-1APk_d$j8pLw)b`RHaGk1ZEhcT`)<99xKi+Usd$_DL(x|@DOyNc z@97Ma_gk231fd4zXHT+_FD!Rc5OXiW_BxaNKDRq)dh6~-7Ms+4WeG50>eN%_sD9It z_WnG{?dE8allRAB1m~OX24q_F@1G8{9%*zaO7^mb=1+2lyN*q5A_>@UjX89@cjz#L_Rd&{<6x`wU8}) z!d0%%h^A4+-%=Q%D;5IsworCfVnbjT8v+@)ay4<%ok^y zmDjy?|F-KB%1Iqjh|^*X59~N%Kl}cv^AA2A|SU)zo-dC~5JUaBC=S=Dj>U z1Ks@v)bWwh7~T_jhPt1{LnU7h@*7UqdohZ2Rg)nT1XI#iHr20c6?WMXG1x1A)e5zd6O-b@w@osEo$TJ$}Z6jQ{4Hu!8Kg=Tg&{cU}%ZI2o+G`=n-KOd(IT~ue8PyFl zZqaR?)H!q3U3C@KB`)3T1zNRupKfl~84HCz&!V38+*}8q_KSnW%{Yi6*e!U35!04O zDqIuYGp5PEcP>Ib0TUuyqpVp+9zxQ&m{JMM`yWAPm*bLm$2zfd@OI=m!rHJ5+ zkcw(KK?-ZZekIa(zZkwgmLh7zHS?Vo!FcJULpAuj4>c$_NeqjMpCbERTW+rX=vgz7 zX1#6@WhBbsz7%MoZQzG!L(9;fD@a}_yCTFSvAVnrM(5gT0NihV` z`Ln)Hq7X4tY`j|yB16N)kjZ?n9l$gBuGVKkNY$R}&v9Qh3WFL_Yr)x%$-wl@R-vos zg@?l4Yel4hSi`@}6I%3{AIr?%K_Q1-Q$&Y1tB`pZLapYOo73?IaYVt)CmTIs$OZ8h zjl4LXC9%7y{&Fk66Z1FDlV5++G^-Z3L_MqZ-c=|UFg3v)4%*|e$&a&3JhqYR3G`Gf zt9})U@QDk|vn!y$F1`r()CdfH&Y^^1@uw6;{25Dy@7y6OASCKGHWcp_XEl~Jt!5XDG;6+x7Rl`5c`qb*|;_U!@0wzaW#+SMeBmvR+QeOU9LaBlo)RNz?WTa*+ZB zpIjYJy`S6Z!e--b2%A5@|MH5vxkSmmn;8Zpc%NakdV*8XvD=!KVY{N2xu0uRfE3&I z4~^~!c>-gZi*V$i%|nEhxV>{dZsq!QUz`E^H|si^6PKEWw3^IqlefZ(NfgZS36ukK zvb<(~sS9llGp9cts)-CO?W(L2QSiX5#u==0)sx9+N-P6J-02>(R!+?J&6$`Z7+BBV zE;mll8HZ?u4s^N(I)jP3Td52a&DKqU{(e`N+If=?iBZ-lYOUXN9P%R#+rTW6zmwuU*nXP-z3;p#u6N-g{qVRrYgXc6t*Vq&Wj#Gr-9UWoP5P5I<;Rr@_a9|&i zL8B}J0b%Uu5vx{1HQ~EGcz8Vp?8Cep<$H+iWQO<`U8mL4FQLV%|N6eDBXif}Wt-7~ z=i-F-wkbqB3Zzt~Ef7>$zJiCTZz8GCk(7ae1Sr$org%)3!(S27+_8q&{5?BjFoGfSt1B4p*7L3{_tO7FVweG(kX5z#=i{s82B|YX_^G8_ihm; z905!sDO?#4?IPncY)BH0>0bv<@KjBd4VXKk9U#~vy^kS~()47`x0=rc8#Ya&QtbK> z(5iS@hY^|~Ek={SYWUD73b(S1AjWq4o(t0PuUX0ABvxsKy<}Vfw=Y^@92rqN-zPx7 zDV*bgjk=dMMZ&UJ(GBa{n$+jic>;J_Q;9kFkC=HOe2V{Oo9I5f@uCx%n>B#-5_f3y z25S>X6$=uqAL>=@)wlBT-X$e5d<+h!5Wyyh%Y=9IT~k&|XRV>r%J%B9rF=(t{f{)A z?1MN6Z(28AAlZ~@dR%yv{4W`XeAfadmnnO&nKwzoHf`>%Zaev2Pto*kC1)0=My73z z*71(0+MUdlyBsc_Rc+0NQIpRIhE7op_%Px4dwI_f!U> z$Y*4u?)c3Ql%esPN?y5cJ>2w*-Z;)NIK-&Qe=RBD{P5%;PWGu_9lfw1*^`2nI-XR& zyA8a!C|U+=EYUy1%|&!{=7}32Pp2>M(oU-Bak9{VKJw_X)GUke?-CS(2~Y8Rm1`r> z(&6z`@howljq9F6?}SISK!0kL9$Ylp7EMRVtAFVrL*PU`xEA=$;EO*k6t4B*n2sFC zSy3=}D|6t0>GY^b60uxuZiX@1dZQKT*G%XHO>x5BU=jXp)(ixyOqh zs0NCzC^2X>CBONR{RO;}(utV&YQ%w$JBh~n4S=TTu@h84Z`b$V8)2lMf;n?aT!v92 zcXgAgK&$|IhqR2?7_)jGabV$dXY9Yvs9({ik+Feea$d{xN}3t61J?r11!8ifWnJ5m zUiIu(=d2P<)~ht48vnk4zqDxv=|k@QTR)-Z|6Ra}R7#GRJuY6lX@w;l{nHXx%}Ms? z=-}iKE@MXXPxUJ8LQZIANg9|D>a%#f-X=7 zn|?Kzmc-EvbK8#YEVD{6b6?yDBV-x8T`T{V5!l#Sm+7Geh3scd7bGJN7?3*BKA9bS zTqDQE!OWs8^!e&pnflGap+t|92q`+pL%a$ot)4SYObyj>)%>J8mXxk}&#xR}gh;U1 z-7z7{Dk1GM&qR+>JvShG+OVmgV0yIm#u3ExckZ;HwW33kf*@p-{X!Y!&=5HO)Mea| zg`~(@V)Eg?d*#Z@OHfG)QJ77A!v&dB)2S4koU47PB=6EntZf=u6_W^w zZCoa;V?n>v9ezIJe-~o36tyfBC1blngGDHCxex>THdFhqJVvBwIv==hxA7?c~R+d)rPdd;(OM3T5->Cy1N zc8_O@qko`%F>NfjE~Q7A^jjCLr~crJi36Y%3K($7F;c(8%f>{Yso~;@mc5!z4+)u^ ztS`m;Oo$5Eqz=MI0DneP8p6ji`Ivv+11+K*8l&10_H7_A8-PKvb?%ny^O`@{{s`gL+1bh diff --git a/docs/dsa/algorithms/image-3.png b/docs/dsa/algorithms/image-3.png deleted file mode 100644 index 6156021b3c2b5f3bdbb2ccc5b323a29e1a6c4eae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75455 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 IuhKp{cCR#8g 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 z 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 diff --git a/docs/dsa/algorithms/image-5.png b/docs/dsa/algorithms/image-5.png deleted file mode 100644 index f5a193ae5b6b71b1e65556f5b3cd8b1528b6cf96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322152 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

    - -## Conclusion - -In this tutorial, we learned about arrays in data structures and algorithms. We learned how to declare an array, access an array, update an array, find the length of an array, iterate through an array, and find the maximum and minimum elements in an array. Arrays are an important data structure that is used in many algorithms and data structures. \ No newline at end of file diff --git a/docs/dsa/arrays/arrays-insertionsort.md b/docs/dsa/arrays/arrays-insertionsort.md deleted file mode 100644 index 02eeecee6..000000000 --- a/docs/dsa/arrays/arrays-insertionsort.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -id: arrays-insertionsort -title: Arrays - Insertion Sort -sidebar_label: Insertion Sort -sidebar_position: 4 -description: "Insertion Sort is a simple sorting algorithm that builds the final sorted array one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort." -tags: [dsa, arrays, sorting, insertion-sort, sorting-algorithms] ---- - -**Insertion Sort** is a simple sorting algorithm that builds the final sorted array one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. - -However, insertion sort provides several advantages: - -- **Simple implementation:** The code implementation of insertion sort is simple and easy to understand. -- **Efficient for small data sets:** Insertion sort is efficient for small data sets. -- **Adaptive:** It is adaptive, meaning it is efficient for data sets that are already substantially sorted. -- **Stable:** It is a stable sorting algorithm, meaning it preserves the relative order of equal elements. -- **In-place:** It requires only a constant amount of additional memory space. -- **Online:** It can sort a list as it receives it. -- **More efficient in practice:** It is more efficient in practice than other quadratic-time sorting algorithms like bubble sort and selection sort. -- **Simple to code:** It is simple to code and implement. - - - -
    - -The insertion sort algorithm takes value at a time from the unsorted part and places it in its correct position in the sorted part. The sorted part is built from left to right, and the unsorted part is on the right side of the array. The algorithm works by shifting the elements in the sorted part that are greater than the current element to the right, creating space for the current element to be inserted. - -:::info Key Points -- **Type:** Sorting Algorithm -- **Time Complexity:** - - **Best Case:** *O(n)* - - **Average Case:** *O(n2)* - - **Worst Case:** *O(n2)* -- **Space Complexity:** *O(1)* -- **Stable:** Yes -- **In-Place:** Yes -- **Online:** Yes -- **Adaptive:** Yes -- **Comparison Sort:** Yes -- **Suitable for:** Small data sets, partially sorted data sets -- **Efficient for:** Small data sets -- **Not efficient for:** Large data sets -- **Simple to code:** Yes -- **Efficient in practice:** Yes - -::: - -:::tip Real-World Analogy -Insertion sort can be compared to sorting a deck of cards. You start with an empty hand and pick one card at a time from the deck. You then insert the card into its correct position in your hand, shifting the other cards if necessary. This process is repeated until all the cards are sorted in your hand. - -## How Insertion Sort Works? - -Let's understand how the Insertion Sort algorithm works with an example: - -Consider an array `arr = [12, 11, 13, 5, 6]` that we want to sort in ascending order using the Insertion Sort algorithm. - -1. **Initial Array:** `[12, 11, 13, 5, 6]` -2. **Step 1:** Start from the second element (index 1) and compare it with the previous element. - - Compare `11` with `12`. Since `11` is smaller, swap them. - - **Array after Step 1:** `[11, 12, 13, 5, 6]` - - The array is partially sorted from index 0 to 1. - - The current array looks like this: `[11, 12, 13, 5, 6]` - - The sorted part is `[11, 12]`, and the unsorted part is `[13, 5, 6]`. - - The key element is `13`. - - The key element is compared with the elements in the sorted part. - - Since `13` is greater than `12`, no swap is needed. - - The array remains the same: `[11, 12, 13, 5, 6]` - - The array is partially sorted from index 0 to 2. - - The current array looks like this: `[11, 12, 13, 5, 6]` - - The sorted part is `[11, 12, 13]`, and the unsorted part is `[5, 6]`. - - The key element is `5`. - - The key element is compared with the elements in the sorted part. - - Since `5` is smaller than `13`, `12`, and `11`, it is moved to the left. - - **Array after Step 1:** `[5, 11, 12, 13, 6]` - - The array is partially sorted from index 0 to 3. - - The current array looks like this: `[5, 11, 12, 13, 6]` - - The sorted part is `[5, 11, 12, 13]`, and the unsorted part is `[6]`. - - The key element is `6`. - - The key element is compared with the elements in the sorted part. - - Since `6` is smaller than `13`, it is moved to the left. - - Since `6` is smaller than `12`, it is moved to the left. - - Since `6` is smaller than `11`, it is moved to the left. - - **Array after Step 1:** `[5, 6, 11, 12, 13]` - - The array is now sorted. - - The sorted array is `[5, 6, 11, 12, 13]`. - -3. **Final Sorted Array:** `[5, 6, 11, 12, 13]` -4. The array is now sorted in ascending order using the Insertion Sort algorithm. -5. The time complexity of the Insertion Sort algorithm is ***O(n2)*** in the worst-case scenario. -6. The space complexity of the Insertion Sort algorithm is ***O(1)***. -7. The Insertion Sort algorithm is efficient for small data sets and partially sorted data sets. - -## Visualization - -You can visualize the Insertion Sort algorithm using the following animation: - -
    - -
    - -You can select the Insertion Sort algorithm from the drop-down menu and visualize how it works on different arrays. - -::: - -## Algorithm - -The insertion sort algorithm works as follows: - -1. Start from the second element (index 1) and compare it with the previous elements. -2. If the current element is smaller than the previous element, swap them. -3. Repeat this process until the current element is greater than the previous element or until the first element is reached. -4. Move to the next element and repeat the process. -5. Continue this process until the entire array is sorted. -6. The array is now sorted. -7. The time complexity of the insertion sort algorithm is ***O(n2)*** in the worst-case scenario. -8. The space complexity of the insertion sort algorithm is ***O(1)***. - -## Pseudocode - -```plaintext -1. for i = 1 to n-1 -2. key = arr[i] -3. j = i - 1 -4. while j >= 0 and arr[j] > key -5. arr[j + 1] = arr[j] -6. j = j - 1 -7. arr[j + 1] = key -``` - -## Implementation - -Here's the implementation of the Insertion Sort algorithm in JavaScript: - -```javascript title="Insertion Sort" -function insertionSort(arr) { - const n = arr.length; - for (let i = 1; i < n; i++) { - let key = arr[i]; - let j = i - 1; - while (j >= 0 && arr[j] > key) { - arr[j + 1] = arr[j]; - j = j - 1; - } - arr[j + 1] = key; - } - return arr; -} - -const arr = [12, 11, 13, 5, 6]; -console.log(insertionSort(arr)); // Output: [5, 6, 11, 12, 13] -``` - -## Complexity Analysis - -The time complexity of the Insertion Sort algorithm is ***O(n2)*** in the worst-case scenario when the array is sorted in reverse order. The best-case time complexity is ***O(n)*** when the array is already sorted. - -The space complexity of the Insertion Sort algorithm is ***O(1)*** since it requires only a constant amount of additional memory space. - -## References - -- [Wikipedia - Insertion Sort](https://en.wikipedia.org/wiki/Insertion_sort) -- [GeeksforGeeks - Insertion Sort](https://www.geeksforgeeks.org/insertion-sort/) -- [Programiz - Insertion Sort](https://www.programiz.com/dsa/insertion-sort) -- [Khan Academy - Insertion Sort](https://www.khanacademy.org/computing/computer-science/algorithms/insertion-sort/a/insertion-sort) -- [TutorialsPoint - Insertion Sort](https://www.tutorialspoint.com/data_structures_algorithms/insertion_sort_algorithm.htm) -- [StudyTonight - Insertion Sort](https://www.studytonight.com/data-structures/insertion-sorting) -- [Insertion Sort Visualization](https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html) \ No newline at end of file diff --git a/docs/dsa/arrays/arrays-selectionsort.md b/docs/dsa/arrays/arrays-selectionsort.md deleted file mode 100644 index 706040c34..000000000 --- a/docs/dsa/arrays/arrays-selectionsort.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -id: arrays-selectionsort-in-dsa -title: Arrays - Selection Sort in DSA -sidebar_label: Selection Sort -sidebar_position: 3 -description: "Selection Sort is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray." -tags: [dsa, arrays, sorting, selection-sort, algorithm of selection-sort, pseudocode of selection-sort, complexity of selection-sort, example of selection-sort, live example of selection-sort, explanation of selection-sort, quiz of selection-sort, conclusion of selection-sort] ---- - -**Selection Sort** is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. - - - -## Algorithm - -1. The selection sort algorithm divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. -2. The algorithm repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. -3. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. -4. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. -5. The array is sorted. -6. Exit. -7. The time complexity of the selection sort is O(n^2). -8. The space complexity of the selection sort is O(1). - -## Pseudocode - -```plaintext title="Selection Sort" -procedure selectionSort( A : list of sortable items ) - n = length(A) - for i = 0 to n-1 inclusive do - min = i - for j = i+1 to n inclusive do - if A[j] < A[min] then - min = j - end if - end for - swap(A[i], A[min]) - end for -end procedure -``` - -## Diagram - - -## Complexity - -The time complexity of the selection sort is O(n^2). The space complexity of the selection sort is O(1). - -## Example - -```js title="Selection Sort" -function selectionSort(arr) { - let n = arr.length; - for (let i = 0; i < n - 1; i++) { - let min = i; - for (let j = i + 1; j < n; j++) { - if (arr[j] < arr[min]) { - min = j; - } - } - let temp = arr[i]; - arr[i] = arr[min]; - arr[min] = temp; - } - return arr; -} - -const arr = [64, 25, 12, 22, 11]; - -console.log(selectionSort(arr)); // [11, 12, 22, 25, 64] -``` - -## Practice Problems - -- [Leetcode - Sort an Array](https://leetcode.com/problems/sort-an-array/) -- [HackerRank - The Full Counting Sort](https://www.hackerrank.com/challenges/countingsort4/problem) -- [Codeforces - Sort the Array](https://codeforces.com/problemset/problem/451/B) -- [CodeChef - Turbo Sort](https://www.codechef.com/problems/TSORT) - -## Quiz - -1. What is the time complexity of the selection sort? - - A) O(n) - - B) O(n^2) - - C) O(n log n) - - D) O(1) - - Correct Answer: B - -2. What is the space complexity of the selection sort? - - A) O(n) - - B) O(n^2) - - C) O(n log n) - - D) O(1) - - Correct Answer: D -- Explanation: The space complexity of the selection sort is O(1). - -3. What is the best-case time complexity of the selection sort? - - A) O(n) - - B) O(n^2) - - C) O(n log n) - - D) O(1) - - Correct Answer: B - -4. What is the worst-case time complexity of the selection sort? - - A) O(n) - - B) O(n^2) - - C) O(n log n) - - D) O(1) - - Correct Answer: B - -5. Is the selection sort stable? - - A) Yes - - B) No - - Correct Answer: A - - -:::info Try it yourself - -```js live -function selectionSort() { - let arr = [64, 25, 12, 22, 11]; - let n = arr.length; - for (let i = 0; i < n - 1; i++) { - let min = i; - for (let j = i + 1; j < n; j++) { - if (arr[j] < arr[min]) { - min = j; - } - } - let temp = arr[i]; - arr[i] = arr[min]; - arr[min] = temp; - } - return ( -
    -

    Selection Sort

    -

    Array: [64, 25, 12, 22, 11]

    -

    - Sorted Array: [{arr.join(", ")}] -

    -
    - ) -} -``` - -In the above example, we have an array of numbers `[64, 25, 12, 22, 11]`. We are using the selection sort algorithm to sort the array in ascending order. The selection sort algorithm divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. The sorted array is `[11, 12, 22, 25, 64]`. The time complexity of the selection sort is O(n^2) and the space complexity is O(1). - -::: - -## Conclusion - -In this article, we learned about the selection sort algorithm. Selection sort is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. The time complexity of the selection sort is O(n^2) and the space complexity is O(1). Selection sort is a stable sorting algorithm. \ No newline at end of file diff --git a/docs/dsa/arrays/bucket-sort.md b/docs/dsa/arrays/bucket-sort.md deleted file mode 100644 index 8067ac6d2..000000000 --- a/docs/dsa/arrays/bucket-sort.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -id: bucket-sort -title: Bucket sort -sidebar_label: Bucket sort -tags: - - DSA - - Python - - C++ - - Java - - Sorting - -description: "Thsi page containes Bucket Sort, with codes in python, java and c++ " ---- - -### Introduction to Bucket Sort - -Bucket sort is a comparison sorting algorithm that distributes elements into a number of "buckets." Each bucket is then sorted individually, either using another sorting algorithm or recursively applying the bucket sort. Finally, the sorted buckets are combined to form the final sorted array. Bucket sort is particularly useful for uniformly distributed data. - -### Steps of Bucket Sort - -1. **Create Buckets**: Initialize an empty array of buckets. -2. **Distribute Elements**: Distribute the elements of the input array into the appropriate buckets. -3. **Sort Buckets**: Sort each bucket individually. -4. **Concatenate Buckets**: Concatenate all sorted buckets to form the final sorted array. - -### Pseudocode - -```text -function bucketSort(array, bucketSize): - if length(array) == 0: - return array - - // Determine minimum and maximum values - minValue = min(array) - maxValue = max(array) - - // Initialize buckets - bucketCount = floor((maxValue - minValue) / bucketSize) + 1 - buckets = array of empty lists of size bucketCount - - // Distribute input array values into buckets - for i from 0 to length(array) - 1: - bucketIndex = floor((array[i] - minValue) / bucketSize) - append array[i] to buckets[bucketIndex] - - // Sort each bucket and concatenate them - sortedArray = [] - for i from 0 to bucketCount - 1: - sort(buckets[i]) // You can use any sorting algorithm - append buckets[i] to sortedArray - - return sortedArray -``` - -### Implementation in Python, C++, and Java - -#### Python Implementation - -```python -def bucket_sort(numbers, size=5): - if len(numbers) == 0: - return numbers - - # Determine minimum and maximum values - min_value = min(numbers) - max_value = max(numbers) - - # Initialize buckets - bucket_count = (max_value - min_value) // size + 1 - buckets = [[] for _ in range(bucket_count)] - - # Distribute input array values into buckets - for number in numbers: - bucket_index = (number - min_value) // size - buckets[bucket_index].append(number) - - # Sort each bucket and concatenate them - sorted_numbers = [] - for bucket in buckets: - sorted_numbers.extend(sorted(bucket)) - - return sorted_numbers - -# Example usage -data = [42, 32, 33, 52, 37, 47, 51] -sorted_data = bucket_sort(data) -print(sorted_data) # Output: [32, 33, 37, 42, 47, 51, 52] -``` - -#### C++ Implementation - -```cpp -#include -#include -#include -using namespace std; - -void bucketSort(vector& nums, int bucketSize) { - if (nums.empty()) - return; - - // Determine minimum and maximum values - int minValue = *min_element(nums.begin(), nums.end()); - int maxValue = *max_element(nums.begin(), nums.end()); - - // Initialize buckets - int numBuckets = (maxValue - minValue) / bucketSize + 1; - vector> buckets(numBuckets); - - // Distribute input array values into buckets - for (int num : nums) { - int bucketIndex = (num - minValue) / bucketSize; - buckets[bucketIndex].push_back(num); - } - - // Sort each bucket and concatenate them - nums.clear(); - for (auto& bucket : buckets) { - sort(bucket.begin(), bucket.end()); - nums.insert(nums.end(), bucket.begin(), bucket.end()); - } -} - -// Example usage -int main() { - vector data = {42, 32, 33, 52, 37, 47, 51}; - bucketSort(data, 5); - for (int num : data) { - cout << num << " "; - } - // Output: 32 33 37 42 47 51 52 - return 0; -} -``` - -#### Java Implementation - -```java -import java.util.ArrayList; -import java.util.Collections; - -public class BucketSort { - public static void bucketSort(int[] array, int bucketSize) { - if (array.length == 0) - return; - - // Determine minimum and maximum values - int minValue = array[0]; - int maxValue = array[0]; - for (int num : array) { - if (num < minValue) - minValue = num; - else if (num > maxValue) - maxValue = num; - } - - // Initialize buckets - int bucketCount = (maxValue - minValue) / bucketSize + 1; - ArrayList> buckets = new ArrayList<>(bucketCount); - for (int i = 0; i < bucketCount; i++) { - buckets.add(new ArrayList()); - } - - // Distribute input array values into buckets - for (int num : array) { - int bucketIndex = (num - minValue) / bucketSize; - buckets.get(bucketIndex).add(num); - } - - // Sort each bucket and concatenate them - int currentIndex = 0; - for (ArrayList bucket : buckets) { - Collections.sort(bucket); - for (int num : bucket) { - array[currentIndex++] = num; - } - } - } - - // Example usage - public static void main(String[] args) { - int[] data = {42, 32, 33, 52, 37, 47, 51}; - bucketSort(data, 5); - for (int num : data) { - System.out.print(num + " "); - } - // Output: 32 33 37 42 47 51 52 - } -} -``` - -### Complexity - -- **Time Complexity**: - - - Best Case: $O(n + k)$, where $n$ is the number of elements and $k$ is the number of buckets. - - Average Case: $O(n + k + n \log(\frac{n}{k}))$ - - Worst Case: $O(n^2)$, when all elements are placed in one bucket and a slow sorting algorithm (like bubble sort) is used within buckets. - -- **Space Complexity**: $O(n + k)$, for the input array and the buckets. - -### Conclusion - -Bucket sort is efficient for sorting uniformly distributed data and can achieve linear time complexity in the best case. However, it may degrade to quadratic time complexity in the worst case if elements are not uniformly distributed. It's essential to choose an appropriate bucket size and secondary sorting algorithm for optimal performance. By understanding its structure and implementation, you can effectively use bucket sort for various sorting tasks. diff --git a/docs/dsa/arrays/radix-sort.md b/docs/dsa/arrays/radix-sort.md deleted file mode 100644 index a360eed45..000000000 --- a/docs/dsa/arrays/radix-sort.md +++ /dev/null @@ -1,261 +0,0 @@ ---- -id: radix-sort -title: Radix sort -sidebar_label: Radix Sort -tags: - - DSA - - Python - - C++ - - Java - - Sorting - -description: "This page explains Radix sort, with code implementations and resources for further learning." ---- - -# Radix Sort - -### Introduction to Radix Sort - -Radix sort is a non-comparative integer sorting algorithm. It sorts integers by processing individual digits. Starting from the least significant digit (LSD) to the most significant digit (MSD), it uses a stable subroutine sort (like counting sort) to handle the individual digits. The algorithm is efficient for sorting numbers with a fixed number of digits and works well when the range of digits is not excessively large. - -### Steps of Radix Sort (Pseudocode Steps) - -1. **Find the maximum number** to determine the number of digits. -2. **Initialize**: Set up a loop to process each digit from the least significant to the most significant. -3. **Digit by digit sorting**: - - Use a stable sort (e.g., counting sort) to sort based on the current digit. -4. **Repeat** until all digits are processed. - -### Example - -To perform radix sort on the array [170, 45, 75, 90, 802, 24, 2, 66], we follow these steps: -![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164537/Radix-Sort.png) - -Step 1: Find the largest element in the array, which is 802. It has three digits, so we will iterate three times, once for each significant place. - -Step 2: Sort the elements based on the unit place digits (X=0). We use a stable sorting technique, such as counting sort, to sort the digits at each significant place. - -Sorting based on the unit place: - -Perform counting sort on the array based on the unit place digits. -The sorted array based on the unit place is [170, 90, 802, 2, 24, 45, 75, 66]. - -![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164536/Radix-Sort--1.png) - -Step 3: Sort the elements based on the tens place digits. - -Sorting based on the tens place: - -Perform counting sort on the array based on the tens place digits. -The sorted array based on the tens place is [802, 2, 24, 45, 66, 170, 75, 90]. - -![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164535/Radix-Sort--2.png) - -Step 4: Sort the elements based on the hundreds place digits. - -Sorting based on the hundreds place: - -Perform counting sort on the array based on the hundreds place digits. -The sorted array based on the hundreds place is [2, 24, 45, 66, 75, 90, 170, 802]. - -![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164535/Radix-Sort--3.png) - -Step 5: The array is now sorted in ascending order. - -The final sorted array using radix sort is [2, 24, 45, 66, 75, 90, 170, 802]. - -![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164534/Radix-Sort--4.png) - -### Pseudocode for Radix Sort - -```text -function radixSort(array): - maxNumber = findMax(array) - numberOfDigits = countDigits(maxNumber) - - for digit in 1 to numberOfDigits: - countingSortByDigit(array, digit) - -function findMax(array): - maxNumber = array[0] - for number in array: - if number > maxNumber: - maxNumber = number - return maxNumber - -function countDigits(number): - count = 0 - while number != 0: - number = number // 10 - count += 1 - return count - -function countingSortByDigit(array, digit): - count = array of size 10 initialized to 0 - output = array of same size as input array - - # Count occurrences of each digit - for number in array: - digitValue = (number // 10^(digit - 1)) % 10 - count[digitValue] += 1 - - # Change count[i] so that count[i] contains the position of this digit in output - for i from 1 to 9: - count[i] += count[i - 1] - - # Build the output array - for i from length(array) - 1 to 0: - digitValue = (array[i] // 10^(digit - 1)) % 10 - output[count[digitValue] - 1] = array[i] - count[digitValue] -= 1 - - # Copy the output array to the input array - for i from 0 to length(array) - 1: - array[i] = output[i] -``` - -### Radix Sort Implementation in Python, C++, and Java - -#### Python - -```python -def radix_sort(array): - def counting_sort_by_digit(array, digit): - count = [0] * 10 - output = [0] * len(array) - - for number in array: - digit_value = (number // 10**(digit - 1)) % 10 - count[digit_value] += 1 - - for i in range(1, 10): - count[i] += count[i - 1] - - for i in range(len(array) - 1, -1, -1): - digit_value = (array[i] // 10**(digit - 1)) % 10 - output[count[digit_value] - 1] = array[i] - count[digit_value] -= 1 - - for i in range(len(array)): - array[i] = output[i] - - max_number = max(array) - number_of_digits = len(str(max_number)) - - for digit in range(1, number_of_digits + 1): - counting_sort_by_digit(array, digit) - -# Example usage -arr = [170, 45, 75, 90, 802, 24, 2, 66] -radix_sort(arr) -print(arr) -``` - -#### C++ - -```cpp -#include -#include -#include - -void countingSortByDigit(std::vector& array, int digit) { - int size = array.size(); - std::vector output(size); - int count[10] = {0}; - - for (int i = 0; i < size; i++) { - int digitValue = (array[i] / digit) % 10; - count[digitValue]++; - } - - for (int i = 1; i < 10; i++) { - count[i] += count[i - 1]; - } - - for (int i = size - 1; i >= 0; i--) { - int digitValue = (array[i] / digit) % 10; - output[count[digitValue] - 1] = array[i]; - count[digitValue]--; - } - - for (int i = 0; i < size; i++) { - array[i] = output[i]; - } -} - -void radixSort(std::vector& array) { - int maxNumber = *max_element(array.begin(), array.end()); - for (int digit = 1; maxNumber / digit > 0; digit *= 10) { - countingSortByDigit(array, digit); - } -} - -// Example usage -int main() { - std::vector arr = {170, 45, 75, 90, 802, 24, 2, 66}; - radixSort(arr); - for (int num : arr) { - std::cout << num << " "; - } - return 0; -} -``` - -#### Java - -```java -import java.util.Arrays; - -public class RadixSort { - - public static void radixSort(int[] array) { - int maxNumber = Arrays.stream(array).max().getAsInt(); - for (int digit = 1; maxNumber / digit > 0; digit *= 10) { - countingSortByDigit(array, digit); - } - } - - private static void countingSortByDigit(int[] array, int digit) { - int size = array.length; - int[] output = new int[size]; - int[] count = new int[10]; - - for (int i = 0; i < size; i++) { - int digitValue = (array[i] / digit) % 10; - count[digitValue]++; - } - - for (int i = 1; i < 10; i++) { - count[i] += count[i - 1]; - } - - for (int i = size - 1; i >= 0; i--) { - int digitValue = (array[i] / digit) % 10; - output[count[digitValue] - 1] = array[i]; - count[digitValue]--; - } - - for (int i = 0; i < size; i++) { - array[i] = output[i]; - } - } - - public static void main(String[] args) { - int[] arr = {170, 45, 75, 90, 802, 24, 2, 66}; - radixSort(arr); - System.out.println(Arrays.toString(arr)); - } -} -``` - -### Complexity of Radix Sort - -- **Time Complexity**: $O(d⋅(n+k))$ - - $d$: Number of digits in the largest number. - - $n$: Number of elements in the array. - - $k$: Range of the digits for decimal system, $k = 10.$ -- **Space Complexity**: $O(n + k)$ - -### Conclusion - -Radix sort is a powerful sorting algorithm for integers or fixed-length strings. Its efficiency and non-comparative nature make it a valuable tool for specific use cases, especially where the number of digits or characters is limited. Understanding and implementing radix sort can significantly enhance the performance of sorting operations in such scenarios. diff --git a/docs/dsa/basic-concepts/_category_.json b/docs/dsa/basic-concepts/_category_.json deleted file mode 100644 index b810bad9b..000000000 --- a/docs/dsa/basic-concepts/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Basic Concepts", - "position": 5, - "link": { - "type": "generated-index", - "description": "Basic Concepts of Data Structures and Algorithms." - } - } \ No newline at end of file diff --git a/docs/dsa/basic-concepts/image-1.png b/docs/dsa/basic-concepts/image-1.png deleted file mode 100644 index cd127aab3647d3b8a854a7fb819e59273140fa37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12924 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 PPyteqRhFrgG79`3igf%< diff --git a/docs/dsa/basic-concepts/image.png b/docs/dsa/basic-concepts/image.png deleted file mode 100644 index 8a263334fd992286c3d518de34ab71cf48d0de6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6623 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 diff --git a/docs/dsa/basic-concepts/space-complexity.md b/docs/dsa/basic-concepts/space-complexity.md deleted file mode 100644 index 8bf46a6ea..000000000 --- a/docs/dsa/basic-concepts/space-complexity.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -id: space-complexity -title: Space Complexity -sidebar_label: Space Complexity -sidebar_position: 2 -description: "Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle." -tags: [Space Complexity, Big O Notation, Memory, Algorithm, Complexity Analysis, Data Structure, DSA, JavaScript, Java, Python, C, C++, Space Complexity Example, Space Complexity Calculation, Space Complexity Analysis, Space Complexity Explanation, Space Complexity Conclusion, Space Complexity Importance, Space Complexity Formula, Space Complexity Constant Space, Space Complexity Auxiliary Space, Space Complexity Example, Space Complexity Program, Space Complexity Code] ---- - -Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle. - -## Why is Space Complexity important? - -Space complexity is important because the memory that is allocated to the program is limited. If the program uses more memory than the available memory, the program will crash. Therefore, it is important to know the space complexity of the algorithm. - -## How to calculate Space Complexity? - -Space complexity is calculated by counting the amount of memory space used by the algorithm. It is calculated by counting the amount of memory space used by the algorithm as a function of the size of the input to the problem. - -## Example - -```js title="Space Complexity" -function sumOfN(n) { - let sum = 0; - for (let i = 1; i <= n; i++) { - sum += i; - } - return sum; -} -``` - -In the above example, the space complexity of the algorithm is O(1) because the algorithm uses a constant amount of memory space. - -## Example of Space Complexity - -1. Write a program to fine maximum and minimum element in an array. - - - - - ```js {6,9,12} - function findMaxMin(arr) { - let max = arr[0]; - let min = arr[0]; - for (let i = 1; i < arr.length; i++) { - if (arr[i] > max) { - max = arr[i]; - } - if (arr[i] < min) { - min = arr[i]; - } - } - return { max, min }; - } - - const arr = [2, 5, 1, 20, 10]; - console.log(findMaxMin(arr)); // { max: 20, min: 1 } - ``` - - - - - ```java - public class Main { - public static void main(String[] args) { - int[] arr = {2, 5, 1, 20, 10}; - System.out.println(findMaxMin(arr)); // { max: 20, min: 1 } - } - - public static Map findMaxMin(int[] arr) { - int max = arr[0]; - int min = arr[0]; - for (int i = 1; i < arr.length; i++) { - if (arr[i] > max) { - max = arr[i]; - } - if (arr[i] < min) { - min = arr[i]; - } - } - Map result = new HashMap<>(); - result.put("max", max); - result.put("min", min); - return result; - } - } - ``` - - - - - ```python - def find_max_min(arr): - max = arr[0] - min = arr[0] - for i in range(1, len(arr)): - if arr[i] > max: - max = arr[i] - if arr[i] < min: - min = arr[i] - return {"max": max, "min": min} - - arr = [2, 5, 1, 20, 10] - print(find_max_min(arr)) # { max: 20, min: 1 } - ``` - - - - - ```c - #include - - struct MaxMin { - int max; - int min; - }; - - struct MaxMin findMaxMin(int arr[], int n) { - struct MaxMin result; - result.max = arr[0]; - result.min = arr[0]; - for (int i = 1; i < n; i++) { - if (arr[i] > result.max) { - result.max = arr[i]; - } - if (arr[i] < result.min) { - result.min = arr[i]; - } - } - return result; - } - - int main() { - int arr[] = {2, 5, 1, 20, 10}; - struct MaxMin result = findMaxMin(arr, 5); - printf("{ max: %d, min: %d }\n", result.max, result.min); // { max: 20, min: 1 } - return 0; - } - ``` - - - - - ```cpp - #include - #include - #include - - std::map findMaxMin(std::vector arr) { - int max = arr[0]; - int min = arr[0]; - for (int i = 1; i < arr.size(); i++) { - if (arr[i] > max) { - max = arr[i]; - } - if (arr[i] < min) { - min = arr[i]; - } - } - std::map result; - result["max"] = max; - result["min"] = min; - return result; - } - - int main() { - std::vector arr = {2, 5, 1, 20, 10}; - std::map result = findMaxMin(arr); - std::cout << "{ max: " << result["max"] << ", min: " << result["min"] << " }\n"; // { max: 20, min: 1 } - return 0; - } - ``` - - - - -In the above example, the space complexity of the algorithm is O(1) because the algorithm uses a constant amount of memory space. - -**Explanation:** In the above example, we are finding the maximum and minimum element in an array. We are using two variables `max` and `min` to store the maximum and minimum element in the array. We are using a constant amount of memory space to store the maximum and minimum element in the array. Therefore, the space complexity of the algorithm is O(1). - -:::info Complexity Analysis -**Farmula to calculate Space Complexity** - -Space Complexity = Constant Space + Auxiliary Space - -**Constant Space:** The amount of space used by the algorithm that is not dependent on the size of the input to the problem. It is a constant amount of memory space used by the algorithm. - -**Auxiliary Space:** The amount of space used by the algorithm that is dependent on the size of the input to the problem. It is a variable amount of memory space used by the algorithm. - -```plaintext title="Space Complexity" -Space Complexity = O(1) + O(n) = O(n) -``` - -**For Example:** - -```js title="Space Complexity" -function sumOfN(n) { - let sum = 0; // Constant Space (O(1)) - for (let i = 1; i <= n; i++) { - sum += i; // Auxiliary Space (O(n)) - } - return sum; -} -``` - -In the above example, the space complexity of the algorithm is `O(1) + O(n) = O(n)`. - -::: - -## Conclusion - -Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle. \ No newline at end of file diff --git a/docs/dsa/basic-concepts/time-complexity.md b/docs/dsa/basic-concepts/time-complexity.md deleted file mode 100644 index eb10b2909..000000000 --- a/docs/dsa/basic-concepts/time-complexity.md +++ /dev/null @@ -1,306 +0,0 @@ ---- -id: time-complexity -title: Time Complexity -sidebar_label: Time Complexity -sidebar_position: 1 -description: "Time Complexity is a measure of the amount of time an algorithm takes to solve a problem as a function of the size of the input to the problem. It is commonly estimated by counting the number of elementary operations performed by the algorithm, where an elementary operation takes a fixed amount of time to perform." -tags: [time complexity, big o notation, algorithm, complexity analysis, data structure, dsa, javascript, java, python, c, c++, time complexity example, time complexity calculation, time complexity analysis, time complexity explanation, time complexity conclusion, time complexity importance, time complexity formula, time complexity constant time, time complexity linear time, time complexity logarithmic time, time complexity quadratic time, time complexity exponential time, time complexity factorial time, time complexity polynomial time, time complexity sublinear time, time complexity linearithmic time, time complexity quasilinear time, time complexity superpolynomial time, time complexity subexponential time, time complexity log factorial time, time complexity exponential factorial time, time complexity exponential exponential time, time complexity exponential factorial exponential time, time complexity exponential exponential factorial time] ---- - -Time Complexity is a measure of the amount of time an algorithm takes to solve a problem as a function of the size of the input to the problem. It is commonly estimated by counting the number of elementary operations performed by the algorithm, where an elementary operation takes a fixed amount of time to perform. - -## Why is Time Complexity Important? - -Time Complexity is important because it helps us understand the efficiency of an algorithm. It allows us to compare different algorithms and choose the most efficient one for a given problem. It also helps us analyze the performance of an algorithm as the size of the input grows. - -## Common Notations for Time Complexity - -The most common notations used to represent the time complexity of an algorithm are: - -- **Big O Notation (O):** It represents the upper bound of the time complexity of an algorithm. It gives the worst-case time complexity of an algorithm. -- **Omega Notation (Ω):** It represents the lower bound of the time complexity of an algorithm. It gives the best-case time complexity of an algorithm. -- **Theta Notation (Θ):** It represents the average-case time complexity of an algorithm. It gives the tight bound of the time complexity of an algorithm. - -### Big O Notation (O) - -Big O Notation is used to represent the upper bound of the time complexity of an algorithm. It gives the worst-case time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. - -![Big O Notation](image.png) - -The Big O Notation is written as `O(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "O of f of n" or "order of f of n". - -### Omega Notation (Ω) - -Omega Notation is used to represent the lower bound of the time complexity of an algorithm. It gives the best-case time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. - -![Omega Notation](image-1.png) - -The Omega Notation is written as `Ω(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "Omega of f of n". - -### Theta Notation (Θ) - -Theta Notation is used to represent the average-case time complexity of an algorithm. It gives the tight bound of the time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. - -The Theta Notation is written as `Θ(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "Theta of f of n". - - -## Examples of Time Complexity - -Here are some examples of time complexity for different algorithms: - -- **Constant Time (O(1)):** An algorithm that takes the same amount of time to run, regardless of the size of the input. -- **Linear Time (O(n)):** An algorithm that takes time proportional to the size of the input. -- **Logarithmic Time (O(log n)):** An algorithm that takes time proportional to the logarithm of the size of the input. -- **Quadratic Time (O(n^2)):** An algorithm that takes time proportional to the square of the size of the input. -- **Exponential Time (O(2^n)):** An algorithm that takes time proportional to an exponential function of the size of the input. -- **Factorial Time (O(n!)):** An algorithm that takes time proportional to the factorial of the size of the input. -- **Polynomial Time (O(n^k)):** An algorithm that takes time proportional to a polynomial function of the size of the input. -- **Sublinear Time (O(log log n)):** An algorithm that takes time proportional to the logarithm of the logarithm of the size of the input. -- **Linearithmic Time (O(n log n)):** An algorithm that takes time proportional to the product of the size of the input and the logarithm of the size of the input. -- **Quasilinear Time (O(n log^k n)):** An algorithm that takes time proportional to the product of the size of the input and the logarithm of the size of the input raised to the power of k. -- **Superpolynomial Time (O(n^k)):** An algorithm that takes time proportional to a function that grows faster than any polynomial function of the size of the input. -- **Subexponential Time (O(2^poly(n))):** An algorithm that takes time proportional to a function that grows slower than any exponential function of the size of the input. -- **Log Factorial Time (O(log n!)):** An algorithm that takes time proportional to the logarithm of the factorial of the size of the input. -- **Exponential Factorial Time (O(2^n!)):** An algorithm that takes time proportional to an exponential function of the factorial of the size of the input. -- **Exponential Exponential Time (O(2^2^n)):** An algorithm that takes time proportional to an exponential function of an exponential function of the size of the input. -- **Exponential Factorial Exponential Time (O(2^n!^2^n)):** An algorithm that takes time proportional to an exponential function of the factorial of an exponential function of the size of the input. -- **Exponential Exponential Factorial Time (O(2^2^n!)):** An algorithm that takes time proportional to an exponential function of an exponential function of the factorial of the size of the input. - -## Analyzing Time Complexity - -To analyze the time complexity of an algorithm, we can follow these steps: - -1. **Count the Operations:** Count the number of elementary operations performed by the algorithm. -2. **Identify the Dominant Term:** Identify the term that grows the fastest as the size of the input grows. -3. **Express the Time Complexity:** Express the time complexity using the Big O notation. -4. **Compare with Other Algorithms:** Compare the time complexity with other algorithms to choose the most efficient one. -5. **Analyze the Best, Worst, and Average Cases:** Analyze the best-case, worst-case, and average-case time complexity of the algorithm. -6. **Optimize the Algorithm:** Optimize the algorithm to improve its time complexity if possible. -7. **Test the Algorithm:** Test the algorithm with different input sizes to verify its time complexity. -8. **Benchmark the Algorithm:** Benchmark the algorithm to measure its actual performance. -9. **Profile the Algorithm:** Profile the algorithm to identify performance bottlenecks and optimize them. -10. **Analyze the Real-World Performance:** Analyze the real-world performance of the algorithm in different environments and scenarios. -11. **Contribute:** If you have any tips to share, feel free to contribute to this section. - -## For Example - -1. Calculating sum of array elements using loop. - - - - - ```js - function sum(arr) { - let result = 0; - for (let i = 0; i < arr.length; i++) { - result += arr[i]; - } - return result; - } - const arr = [1, 2, 3, 4, 5]; - console.log(sum(arr)); // Output: 15 - ``` - - - ```py - def sum(arr): - result = 0 - for i in arr: - result += i - return result - arr = [1, 2, 3, 4, 5] - print(sum(arr)) # Output: 15 - ``` - - - ```java - class Sum { - public static void main(String args[]) { - int arr[] = {1, 2, 3, 4, 5}; - int result = 0; - for (int i = 0; i < arr.length; i++) { - result += arr[i]; - } - System.out.println(result); // Output: 15 - } - } - ``` - - - ```c - #include - int main() { - int arr[] = {1, 2, 3, 4, 5}; - int result = 0; - for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { - result += arr[i]; - } - printf("%d\n", result); // Output: 15 - return 0; - } - ``` - - - ```go - package main - import "fmt" - func main() { - arr := []int{1, 2, 3, 4, 5} - result := 0 - for i := 0; i < len(arr); i++ { - result += arr[i] - } - fmt.Println(result) // Output: 15 - } - ``` - - - ```cpp - #include - using namespace std; - int main() { - int arr[] = {1, 2, 3, 4, 5}; - int result = 0; - for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { - result += arr[i]; - } - cout << result << endl; // Output: 15 - return 0; - } - ``` - - - ```swift - import Foundation - let arr = [1, 2, 3, 4, 5] - var result = 0 - for i in arr { - result += i - } - print(result) // Output: 15 - ``` - - - ```kotlin - fun main() { - val arr = intArrayOf(1, 2, 3, 4, 5) - var result = 0 - for (i in arr) { - result += i - } - println(result) // Output: 15 - } - ``` - - - ```rs - fn main() { - let arr = [1, 2, 3, 4, 5]; - let mut result = 0; - for i in arr.iter() { - result += i; - } - println!("{}", result); // Output: 15 - } - ``` - - - ```php - - ``` - - - ```cs - using System; - class Sum { - static void Main() { - int[] arr = {1, 2, 3, 4, 5}; - int result = 0; - foreach (int i in arr) { - result += i; - } - Console.WriteLine(result); // Output: 15 - } - } - ``` - - - ```ts - let arr: number[] = [1, 2, 3, 4, 5]; - let result: number = 0; - for (let i of arr) { - result += i; - } - console.log(result); // Output: 15 - ``` - - - ```scala - object Sum { - def main(args: Array[String]): Unit = { - val arr = Array(1, 2, 3, 4, 5) - var result = 0 - for (i <- arr) { - result += i - } - println(result) // Output: 15 - } - } - ``` - - - ```haskell - main = do - let arr = [1, 2, 3, 4, 5] - let result = sum arr - print result -- Output: 15 - ``` - - - ```r - arr <- c(1, 2, 3, 4, 5) - result <- sum(arr) - print(result) # Output: 15 - ``` - - - ```perl - my @arr = (1, 2, 3, 4, 5); - my $result = 0; - foreach my $i (@arr) { - $result += $i; - } - print $result; # Output: 15 - ``` - - - ```lua - arr = {1, 2, 3, 4, 5} - result = 0 - for i = 1, #arr do - result = result + arr[i] - end - print(result) -- Output: 15 - ``` - - - -Each of the above code snippets has a time complexity of `O(n)` because the number of iterations in the loop is directly proportional to the size of the input array. - -**Exlpanation:** The time complexity of the given code is `O(n)` because the loop iterates through the array elements one by one, and the number of iterations is directly proportional to the size of the input array. Therefore, the time complexity is linear, i.e., `O(n)`. - - -:::info -**Note:** The time complexity of an algorithm can be different for different programming languages, but the underlying logic and analysis remain the same. -::: - -## Conclusion - -Time Complexity is an important concept in computer science and programming. It helps us understand the efficiency of algorithms and make informed decisions about choosing the most efficient algorithm for a given problem. By analyzing the time complexity of algorithms, we can optimize them for better performance and improve the overall efficiency of our programs. \ No newline at end of file diff --git a/docs/dsa/binary_search/Iterative_binary_search.md b/docs/dsa/binary_search/Iterative_binary_search.md deleted file mode 100644 index 7fab7b613..000000000 --- a/docs/dsa/binary_search/Iterative_binary_search.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -id: iterative-binary-search-DSA -title: Iterative Binary Search -sidebar_label: Iterative Binary Search -sidebar_position: 7 -description: "In this blog post, we'll explore the iterative binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array. You'll learn what iterative binary search is, how it works, and its time complexity. We'll also cover practical applications and common problems you can solve using this algorithm. By the end, you'll have a thorough understanding of iterative binary search and how to implement it in your programming projects." -tags: [dsa, algorithms, binary search, iterative] ---- - -Iterative Binary Search is powerful algorithm that is essential for efficiently finding elements in sorted arrays, making it a staple in the toolkit of any adept programmer. Whether you're optimizing search operations or solving complex algorithmic challenges, understanding iterative binary search is crucial. Let's delve into its mechanics, applications, and implementation. - -## What is Iterative Binary Search? - -Iterative binary search is a highly efficient algorithm used to find an element in a sorted array. It works by repeatedly dividing the search interval in half, using an iterative approach. If the value of the search key is less than the item in the middle of the interval, the algorithm narrows the interval to the lower half. Otherwise, it narrows it to the upper half. The process continues until the search key is found or the interval is empty. - -In pseudo-code, iterative binary search is defined as follows: - -```cpp -FUNCTION iterativeBinarySearch(array, key): -low = 0 -high = array.length - 1 -WHILE low <= high: -mid = (low + high) / 2 -IF array[mid] == key: -RETURN mid -ELSE IF array[mid] < key: -low = mid + 1 -ELSE: -high = mid - 1 -RETURN -1 -``` - -```cpp -int iterativeBinarySearch(int array[], int size, int key) { - int low = 0; - int high = size - 1; - while (low <= high) { - int mid = low + (high - low) / 2; - if (array[mid] == key) { - return mid; - } else if (array[mid] < key) { - low = mid + 1; - } else { - high = mid - 1; - } - } - return -1; -} -``` - -## How Iterative Binary Search Works - -### Step-by-Step Explanation - -1. Initialize: Set two pointers, low at the beginning and high at the end of the array. -2. Middle Element: Calculate the middle element's index. -Comparison: -3. If the middle element is the target, return its index. -4. If the middle element is less than the target, discard the left half by setting low to mid + 1. -5. If the middle element is greater than the target, discard the right half by setting high to mid - 1. -6. Repeat: Repeat steps 2 and 3 until the target is found or the low pointer exceeds the high pointer. - -### Time Complexity - -The time complexity of iterative binary search is $O(logn)$, -where $𝑛$ is the number of elements in the array. This logarithmic time complexity makes iterative binary search significantly faster than linear search for large datasets. - -## Practical Applications - -Iterative binary search is widely used in various real-world applications and algorithmic problems: - -1. Searching in a Sorted Array - The primary use of iterative binary search is to find elements in a sorted array efficiently. It is the foundation for more complex search algorithms. - -2. Dictionary Lookups - Iterative binary search is used in dictionaries (like the one you're reading now) to quickly find words and their definitions. - -3. Binary Search Trees - Iterative binary search is the basis for searching in binary search trees (BSTs), a fundamental data structure in computer science. - -4. Finding Boundaries - Iterative binary search can be adapted to find the first or last occurrence of a target element, making it useful in problems requiring boundary searches. - -Common Problems Solved Using Iterative Binary Search -Iterative binary search can be adapted in various ways to solve different types of problems. Here are a couple of common problems: - -1. Lower Bound and Upper Bound - These variations of iterative binary search are used to find the first and last occurrence of a target element in a sorted array. - -Lower Bound Pseudo-Code: - -```cpp -FUNCTION lowerBound(array, key): - low = 0 - high = array.length - WHILE low < high: - mid = (low + high) / 2 - IF array[mid] < key: - low = mid + 1 - ELSE: - high = mid - RETURN low - -``` - -Upper Bound Pseudo-Code: - -```cpp -FUNCTION upperBound(array, key): - low = 0 - high = array.length - WHILE low < high: - mid = (low + high) / 2 - IF array[mid] <= key: - low = mid + 1 - ELSE: - high = mid - RETURN low - - -``` - -2. Rotated Sorted Array - Iterative binary search can be modified to handle rotated sorted arrays, where the array is sorted but then rotated at some pivot point. - -:::tip -Handle Edge Cases: Ensure your implementation correctly handles cases where the target element is not present or when the array is empty. -Prevent Overflow: When calculating the middle index, use $\text{mid} = \text{low} + \frac{\text{high} - \text{low}}{2}$ instead of $\text{mid} = \frac{\text{low} + \text{high}}{2}$ to prevent potential overflow. -Efficiency: The iterative approach often uses less memory than the recursive approach because it doesn't involve the overhead of multiple recursive function calls. -::: - -## Conclusion - -Iterative binary search is a fundamental algorithm that every programmer should master. Its efficiency and versatility make it a powerful tool for solving a wide range of problems. By understanding how iterative binary search works and how to implement its variations, you'll be well-equipped to tackle numerous challenges in your programming journey. diff --git a/docs/dsa/binary_search/_category_.json b/docs/dsa/binary_search/_category_.json deleted file mode 100644 index 34c97b96a..000000000 --- a/docs/dsa/binary_search/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Binary Search", - "position": 7, - "link": { - "type": "generated-index", - "description": "Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). " - } -} diff --git a/docs/dsa/binary_search/binary-search.md b/docs/dsa/binary_search/binary-search.md deleted file mode 100644 index fbc27804e..000000000 --- a/docs/dsa/binary_search/binary-search.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: binary-search-dsa -title: Binary Search -sidebar_label: Binary Search -description: "In this blog post, we'll dive into the binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array." -tags: [dsa, algorithms, binary search] ---- - - -## Introduction -Binary search is a searching algorithm, used to search for an element in an array. It follows a unique approach which reduces the time complexity as compared to linear search. However, to use binary search, the array must be sorted. - -## Implementation - -Let us see how to implement binary search in Java: - -```java - //let element to be found=target - int low=0; - int high=n-1; //where n is the length of the sorted array - int mid; //represents the mid index of the array - - int flag=0; //element not yet found - - while(low<=high) { - - mid=(low + high)/2; - if(arr[mid]==target) { - flag=1; //element found - System.out.println("Target found!"); - break; - } - else if(arr[mid] -Binary search : O(log n) - -## Points to Remember: - -- Binary search requires a sorted array. -- Works for 1 dimensional arrays. -- Faster and complex than sequential search. -- Uses the divide and conquer approach. -- Best if arrays are too long (large datasets). diff --git a/docs/dsa/binary_search/recursive_binary_search.md b/docs/dsa/binary_search/recursive_binary_search.md deleted file mode 100644 index 4d3c50f27..000000000 --- a/docs/dsa/binary_search/recursive_binary_search.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -id: recursive-binary-search-DSA -title: Recursive Binary Search -sidebar_label: Recursive Binary Search -sidebar_position: 8 -description: "In this blog post, we'll explore the recursive binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array. You'll learn what recursive binary search is, how it works, and its time complexity. We'll also cover practical applications and common problems you can solve using this algorithm. By the end, you'll have a thorough understanding of recursive binary search and how to implement it in your programming projects." -tags: [dsa, algorithms, binary search, recursive] ---- - -Recursive Binary Search algorithm is essential for efficiently finding elements in sorted arrays, making it a staple in the toolkit of any adept programmer. Whether you're optimizing search operations or solving complex algorithmic challenges, understanding recursive binary search is crucial. Let's delve into its mechanics, applications, and implementation. - -## What is Recursive Binary Search? - -Recursive binary search is a highly efficient algorithm used to find an element in a sorted array. It works by repeatedly dividing the search interval in half, using a recursive approach. If the value of the search key is less than the item in the middle of the interval, the algorithm narrows the interval to the lower half. Otherwise, it narrows it to the upper half. The process continues until the search key is found or the interval is empty. - -In pseudo-code, recursive binary search is defined as follows: - -```cpp -FUNCTION recursiveBinarySearch(array, low, high, key): -IF low > high: -RETURN -1 -mid = (low + high) / 2 -IF array[mid] == key: -RETURN mid -ELSE IF array[mid] < key: -RETURN recursiveBinarySearch(array, mid + 1, high, key) -ELSE: -RETURN recursiveBinarySearch(array, low, mid - 1, key) -``` - -```cpp -int recursiveBinarySearch(int array[], int low, int high, int key) { - if (low > high) { - return -1; - } - int mid = low + (high - low) / 2; - if (array[mid] == key) { - return mid; - } else if (array[mid] < key) { - return recursiveBinarySearch(array, mid + 1, high, key); - } else { - return recursiveBinarySearch(array, low, mid - 1, key); - } -} -``` - -## How Recursive Binary Search Works - -### Step-by-Step Explanation - -1. Initialize: Set two pointers, low at the beginning and high at the end of the array. -2. Middle Element: Calculate the middle element's index. -Comparison: -3. If the middle element is the target, return its index. -4. If the middle element is less than the target, discard the left half by setting low to mid + 1. -5. If the middle element is greater than the target, discard the right half by setting high to mid - 1. -6. Repeat: Repeat steps 2 and 3 until the target is found or the low pointer exceeds the high pointer. - -### Time Complexity - -The time complexity of iterative binary search is $𝑂(log𝑛)$. - -where $n$ is the number of elements in the array. This logarithmic time complexity makes iterative binary search significantly faster than linear search for large datasets. - -## Practical Applications - -Iterative binary search is widely used in various real-world applications and algorithmic problems: - -1. Searching in a Sorted Array - The primary use of iterative binary search is to find elements in a sorted array efficiently. It is the foundation for more complex search algorithms. - -2. Dictionary Lookups - Iterative binary search is used in dictionaries (like the one you're reading now) to quickly find words and their definitions. - -3. Binary Search Trees - Iterative binary search is the basis for searching in binary search trees (BSTs), a fundamental data structure in computer science. - -4. Finding Boundaries - Iterative binary search can be adapted to find the first or last occurrence of a target element, making it useful in problems requiring boundary searches. - -Common Problems Solved Using Iterative Binary Search -Iterative binary search can be adapted in various ways to solve different types of problems. Here are a couple of common problems: - -1. Lower Bound and Upper Bound - These variations of iterative binary search are used to find the first and last occurrence of a target element in a sorted array. - -Lower Bound Pseudo-Code: - -```cpp -FUNCTION lowerBound(array, low, high, key): - IF low == high: - RETURN low - mid = (low + high) / 2 - IF array[mid] < key: - RETURN lowerBound(array, mid + 1, high, key) - ELSE: - RETURN lowerBound(array, low, mid, key) - - -``` - -Upper Bound Pseudo-Code: - -```cpp -FUNCTION upperBound(array, low, high, key): - if low == high: - return low - mid = (low + high) / 2 - if array[mid] <= key: - return upperBound(array, mid + 1, high, key) - else: - return upperBound(array, low, mid, key) - -``` - -2. Rotated Sorted Array - Recursive binary search can be modified to handle rotated sorted arrays, where the array is sorted but then rotated at some pivot point. - -:::tip -Handle Edge Cases: Ensure your implementation correctly handles cases where the target element is not present or when the array is empty. -Prevent Stack Overflow: Be mindful of the recursion depth, especially for large arrays, as deep recursion can lead to stack overflow. -Efficiency: The recursive approach can be more intuitive and elegant, but consider the iterative approach for environments with limited stack size. -::: - -## Conclusion -Recursive binary search is a fundamental algorithm that every programmer should master. Its efficiency and versatility make it a powerful tool for solving a wide range of problems. By understanding how recursive binary search works and how to implement its variations, you'll be well-equipped to tackle numerous challenges in your programming journey. diff --git a/docs/dsa/data-structure-types.md b/docs/dsa/data-structure-types.md deleted file mode 100644 index 350d26e72..000000000 --- a/docs/dsa/data-structure-types.md +++ /dev/null @@ -1,367 +0,0 @@ ---- -id: data-structure-types -title: Data Structure Types -sidebar_label: Data Structure Types -sidebar_position: 2 -description: "Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. This section covers the different types of data structures and their applications." -tags: - [ - dsa, - data-structures, - types, - data structure types, - primitive data types, - abstract data types, - linear data structures, - non-linear data structures, - homogeneous data structures, - heterogeneous data structures, - static data structures, - dynamic data structures, - mutable data structures, - immutable data structures, - persistent data structures, - transient data structures, - stack, - queue, - linked list, - tree, - graph, - hash table, - set, - map, - dictionary, - priority queue, - heap, - trie, - bloom filter, - bit array, - bitset, - bitboard, - ] ---- - -A data structure is a way of organizing and storing data so that it can be accessed and modified efficiently. It is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. - -Data structures can be classified into different types based on various criteria. Here are some common types of data structures: - -```mermaid -graph TD - A[Data Structures] --> B[Primitive Data Structures] - A[Data Structures] --> C[Non-Primitive Data Structures] - - B[Primitive Data Structures] --> D(Integer) - B[Primitive Data Structures] --> E(Float) - B[Primitive Data Structures] --> F(Character) - B[Primitive Data Structures] --> G(Boolean) - - C[Non-Primitive Data Structures] --> H[Linear Data Structures] - C[Non-Primitive Data Structures] --> I[Non-Linear Data Structures] - - H[Linear Data Structures] --> J[Static Data Structures] - H[Linear Data Structures] --> K[Dynamic Data Structures] - - J[Static Data Structures] --> L(Array) - - K[Dynamic Data Structures] --> M(Linked List) - K[Dynamic Data Structures] --> N(Stack) - K[Dynamic Data Structures] --> O(Queue) - - I[Non-Linear Data Structures] --> P[Trees] - I[Non-Linear Data Structures] --> Q[Graphs] -``` - -### Primitive Data Structures - -Primitive data structures are the basic data structures that are directly operated upon by the machine instructions. They include: - -1. **Integer**: A data type that represents whole numbers. - - for example: `1`, `2`, `3`, `4`, `5`, ... - - ```javascript title="Integer" - let num = 10; - ``` - -2. **Float**: A data type that represents real numbers with decimal points. - - for example: `1.0`, `2.5`, `3.14`, `4.2`, `5.75`, ... - - ```javascript title="Float" - let num = 3.14; - ``` - -3. **Character**: A data type that represents a single character. - - for example: `a`, `b`, `c`, `d`, `e`, ... - - ```javascript title="Character" - let ch = "A"; - ``` - -4. **Boolean**: A data type that represents true or false values. - - for example: `true`, `false` - - ```javascript title="Boolean" - let isTrue = true; - ``` - -### Non-Primitive Data Structures - -Non-primitive data structures are the advanced data structures that are derived from primitive data structures. They include: - -1. **Linear Data Structures**: Data structures in which elements are arranged in a sequential manner. They include: - - - **Static Data Structures**: Data structures in which the size is fixed at compile time. They include: - - - **Array**: A collection of elements of the same data type stored in contiguous memory locations. - - ```javascript title="Array" - let arr = [1, 2, 3, 4, 5]; - ``` - - - **Dynamic Data Structures**: Data structures in which the size can be changed at runtime. They include: - - - **Linked List**: A collection of elements called nodes, where each node contains a data field and a reference (link) to the next node in the sequence. - - ```javascript title="Linked List" - class Node { - constructor(data) { - this.data = data; - this.next = null; - } - } - - class LinkedList { - constructor() { - this.head = null; - } - - add(data) { - const newNode = new Node(data); - - if (!this.head) { - this.head = newNode; - } else { - let current = this.head; - - while (current.next) { - current = current.next; - } - - current.next = newNode; - } - } - } - - const list = new LinkedList(); - list.add(1); - list.add(2); - list.add(3); - ``` - - - **Stack**: A collection of elements with two main operations: push (insert) and pop (delete). - - ```javascript title="Stack" - class Stack { - constructor() { - this.items = []; - } - - push(element) { - this.items.push(element); - } - - pop() { - if (this.items.length === 0) { - return "Underflow"; - } - return this.items.pop(); - } - } - - const stack = new Stack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.pop(); - ``` - - - **Queue**: A collection of elements with two main operations: enqueue (insert) and dequeue (delete). - - ```javascript title="Queue" - class Queue { - constructor() { - this.items = []; - } - - enqueue(element) { - this.items.push(element); - } - - dequeue() { - if (this.items.length === 0) { - return "Underflow"; - } - return this.items.shift(); - } - } - - const queue = new Queue(); - queue.enqueue(1); - queue.enqueue(2); - queue.enqueue(3); - queue.dequeue(); - ``` - -2. **Non-Linear Data Structures**: Data structures in which elements are not arranged in a sequential manner. They include: - - - **Trees**: A hierarchical data structure with a root node and subtrees of children nodes. - - ```javascript title="Tree" - class Node { - constructor(data) { - this.data = data; - this.children = []; - } - - addChild(data) { - const child = new Node(data); - this.children.push(child); - } - } - - const tree = new Node(1); - tree.addChild(2); - tree.addChild(3); - ``` - - - **Graphs**: A non-linear data structure consisting of nodes (vertices) and edges (connections between nodes). - - ```javascript title="Graph" - class Graph { - constructor() { - this.nodes = []; - this.edges = []; - } - - addNode(node) { - this.nodes.push(node); - } - - addEdge(node1, node2) { - this.edges.push([node1, node2]); - } - } - - const graph = new Graph(); - graph.addNode(1); - graph.addNode(2); - graph.addEdge(1, 2); - ``` - - - **Hash Table**: A data structure that stores key-value pairs and provides fast lookup of values based on keys. - - ```javascript title="Hash Table" - class HashTable { - constructor() { - this.table = {}; - } - - put(key, value) { - this.table[key] = value; - } - - get(key) { - return this.table[key]; - } - } - - const hashTable = new HashTable(); - hashTable.put("name", "John"); - hashTable.get("name"); - ``` - - - **Heap**: A specialized tree-based data structure that satisfies the heap property. - - ```javascript title="Heap" - class MinHeap { - constructor() { - this.heap = []; - } - - insert(value) { - this.heap.push(value); - this.heapifyUp(); - } - - heapifyUp() { - let index = this.heap.length - 1; - - while (index > 0) { - let parentIndex = Math.floor((index - 1) / 2); - - if (this.heap[parentIndex] <= this.heap[index]) { - break; - } - - [this.heap[parentIndex], this.heap[index]] = [ - this.heap[index], - this.heap[parentIndex], - ]; - index = parentIndex; - } - } - } - - const minHeap = new MinHeap(); - minHeap.insert(3); - minHeap.insert(2); - minHeap.insert(1); - ``` - -## Different Between Primitive and Non-Primitive Data Structures - -|No. |Primitive Data Structures|Non-Primitive Data Structures| -|----|--------------------------|-----------------------------| -|1. |Basic data structures that are directly operated upon by the machine instructions.|Advanced data structures that are derived from primitive data structures.| -|2. |Examples: Integer, Float, Character, Boolean.|Examples: Array, Linked List, Stack, Queue, Tree, Graph, Hash Table, Heap.| -|3. |Stored in contiguous memory locations.|Stored in non-contiguous memory locations.| -|4. |Fixed size at compile time.|Size can be changed at runtime.| -|5. |Efficient for simple data storage and retrieval.|Efficient for complex data storage and retrieval.| -|6. |Low-level data structures.|High-level data structures.| - -## Different Between Linear and Non-Linear Data Structures - -|No. |Linear Data Structures|Non-Linear Data Structures| -|----|-----------------------|-------------------------| -|1. |Data structures in which elements are arranged in a sequential manner.|Data structures in which elements are not arranged in a sequential manner.| -|2. |Examples: Array, Linked List, Stack, Queue.|Examples: Tree, Graph.| -|3. |Elements are stored in a linear sequence.|Elements are stored in a non-linear sequence.| -|4. |Efficient for simple data storage and retrieval.|Efficient for complex data storage and retrieval.| -|5. |Low-level data structures.|High-level data structures.| - -## Different Between Static and Dynamic Data Structures - -|No. |Static Data Structures|Dynamic Data Structures| -|----|----------------------|----------------------| -|1. |Data structures in which the size is fixed at compile time.|Data structures in which the size can be changed at runtime.| -|2. |Examples: Array.|Examples: Linked List, Stack, Queue.| -|3. |Size is determined at compile time.|Size can be changed at runtime.| -|4. |Efficient for fixed-size data storage and retrieval.|Efficient for variable-size data storage and retrieval.| -|5. |Low-level data structures.|High-level data structures.| - -## Different Between Mutable and Immutable Data Structures - -|No. |Mutable Data Structures|Immutable Data Structures| -|----|-----------------------|------------------------| -|1. |Data structures in which the data can be modified after creation.|Data structures in which the data cannot be modified after creation.| -|2. |Examples: Array, Linked List, Stack, Queue.|Examples: String, Tuple, Set, Map.| -|3. |Data can be changed after creation.|Data cannot be changed after creation.| -|4. |Efficient for data that needs to be modified frequently.|Efficient for data that needs to be shared and reused.| -|5. |Low-level data structures.|High-level data structures.| - -## Conclusion - -Data structures are the building blocks of computer science. They are the tools you'll use to build software systems. Understanding the different types of data structures and their applications is essential for designing efficient algorithms and solving complex problems. By learning data structures, you'll be able to represent data in a meaningful way, store and organize data in memory, and build software systems that are scalable, efficient, and reliable. \ No newline at end of file diff --git a/docs/dsa/dsa.md b/docs/dsa/dsa.md deleted file mode 100644 index 4f0fdce3e..000000000 --- a/docs/dsa/dsa.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -id: dsa -title: Data Structures and Algorithms -sidebar_label: Data Structures and Algorithms -sidebar_position: 1 -description: "Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms." -tags: [dsa, data-structures, algorithms, programming, computer-science, software-engineering, competitive-programming, interview-preparation, open-source, learning, teaching, problem-solving, performance, career-growth, understanding, competitive-programming, coding-competitions, open-source, building-systems, learning-new-technologies, programming-languages, tools, concepts, problem-solving, data-structures, algorithms, resources, books, websites, courses, youtube-channels, practice, interview-preparation, competitive-programming, community, contribute] ---- - -> Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms. - -## Introduction - -Data Structures and Algorithms are the fundamental concepts that every programmer must know. They are the tools you'll use to build software systems. Data Structures are a way of organizing and storing data so that it can be accessed and modified efficiently. Algorithms are a set of instructions to solve a problem or perform a task. - -## What is Algorithm? - -An algorithm is a set of instructions to solve a problem or perform a task. It is a step-by-step procedure that defines a set of actions to be executed in a certain order to get the desired output. - -### Quility of Good Algorithm - -- **Correctness**: An algorithm is correct if it produces the correct result for all instances of the problem it is designed to solve. -- **Efficiency**: An algorithm is efficient if it solves the problem within the resources (like time and space) available to it. -- **Simplicity**: An algorithm is simple if it is easy to understand and implement. -- **Optimality**: An algorithm is optimal if it produces the best result among all possible solutions for the given problem. -- **Scalability**: An algorithm is scalable if it can handle the input size efficiently. -- **Adaptability**: An algorithm is adaptable if it can be easily modified to solve a different problem. -- **Robustness**: An algorithm is robust if it can handle invalid input without crashing. -- **Maintainability**: An algorithm is maintainable if it can be easily modified and maintained. -- **Reusability**: An algorithm is reusable if it can be used in different programs. - -### Algorithm Examples - -- **Sorting Algorithms**: Bubble Sort, Selection Sort, Insertion Sort, Merge Sort, Quick Sort, Heap Sort, Radix Sort, Counting Sort, Bucket Sort, etc. -- **Searching Algorithms**: Linear Search, Binary Search, Jump Search, Interpolation Search, Exponential Search, etc. -- **Graph Algorithms**: Breadth-First Search (BFS), Depth-First Search (DFS), Dijkstra's Algorithm, Bellman-Ford Algorithm, Floyd-Warshall Algorithm, Prim's Algorithm, Kruskal's Algorithm, etc. -- **Dynamic Programming Algorithms**: Fibonacci Series, Longest Common Subsequence, Longest Increasing Subsequence, Knapsack Problem, Matrix Chain Multiplication, etc. -- **Greedy Algorithms**: Fractional Knapsack Problem, Job Sequencing Problem, Huffman Coding, Prim's Algorithm, Kruskal's Algorithm, etc. -- **Divide and Conquer Algorithms**: Binary Search, Merge Sort, Quick Sort, Strassen's Algorithm, etc. -- **Backtracking Algorithms**: N-Queens Problem, Sudoku Solver, Knight's Tour, Rat in a Maze, etc. -- **Branch and Bound Algorithms**: Traveling Salesman Problem, 0/1 Knapsack Problem, Job Assignment Problem, etc. -- **Randomized Algorithms**: Randomized Quick Sort, Randomized Selection, Las Vegas Algorithm, Monte Carlo Algorithm, etc. -- **Approximation Algorithms**: Traveling Salesman Problem, Knapsack Problem, Set Cover Problem, etc. - -## What is Data Structure? - -A data structure is a way of organizing and storing data so that it can be accessed and modified efficiently. It is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. - -![Data Structure](image.png) - -:::note -Data structures are the building blocks of computer science. They are the tools you'll use to build software systems. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. -::: - -### Types of Data Structures - -Data structures can be classified into two categories: - -```mermaid -graph TD - A[Data Structures] --> B[Primative Data Structures] - A[Data Structures] --> C[Non-Primative Data Structures] - - B[Primative Data Structures] --> D(Integer) - B[Primative Data Structures] --> EFloat - B[Primative Data Structures] --> F(Character) - B[Primative Data Structures] --> G(Boolean) - - C[Non-Primative Data Structures] --> H[Linear Data Structures] - C[Non-Primative Data Structures] --> I[Non-Linear Data Structures] - - H[Linear Data Structures] --> J[Static Data Structures] - H[Linear Data Structures] --> K[Dynamic Data Structures] - - J[Static Data Structures] --> L(Array) - - K[Dynamic Data Structures] --> M(Linked List) - K[Dynamic Data Structures] --> N(Stack) - K[Dynamic Data Structures] --> O(Queue) - - I[Non-Linear Data Structures] --> Q(Trees) - I[Non-Linear Data Structures] --> R(Graphs) - -``` - -1. **Primitive Data Structures**: These are the basic data structures that are directly operated upon by the machine instructions. They include Integer, Float, Character, Boolean, etc. -2. **Non-Primitive Data Structures**: These are the advanced data structures that are derived from primitive data structures. They include Linear Data Structures (Array, Linked List, Stack, Queue), Non-Linear Data Structures (Trees, Graphs), etc. - -### Data Structure Examples - -- **Array**: A collection of elements of the same data type stored in contiguous memory locations. -- **Linked List**: A collection of elements called nodes, where each node contains a data field and a reference (link) to the next node in the sequence. -- **Stack**: A collection of elements with two main operations: push (insert) and pop (delete). -- **Queue**: A collection of elements with two main operations: enqueue (insert) and dequeue (delete). -- **Tree**: A hierarchical data structure with a root node and subtrees of children nodes. -- **Graph**: A non-linear data structure consisting of nodes (vertices) and edges (connections between nodes). -- **Hash Table**: A data structure that stores key-value pairs and provides fast lookup of values based on keys. -- **Heap**: A specialized tree-based data structure that satisfies the heap property. - -## Why Learn Data Structures and Algorithms? - -Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. Here are some reasons why you should learn Data Structures and Algorithms: - -1. **Problem Solving**: Data Structures and Algorithms help you solve complex problems efficiently. -2. **Performance**: Data Structures and Algorithms help you write efficient code that runs faster and uses less memory. -3. **Understanding**: Data Structures and Algorithms help you understand how software systems work under the hood. -4. **Career Growth**: Data Structures and Algorithms are essential skills for software engineers, data scientists, machine learning engineers, and other tech professionals. -5. **Interview Preparation**: Data Structures and Algorithms are commonly asked in technical interviews for software engineering roles. -6. **Competitive Programming**: Data Structures and Algorithms are essential for competitive programming and coding competitions. -7. **Open Source**: Data Structures and Algorithms are used in open-source projects and libraries. -8. **Learning New Technologies**: Data Structures and Algorithms help you learn new programming languages, tools, and concepts. -9. **Building Systems**: Data Structures and Algorithms are the foundation of building software systems. -10. **Community**: Data Structures and Algorithms have a vibrant community of learners, educators, and practitioners. - -## Resources - -Here are some resources to help you learn and master Data Structures and Algorithms: - -1. **Books**: Introduction to Algorithms, Data Structures and Algorithms in Python, Algorithms, The Algorithm Design Manual, etc. -2. **Websites**: GeeksforGeeks, LeetCode, HackerRank, CodeSignal, CodeChef, TopCoder, etc. -3. **Courses**: Coursera, edX, Udemy, Khan Academy, MIT OpenCourseWare, Stanford Online, etc. -4. **YouTube Channels**: freeCodeCamp, HackerRank, GeeksforGeeks, mycodeschool, Abdul Bari, etc. -5. **Practice**: LeetCode, HackerRank, GeeksforGeeks, CodeChef, TopCoder, etc. - -## Conclusion - -Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms. Happy learning! \ No newline at end of file diff --git a/docs/dsa/graphs/_category_.json b/docs/dsa/graphs/_category_.json deleted file mode 100644 index 440450f74..000000000 --- a/docs/dsa/graphs/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Graphs", - "position": 14, - "link": { - "type": "generated-index", - "description": "Graphs are a data structure that represents a collection of interconnected nodes or vertices. They are commonly used in Data Structures and Algorithms (DSA) to model relationships between objects or entities." - } -} diff --git a/docs/dsa/graphs/graphs.md b/docs/dsa/graphs/graphs.md deleted file mode 100644 index a914f12e6..000000000 --- a/docs/dsa/graphs/graphs.md +++ /dev/null @@ -1,301 +0,0 @@ - - -# Graphs in Data Structures and Algorithms (DSA) - -Graphs in Data Structures and Algorithms (DSA) are a non-linear data structure that consists of a set of vertices (nodes) connected by edges. They are widely used to represent relationships between objects or entities. - -![alt text](image.png) - -## Implementing a Graph using an Adjacency Matrix - -To implement a graph, you can use various data structures such as an adjacency matrix or an adjacency list. - -An adjacency matrix is a 2D array where each cell represents the presence or absence of an edge between two vertices. It requires O(V^2) space, where V is the number of vertices. - -Here's an example of implementing a graph using an adjacency matrix in Python: - -```python -class Graph: - def __init__(self, num_vertices): - self.num_vertices = num_vertices - self.adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] - - def add_edge(self, src, dest): - self.adj_matrix[src][dest] = 1 - self.adj_matrix[dest][src] = 1 - - def remove_edge(self, src, dest): - self.adj_matrix[src][dest] = 0 - self.adj_matrix[dest][src] = 0 - - def print_graph(self): - for row in self.adj_matrix: - print(row) - -# Example usage: -g = Graph(4) -g.add_edge(0, 1) -g.add_edge(1, 2) -g.add_edge(2, 3) -g.print_graph() -``` - -Output: -```plaintext -[0, 1, 0, 0] -[1, 0, 1, 0] -[0, 1, 0, 1] -[0, 0, 1, 0] -``` - -## Implementing a Graph using an Adjacency List - -Another way to implement a graph is using an adjacency list. It is a collection of linked lists, where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. - -Here's an example of implementing a graph using an adjacency list in Python: - -```python -class Graph: - def __init__(self, num_vertices): - self.num_vertices = num_vertices - self.adj_list = [[] for _ in range(num_vertices)] - - def add_edge(self, src, dest): - self.adj_list[src].append(dest) - self.adj_list[dest].append(src) - - def remove_edge(self, src, dest): - self.adj_list[src].remove(dest) - self.adj_list[dest].remove(src) - - def print_graph(self): - for vertex, adj_vertices in enumerate(self.adj_list): - print(f"Vertex {vertex}: {adj_vertices}") - -# Example usage: -g = Graph(4) -g.add_edge(0, 1) -g.add_edge(1, 2) -g.add_edge(2, 3) -g.print_graph() -``` - -Output: -```plaintext -Vertex 0: [1] -Vertex 1: [0, 2] -Vertex 2: [1, 3] -Vertex 3: [2] -``` - -## Additional Operations on Graphs - -These are just basic operations on graphs. Depending on your requirements, you can perform various other operations like finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). - - -Graphs in Data Structures and Algorithms (DSA) are a non-linear data structure that consists of a set of vertices (nodes) connected by edges. They are widely used to represent relationships between objects or entities. - -To implement a graph, you can use various data structures such as an adjacency matrix or an adjacency list. - -An adjacency matrix is a 2D array where each cell represents the presence or absence of an edge between two vertices. It requires O(V^2) space, where V is the number of vertices. - -Here's an example of implementing a graph using an adjacency matrix in Python: - -```python -class Graph: - def __init__(self, num_vertices): - self.num_vertices = num_vertices - self.adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] - - def add_edge(self, src, dest): - self.adj_matrix[src][dest] = 1 - self.adj_matrix[dest][src] = 1 - - def remove_edge(self, src, dest): - self.adj_matrix[src][dest] = 0 - self.adj_matrix[dest][src] = 0 - - def print_graph(self): - for row in self.adj_matrix: - print(row) - -# Example usage: -g = Graph(4) -g.add_edge(0, 1) -g.add_edge(1, 2) -g.add_edge(2, 3) -g.print_graph() -``` - -Output: -``` -[0, 1, 0, 0] -[1, 0, 1, 0] -[0, 1, 0, 1] -[0, 0, 1, 0] -``` - -Another way to implement a graph is using an adjacency list. It is a collection of linked lists, where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. - -Here's an example of implementing a graph using an adjacency list in Python: - -```python -class Graph: - def __init__(self, num_vertices): - self.num_vertices = num_vertices - self.adj_list = [[] for _ in range(num_vertices)] - - def add_edge(self, src, dest): - self.adj_list[src].append(dest) - self.adj_list[dest].append(src) - - def remove_edge(self, src, dest): - self.adj_list[src].remove(dest) - self.adj_list[dest].remove(src) - - def print_graph(self): - for vertex, adj_vertices in enumerate(self.adj_list): - print(f"Vertex {vertex}: {adj_vertices}") - -# Example usage: -g = Graph(4) -g.add_edge(0, 1) -g.add_edge(1, 2) -g.add_edge(2, 3) -g.print_graph() -``` - -Output: -``` -Vertex 0: [1] -Vertex 1: [0, 2] -Vertex 2: [1, 3] -Vertex 3: [2] -``` - -These are just basic operations on graphs. Depending on your requirements, you can perform various other operations like finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). - -## Implementing a Graph in Java - -To implement a graph in Java, you can use similar approaches as in Python. Here's an example of implementing a graph using an adjacency matrix in Java: - -```java -public class Graph { - private int numVertices; - private int[][] adjMatrix; - - public Graph(int numVertices) { - this.numVertices = numVertices; - this.adjMatrix = new int[numVertices][numVertices]; - } - - public void addEdge(int src, int dest) { - adjMatrix[src][dest] = 1; - adjMatrix[dest][src] = 1; - } - - public void removeEdge(int src, int dest) { - adjMatrix[src][dest] = 0; - adjMatrix[dest][src] = 0; - } - - public void printGraph() { - for (int i = 0; i < numVertices; i++) { - for (int j = 0; j < numVertices; j++) { - System.out.print(adjMatrix[i][j] + " "); - } - System.out.println(); - } - } - - public static void main(String[] args) { - Graph g = new Graph(4); - g.addEdge(0, 1); - g.addEdge(1, 2); - g.addEdge(2, 3); - g.printGraph(); - } -} -``` - -Output: -``` -0 1 0 0 -1 0 1 0 -0 1 0 1 -0 0 1 0 -``` - -## Implementing a Graph in C++ - -Similarly, you can implement a graph in C++ using an adjacency matrix. Here's an example: - -```cpp -#include -#include - -using namespace std; - -class Graph { -private: - int numVertices; - vector> adjMatrix; - -public: - Graph(int numVertices) { - this->numVertices = numVertices; - this->adjMatrix.resize(numVertices, vector(numVertices, 0)); - } - - void addEdge(int src, int dest) { - adjMatrix[src][dest] = 1; - adjMatrix[dest][src] = 1; - } - - void removeEdge(int src, int dest) { - adjMatrix[src][dest] = 0; - adjMatrix[dest][src] = 0; - } - - void printGraph() { - for (int i = 0; i < numVertices; i++) { - for (int j = 0; j < numVertices; j++) { - cout << adjMatrix[i][j] << " "; - } - cout << endl; - } - } -}; - -int main() { - Graph g(4); - g.addEdge(0, 1); - g.addEdge(1, 2); - g.addEdge(2, 3); - g.printGraph(); - - return 0; -} -``` - -Output: -``` -0 1 0 0 -1 0 1 0 -0 1 0 1 -0 0 1 0 -``` - -Remember to adjust the number of vertices and edges according to your requirements. - -In conclusion, graphs are a fundamental data structure in Data Structures and Algorithms (DSA) that are used to represent relationships between objects or entities. They can be implemented using various data structures such as an adjacency matrix or an adjacency list. - -An adjacency matrix is a 2D array that represents the presence or absence of edges between vertices. It requires O(V^2) space, where V is the number of vertices. On the other hand, an adjacency list is a collection of linked lists where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. - -Both implementations have their own advantages and disadvantages. The choice of implementation depends on the specific requirements of the problem at hand. - -Additionally, there are various other operations that can be performed on graphs, such as finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). - -Graphs can also be implemented in other programming languages like Java and C++. The implementation follows similar approaches using either an adjacency matrix or an adjacency list. - -Overall, understanding graphs and their implementations is crucial for solving problems that involve relationships and connectivity between entities. diff --git a/docs/dsa/graphs/image.png b/docs/dsa/graphs/image.png deleted file mode 100644 index 6398c1d9867bf2cd8ad8ce16ec798d1d8d8b61d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64486 zcmce8Np$76*^xz+B4inYUtfR zoK_gYZRkhTa7PM@{{0>+4yRL_cp0|Ruwaayi$o+%_U~V^UKe~SGK5@s!K+^9t|!8$ z{=ujNR%uKIXnv?(4YZ=iVap85nVjgufxOp*t*Q=iJr%Q)kg2sMf z1uUk~okdY!P2p2SyIzvfRGx?bwO_aF;!-buo5xb6qd3glz}B!mT0!#)@!g`PseJYD zOrIlpV0D41X3}nfWWj$eg={vq(Asfz?~ic=;c|PC*K@{rh1B>i5L3tFyE1l?w!I= z0rGWcdeHDM2V(?IQHRjUSt*MDhnvA_JRE1X2oO*{fbOOvogm#(8FM%Ct(Y z(}L*Q({IbD5r1_v{0t}M-$Y+Dy#9ix*gCD>;_%Fu+-w3nDv6fLh-J6k9mj(qlA*_m zE6_75+5Apn6nozuokn?JV?l`xNAjYVA+gN!B=hH2Yw3;Uo9nJZq)`RK>xxWwBTe1h z>c%&h1(g#RLk7dEw>RkTQ{D4Kr~C9eFJ)krM5aoIUE}qudzj9pbXa?*p*%cq@IKy= zL?EQHp@GH+ltkrDe?*I@jfd;%l(Y2IEQt+`83u~nV!qnIvoRHLZ84<#jC3za(Tn+S%1 zL#`45`x*F(LV>zr1z9(8;q42)#9pkRxPjHE71Zt&F+pFJgtS{yB_*AD!P+&2JL>F; zPE=TBTvi0(!OEwKOt)iuo)y0>-_$A{-F9!*=g_frT~NJe>_;86{*zEKIINzJn|q)3 zsw?2zva@S)n0fc%=TVyn4<6u$O1ZhY>DAkpm6YTibP7Es&_UISSUsDZoD}%&x%mAZ zTdE=xIi9+~`mPF-MlJiFW6?{GyS>@}^XJdn z+FF0QfUK-6GZWLw$_hg~Z0~}Cg0ix*nwpxHmdkiqnt1a^$$gha*MGAyFfp|&E~Fak zUQ>8xVgA7ll^PH^{E;Q*~Y0T=F^a?!A9mG3f}k@d@$Wfc|S z%Q&_qzfmeNq}Cj+j~!N5SMj?hnmu-JtB9x>8v2XhyA>j+sX6Dl7=5@pz!s@)WORMG z8_?F&G{uFdfFFWL!PwJ}ii#rR&=-WynV+9uTeIS&c*j^=TU*=M*!by_`}C)m!tPrv zoSZ%6bDzBqRj&W4z;!*&RbBAWPbB5;4*kp6cMyn*ndN)XTU}kfIbLzS7cQ>INJJ36 z*tnYIb9J^lK9m;tDk(YndNbg%qJ0RHfJ)GL>2=q_t8gAXGbgA0QEek?N=m)w&yfS; zdB}R4_|wba<6Bz%`jQ?jFE88I`y7ddb7y5``7cHblp8cB^;<}CXlZIDE%U8va*c&P{z!cYaULnnFlm>xDA+vvdunQGcGf^oui58h=hrXw9D|9i zRMGvz#5*K1k34o}IQ{pde8mWHKdx~V4YT&~^f+m1YBsxXPt{lsz~>p4lPNpJ3E*mq zyy4#3d;IvZL+jZ}#BFB9VOK#aSUp&8dmEcP7c4UoF0Q@rY!!?|*c0s}GS7FR#ybk^ zRj~Kny?ZxS?A+?*%Li+Hc`RXF3uZkrEyq)~3yu@Z&g)IBFQ-2pA0PkgrQkX%EG+!( zwVIj8ta5yE!pYA5@#Dw#AZ{fWZ}0Pqv%?PK%1@t;L&*#UUDs3@;spb)F7_9Dc0IBy zc_c~l@}>Fg+ves52P-WHvZNXI;aonSZBE*;vRH!N*8<@rWg`Qq$A_O%C`U!-pxVsBm&{bXqTHE$*KV4#v@8iJ$eVe6pK7 zSV~mk7ZAu6_SoqR#m&#pAMrfk)=HyGDV!V~CBZ_ou(agVZ{QLU**f`W{=AizS=}tC zeDm<|u;TLp&O|5{y{M=tq>>O}O-&OYF{eKvc`T(xsl)4kJw+fwwzsz-OnuJRi~7EQ zk9;#vz8D`LPiEx151$p8Czqh{BA-R-`SaAiWw@h+il1GDE`JK|em)x0gJsH0O_eVi z4#hkD`%lhx~}F~`>3x8 z{T9!Pi4_Mm?!W6>b~R98BwActOy)44ASd^Pu&1P?lu-+LpiBH!Di$ZDlu@1tjXtsW z$IqWX`}@s#?hFPoGc)&ecW-QNK8gwUK{^_+f~b*YjPi~8_MV=n8>6KVKQ?ttiM>@-Rlk4#PD)C0!;n>b3wyoo z^iPz4!*4~V#K=6Xp!p+j88yYC;WJ;FziR~r_ns$hZf+WIjN1$$N%L0{wPT<@P8(S5 z=tTGakjKKGj?ZCIKYce|jwAUYUYA8phi<<`O_&LBd8!;E&%=ig`S_0d9sGyaU4znC zu~69grQipH>z^ofpA6T`w{)F#EpW-jl$59kW4wFGr_}6yv;kr03|TWbH`h~ypl4#+ zef|XYn@1kY_g}w$O-$%`cnIJ@x`$78b(ui*%nE;qRB(RjAEL^UjJk>TL*C{C37TXA zW6r~@)ou5Ge$kicOk{7W80D*U@T8T6dIV!?blCG)I@3cXIapZ(_1-Z;&WF3APyj2! z#KZ(hvU+msr1eC!Xc#*==TnZW5OwquO-*zu*XG%E*K_|uqDqHXFEQ!=Uj5s>NnfAc zw{_V`Q6GGVnoC6>pTLu<$dj6pn)+N{KO;N4qN3u&Q$%Cje}Z_GGdDwrCEq#?djp-c>JOA8C8cM4@6KT0#e?kYEG%j&l%DlBY0Y1!SLs>3a0Ke{HJVhCI( zB_sQHe!jB0%1ZX*#}EBhUoY62PzI+uA!%iKt)#wt_s)(V_d91x3oaQ4I|oOQOfh8U z@^XT526>{1n(9frmoHyxYLd)gbPJM39i5!0C@VWtVJhrwZEY1iO^%^@XLxqD#iT1NEDS>u0p~zQN*Wd(4w<2AVK16e;Me-!mHu>(-QU|M z|8O&hDkrqGw0`^Sit0>|kdVOV86$GSG~QGVtZuHY<=6hn?<=;|sk678ur>i@K<1FVshM4H}@ad7KijFj23kOS@5!;6wZ*E*pKV=Jq**4sjvJCNZxd%J0 zLXc{f`;sj!EpJH~R@B$k)m2yj;#E?;4t(J!HaAwL$HvCiK}g{LfD2LaFm=7OXdhK% zK#!etUb+O6xErrQzr0MZKIkVKmK1+_W_EUVMh0GZS6^RWWZuPTk2pc7)ZA&efblNo zFwP9)YlkosPm!#ya6%WV`jzclQodqyP->C81BZr&j4u9=X;&CVOEV}JxeOO7@$vE9 zyLYd{7-1#?f92vrdS>f%bEv5i$M)2mw{R(6C{9!kelt%iWbcET2f;IGnJwyjTKUy< zh!=ka(!0*{=Z_%6Pu5sM&Al7{4RFQx?>Ga8@YAKGxb9NtoCstcB&A_0YU&oZ&9Q?6 z9^VLVWkw=0PQ#3>EPHF~T-$2MW1l}$eXebH)j&Iqz1|mxEaz@+UQk_qP+XKH71c#2`Q2#(s;^9M~D2*om>X&fx}5VcPlFvDgw;l4!(L2-}B;ldwTctp|XL2fwgt<@cR2)=E{d^w6~&#pU)v-W-qLk9?d`?*8le2 zTP11X<}j`6qoF`?_s|culMFyS@zZ6qICY3HZNZ; zdl{;|W!TJ`wclM|KkE{|cud~J=OCZ(zPg&nc%!wo6_)eMqEiwr&-$uJ8 zk3gf##HZvJIbX}asmaP2g2+3x-hwd~R^PAPlkw3}K3-nCsaorQ$J>qi<&BMZ=rx`_L*3EcIOry4i~Qr> zyerkWsSLb~`=S4S=E&K@uKHYv&7)wTVuD!noyBq9R)e21$W7JYVh*6}b$xJwz2 z5Z#;Ct}0X#ownq>U9dd^Ih0~aX@c>CQ@d$Z?Wa#r<0&oTX4d=jH%u`P$!jtHMO?0v$M9w z#t06Sm@h~+OiRBxd`@OPrl+T~{f?jOP>%Q^Ydw_u1{d7^!LmvRexlxC?y5fEUp>@C zn%HbXr#z?_)z#{1#96D7Dn(;{8!dr8TEw9Ulq4nj1Ue}!Mt1MYl9GAXthBTyz|%`h z?`Q2DY;6IpO}}H){+TVFEywuV|KB!jntzx6m6>WjEOL6cZ{KdzCot28pcolJvzL9{ ziQ0YQ-C|$g4A3RLA1X4PDftrxmpyZ+(N!p>+*=q4cr{NtCGQ)f;M{-{N5^o>f5m zyGnUiH@EGHDl>n7e=n~`G_eB%1G4!;X=xPqvtGS__5t(bV_J=Z0`9E8Ph%Dndf!iP z)6mie{M)X_#KcVOeLt`&>^R@_%ka0(BeMa_8{)6nwmrcg3pqk zH3^J?`TU8!s?*#g*6U(wr+Q6u#PTO6K0@R#8(5BR4OKFqe=D>u|M(Hfr}IbPU21|J z$a2S9lZS`d*Hm^)fExEIUFSlP6gO@KiO)K;7yE>-o&luOxQ~uo(%ATj7^lO_*!z_{ zgmXDyjH;@kb=Sze27f&E#V?rFPuRT!=9A@^5=ntXscJ7bBu_+UvxFtiV<8|UWKQgT z!SjfR$9d&P>TI)zwuZ)gb=L0@IX!{l_K?~WdmCnVp!IO@+th<*SYKcN$Fg%Wrx6V$ zCG1noXd(-e*U_OdpQO-fKRr{Olz5dVW|cBYcWb7>$;{Ca5igYsQ84|Hcgx89-e5v+GS{4!lE1#VGm4qMkx`q&Te^;A7H8Weh zT*2UI@4*i|MH@1+{dFnZ#@nLuItuBhI&r8sI-k-r;;-wjq#Gk#^2Tj%%~LnjHl^i33y!x|e!#^{Hp#g#4pDHM{&-?~Z5&Z-=7+<`+Cu2j} zn2Air$=-ek5CaeObtTK-g2Qc~l?QAUXuh2%#Nj%tR-e21Dk z6l-IESqM)nv!o>M1Ev{P5aH|gxJNxsR7)ZgcAo}J`(LRhDi>7%7MEjmHGqr*?Wmot z?Z3at`88{acfO7FCSU8UhCCv?WiWq`$8CbJxlIsmy`xHpKyu1jQ6kl)`M^{@i#g91 zG|k4!iX5!SPAcs5=S!XKIGsq84ZRV&qmdZ@h0Y;S4CYXAOAC-ky$g;K4U<29;7y=e zQ}F4`aT>LX@bI9JE(0sn-TkC=ve=%9`*#IE zraz_5UtiQUZD4*}nudJe>POiPEGiI&<;okUXzIUhnvc(W$eh>0$3{*YUd^b+MQyta z3(E7P{#aUiVPs^)le*;93amwLF0uxW&?XCW&;~wY7e(yPUM+Cyk1Z zjV)4VeJxQ~9tJO;n-domE!*_=^768^EuFOw&q*B{8v_HWD=87m{3%5%#LgJU zceQ$bk==IsmD98;g(dRn=qNKY6YiqO0NFVvPH}YP0Ik_{8>PawqhNbteo0Bc1?swm zTM6I!X{d=<`4gj4eZnLJcei~#<*@~Vup>*1hvxu_#RU)=VJ48VZ}^$~d{kl^iW(&| zDSCAqQ&SZ7VA3e`&)n7Q!D9CH(;Wjeu|2^Z^R0gWo;-Qtf3Zjll>p8l`(lY1SPX9< zOS1jX*CFKgw4A5_(Zg=+vXj5yTmF)Vj`T%RY2KI`bKHh05y+98TfvBM1P~RJ6coVe zwkyHK7&kaI>ff*~K%WB3Nfhw~!Wh;T(yy3nQpMfmq4bcMcV}l_d(^PZzo=qGeU39k zyojpx!^6UW?g6G|trpeA|K-c=L=~~d+STw4GDY=o~eW`;k@ z`$d(#rUk|bX_P$aM=^(x$KY06rFrmHL3%^<8N@)geVPRZ?CXM^c zu0kHre84t>R=#1ib4&A7;GIIIklRM=^=WJ_V{G4Y(0gh+*$`D(*&bZZ&#G!_$du{h zn|>R`MZh-jDy65Tfl4u6VFaC|i2ubY^wB4~bJuJ6vECvyj+G)8r+mxO6GXX=P^|;W zg|b#fX$U`ieya^GmdJclQj!I0^os-~Py#p+#?ipZo%TRfXchpY!;Js{?dRtQEpA-< zKc{E~neGM%akvg0c2X=fT|GU>4<=rRB5mee>^ zYV~V2A&1_2x8>yb(dIZ%Skk6hVt!4q3FbS3fu>wbdZ71Fi%nN^CYNPoeUX4K8WV71 z93_F|Bh|n#glWwrU>6r)zAdx73O{`!oz-)QwwD{py>Obu^v7D6)nR|~w8^W*(DS!Z z8TWoZZUpWA1%Pk5YDs+$rbOf-Oeq#}JQ^X_HRwO5Dos%FP@-K}q}WM)0D$wP;)O&7 z4h63;?EqSVcE{K^oYL08Az&et3=lZ5uHD_;oePfaq|KiDe}H5M+R*X*?>cjqClv6W zbyuE8`wQ=Gcl^Rb{uM+gArv^gj%G_H{j|MYuH_!@hD-uu{WLHW8_tc!y^|iC-sPj5paqvG(myM-)@WVgeJhka3uF{oE9l@?;nclNte!RQD z{7uE|oLg#-=Ul#K{+#{(I)~+8*l`np1}}w-hpo#i>cIuaEoiK#=dNye%=T|s^vg01 z&k<;)qiG5SIT-iIStMy{b<2zy;5V9BSp=F~bU5Sdot>TY^K%H6o2>wBXq|4^nXg!? zqG6M(HSjWDB5sEh(q0K%ugslZUWL!>Uf6z*7zs12pT@PFzDI;Dr^taP5&TDuBY87g z;J1#B4pLxMb8|D06SHM1m`^w14tqm_Fi8SZz!y3>2wmE~E13fF%Hn+yaX_VK2j&f> zK#AU!jgg42ij2ge+k}*z+=p%=G!E3e_mPd6S$-Z%?+fS&gC}sgMWMHuyI2u`hTaFl zT42ui5I{oQarVF}bWPWnZPzD8|E9+MuTKKn-oJmLRI|dI{=IT;PlRyv9^H{}s^YKt z20+x613?RQT+O%i^X4&}1gYGcTPi31Tz(91Di7Ww?D&mP#{0yDCB!P^-%qAtW%>Tr zN@;WvukU%joC{(W`{IvtBPl586fZN7a)D*m2l3t&{-NyquhF-CqxCLQV9A z4!ZLox0CJd;j3-TS^ULty9`+BfPK!Zuiw7O<=(oZyyM;sedo-?gq$YJgrAJsU+)%7 zLYggLd3JZjy$+UuvV&5Ekm`Lw6twg(^#`PzN|P>(@GfMNnv>GiFM|8pukr@1PE}aa z@creRX9=X`Z7H$<98(cY+kFBx28tnc@2{7F-gP_adw6*G_y}vbr(|Sgq^Ad0Kc&sY zw{}Je;jv0{-~aO!G%`DW+nPy`y696W6tnlbAfeNUcsc?)Ac|lIsHvz3T*T|f2f78S zrG@3?KUWW5PSvje`5I;UGvf{=W$;;3b+t3(PC%>lMp*s8!EM(WX z6s+BNv8O_rhHX@&x+ISpgxsquFE+ws)N|``{utxfek?mIl|oKU@@G+OW`Ao5srwQ$ zU=Pz6C!~qyrj;Qlmt!P?&cLDV@))vlZY5R=a>^1fO}kB95Xa}*TC`lXPz+hsgb%g^ zB!V9w#kjyqhUWu@Z-?2H#xg`aRK6H} z9UW(l>9v(JGxUKC%PJ)^Q`BvPn32FXjUOsE2q#3EEx5yj(Jd=zLPmR3Q~dMXzP3@ z+Myt@=Pym{Hm$h-1@H+%9y|IX zG~#X>8Xg`eH~FvgH(@B_e4`Zs!kcUmp_Z=IHo+Ps7X{rGVPO8&py zwp~X-;09=;zFJsVC})XGj*YFH{G(snFuD81$X1y>;|t*HWM>b93pj z456@s07_0vE9=pWwblgS31oU+3iM~xo}Lb~P3Q$U?M$i-Bi7#R-GbzJon}&Jo-CCj zf`Xm^HJ}>B?ogkQu=~4svDAXg}Jb zztHm>M?BXg->+Z!s9d1VHYinsR(*h0?wZqj03{~>>J3U_#g2t{JJ9u^E193io8vI z%1D$}sFsTE>r$+-0eci#hFoK+xR^EVqR5&eB|CS7MJ_qapsj0b#?`#YaPuQ?f-a2jV?gngC^<4Oi&%C4`_=Tp! zau4ZAH(*e23yT#<;q4^=ZlFT=sK(zOVaFw6=*I&Bg7d+H*;YSc;#WXOukY@H0`0;@ z{{Hs^jkqF3A7&B-_tNRW+~#eq98a|O)?Ky?A#dNk8%p^i#|X&}#Yx+$?1e01cuat= zyq9(J3(c<|POl9@&#!n(0(Gl!1JGw#b7I6r=%T+A&KSIZ(cUm*Y72=9QZN-2RYppR zs^$^wt$8erv*evSBc~ER<;W&w_Fg(~YwNv}^A^LnfsSz(%1l*U*{+}ax$GQgjH4&` zAg;r8HC$O4&E@KbH+#+=X$swmi_1fN%hZgF&#vo4BZ%@3ACLy{wzV}U4r4!kdfl_Q z;0TPXr@K4wiX?@)xzP^&TNXH3tE($3-abAc{c|KkM1mp$0@)vJ<6>3L5ca+ttKhDE zV8bDC4w_=mzTEX{)3KFAC@3fZS&X+)lE)IKd4M#V^Om*!2)Pdluh8dsD{v}Cb;{ks zqOhrng2=(-Fb9=#h5(dU|@4`pTN4(hO=7)C(q0?M0K-E- zK!Ab4?4|eR3}I8b5da?`wuElm%{CqFEp!3ikig*@l9WLD9@Vp0(RzM=#EX`a658-! zPv?@CLyR(x!h_^wAIR5Sh5W>5(Hz@d{M`Q`-cj)>1y}Qe?muKje9j^fZ&OmPTQ&yl z9dII&te>E>4rccf_o5{_g|4B!UQbI4L)1N|lBAXh-kOq@HugzAB&CTaH(OxmJ;klx zQP?~Q`D}NNOrSS=vg2P>P`XWDnF>v;9KEKd8^}tgrg^!!l1b*e$>{`SA^7GzsgT?% zH$eS{8>yq!vLtQ_Y+OISw|68}bg%1z z{IE$z+E_Q-%fBd$4B;h=eg*#c-98&mPC z)5S`)VSQcQRcgZvP&7|ZPl59S2Med+=LXyHa`;CqjU68D!AS8l@J@u8prHhUo)++L zdM?a#M}}WEMLjNu=g}kV)G~P6^Y7ZN>YAGG`YmoppuO#eOs#5z{5qk@9KQ>49#VwF zxSQ3Tb5@yMx0pckyND`iP=$nqL}*k%I|CJqffBL4ZV9Td&()i&HtDO`q9CY^eC^%%?O zXOp1J5Gq}M2a{Hf7!~eSQ67Y*v;7g2wDh3t-Eqw+lxT0-v|P zPw86*>T|0Uu35S086pJ!+~0SydZ4jJ%d&+cXF#ig9$Y#7G?_!vq0pFXVr&fKYn3F< zD<4#Pl=s;6)3ak^T84)9HIvXlftwSgTI)1$at0h*2Dl$A$zu%$2Hi4l3|F;D@BdU; z2~C?dR$%S)Hk3vXkH66yYW#9@OFOn1HdK3$6xIMX z$%fw8Q=P;zeO&=h@`s?;h9!~03Q?CVlo;A%NpL(o6XCrZbl_A{0&q%}){odG^y}h2 zI541eNnY{1c6L=J)y1%ipY8m#@_|ml`o)W-ciM(tP^)F1JfY)4YI2g4Ce8p+?>E#o zZ*Pjczo>x{YJ(()RlX}BSfksyp~WE8I5=o)l1$AHNqdB-3Q~!ICfvu_=DRb~n3{U$ z^bExC{~Dfx0`wqVh&!XpQ6td(I*k64u%>E@xjw}wiSa4jPS}uEn`sNUhQR8e1^=xh zM0jB#6HBGs|qpnTn{} zP4~b0(}_v|On4im74B|smqWCdL(RLbH)Nh9a}sD{4YT&TW4!MapiRCyGP>r|z-%W6 zV*}-va0cb~wpm)kf%haAQ=>*`J#lNBMP9b5$qCV!QvoLcsx1T!p!KekAQ_$nQxPKWQaEkfiJio+7UcPrRR@{GW zklv;{ROc@=T@H|5fM6`v_-T5WgQNPxB2~ZxA}^S0&sm~v!d;4r+JqE zA0O;r{R0EcMA*=XR?vjqBEZmFJ-1<+;8hy_SYGbGl4=Q@8WS@!efj3x)pWqW(F*^g zUgm6YBmK?IQCd{-KS%`ok&}%Lj{Vh1!1al(t*uE|Fy9>=LKF-WPY9X6XL*;Eo>@Ra zLvjXXdLoLm)hcZTlwv@?*U=8Xs4O(U38W`p)ue=t{qipfeUF{s&r9LAT{nKUM|eGG zUr#IOIA3aXxsm%gTq+kK*T97d9ukl*uCD-l2OYlvPgD+nhqUgtmTAUm>RKnSX#0ZW z(%~6IFzw}VT zA`eM5ATAHx!FVJE!l@F_Zvy~tU#ydSzPQ+C!~g(6K_B`h=T{ z{#|mi06#wl3UVbzdCdk8TOh)NvInnt`wBo7l7Ry_+Z?V|902GyIxTjC?FEVqz-Va( zr}bY2z`cSCPfA1K>C-+S19RBUY~CUGz2L?S{fygw{K&h`94Q9#dUxZy&_||>;B=wYajZIiwJOI)=>?0{T z7UB&!c6JK!^NZsH5h#9dAx%IBpYK#H?oxbK=y_cP=g5!y7++?JU3>+KYtiRi0$O4dL(5lTU*8C)FG`+xA>fZ z3}|&9dDg{aG?1<)zobYD3$33%eF__FhxU4( z_Hp;E<&MrG;KT>S{%ygkpaj0^TUKC71m6c04b7Fq^>!QRB5tm(5|thd@#NIhqCi?N zEis~%QbR)zI!fGvY>N<~=BMnv<=aHX`baN-0WyKhgj@OT+v_|QFp7=Y@T8(0-eLa? zvc%(X0>8^mqus47v^f^VLfDB$t-g0~1|24=3!sPkpvlz2@-bk-z)x%rE(s+NNuQc` z^8DO;VmkL+e3?2;s@*ALV0GAyx>gRs*xb|vjzE;Mt+5J}J|}&MBtY3+3yyH2l$6bW z|BhV-L@}2g@w(u=GqbWVSV?fu1gQw*d`Z!ATU)PgJTjhp#_`gv4Wx~aaN%!)fzQCU$@f)w*8y+drt zxp8WG`eX}?IRiA6_laBl;FLne=0#i& z#y{5_1@8VPr+{LAeogXKJTTMA*}1y4)qk-&8gf1G&EYAS&9gMoPe5bBqn8HNmnOFB z6)252Jimbdq5vSi_HaXTHK2_iE=i|+7a0hbqIVp%P9u$eqP;6qXpMmq2v{^GCI%LP zR><{3US5zzf@I2H*a7x)t@!Q*pzH;D`5aAgDDI)Kk%##GJvmuD^g@t$Y)_fjOnz9w zdKt4YZwIx^qWI)+rqKoVU?pX64=PHfNvY9c2Po={^2U<4Wp0(Mz)D>H+`ae-r3;EQ zq-a1M#PaV8uh@frSSKH-Bgiz!vzIp%l;|a!RKlK?=FbB`w1{1L(vjAb{enai0%Jej$n(c{&7C zk_j;NyqNt(Iw})NBdrFxTh$HaizPY7L`XZHYzs1+Azb&?`ub#*8Ri#_G6IbIc75`q zL^4gd5B!yv^C3g+23-FGoDgtc6oAv83|1qt>>|yF?N4!ecEQbZ{Nv#OsAfSWYAjjL z`l#`Q?Xp9u^{pFH808^FR8|CUS^#DT6M?&4q2Vq}Db&`!?OT?3VuWOqK87JtvwF($>G@tMK!_27Q@}E%YPlsDCTBbeX_N7$RVbIrlT`67hi6x zNK7LEH*RRCJiIth0JjvqY%aKi&NZiKObAp#(Al96)6}dBxV{3`8L>PTL5mTA7h|NW z3z-^3lwUPBm5GZq3e+2nsVi_kN^ExmOayzUme$zhWFwH=&@d+?5Md!$@s2rM6CgH0 zLBL?R19&c{9j&gIBpNJdP=P|-;FR$EnkAkTmI*Ex0kDN_rjti^dx$38xR*$Vn;cK< zc)|>Bj|eoiz@CAV7W{w1>%3pYL#1+|_Xk=VaLrme7WaEzF8?Epm3>e5otZm0p*J@5 zh=>RfqQPIWylgI*+qH1hWC5&L+6MVbn2G>FUrZpGJ+ka9ncASwp$&(DK?~EvJfFp; zg-_Yw$OKk(Xh`kDoS3L6*hq72p2*5#P6&N+n1k9%;7>0kk3*T4^!BZ*hX;5@G&Sq( zCe?MyQ;vJ{at}ao4!I=qKK_+*3}IgZMt*P$(cOKVieWrG>XX&C3vVZI|T`7vly!f4ZDegY8n&Mi3fH-R-2>7LLBV3Cgk1V4u#t&lo{r>v+s%XZVu85 zFu*T()*S^QQ9!k|4j~J<{n(yVry=sQzpa=c`_;R5B$dnuBD8oI9bB02$mq!7@`9h- z?c-VE1Uf2vKsJ+KrlU9Xn?=pwPjuaf!Kz+u9Qjl|@ZmAh(d$hF>JPEVYKOVs@Z)JS z#6$b``boZ4X&vyaB_%k9434TMQZl?0V4p+~5gMp_Wr5`u1MZG! z;G16CiBm43$3Wb#k=%*`1K`V6>)$f*)Mnsj^7VyDqi?SOFv^IYMV9mt|D?j=gf|3A zg6=`*3Wz@QjR2P1JXDAAkJMfrdfVCIDNw-SWjiIc>zFxp}L(+ubGxfp=Up z+a0>N+IQu%amx)Sa8sPoG7t>bCTfze&2v3G`*m)6QVp(4wC0#IMJ`EC8BjQn)Agma zqR$H={#f}TQ?SdB7@pr*B0wZ95Omx_fB(dQ%C%v>qV%rZSZ(d#_i0s`^Cl$EN^5D*WtUB*v?YSQkEt?fkXP$IL@LS#ixG6k*Kx9 zW4c^fYr)0v(<_POeaL`P+b#tQ6tFYtK$p~hGa zjZMx|PaTEOwcmz9Z<|3Sp79mRENpt<$8z7UTwZ158p%$o2Tgqt)XX@h&&^Wx&T7Af z@c8;uFi_{t8zn+{?ottkpd1XqStA z`MAQ6k&ra4XGC}e;w34~nca^i~ z&4o;A^QQh9Zk2zlBWLClqe{ugT9j9_;fS~fkMmGZ4`sc&GjgLp|4%xEe|=le`esM!YQBSV};jL zCmk4PXL9PcKU)U={MuAGP;r!zk{has9sL$jXiX&b>W+B8qkVtkL!{l@H7Oa(s~2Q>tG<=>-`kg@!;HA;#X?Fc z>@nn4T^g!X*t0j92&SR(f;okPR*P-?zc(^W3A1mpJ5KQAGUdXRB%&QcFm}x)%L+Q(<^h}LdK4Cs& zk9nAPo%`>Pl9FFt^FCRtQ6Gl6-uQ}fVxg$g%>7h2;4(M2+}i1PQOWPIBTog(DM zFu|l}jAR(3T~>I*&F-nQuqQdpE10m@z`(|+iYNN;l79K^zkMDUI$aXnc`TzX_-F<- z&ia;R2c{qi7hm@T7hcw?n*oe3Ih!wZBUzH7A)96NEkh<4IDA_ec)-$+9n|hb^)1X1 zBW7_8IkZG5k@OBTk8j74blfMrE~riMaxZ{ZH8+Q`8=Rnd=SEPR`j!vQd;=xgmz|N7 zkXTtFt7~h)%U`^w^Gy}Zmo|0a@MxZGCE%1x2tlM}X9G6+zIy2RFo+KD9H^rIoJ^S# zQ!_KsP0IG180D*PhF0Ju>HS)AI^f-*=LP$ba?t`f{A@lOIt;Z$+zfL9@gBJQQOj0d zKB8w4d1%74iaad7Z`rg;M}!8P`f#FYg^#FWps7)1SvvC0RA#QcxJ0wOnVlxA`|z3@ zsPGnmUN8y*;2yd>pb5;X$a|bX=Gr|0?f^PofMuD&9%G}UfgjAtyT5$-0`odN{QQO1 z6soc8eSd#Im9DLIg+>FoIv@qzoBjGJ=e@+J2-*&R3Ij{6qpORe1%oJnZZ2+oPZejk zm4*Qo0jpNm+be%R8MzL$W$?SyOj3Y=>g^30vjGR$U?LqBh$q=s>)G(bO2e*=`YPg= zf1#g+S%jfpn4r1Zr@iJTil76eI9M|v)@;^8phmoK2ZjQ`J$z%Rhk+zMJ{b7OV~GTt z*vF3`Q_nRxEdnWWpN%bWGd1p;VEh6u9c54gE`>Qqax?G?H!Kf;s%%jo(zgnd2pCHy z%z56dUk<1)H@9Q%U&|c0)2Vvao5Xl|T|v!`BI5+~%r~l+JpiWk(c$64t(pP*sak9+ zr@BKEFRwFTR&O+6n0l&&(JYuYQ4u?P0i->>w5F!9p7A{yH4t%bmI9EiS}w`XZDJiD zDFJij2Z>8I3atS=-HZwXe}x5lZ8zL3 z7`ceZd(92XUjuO2;Gg?jlYNQDUgC&~m0PM^!4Lvt0n%!|V43;QlA!eHCK801H<~!G zQ0N)oDHt?5F9%$}B*@K+7=<0BPr-Tpu(R{0MNMR$KFA*?CMG94qDE)mwOtLs1e2+J zV^A%{4w~Qhl!zE}0~f0uKV|fj0f-qe6?=*Rf8adNU=e zX}W;`I_oiaIac2)g9Q-`^Dx9FU0l*?Z=T#}{xG$r1ha(D=US(gltf4eA$SA?P6)5} z2*LjGuY=Hk4^}(q3Y-#&y^JhdIS0YKn5!Wj;E`EuxWS|3Fw+f0(|s5IbTF80WnWHa zL;ukYRG0Ik*q%jKp_@TwzD(sJ^_%H4=onyFcTN(EHPW#LQb^Uuod4Su4h6Z%#kxU$Q#y!B`GeCm?0Ze;KDxvp?f1tAMpXFpNdVN<8>M{8WCOHUlO*Z>Xv zjVTHyKj~1i#r)30#V;0MoCJo;L}=O|?twJ|R!g1}$DUzc%lmr%IffB`k5dBUy+rw# zMGZ}KGW>x<5K2Iw0f!0Qw%Fz0;p+{f%TnN_Dy@MIfM5XE1WaJaCs?^7;E5Aq;s5+_ zQMv^)l_5DC1Ak#0aT_hSrsfb+{Iml|Dds+&Z{8sYFe}tg1BnGOpY5~L2(2Xem!$SF zt>PC2)B9JT$xwmZy6k+p0<7lzyfH5YJY=BI8r)(!?1d~i@A{A+$iVRegK^-XnW%(* z)fpNQv>!lBE-Wm>#1LeyYHAjU=~Jj-DF}5>fL!S-cDgx~FAH>cA(-5{yWz0_|IKKz zMt(1x6qfj&R@hsu_?Rs4C3kl$F@|E09)mRX@b(^C~^Yipawl1}M?Jk@_qO})T-&ukz@Y#*B_--qiiUx^g5N_BYQ(I}K?=C0)N-wF4|tVe zrW2ZDsEZ@+p2si(DUL?=Xy#ql0zzg8MnUvBo+rVC%$Lpf{@@X87GAP;&Hqtz!MMQ+ zlA*ykIQ3+Ppi)224^pI0y3+xbfF6Bs1jyyiP82LbI_#Z^s;*_{z{HNtqbWQ79PD|X z$~t5(l3x9skRZ*W1xFD3K==;+mD#uK+(<=_c3%m6mT~HmPi~{pr}qP`n-2MEQ82t~ z2s-EC;b+hqGQ)*{@f(P*zq)JoZv-+hUlV1}OL*;j&T!#11mw7tj^cDnzHY^^teUmQ zEWM}7s3Z%TxiLPPj3J;KMKxlBakwfu2oB|>Wti1o<-9)Ngu6$7gua6_GaSmwYxkXd zHWg~xLvRbhIOzSzPNy4-bVUV}t++{xDxFu0#-YPpcEh}2EENo3l^;Ub%c#MKn^-nx zozwqJkpnYM)dNqxXqz+A)7v~ednFMlhD8tQ0lIQk;;+2@K%qcS3!~&P*ElxDFDUqd zMFF^Bkjx?Kqk^)>e_RKDc&tVYW23*;d09S-3;=Ng*B0(XRb-tuYY(%~VCQgXIZB$_ zC6kF?^->xpiU^tBZgtID9S_PdyY%Unig8n=*?+q}5YqH`LckWEK1q6U% z0)#yaF%cRv4PrK({+a9a4F;#dd6o0t8Uz9b82vfSo7;7;w|5t$3Nz7RPm*Iih%&k` z_4lV)s(@5@Mp?}c1zYss+g*s#K_mJ|2DAOtAK8BJjLDzoh3;F|a+wiak?(QKgS5Hr!akscOmLb(1 z?)S+^oWXL!02jbU7aEElhy0R1eR!SyhbzW%GQt_Y2qH%37t2Z#3mE&ZV`c8FyYRn; z>xOB{mg?%xLm*GGv$B+#61B_qVcug3T=&B&;9?`zs8~p;!l%l)(3a z#uvT5I0X7$*5j@#|s`nfKUs-`3KnLY0+>=382{5h&&P(6EsHopf6uw5fqA%9NE-d z?(=;;5OJuP{A53S-igbpQ#J;8s{mhNm0aYARCzJQdy|T# z_}}9&p{1$rA~)$ZAO}5de+smZOXCbU32sS2Quve9Axa(f6^4LKG_m5w+k3gh#Z}NB zKTkrJbQJoJB;B67+J-9*97iGG$9t?f3YQ)G=1u!c*w!FO!4%n>Du^FDJHU(p)EPox z633{~xuB{lek=<~i8Sl=%?$YwJk=mW&`FB;Yj1Ba%w2Ig6UDjm96bg{wUz{^K5iRSPWjbl*iN=9v9VhB(ijJJU&gvRp4 zix=+hFw*cS^Cw6RojBBudTB4kvE`b{fpIs!7%`KVpg<-UU_g zKlRgv3e)hGv0i#V7(=U}Ef_ZnFd+W=--Pu);D9IW__;=hzDPHC-+$NSeFUIv{`{3j z2INeb+MohX9^8ZgG(r{8M%fTj5E*b_<-$2C(>RudbS=PBR#2DLI`NV6TmZ5Ixeq=? zn78o<*$vuzm}XLBLTz1vJJELVovp)o5B$L>9Z7uMrU1lLZ3htnn9JaV(NY|K)3XS} zyM@+LZw$@Nmv5eJ^0<*q>Kh0+fA&wmd_hZDqDzjMTKTZ>!?X&BR`Ii?L}(>oJOae6 z^z3Yaeo$2cmfvZ=cy4cN8=M`iXW`^jRbMZV*bDW&bd(}O8c@je+*}1qBzqs=we~En z(su~wXf$*mzS4fcFj;&?~(+FVk z8=Mr^8qFQHN1e3_d)g2D=#YShM3xM(f>hPjQG#BAN&(^oxYx_|8+k-UGY3|o8_P-S zhM8kvtwhk9##z6t(BH)U>)W^fA8&6J7WMju{|X`w>Cm7E%m4!-Al;HfNhlK1(jkbH z0tzB9(u+nq6_9R_5G15aLL`+grBP5~Km7jtY@h6deQl4{TGv{vVP?MX`^0^JZh12X z;1bYVb{+rP+KR-YTg-;|NDbbAeuX9Bq7^46kG569y9-}|wgX<*b1^g#>K^|btbJhv z2$xR?HXC|PP1O zL%?%$S84|fg~HHtRaI5^=ZcDoVA8hwOignidtNhFPWZQ&K}Q^y#K~PsvLM?=X}@NS zSS>d!&NTSvEuA?7mC*Ti84muhpf<6J21rhT57kSAXy3Oes5IMJ0~AHL5ubq4fJdpC za~~8w^&sPic8w+b+WL|#0!6@--B3ap#ZE#*VOBXY?Ie0!14`G`FKvi9=ee}+c`me1}IJP0_U?;$Qb#>KFS zr)ids!=-$DE;7Cmr3s${?70B3Q3&NKT>7#Y<_l6hvbWFW(oUIyWKo!VUgo;L#_$57 zP?kW%61f(4gNmR9&>)T?DounD7mdt$6Vx!VnKLl2HyMXMidq+*;d{@6Y{t7P)ax3C zO8d{pLO~=Gj(RbGeJQwjnSB5EZzk~ZqvF7y>%FH@JM|HqV9+AN&Y)`^s7n)$w7X-} zicq^GsS|#<5*{EVNbu%1b$*Ru@x9>#aNL?DG=kQ4Z6psA?mu1YSTcc{am5=0Teapt zFPg{UZabxg6N{6Wv+-P;bavo-^3b0J7OPMKgJTVD?xT~JASU&6)fi#fWwdxDI}~s& zpp8ZDQddb7G0AJY$=|ZNx^l?*9ZzoBw=#ZYED61^pZo>g7i`y{M|xjW6lXoLu=D9D zv^7wt$TmK$GlpYRI^&9z_~_gK;O6Gc37+!84%-?kS!g%my@N^wPH5j<4qsO|vf$ec zpA=3W)y4;hlBw^>0hmuOSQFsm!L+|TG&6fxNb+7iyq5w=xXea4Bx7P?=H|>J766|C zD}QVVkjlVp@c!HSvj&*y0E**WR2j!YdUEmQVH>l5A`Fc>Iy*jAGF3bo-_KtP zXAJwy5=%gBRq$~*olD2`Vl+}(c3mjAYIFz8VsPDIVsG&9R8RfVD|`wn`h@1=CEv5H zvzdh*IG)Ym{)UbXJ_P75;92)s%SnKq52XsIn!V>ALCc720Jheg%{hKg${3^gcVg>L zn=dSWOMQMhB$BaQKQ$y68Gw9&^F+G%NoYB>(4~VhZrDi z;EZC)eGDo|P`==X#Y{{8z-11b>u0cW1P0c%CyjXGufd-Ms0Tvq+^e5N;=Y+r{+^s} z`E0#7e~0nAz0N;*c=%!A#L^Rlj2T=(*-aNHW*Z}M8cAD23S~NOoQefYW-aM{|V1PU}qfnQ_g3if*VSx zt_qmtd8Kdt`t=bs4WMiHOoy|4bQE#$GE?uF*7eF(AkQ&`ea`&K{oy%rwM|cYpgAZ2 ztOSS{ZL1Ai6fJ9~&ee>Pl7I!E3i}LDoKSk5ML-_FwF#cE?|;A6W(Lwzn_Fr}ocHib zj=1)4;B7g9XX;!h0vLfTd*;zy{5qH;#U&)b68KGg{CPDDa@hS9@CE=vroBy;1uiK0 zUN=ALuQM|zU{aH(79x=9TyVkNT*rQ@mqy;FTBHW>wUuB`=G$*9Zic6yl^(@ z-vqRX7PSi};^2UsyhZhBN!TNTP z{cmscd0vCZ6r6HdZPbavptJ>jCF*UUND|kvmq>~abf{VDPeBsd;PJ%7rYquq(m~gj9d{|zyUXaPVO-^F1|5xErHqUΜ39KGcVxF+1;wI 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

    3*leh&sX5j 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 z zlM^p#$+pml9;ryKR}2=0EAu-#_Qnl)KJd`QB&v%hBBLWOE2hHy86G&R4Z7S1k@F>G zX{1X4;cZ5ckQu#tMbz;Lb^qN@$v7&%hKRIC&MDOj_(X+{m zfSkV+F6hcs*j<#>g{%hJY z;Iwk~vatyY!sr>|v6dgepC%W}FfY%}IjM z!Ex~f$%jyVp;tXz{rHQ9I>m|G;kp?_C~|d=jFpxaOj%iCN5`$65m~H>fq}s*ZmFkv z|BLfKM8(BMj<>NY&%A!$%)dYOl>UZz2pde+{jPc>#R%N>rfr9QjmG?7h3t2KKbX}K z%X}Jr^)3gt8KvbroQgy;b`6oDp?P{4)Ozdxt#Lo@{qsI2)Ew^f_xs>b{LI=QGba~O zD8iLCYGMaisTj}%A$l6FHsLi>?`N|%t!gP2ZzbtcaQBh+@8@wSV`0O3V81eYk`zK6 zV!c4JLt#v+sn`yo3+w#AiDZSdvN?TdW`~3np!9fr55IzZN6?Fpns9Y>_4lF&cuFIe zYWZ*OGgswc(5T~6`xj=>X#Skfmg;0u%Q?vb0C|*=(crl{1kB^@?V#QRLad5pVQP!X zS4nCM^;yY7?m+qVCKE>=vM$!F`%JNg_jx&=pyz-jJb|qthwL7NJi*a1bF9jDE|)4^ z{^>YeB*Se8&lY%hlW-Q8W z$&^Ayk(AUCcaBl!HUXhv&3CPiSATs`PzyQ>$>t1%{7#=)gQ%?Rrh%Gxx)vwsCkppQ zM?Cw%b$*bSY_QXy9dxMs$)# z7Ene0aONF3e~|=Lj9Stp4#9i|EffT{*S zP$_XIl)RDM9PDf_Z3i>-)ZSmQ>x$$nbzr|!_p5GE!+xJMC{48*xi#JZo^I}>i|OMg z5Eu7v%{0r?#6;3{($Kr|DOI?v5mpm}_IWQ$Mok3qcLYD>ulEXf zlbg1cjyirfjrPOyl%?j5+}uO{n~fz2C&cl==$Ggb5T1#wesl29A|qNtzjODI&R(ms zV7m|Kc%h?frkw9g4UG0>T-IMA0&e$cy zOC{R(N~H7)bTX=o_DTLQAP-yicooWm-svdQKMLaI48+#?6)-r&Gs~Xs^#}kK`URla z18REk)g+=HtRDz~hO+mWAA?>C9*Gl?wn3fd;8uxRKM&v-PQJ23& zkA{Yw>G1$NF>Yk6OQ}R2It2v{O$Ng&k&BC=twF4kaE&`}XNt8fYfK{MUMdhe_$LIB zaJCqcz4_sNf`U}%TCRvRB=}pTGE1%B_)Jn{%%0y@gS>lM)rqcZINR|2F+ce~Q}HaAr)0Cnth zID%Qjr4)k!MaQd^NAiB4c6LKL4cP5yK8b0jWn=`jsR9SfeNDPNm`uM2?9y+I>gYeg zxGEbGt&#OZzmk6|^z`(C1gUXRIg(%&zEn5b>n=T|j7?6_~f8b#`ck%I@F}-JaTs_x*F!H*K_aF_on(g+!uDtY zyt@b4TR`$*SYo^ObiW@=a_VPOe8f@1#W$Zlo5j^zN2k1~Hnux$Sd}!VYmoxW=}_&V zHMAd)pL4uZ8Wta@kzyEGiUBzX&vU?(TAc5Szg_^m+tdEw8@&BBfawkoYs*i~%&=tf zMz153mBly2rxl~1;;~QZLL6uVO{Tb>W*HkA^DaFHbXz?M#V>t*O4?>KC)N&ozbYe` z#vY^~?4f+50i_jH^eTr2`q4Bo37t|n_g|;LkTNs!!B@t@cceX6LfBrF>N|JM8WaBg zcBk3mEr}bS?>%y$BVRBn2oS4Prhu@2wZ1h%Sq`jP>0WaG=?c z5N<&t_9RpaJ*+?c-t69Jb@0{tzw)$$FT=IL-v5=p(+pM5S}w(!aK?iCeD~+iF6Kbm z5Y4tpx;d%=HM3uQecJwjk{m<}CZPTN&Njx%a}wsvt`^PYj{e>dNQt$+i9Zn%PbE;s zkCPr%#&LK8FIxBGPxD@%UiAf;gSDd+GM_IabYte1o5Ui+=p)7>(6TRO~k ze~NyurR_|N_J@MVuxML#Tw3=7<7#75wA$yNp2T!erbLQB57^llcE`@>$ZVFxT~`&Abld<+(7tx-c@LSNW!0^n?DfXjjOVXIJP{G2)3+ z<*$vD4>r|o{ANjY_g`Qc9?I;Xxd^bu@E0*!LY+{1ci-BrQ?O^IKJqWa-Gc3_OO5+X zoR-TgT*|OVY;Vlmu6sugCMTV}?YJT@d7w#(*%mKOo`^hOMBKl{pYqapRRjHB^x0do z&EMM$A)eH{CK{@gur>peV!*-iTG+e146MTt>b@NqaTNJ95Y+@u*cbaK;BAY%YYI-9 zQxMzr;DoH#MOjRq)lF$~Q&J?luGAX;d6QAT+$VQDDH3UEiW3%^;PKht@A%uO5R_){ z{%?M2F3;`~D9U^Ys3NxM+JJPwaIGtx@A zD0O5W62XjCJK7jOJet@xZSW~7tgkN`>}bL3aOvs0=d@m&Kjhd^3}6-ysMg1%|DMn4 z%;XaGwz?t><+#lr&mv)I8c#r563JziX<`Dt(~wn$i`JuxM>l5=J59_cxDtj%d;XJL z)+o{ucaK(K-BPb-b&cOdezcqjX@P0wQU1gz{X1BFp39DX%jBztl~w&1^*8aYe1lz! zd6^}DZG~~^%aqQTg4Yj+0?B0Uz4BVgThb$*C-IbEvSj_oOX>p~r&28-INXlnDsH}R z5~WG4nesLHv`6ngRkFWrH}Yrwdz2jS&pIiGeG8=kmDFp6ZKqO}%h~XG@K2M+~)|AAd7<36x|BSL&vDq+llZBgu`V>%jj{rJcAXyVsz%@|fHf!e_BnrVvP?<$ zwFT5L;q49W{9G@2D1JFRy=Q*X*;c#4-I}0*9s1BN#wRL#B57eY%JgS2sQP0^pXtfT zjYz~@uxH_|A3vK-Ewm7Zhd2ELU2>u>p_*e9t=iBLzS19+_nJhYVqQQ*fe0TGH-F&i zU8q}xxZ7vO)KuqhACG+4OTBCPQr-hn=MN}akubJho7`I-Ip8H1`{3?iP`U)?#KDh$Di-mlvbys`wx!Q zxr?X`IFAkvm?Ueq=QWz4h!}(5~I20%B zvs#IGz~ZkmtL<%O#(=$_T~X7>A1*nGb5ld2q1 z{$TOHM-cJwid&J;1>SClggXh=L3;bVPpfF`HQDYH5Vw$AMAmkQ*lCAHaAgI2Zf<6Q zgeg=ln%`h;8TNY&{_Zh~Uqr7-N^n`!h_F`OG2yP*W>>|BR^@Kf(F=Ql_O6_?1lC?O zgqGqDUUQB$d|-LOVnC-U8b>Gr>Pr4P$03Zc$=Ku-155hJVNa>8$OomIwqq2e%2vw3 zZftVtu6R!|h1=PZ+s?Ojxv3KQ#VGBDj=N_yg>X1UB5{u;GMN&WkdW{;vy9JK?^xL& zsr$Kix~p5QnzK51=QW4>KXeR}MGMQ5NY9z8aJV zq8+l^Td0ntkNmX6Y?c{BDjnSR;@V5WV zxoO$^=U-2G7%uHGBcUN}r7sB`%V+TaA2DwEf()#9k3}-iwPtit zj%lYPiHQk5CX@fgF&rLVPf1k#uh=m6He*Caqo~S-4{QG*IB`Bfa1^}6P>AiX5Vtv6|Zd{a1PS1Kv7sq3`LNdB1jVt)DSpRB^ z<;oYU(C^)Rz6~T+uwkgSsdr@TYM0$gYx}NqIC_55Ie$ zV$+ic;o{?IQDtrLQYI^|(`9NX!JRuCo)BemqB!unG3xG00XIITUo)CRi@I zokns84MbDlIHQFK@`zY@nTfeQ@C!Hs4qC^|E;iCi8}`)n^>0M!6aDhnnxgcI1j0HQ z%jn8Z1b_Z2E6=u;vyp6d%4foQ{K+Evn594utNwbq1{qg zFzTWOeQ)-q>9lj=W@6l9@5k77;Ienq(WHp%RAW>tGQ?d0-x{i(BSgl+;-|tKXaVcYiSWXZ|%eGM(`??t%^Pr97-l~yR4Pu@?M=I+{u@A3`NP)nsc0yNd92v7QfqJTS^ak7^-;Q8 zpy!h2qens5EtBv-JP@wYqj~P|^7Cpvy`i43Z7e3*eR>$Mu#?zDCJ(HMPKJyW>Nwme zm=dBTHCmRfsz3YY5c@<$Ra8`_m8bVby#<*dG;O%jMDqN3Irt0H(JXghcCk$lQn92^yO3W?j_zne5qb+#X!SPDMl$)|SD;f_?ymc$y8m}n4Rn3ou5 zrGH{z$ZP=fRT~G+`O^cUnL@~igRNIhO`+3`%E~{jjj^|~aUoh%M)#m@Z&Anhw88sn zG0*XXhUl~3lrnW)=hr*I7PX>Mvi`esi@Rkg#}XQRKzAshMD=aWZOP)v2Fi{(bJD~Z z(C?7W)5GD!AMZV3cv+F-28_tAR+jz&i86^HIB=Z#*lKch0^P@`SPGrWaRZ|VX;>cD zHs#I$d1Tk;B0Vri`v$bKr>j4`bSPycZWZq90kkO~yn9I6C?<5MD`2??PJoe<=RnwUQlHPG1(!ltgf zNR(&pwm0>uZh6}xXV~xbH+WjtVOmy0e7G`3*v-DbAEvtA`!ESj@3ryy4{@zL))jeC z)5c<3zj@QsMGgK5sp+AcBdsc1zbm}u+)+P z#C1@<;D1Mj83%lh3uh+nyl*EcV_m?9$1U$9qm1>O)fvRy@Qw^*9Q_6 ziem5~A2PJ|jzC??A0(RdPQz75tt@6nsmi0#sCr}EB5EqD-{1AZY%?oh1Nd=DAP~qs zPgMg?YYR`ChgKdo;0HulP*{{tP@GRlQcqCup|IFPF_8!07eT=*y57Y9=L0To)(*D5 X|Njrft9bH(4?rHPK2^aenTP!!2Bs*Q diff --git a/docs/dsa/image.png b/docs/dsa/image.png deleted file mode 100644 index 6fec022374f45ac3d99c73deef1db4896380e8ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8465 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 - - - ```js - // Node class in JavaScript - class Node { - constructor(data) { - this.data = data; - this.next = null; - } - } - - // LinkedList class in JavaScript - class LinkedList { - constructor() { - this.head = null; - } - - // Add a node at the end - append(data) { - let newNode = new Node(data); - if (this.head === null) { - this.head = newNode; - return; - } - let current = this.head; - while (current.next) { - current = current.next; - } - current.next = newNode; - } - } - ``` - - - - ```java - // Node class in Java - class Node { - int data; - Node next; - Node(int d) { data = d; next = null; } - } - - // LinkedList class in Java - public class LinkedList { - Node head; - - // Add a node at the end - public void append(int data) { - Node newNode = new Node(data); - if (head == null) { - head = newNode; - return; - } - Node current = head; - while (current.next != null) { - current = current.next; - } - current.next = newNode; - } - } - ``` - - - - ```python - # Node class in Python - class Node: - def __init__(self, data): - self.data = data - self.next = None - - # LinkedList class in Python - class LinkedList: - def __init__(self): - self.head = None - - # Add a node at the end - def append(self, data): - new_node = Node(data) - if self.head is None: - self.head = new_node - return - last = self.head - while last.next: - last = last.next - last.next = new_node - ``` - - - - ```c - // Node structure in C - struct Node { - int data; - struct Node* next; - }; - - // LinkedList structure in C - struct LinkedList { - struct Node* head; - }; - - // Function to create a new node - struct Node* createNode(int data) { - struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); - newNode->data = data; - newNode->next = NULL; - return newNode; - } - - // Function to add a node at the end - void append(struct LinkedList* list, int data) { - struct Node* newNode = createNode(data); - if (list->head == NULL) { - list->head = newNode; - return; - } - struct Node* temp = list->head; - while (temp->next != NULL) { - temp = temp->next; - } - temp->next = newNode; - } - ``` - - - - ```cpp - // Node class in C++ - class Node { - public: - int data; - Node* next; - Node(int d) { data = d; next = nullptr; } - }; - - // LinkedList class in C++ - class LinkedList { - public: - Node* head; - LinkedList() { head = nullptr; } - - // Add a node at the end - void append(int data) { - Node* newNode = new Node(data); - if (head == nullptr) { - head = newNode; - return; - } - Node* current = head; - while (current->next != nullptr) { - current = current->next; - } - current->next = newNode; - } - }; - ``` - - - - ```ts - // Node class in TypeScript - class Node { - data: number; - next: Node | null; - - constructor(data: number) { - this.data = data; - this.next = null; - } - } - - // LinkedList class in TypeScript - class LinkedList { - head: Node | null; - - constructor() { - this.head = null; - } - - // Add a node at the end - append(data: number): void { - let newNode = new Node(data); - if (this.head === null) { - this.head = newNode; - return; - } - let current = this.head; - while (current.next !== null) { - current = current.next; - } - current.next = newNode; - } - } - ``` - - - -## How to access a Linked List? - -A linked list can be accessed by traversing the nodes starting from the head. - - - - - ```js - // Access elements in a LinkedList in JavaScript - let list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - let current = list.head; - while (current !== null) { - console.log(current.data); - current = current.next; - } - ``` - - - - ```java - // Access elements in a LinkedList in Java - LinkedList list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - Node current = list.head; - while (current != null) { - System.out.println(current.data); - current = current.next; - } - ``` - - - - ```python - # Access elements in a LinkedList in Python - list = LinkedList() - list.append(10) - list.append(20) - list.append(30) - - current = list.head - while current: - print(current.data) - current = current.next - ``` - - - - ```c - // Access elements in a LinkedList in C - struct LinkedList list; - list.head = NULL; - append(&list, 10); - append(&list, 20); - append(&list, 30); - - struct Node* current = list.head; - while (current != NULL) { - printf("%d\n", current->data); - current = current->next; - } - ``` - - - - ```cpp - // Access elements in a LinkedList in C++ - LinkedList list; - list.append(10); - list.append(20); - list.append(30); - - Node* current = list.head; - while (current != nullptr) { - std::cout << current->data << std::endl; - current = current->next; - } - ``` - - - - ```ts - // Access elements in a LinkedList in TypeScript - let list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - let current = list.head; - while (current !== null) { - console.log(current.data); - current = current.next; - } - ``` - - - -## How to update a Linked List? - -A linked list can be updated by changing the data of a node directly. - - - - - ```js - // Update elements in a LinkedList in JavaScript - let list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - let current = list.head; - while (current !== null) { - if (current.data === 20) { - current.data = 25; - } - current = current.next; - } - ``` - - - - ```java - // Update elements in a LinkedList in Java - LinkedList list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - Node current = list.head; - while (current != null) { - if (current.data == 20) { - current.data = 25; - } - current = current.next; - } - ``` - - - - ```python - # Update elements in a LinkedList in Python - list = LinkedList() - list.append(10) - list.append(20) - list.append(30) - - current = list.head - while current: - if current.data == 20: - current.data = 25 - current = current.next - ``` - - - - ```c - // Update elements in a LinkedList in C - struct LinkedList list; - list.head = NULL; - append(&list, 10); - append(&list, 20); - append(&list, 30); - - struct Node* current = list.head; - while (current != NULL) { - if (current->data == 20) { - current->data = 25; - } - current = current->next; - } - ``` - - - - ```cpp - // Update elements in a LinkedList in C++ - LinkedList list; - list.append(10); - list.append(20); - list.append(30); - - Node* current = list.head; - while (current != nullptr) { - if (current->data == 20) { - current->data = 25; - } - current = current->next; - } - ``` - - - - ```ts - // Update elements in a LinkedList in TypeScript - let list = new LinkedList(); - list.append(10); - list.append(20); - list.append(30); - - let current = list.head; - while (current !== null) { - if (current.data === 20) { - current.data = 25; - } - current = current.next; - } - ``` - - - -## How to delete a node from a Linked List? - -A node can be deleted from a linked list by adjusting the links of the adjacent nodes. - - - - - ```js - // Delete a node from a LinkedList in JavaScript - class LinkedList { - // ... - delete(data) { - if (this.head === null) return; - if (this.head.data === data) { - this.head = this.head.next; - return; - } - let current = this.head; - while (current.next !== null) { - if (current.next.data === data) { - current.next = current.next.next; - return; - } - current = current.next; - } - } - } - ``` - - - - ```java - // Delete a node from a LinkedList in Java - public class LinkedList { - // ... - public void delete(int data) { - if (head == null) return; - if (head.data == data) { - head = head.next; - return; - } - Node current = head; - while (current.next != null) { - if (current.next.data == data) { - current.next = current.next.next; - return; - } - current = current.next; - } - } - } - ``` - - - - ```python - # Delete a node from a LinkedList in Python - class LinkedList: - # ... - def delete(self, data): - if self.head is None: - return - if self.head.data == data: - self.head = self.head.next - return - current = self.head - while current.next: - if current.next.data == data: - current.next = current.next.next - return - current = current.next - ``` - - - - ```c - // Delete a node from a LinkedList in C - void deleteNode(struct LinkedList* list, int data) { - if (list->head == NULL) return; - struct Node* temp = list->head; - if (temp->data == data) { - list->head = temp->next; - free(temp); - return; - } - struct Node* prev = NULL; - while (temp != NULL && temp->data != data) { - prev = temp; - temp = temp->next; - } - if (temp == NULL) return; - prev->next = temp->next; - free(temp); - } - ``` - - - - ```cpp - // Delete a node from a LinkedList in C++ - class LinkedList { - // ... - void deleteNode(int data) { - if (head == nullptr) return; - Node* temp = head; - if (temp->data == data) { - head = temp->next; - delete temp; - return; - } - Node* prev = nullptr; - while (temp != nullptr && temp->data != data) { - prev = temp; - temp = temp->next; - } - if (temp == nullptr) return; - prev->next = temp->next; - delete temp; - } - }; - ``` - - - - ```ts - // Delete a node from a LinkedList in TypeScript - class LinkedList { - // ... - delete(data: number) { - if (this.head === null) return; - if (this.head.data === data) { - this.head = this.head.next; - return; - } - let current = this.head; - while (current.next !== null) { - if (current.next.data === data) { - current.next = current.next.next; - return; - } - current = current.next; - } - } - } - ``` - - - -## Applications of Linked Lists - -- **Dynamic memory allocation**: Linked lists can efficiently manage memory allocation and deallocation. -- **Implementation of stacks and queues**: Linked lists provide the foundation for stack and queue data structures. -- **Graph representation**: Adjacency lists use linked lists to represent graphs. -- **Handling sparse matrices**: Linked lists efficiently store and manipulate sparse matrices. - -## Common Linked List Problems - -- **Reverse a Linked List**: Reversing the nodes of a linked list. -- **Detect a cycle in a Linked List**: Checking if a linked list contains a cycle. -- **Merge two sorted Linked Lists**: Combining two sorted linked lists into one sorted linked list. -- **Find the middle of a Linked List**: Finding the middle node in a linked list. - -## Advanced Linked List Variants - -- **Doubly Linked List**: A linked list where each node has references to both the next and previous nodes. -- **Circular Linked List**: A linked list where the last node points back to the first node. -- **Skip List**: A linked list with additional pointers for faster search. - -## Resources and References - -- **Books**: - - "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein - - "Data Structures and Algorithm Analysis in C" by Mark Allen Weiss -- **Online Courses**: - - Coursera: Data Structures and Algorithms Specialization - - edX: Data Structures Fundamentals -- **Websites**: - - [GeeksforGeeks](https://www.geeksforgeeks.org) - - [LeetCode](https://leetcode.com) - - [HackerRank](https://www.hackerrank.com) - ---- - -By understanding and mastering these linked list concepts and algorithms, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. - -## Conclusion - -Linked lists are a fundamental data structure in computer science and play a crucial role in various applications and algorithms. This guide covers the essential concepts and operations associated with linked lists, providing a comprehensive understanding of how they work and how to implement them in different programming languages. - -Understanding linked lists is crucial for solving numerous problems in computer science, from basic data manipulation to complex algorithms in dynamic memory allocation, graph representation, and more. The examples provided demonstrate how to work with linked lists efficiently, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of linked lists enhances your ability to handle data structures and perform operations crucial in both everyday programming and competitive coding. - -Problems for Practice -To further practice and test your understanding of linked lists, consider solving the following problems from LeetCode: - -1. Reverse Linked List -2. Linked List Cycle -3. Merge Two Sorted Lists -4. Remove Nth Node From End of List -5. Add Two Numbers - -Engaging with these problems will help reinforce the concepts learned and provide practical experience in using linked lists effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of linked list manipulation in various contexts. diff --git a/docs/dsa/linkedlist/LinkedListProblems.md b/docs/dsa/linkedlist/LinkedListProblems.md deleted file mode 100644 index 5c727033b..000000000 --- a/docs/dsa/linkedlist/LinkedListProblems.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -id: leetcode-linkedlist-problems -title: LeetCode LinkedList Problems -sidebar_label: LinkedList Problems -sidebar_position: 1 -description: "A collection of easy, medium, and hard LinkedList problems from LeetCode to help you practice and master LinkedList concepts in Data Structures and Algorithms." -tags: - [ - dsa, - data-structures, - linkedlist, - leetcode, - linkedlist-problems, - linkedlist-in-dsa, - linkedlist-in-data-structure, - linkedlist-in-algorithm, - linkedlist-in-dsa-example, - linkedlist-in-dsa-explanation, - linkedlist-in-dsa-conclusion, - linkedlist-in-dsa-importance, - linkedlist-in-dsa-syntax, - linkedlist-in-dsa-declaration, - linkedlist-in-dsa-access, - linkedlist-in-dsa-update, - linkedlist-in-dsa-delete, - linkedlist-in-dsa-iterate, - linkedlist-in-dsa-max-min, - linkedlist-in-dsa-program, - linkedlist-in-dsa-code, - linkedlist-in-dsa-js, - linkedlist-in-dsa-java, - linkedlist-in-dsa-python, - linkedlist-in-dsa-c, - linkedlist-in-dsa-cpp, - linkedlist-in-dsa-ts, - ] ---- - -# LeetCode LinkedList Problems - -## Easy Problems - -1. [Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/) - - - Problem: Reverse a singly linked list. - - LeetCode ID: 206 - -2. [Remove Linked List Elements](https://leetcode.com/problems/remove-linked-list-elements/) - - - Problem: Remove all elements from a linked list of integers that have value val. - - LeetCode ID: 203 - -3. [Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list/) - - - Problem: Check if a linked list is a palindrome. - - LeetCode ID: 234 - -4. [Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/) - - - Problem: Merge two sorted linked lists and return it as a new sorted list. - - LeetCode ID: 21 - -5. [Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/) - - - Problem: Determine if a linked list has a cycle. - - LeetCode ID: 141 - -6. [Remove Duplicates from Sorted List](https://leetcode.com/problems/remove-duplicates-from-sorted-list/) - - - Problem: Delete all duplicates such that each element appears only once. - - LeetCode ID: 83 - -7. [Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/) - - Problem: Find the node at which the intersection of two singly linked lists begins. - - LeetCode ID: 160 - -## Medium Problems - -1. [Add Two Numbers](https://leetcode.com/problems/add-two-numbers/) - - - Problem: Add two numbers represented by linked lists. - - LeetCode ID: 2 - -2. [Odd Even Linked List](https://leetcode.com/problems/odd-even-linked-list/) - - - Problem: Group all odd nodes together followed by the even nodes. - - LeetCode ID: 328 - -3. [Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) - - - Problem: Remove the nth node from the end of the list. - - LeetCode ID: 19 - -4. [Reorder List](https://leetcode.com/problems/reorder-list/) - - - Problem: Reorder the list to follow a specific order. - - LeetCode ID: 143 - -5. [Rotate List](https://leetcode.com/problems/rotate-list/) - - - Problem: Rotate the list to the right by k places. - - LeetCode ID: 61 - -6. [Swap Nodes in Pairs](https://leetcode.com/problems/swap-nodes-in-pairs/) - - - Problem: Swap every two adjacent nodes. - - LeetCode ID: 24 - -7. [Partition List](https://leetcode.com/problems/partition-list/) - - Problem: Partition the list so that nodes less than x come before nodes greater than or equal to x. - - LeetCode ID: 86 - -## Hard Problems - -1. [Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/) - - - Problem: Merge k sorted linked lists and return it as one sorted list. - - LeetCode ID: 23 - -2. [Reverse Nodes in k-Group](https://leetcode.com/problems/reverse-nodes-in-k-group/) - - - Problem: Reverse the nodes of a linked list k at a time. - - LeetCode ID: 25 - -3. [Copy List with Random Pointer](https://leetcode.com/problems/copy-list-with-random-pointer/) - - - Problem: A linked list with a random pointer, deep copy the list. - - LeetCode ID: 138 - -4. [LRU Cache](https://leetcode.com/problems/lru-cache/) - - - Problem: Design and implement a data structure for Least Recently Used (LRU) cache. - - LeetCode ID: 146 - -5. [Flatten a Multilevel Doubly Linked List](https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/) - - - Problem: Flatten a multilevel doubly linked list. - - LeetCode ID: 430 - -6. [Linked List Random Node](https://leetcode.com/problems/linked-list-random-node/) - - Problem: Return a random node's value from the linked list. - - LeetCode ID: 382 - -## Conclusion - -Practicing these problems will help reinforce the concepts learned and provide practical experience in using linked lists effectively. By solving these problems, you will enhance your problem-solving skills and deepen your understanding of linked list manipulation in various contexts. diff --git a/docs/dsa/linkedlist/_category_.json b/docs/dsa/linkedlist/_category_.json deleted file mode 100644 index 471f3ca54..000000000 --- a/docs/dsa/linkedlist/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "LinkedList", - "position": 9, - "link": { - "type": "generated-index", - "description": "In data structures, Linked List is basically chains of nodes where each node contains information such as data and a pointer to the next node in the chain. It is a popular data structure with a wide range of real-world applications. In this article, we will provide a complete introduction of Linked List, which will help you tackle any problem based on Linked List." - } -} diff --git a/docs/dsa/master-theorem.md b/docs/dsa/master-theorem.md deleted file mode 100644 index 7b0bbcb89..000000000 --- a/docs/dsa/master-theorem.md +++ /dev/null @@ -1,209 +0,0 @@ ---- -id: master-theorem -title: Master Theorem for Divide and Conquer Recurrences -sidebar_label: Master Theorem -sidebar_position: 3 -description: "Master Theorem for solving divide and conquer recurrences. Explained with examples." -tags: - [ - dsa, - data-structures, - algorithms, - divide-and-conquer, - master-theorem, - recurrences, - ] ---- - -Master Theorem is a popular technique to solve recurrence relations of divide and conquer algorithms. It provides a way to determine the time complexity of recursive algorithms. The theorem is used to solve recurrences of the form: - -$$ - \boldsymbol{{T(n)} = aT \frac{n}{b} + f(n)} -$$ - -where: - -- $T(n)$ is the time complexity of the algorithm. -- $a$ is the number of subproblems in the recursion. -- $\frac{n}{b}$ is the size of each subproblem. -- $f(n)$ is the time complexity of the work done outside the recursive calls. -- $n$ is the size of the input. -- $a \geq 1$ and $b > 1$ are constants. -- $f(n)$ is a function that is asymptotically positive. -- $T(n)$ is defined on non-negative integers. -- The recurrence relation is defined for $n \geq n_0$ for some constant $n_0$. - -The Master Theorem provides a way to determine the time complexity of the algorithm based on the values of `a`, `b`, and `f(n)`. - -## Master Theorem Cases {#master-theorem-cases} - -The Master Theorem has three cases based on the comparison of `f(n)` with `n^log_b(a)`: - -1. **Case 1**: If `f(n) = O(n^log_b(a - ε))` for some constant `ε > 0`, then `T(n) = Θ(n^log_b(a))`. -2. **Case 2**: If `f(n) = Θ(n^log_b(a))`, then `T(n) = Θ(n^log_b(a) * log(n))`. -3. **Case 3**: If `f(n) = Ω(n^log_b(a + ε))` for some constant `ε > 0`, if `a * f(n/b) <= c * f(n)` for some constant `c < 1` and sufficiently large `n`, then `T(n) = Θ(f(n))`. - -## Example {#example} - -Let's consider the recurrence relation for the Merge Sort algorithm: - -$ - \boldsymbol{{T(n)} = aT \frac{n}{b} + f(n)} -$ - -Here: - -- `a = 2` (number of subproblems). -- `b = 2` (size of each subproblem). -- `f(n) = Θ(n)` (time complexity of work done outside the recursive calls). -- `n` is the size of the input. -- `n0 = 1`. -- `f(n)` is asymptotically positive. -- `a >= 1` and `b > 1`. -- The recurrence relation is defined for `n >= n0`. -- The relation is of the form `T(n) = aT(n/b) + f(n)`. - -Now, let's compare `f(n)` with `n^log_b(a)`: - -- `n^log_b(a) = n^log_2(2) = n`. -- `f(n) = Θ(n)`. -- `f(n) = Θ(n) = n^log_b(a)`. - -Since `f(n) = Θ(n) = n^log_b(a)`, the recurrence relation falls under **Case 2** of the Master Theorem. Therefore, the time complexity of the Merge Sort algorithm is `T(n) = Θ(n * log(n))`. - -## Conclusion {#conclusion} - -The Master Theorem provides a way to determine the time complexity of divide and conquer algorithms. It simplifies the process of solving recurrence relations and helps in analyzing the time complexity of recursive algorithms. By comparing the function `f(n)` with `n^log_b(a)`, the Master Theorem classifies the recurrence relation into one of the three cases and provides the time complexity of the algorithm. - -Master Theorem is a powerful tool to analyze the time complexity of divide and conquer algorithms. It is widely used in the analysis of recursive algorithms to determine their time complexity. - -## Implementations - - - - ```js - function masterTheorem(a, b, f, n) { - if (a < 1 || b < 1) { - return "Invalid input"; - } - - const logBaseB = Math.log(a) / Math.log(b); - - if (f === n ** logBaseB) { - return `T(n) = Θ(n^${logBaseB} * log(n))`; - } else if (f < n ** logBaseB) { - return `T(n) = Θ(n^${logBaseB})`; - } else { - return "Case 3: Not covered by Master Theorem"; - } - } - ``` - - - ```java - public class MasterTheorem { - public static String masterTheorem(int a, int b, int f, int n) { - if (a < 1 || b < 1) { - return "Invalid input"; - } - - double logBaseB = Math.log(a) / Math.log(b); - - if (f == Math.pow(n, logBaseB)) { - return String.format("T(n) = Θ(n^%.2f * log(n))", logBaseB); - } else if (f < Math.pow(n, logBaseB)) { - return String.format("T(n) = Θ(n^%.2f)", logBaseB); - } else { - return "Case 3: Not covered by Master Theorem"; - } - } - - public static void main(String[] args) { - System.out.println(masterTheorem(2, 2, 2, 2)); - } - } - ``` - - - - ```python - def master_theorem(a, b, f, n): - if a < 1 or b < 1: - return "Invalid input" - - log_base_b = a / b - - if f == n ** log_base_b: - return f"T(n) = Θ(n^{log_base_b} * log(n))" - elif f < n ** log_base_b: - return f"T(n) = Θ(n^{log_base_b})" - else: - return "Case 3: Not covered by Master Theorem" - ``` - - - - ```cpp - #include - #include - #include - - std::string masterTheorem(int a, int b, int f, int n) { - if (a < 1 || b < 1) { - return "Invalid input"; - } - - double logBaseB = log(a) / log(b); - - if (f == pow(n, logBaseB)) { - return "T(n) = Θ(n^" + std::to_string(logBaseB) + " * log(n))"; - } else if (f < pow(n, logBaseB)) { - return "T(n) = Θ(n^" + std::to_string(logBaseB) + ")"; - } else { - return "Case 3: Not covered by Master Theorem"; - } - } - - int main() { - std::cout << masterTheorem(2, 2, 2, 2) << std::endl; - return 0; - } - ``` - - - - -## Live Coding Implementation - -```jsx live -function MasterTheoremExample() { - const a = 2, - b = 2, - f = 2, - n = 4; - - function MasterTheorem(a, b, f, n) { - if (a < 1 || b < 1) { - return `Invalid input`; - } - - const logBaseB = Math.log(a) / Math.log(b); - - if (f === n ** logBaseB) { - return `T(n) = Θ(n^${logBaseB} * log(n))`; - } else if (f < n ** logBaseB) { - return `T(n) = Θ(n^${logBaseB})`; - } else { - return `Case 3: Not covered by Master Theorem`; - } - } - - return ( -

    -

    - Output: {MasterTheorem(a, b, f, n)} -

    -
    - ); -} -``` diff --git a/docs/dsa/recursion/_category_.json b/docs/dsa/recursion/_category_.json deleted file mode 100644 index 1af68bcf8..000000000 --- a/docs/dsa/recursion/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Recursion", - "position": 10, - "link": { - "type": "generated-index", - "description": "In data structures, The process in which a function calls itself directly or indirectly is called recursion and the corresponding function is called a recursive function. Using a recursive algorithm, certain problems can be solved quite easily. " - } -} diff --git a/docs/dsa/recursion/recursion.md b/docs/dsa/recursion/recursion.md deleted file mode 100644 index ff8563344..000000000 --- a/docs/dsa/recursion/recursion.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -id: recursion-in-dsa -title: Recursion in Data Structures and Algorithms -sidebar_label: Recursion -sidebar_position: 3 -description: "Recursion is a programming technique where a function calls itself directly or indirectly to solve a problem. It is used in various applications such as solving mathematical problems, implementing data structures, and more." -tags: - [ - dsa, - algorithms, - recursion, - recursive-functions, - recursion-in-dsa, - recursion-in-algorithm, - recursion-in-dsa-example, - recursion-in-dsa-explanation, - recursion-in-dsa-conclusion, - recursion-in-dsa-importance, - recursion-in-dsa-syntax, - recursion-in-dsa-implementation, - recursion-in-dsa-applications, - recursion-in-dsa-problems, - recursion-in-dsa-solutions, - recursion-in-dsa-code, - recursion-in-dsa-js, - recursion-in-dsa-java, - recursion-in-dsa-python, - recursion-in-dsa-c, - recursion-in-dsa-cpp, - recursion-in-dsa-ts, - ] ---- - -Recursion is a programming technique where a function calls itself directly or indirectly to solve a problem. It is used in various applications such as solving mathematical problems, implementing data structures, and more. - -## Why is Recursion important? - -Recursion is important because it provides a simple and elegant way to solve complex problems. It allows problems to be broken down into smaller, more manageable subproblems, making it easier to understand and implement solutions. - -## How to implement Recursion? - -Recursion can be implemented in various programming languages using the following syntax: - -## Recursive Function Structure - -```python -def recursive_function(parameters): - if base_condition(parameters): - return base_case_value - else: - return recursive_function(modified_parameters) -``` - -## Examples of Recursive Functions - -### Factorial - - - - - ```js - function factorial(n) { - if (n === 0) { - return 1; - } - return n * factorial(n - 1); - } - ``` - - - - ```java - public class RecursionExample { - public static int factorial(int n) { - if (n == 0) { - return 1; - } - return n * factorial(n - 1); - } - } - ``` - - - - ```python - def factorial(n): - if n == 0: - return 1 - return n * factorial(n - 1) - ``` - - - - ```c - int factorial(int n) { - if (n == 0) { - return 1; - } - return n * factorial(n - 1); - } - ``` - - - - ```cpp - int factorial(int n) { - if (n == 0) { - return 1; - } - return n * factorial(n - 1); - } - ``` - - - - ```ts - function factorial(n: number): number { - if (n === 0) { - return 1; - } - return n * factorial(n - 1); - } - ``` - - -Fibonacci - - - - ```js - function fibonacci(n) { - if (n <= 1) { - return n; - } - return fibonacci(n - 1) + fibonacci(n - 2); - } - ``` - - - - ```java - public class RecursionExample { - public static int fibonacci(int n) { - if (n <= 1) { - return n; - } - return fibonacci(n - 1) + fibonacci(n - 2); - } - } - ``` - - - - ```python - def fibonacci(n): - if n <= 1: - return n - return fibonacci(n - 1) + fibonacci(n - 2) - ``` - - - - ```c - int fibonacci(int n) { - if (n <= 1) { - return n; - } - return fibonacci(n - 1) + fibonacci(n - 2); - } - ``` - - - - ```cpp - int fibonacci(int n) { - if (n <= 1) { - return n; - } - return fibonacci(n - 1) + fibonacci(n - 2); - } - ``` - - - - ```ts - function fibonacci(n: number): number { - if (n <= 1) { - return n; - } - return fibonacci(n - 1) + fibonacci(n - 2); - } - ``` - - - -## Applications of Recursion - -1. Mathematical computations: Factorial, Fibonacci series, power functions, etc. -2. Data structures: Tree and graph traversals. -3. Algorithm design: Divide and conquer algorithms like merge sort and quicksort. -4. Dynamic programming: Recursive definitions with memoization. -5. Common Recursive Problems -6. Tower of Hanoi: Moving disks between rods following specific rules. -7. Permutations and combinations: Generating all possible arrangements or selections. -8. Backtracking: Solving puzzles and constraint satisfaction problems. - -## Advanced Recursive Techniques - -1. Tail Recursion: A special form of recursion where the recursive call is the last statement in the function. Optimized by compilers to prevent stack overflow. -2. Memoization: Caching the results of expensive function calls to improve performance. - -## Resources and References - -### Books: - -1. "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein -2. "The Art of Computer Programming" by Donald Knuth - -### Online Courses: - -1. Coursera: Data Structures and Algorithms Specialization -2. edX: Algorithms and Data Structures - -### Websites: - -1. GeeksforGeeks -2. LeetCode -3. HackerRank - -By understanding and mastering these recursion concepts and techniques, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. - -## Conclusion - -Recursion is a powerful technique in computer science that enables elegant and efficient solutions to complex problems. This guide covers the essential concepts and applications of recursion, providing a comprehensive understanding of how to implement and utilize recursive functions in different programming languages. - -Understanding recursion is crucial for solving numerous problems in computer science, from basic mathematical computations to complex algorithm design. The examples provided demonstrate how to work with recursion effectively, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of recursion enhances your ability to handle algorithmic challenges and perform operations crucial in both everyday programming and competitive coding. - -## Problems for Practice - -To further practice and test your understanding of recursion, consider solving the following problems from LeetCode: - -1. Fibonacci Number -2. Climbing Stairs -3. Permutations -4. Subsets -5. Combination Sum - - - Engaging with these problems will help reinforce the concepts learned and provide practical experience in using recursion effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of recursive algorithms in various contexts. diff --git a/docs/dsa/recursion/recursionVsIteration.md b/docs/dsa/recursion/recursionVsIteration.md deleted file mode 100644 index 84d0b0067..000000000 --- a/docs/dsa/recursion/recursionVsIteration.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -id: recursion-vs-iteration-in-dsa -title: Difference between Recursion and Iteration in Data Structures and Algorithms -sidebar_label: Recursion vs Iteration -sidebar_position: 3 -description: "Understanding the differences between recursion and iteration is crucial for selecting the appropriate approach for solving various problems in data structures and algorithms. This guide highlights the key differences, advantages, and use cases of both recursion and iteration." -tags: - [ - dsa, - data-structures, - algorithms, - recursion, - iteration, - recursion-vs-iteration, - recursion-in-dsa, - iteration-in-dsa, - recursion-vs-iteration-in-dsa, - recursion-vs-iteration-examples, - recursion-vs-iteration-differences, - recursion-vs-iteration-advantages, - recursion-vs-iteration-disadvantages, - recursion-vs-iteration-usage, - ] ---- - -Understanding the differences between recursion and iteration is crucial for selecting the appropriate approach for solving various problems in data structures and algorithms. This guide highlights the key differences, advantages, and use cases of both recursion and iteration. - -## Introduction - -### Recursion - -Recursion is a technique where a function calls itself in order to solve a smaller instance of the same problem until a base case is reached. Recursive solutions can be elegant and easy to understand but may come with performance overheads due to repeated function calls. - -### Iteration - -Iteration involves using loops (such as for, while, or do-while) to repeat a block of code until a certain condition is met. Iterative solutions are often more efficient in terms of memory usage and execution time compared to recursion, but they can be less intuitive for problems that have a naturally recursive structure. - -## Key Differences - -| Feature | Recursion | Iteration | -| ------------ | ------------------------------------------------------ | ------------------------------------------- | -| Definition | Function calls itself | Loop repeatedly executes block of code | -| Termination | Base case | Loop condition | -| Memory Usage | Uses call stack, can lead to stack overflow | Uses constant or linear memory | -| Readability | Often more readable for problems with recursive nature | Can be less readable for complex conditions | -| Performance | Higher overhead due to function calls | Generally more efficient | -| Use Cases | Divide and conquer, tree and graph traversal | Simple loops, repetitive tasks | - -## Examples - -### Factorial Calculation - -#### Recursion - -```python -def factorial(n): - if n == 0: - return 1 - else: - return n * factorial(n - 1) -``` - -#### Iteration - -```python -def factorial(n): - result = 1 - for i in range(1, n + 1): - result *= i - return result -``` - -### Fibonacci Series - -#### Recursion - -```python -def fibonacci(n): - if n <= 1: - return n - else: - return fibonacci(n - 1) + fibonacci(n - 2) -``` - -#### Iteration - -```python -def fibonacci(n): - a, b = 0, 1 - for _ in range(n): - a, b = b, a + b - return a -``` - -## Advantages and Disadvantages - -### Recursion - -#### Advantages: - - 1. Simplifies the code for problems that have a natural recursive structure. - 2. Makes the code easier to write and understand for problems like tree traversals. - -#### Disadvantages: - - 1. Can lead to stack overflow if the recursion depth is too large. - 2. Generally less efficient in terms of time and space due to function call overhead. - -### Iteration - -#### Advantages: - - 1. More efficient in terms of memory and execution time. - 2. Avoids the risk of stack overflow. - -#### Disadvantages: - - 1. Can result in more complex and less readable code for problems with recursive nature. - 2. Requires explicit management of loop conditions and state. - -## When to Use Recursion vs Iteration - -### Use Recursion When: - -The problem has a naturally recursive structure (e.g., tree and graph traversal). -Code readability and simplicity are more important than performance. -You are dealing with divide-and-conquer algorithms (e.g., quicksort, mergesort). - -### Use Iteration When: - -Performance and memory efficiency are critical. -The problem involves simple repetitive tasks or loops. -You want to avoid the risk of stack overflow for deep recursion. - -## Conclusion - -Both recursion and iteration are fundamental techniques in data structures and algorithms, each with its own strengths and weaknesses. The choice between recursion and iteration depends on the specific problem at hand, the importance of performance and memory usage, and the need for code readability and simplicity. By understanding the differences and appropriate use cases for each approach, you can make informed decisions in your algorithmic implementations. - -## Resources and References - -#### Books: - - 1. "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein - 2. "Data Structures and Algorithm Analysis in C" by Mark Allen Weiss - -#### Online Courses: - - 1. Coursera: Data Structures and Algorithms Specialization - 2. edX: Algorithms and Data Structures - -#### Websites: - - 1. GeeksforGeeks - 2. LeetCode - 3. HackerRank - - Understanding and mastering both recursion and iteration will significantly enhance your ability to solve a wide range of problems in data structures and algorithms. This guide provides a comprehensive overview of the differences, advantages, and use cases for each approach, enabling you to make the best choice for your specific needs. diff --git a/docs/dsa/recursion/recursion_leetcode_questions.md b/docs/dsa/recursion/recursion_leetcode_questions.md deleted file mode 100644 index 3010abf3c..000000000 --- a/docs/dsa/recursion/recursion_leetcode_questions.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -id: recursion-leetcode-questions -title: Recursion Leetcode Questions -sidebar_label: Recursion Leetcode Questions -sidebar_position: 4 -description: "A collection of 20 Leetcode questions focused on recursion, categorized into easy, medium, and hard levels." -tags: - [ - dsa, - data-structures, - algorithms, - recursion, - leetcode, - recursion-leetcode, - recursion-leetcode-easy, - recursion-leetcode-medium, - recursion-leetcode-hard, - recursion-leetcode-questions, - ] ---- - -A collection of 20 Leetcode questions focused on recursion, categorized into easy, medium, and hard levels. - -## Easy - -1. **[Factorial](https://leetcode.com/problems/factorial)** - - Description: Calculate the factorial of a given number using recursion. -2. **[Fibonacci Number](https://leetcode.com/problems/fibonacci-number)** - - Description: Compute the n-th Fibonacci number using recursion. -3. **[Reverse String](https://leetcode.com/problems/reverse-string)** - - Description: Reverse a string using recursion. -4. **[Sum of Digits of a Number](https://leetcode.com/problems/sum-of-digits-of-a-number)** - - Description: Find the sum of digits of a given number using recursion. -5. **[Power of Three](https://leetcode.com/problems/power-of-three)** - - Description: Determine if a number is a power of three using recursion. -6. **[Climbing Stairs](https://leetcode.com/problems/climbing-stairs)** - - Description: Find the number of ways to climb a staircase using recursion. -7. **[Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list)** - - Description: Check if a linked list is a palindrome using recursion. -8. **[Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree)** - - Description: Find the maximum depth of a binary tree using recursion. - -## Medium - -1. **[Subsets](https://leetcode.com/problems/subsets)** - - Description: Generate all possible subsets of a set using recursion. -2. **[Permutations](https://leetcode.com/problems/permutations)** - - Description: Generate all possible permutations of a sequence using recursion. -3. **[Unique Binary Search Trees II](https://leetcode.com/problems/unique-binary-search-trees-ii)** - - Description: Generate all unique BSTs that store values 1 to n using recursion. -4. **[Word Search](https://leetcode.com/problems/word-search)** - - Description: Search for a word in a 2D grid using recursion. -5. **[Combination Sum](https://leetcode.com/problems/combination-sum)** - - Description: Find all unique combinations of numbers that sum to a target using recursion. -6. **[Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number)** - - Description: Generate all possible letter combinations that a phone number could represent using recursion. -7. **[Generate Parentheses](https://leetcode.com/problems/generate-parentheses)** - - Description: Generate all combinations of well-formed parentheses using recursion. - -## Hard - -1. **[N-Queens](https://leetcode.com/problems/n-queens)** - - Description: Solve the N-Queens problem using recursion. -2. **[Sudoku Solver](https://leetcode.com/problems/sudoku-solver)** - - Description: Solve a given Sudoku puzzle using recursion. -3. **[Regular Expression Matching](https://leetcode.com/problems/regular-expression-matching)** - - Description: Implement regular expression matching with support for '.' and '\*' using recursion. -4. **[Longest Valid Parentheses](https://leetcode.com/problems/longest-valid-parentheses)** - - Description: Find the length of the longest valid parentheses substring using recursion. -5. **[Interleaving String](https://leetcode.com/problems/interleaving-string)** - - Description: Determine if a string is an interleaving of two other strings using recursion. - ---- - -These questions provide a comprehensive overview of recursion techniques and are a great way to practice and improve your recursion skills in data structures and algorithms. diff --git a/docs/dsa/stack/_category_.json b/docs/dsa/stack/_category_.json deleted file mode 100644 index 9b32456bc..000000000 --- a/docs/dsa/stack/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Stack", - "position": 12, - "link": { - "type": "generated-index", - "description": "Stack is a linear data structure that follows LIFO principle" - } -} diff --git a/docs/dsa/stack/stack-using-array.md b/docs/dsa/stack/stack-using-array.md deleted file mode 100644 index 3dd65eb53..000000000 --- a/docs/dsa/stack/stack-using-array.md +++ /dev/null @@ -1,244 +0,0 @@ ---- -id: stack-in-dsa -title: Stack Using Array -sidebar_label: Stack Using Array -sidebar_position: 1 -description: "Stack is a linear data structure that follows LIFO principle" -tags: [dsa, data-structures, stack, LIFO] ---- - -### Introduction to Stack - -A stack is a linear data structure that follows the Last In First Out (LIFO) principle. This means that the last element added to the stack will be the first one to be removed. Stacks are used in various applications such as expression evaluation, function call management in recursion, and more. - -### Stack Operations - -1. **Push**: Add an element to the top of the stack. -2. **Pop**: Remove the top element from the stack. -3. **Peek (or Top)**: Retrieve the top element of the stack without removing it. -4. **isEmpty**: Check if the stack is empty. -5. **Size**: Get the number of elements in the stack. - -### Pseudocode - -#### Basic Operations - -1. **Push**: - - ```text - function push(stack, element): - stack.append(element) - ``` - -2. **Pop**: - - ```text - function pop(stack): - if isEmpty(stack): - return "Stack Underflow" - return stack.pop() - ``` - -3. **Peek**: - - ```text - function peek(stack): - if isEmpty(stack): - return "Stack is empty" - return stack[-1] - ``` - -4. **isEmpty**: - - ```text - function isEmpty(stack): - return len(stack) == 0 - ``` - -5. **Size**: - ```text - function size(stack): - return len(stack) - ``` - -### Implementation in Python, C++, and Java - -#### Python Implementation - -```python -class Stack: - def __init__(self): - self.elements = [] - - def push(self, element): - self.elements.append(element) - - def pop(self): - if self.is_empty(): - return "Stack Underflow" - return self.elements.pop() - - def peek(self): - if self.is_empty(): - return "Stack is empty" - return self.elements[-1] - - def is_empty(self): - return len(self.elements) == 0 - - def size(self): - return len(self.elements) - -# Example usage -stack = Stack() -stack.push(10) -stack.push(20) -print(stack.pop()) # Output: 20 -print(stack.peek()) # Output: 10 -print(stack.is_empty()) # Output: False -print(stack.size()) # Output: 1 -``` - -#### C++ Implementation - -```cpp -#include -#include - -class Stack { -private: - std::vector.elements; - -public: - void push(int element) { - .elements.push_back(element); - } - - int pop() { - if (isEmpty()) { - std::cerr << "Stack Underflow" << std::endl; - return -1; - } - int top =.elements.back(); - .elements.pop_back(); - return top; - } - - int peek() { - if (isEmpty()) { - std::cerr << "Stack is empty" << std::endl; - return -1; - } - return.elements.back(); - } - - bool isEmpty() { - return.elements.empty(); - } - - int size() { - return.elements.size(); - } -}; - -// Example usage -int main() { - Stack stack; - stack.push(10); - stack.push(20); - std::cout << stack.pop() << std::endl; // Output: 20 - std::cout << stack.peek() << std::endl; // Output: 10 - std::cout << std::boolalpha << stack.isEmpty() << std::endl; // Output: false - std::cout << stack.size() << std::endl; // Output: 1 - return 0; -} -``` - -#### Java Implementation - -```java -import java.util.ArrayList; - -public class Stack { - private ArrayList.elements; - - public Stack() { - .elements = new ArrayList<>(); - } - - public void push(int element) { - .elements.add(element); - } - - public int pop() { - if (isEmpty()) { - System.out.println("Stack Underflow"); - return -1; - } - return.elements.remove.elements.size() - 1); - } - - public int peek() { - if (isEmpty()) { - System.out.println("Stack is empty"); - return -1; - } - return.elements.get.elements.size() - 1); - } - - public boolean isEmpty() { - return.elements.isEmpty(); - } - - public int size() { - return.elements.size(); - } - - // Example usage - public static void main(String[] args) { - Stack stack = new Stack(); - stack.push(10); - stack.push(20); - System.out.println(stack.pop()); // Output: 20 - System.out.println(stack.peek()); // Output: 10 - System.out.println(stack.isEmpty()); // Output: false - System.out.println(stack.size()); // Output: 1 - } -} -``` - -### Complexity - -- **Time Complexity**: - - - Push: $O(1)$ - - Pop: $O(1)$ - - Peek: $O(1)$ - - isEmpty: $O(1)$ - - Size: $O(1)$ - -- **Space Complexity**: $O(n)$, where $n$ is the number of elements in the stack. - -### Example - -Consider a stack with the following operations: - -1. Push 10 -2. Push 20 -3. Pop -4. Peek -5. Check if empty -6. Get size - -**Operations**: - -- Push 10: Stack becomes [10] -- Push 20: Stack becomes [10, 20] -- Pop: Removes 20, Stack becomes [10] -- Peek: Returns 10, Stack remains [10] -- isEmpty: Returns false -- Size: Returns 1 - -### Conclusion - -A stack is a fundamental data structure used in computer science for various applications where the LIFO (Last In First Out) principle is required. It is simple to implement and provides efficient operations for adding and removing elements. Understanding and using stacks effectively can help solve many algorithmic problems. diff --git a/docs/dsa/strings/_category_.json b/docs/dsa/strings/_category_.json deleted file mode 100644 index 5e94df7ac..000000000 --- a/docs/dsa/strings/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "String", - "position": 8, - "link": { - "type": "generated-index", - "description": "In data structures, a string is a sequence of characters used to represent text. Strings are commonly used for storing and manipulating textual data in computer programs. They can be manipulated using various operations like concatenation, substring extraction, and comparison." - } -} diff --git a/docs/dsa/strings/leetcode_practice_problems_strings.md b/docs/dsa/strings/leetcode_practice_problems_strings.md deleted file mode 100644 index a9ea2bd93..000000000 --- a/docs/dsa/strings/leetcode_practice_problems_strings.md +++ /dev/null @@ -1,31 +0,0 @@ -# Practice Problems for Strings - -To further practice and test your understanding of strings, consider solving the following problems from LeetCode: - -## Easy - -1. [Valid Palindrome](https://leetcode.com/problems/valid-palindrome/) -2. [Longest Common Prefix](https://leetcode.com/problems/longest-common-prefix/) -3. [Implement strStr()](https://leetcode.com/problems/implement-strstr/) -4. [Count and Say](https://leetcode.com/problems/count-and-say/) -5. [Reverse String](https://leetcode.com/problems/reverse-string/) -6. [First Unique Character in a String](https://leetcode.com/problems/first-unique-character-in-a-string/) -7. [Valid Anagram](https://leetcode.com/problems/valid-anagram/) -8. [Reverse Vowels of a String](https://leetcode.com/problems/reverse-vowels-of-a-string/) -9. [Detect Capital](https://leetcode.com/problems/detect-capital/) -10. [Repeated Substring Pattern](https://leetcode.com/problems/repeated-substring-pattern/) - -## Medium - -11. [Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/) -12. [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/) -13. [Group Anagrams](https://leetcode.com/problems/group-anagrams/) -14. [Decode String](https://leetcode.com/problems/decode-string/) -15. [String to Integer (atoi)](https://leetcode.com/problems/string-to-integer-atoi/) -16. [Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number/) -17. [Simplify Path](https://leetcode.com/problems/simplify-path/) -18. [Add Bold Tag in String](https://leetcode.com/problems/add-bold-tag-in-string/) -19. [Find All Anagrams in a String](https://leetcode.com/problems/find-all-anagrams-in-a-string/) -20. [Longest Palindromic Subsequence](https://leetcode.com/problems/longest-palindromic-subsequence/) - -Engaging with these problems will help reinforce the concepts learned and provide practical experience in using strings effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of string manipulation in various contexts. diff --git a/docs/dsa/strings/strings-dsa.md b/docs/dsa/strings/strings-dsa.md deleted file mode 100644 index a37e5923a..000000000 --- a/docs/dsa/strings/strings-dsa.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -id: strings-in-dsa -title: Strings in Data Structures and Algorithms -sidebar_label: Strings -sidebar_position: 1 -description: "A string is a sequence of characters. It is a data structure that represents a sequence of characters, either as a literal constant or as some kind of variable. In data structures and algorithms, strings are used in a wide range of applications such as text processing, pattern matching, and data serialization." -tags: - [ - dsa, - data-structures, - strings, - string, - string-data-structure, - string-in-dsa, - string-in-data-structure, - string-in-algorithm, - string-in-dsa-example, - string-in-dsa-explanation, - string-in-dsa-conclusion, - string-in-dsa-importance, - string-in-dsa-syntax, - string-in-dsa-declaration, - string-in-dsa-access, - string-in-dsa-update, - string-in-dsa-length, - string-in-dsa-iterate, - string-in-dsa-max-min, - string-in-dsa-program, - string-in-dsa-code, - string-in-dsa-js, - string-in-dsa-java, - string-in-dsa-python, - string-in-dsa-c, - string-in-dsa-cpp, - string-in-dsa-ts, - ] ---- - -A string is a sequence of characters. It is a data structure that represents a sequence of characters, either as a literal constant or as some kind of variable. In data structures and algorithms, strings are used in a wide range of applications such as text processing, pattern matching, and data serialization. - -## Why are Strings important? - -Strings are important because they are used to store and manipulate text. They are used in many applications such as text processing, pattern matching, and data serialization. - -## How to declare a String? - -A string can be declared in various programming languages using the following syntax: - -# Strings in Data Structures and Algorithms (DSA) - -## Table of Contents - -1. [Introduction](#introduction) -2. [Basic String Operations](#basic-string-operations) -3. [Pattern Matching Algorithms](#pattern-matching-algorithms) -4. [String Manipulation](#string-manipulation) -5. [String Data Structures](#string-data-structures) -6. [Common String Problems](#common-string-problems) -7. [Advanced String Algorithms](#advanced-string-algorithms) -8. [Resources and References](#resources-and-references) - -## Introduction - -Strings are sequences of characters and are a fundamental data type in computer science. They are used extensively in algorithms and data structures. - -## Basic String Operations - -- **Length**: Determine the length of a string. -- **Concatenation**: Combine two or more strings. -- **Substring**: Extract a portion of a string. -- **Comparison**: Compare two strings lexicographically. -- **Search**: Find the occurrence of a substring. - -## Why are Strings important? - -Strings are important because they are used to store and manipulate text. They are used in many applications such as text processing, pattern matching, and data serialization. - -## How to declare a String? - -A string can be declared in various programming languages using the following syntax: - - - - - ```js - // Declare a string in JavaScript - let str = "Hello, world!"; - ``` - - - - ```java - // Declare a string in Java - String str = "Hello, world!"; - ``` - - - - ```python - # Declare a string in Python - str = "Hello, world!" - ``` - - - - ```c - // Declare a string in C - char str[] = "Hello, world!"; - ``` - - - - ```cpp - // Declare a string in C++ - std::string str = "Hello, world!"; - ``` - - - - ```ts - // Declare a string in TypeScript - let str: string = "Hello, world!"; - ``` - - - -## How to access a String? - -A string can be accessed using the index of the character. The index of the first character is 0, the index of the second character is 1, and so on. - - - - - ```js - // Access a string in JavaScript - let str = "Hello, world!"; - console.log(str[0]); // H - console.log(str[1]); // e - console.log(str[2]); // l - ``` - - - - ```java - // Access a string in Java - String str = "Hello, world!"; - System.out.println(str.charAt(0)); // H - System.out.println(str.charAt(1)); // e - System.out.println(str.charAt(2)); // l - ``` - - - - ```python - # Access a string in Python - str = "Hello, world!" - print(str[0]) # H - print(str[1]) # e - print(str[2]) # l - ``` - - - - ```c - // Access a string in C - char str[] = "Hello, world!"; - printf("%c\n", str[0]); // H - printf("%c\n", str[1]); // e - printf("%c\n", str[2]); // l - ``` - - - - ```cpp - // Access a string in C++ - std::string str = "Hello, world!"; - std::cout << str[0] << std::endl; // H - std::cout << str[1] << std::endl; // e - std::cout << str[2] << std::endl; // l - ``` - - - - ```ts - // Access a string in TypeScript - let str: string = "Hello, world!"; - console.log(str[0]); // H - console.log(str[1]); // e - console.log(str[2]); // l - ``` - - - -## How to update a String? - -A string can be updated by creating a new string with the desired changes, as strings are immutable in many programming languages. - - - - - ```js - // Update a string in JavaScript - let str = "Hello, world!"; - str = "Hello, JavaScript!"; - console.log(str); // Hello, JavaScript! - ``` - - - - ```java - // Update a string in Java - String str = "Hello, world!"; - str = "Hello, Java!"; - System.out.println(str); // Hello, Java! - ``` - - - - ```python - # Update a string in Python - str = "Hello, world!" - str = "Hello, Python!" - print(str) # Hello, Python! - ``` - - - - ```c - // Update a string in C - char str[] = "Hello, world!"; - strcpy(str, "Hello, C!"); - printf("%s\n", str); // Hello, C! - ``` - - - - ```cpp - // Update a string in C++ - std::string str = "Hello, world!"; - str = "Hello, C++!"; - std::cout << str << std::endl; // Hello, C++! - ``` - - - - ```ts - // Update a string in TypeScript - let str: string = "Hello, world!"; - str = "Hello, TypeScript!"; - console.log(str); // Hello, TypeScript! - ``` - - - -## How to find the length of a String? - -The length of a string can be found using the `length` property or method. - - - - - ```js - // Find the length of a string in JavaScript - let str = "Hello, world!"; - console.log(str.length); // 13 - ``` - - - - ```java - // Find the length of a string in Java - String str = "Hello, world!"; - System.out.println(str.length()); // 13 - ``` - - - - ```python - # Find the length of a string in Python - str = "Hello, world!" - print(len(str)) # 13 - ``` - - - -## Pattern Matching Algorithms - -- **Naive Pattern Matching**: A straightforward approach with a time complexity of O(m\*n). -- **Knuth-Morris-Pratt (KMP)**: An efficient pattern matching algorithm with a time complexity of O(m+n). -- **Rabin-Karp Algorithm**: Uses hashing for pattern matching with a time complexity of O(m+n) on average. -- **Boyer-Moore Algorithm**: A powerful algorithm with a worst-case time complexity of O(m\*n) but performs well in practice. - -## String Manipulation - -- **Reversal**: Reversing a string. -- **Palindromes**: Checking if a string reads the same forwards and backwards. -- **Anagrams**: Checking if two strings are permutations of each other. -- **Rotation**: Rotating a string by a given number of characters. - -## String Data Structures - -- **Trie (Prefix Tree)**: A tree-like data structure that stores a dynamic set of strings, typically used for search operations. -- **Suffix Tree**: A compressed trie of all suffixes of a given string, useful for pattern matching. -- **Suffix Array**: An array of all suffixes of a string, sorted in lexicographical order. -- **Aho-Corasick Algorithm**: A trie-based data structure for multiple pattern matching. - -## Common String Problems - -- **Longest Common Substring**: Finding the longest substring that appears in two or more strings. -- **Longest Common Subsequence**: Finding the longest sequence that can be derived from two strings without changing the order of characters. -- **Edit Distance (Levenshtein Distance)**: Measuring the minimum number of single-character edits required to change one string into another. -- **String Compression**: Reducing the size of a string using algorithms like Run-Length Encoding (RLE). - -## Advanced String Algorithms - -- **Burrows-Wheeler Transform (BWT)**: A data transformation algorithm useful for data compression. -- **Manacher’s Algorithm**: An efficient algorithm to find the longest palindromic substring in linear time. -- **Z-Algorithm**: Finds occurrences of a pattern in a string in linear time. - -## Resources and References - -- **Books**: - - "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein - - "Algorithms" by Robert Sedgewick and Kevin Wayne -- **Online Courses**: - - Coursera: Data Structures and Algorithm Specialization - - edX: Algorithms and Data Structures -- **Websites**: - - [GeeksforGeeks](https://www.geeksforgeeks.org) - - [LeetCode](https://leetcode.com) - - [HackerRank](https://www.hackerrank.com) - ---- - -By understanding and mastering these string concepts and algorithms, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. - -## Conclusion - -Strings are a vital data structure in the study of data structures and algorithms (DSA). They are sequences of characters used to represent text and are fundamental to various programming tasks. In this tutorial, we explored the essential operations related to strings, including declaration, access, modification, length determination, iteration, and searching in different programming languages like JavaScript, Java, Python, C, C++, and TypeScript. - -Understanding strings is crucial for solving numerous problems in computer science, from simple text manipulation to complex algorithms in text processing, pattern matching, and more. The examples provided demonstrate how to work with strings efficiently, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of strings enhances your ability to handle data and perform operations crucial in both everyday programming and competitive coding. - -Problems for Practice -To further practice and test your understanding of strings, consider solving the following problems from LeetCode: - -1. Longest Substring Without Repeating Characters -2. Valid Anagram -3. Longest Palindromic Substring -4. Group Anagrams -5. Minimum Window Substring - -Engaging with these problems will help reinforce the concepts learned and provide practical experience in using strings effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of string manipulation in various contexts. diff --git a/docs/html/_category_.json b/docs/html/_category_.json index 1d5f1200b..3c4cbb3b2 100644 --- a/docs/html/_category_.json +++ b/docs/html/_category_.json @@ -1,6 +1,6 @@ { "label": "HTML", - "position": 9, + "position": 2, "link": { "type": "generated-index", "description": "HTML stands for Hyper Text Markup Language. It is the standard markup language for documents designed to be displayed in a web browser. It can be assisted by technologies such as Cascading Style Sheets (CSS) and scripting languages such as JavaScript." diff --git a/docs/java/Spring-and-Spring-Boot/_category_.json b/docs/java/Spring-and-Spring-Boot/_category_.json deleted file mode 100644 index aec111a48..000000000 --- a/docs/java/Spring-and-Spring-Boot/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Spring and Spring-boot", - "position": 10, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about very famous frameworks of core jaava spring and springboot" - } - } \ No newline at end of file diff --git a/docs/java/Spring-and-Spring-Boot/aspect-oriented-programming.md b/docs/java/Spring-and-Spring-Boot/aspect-oriented-programming.md deleted file mode 100644 index 2c2b191e8..000000000 --- a/docs/java/Spring-and-Spring-Boot/aspect-oriented-programming.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -id: aspect oriented programming -title: Aspect oriented programming(AOP) -sidebar_label: Spring AOP Tutorial -sidebar_position: 4 -tags: [java, spring,core-java, programming, java core, java spring, java web, AOP, aspect oriented] -description: in thi tutorial you will learn about aspect oriented programming and how aspect6s are working and when to use it and how to use it. ---- -### Spring AOP Tutorial - -**Aspect-Oriented Programming (AOP)** complements Object-Oriented Programming (OOP) by providing modularity, with aspects as the key unit of modularity rather than classes. - -AOP breaks the program logic into distinct parts called concerns, increasing modularity by addressing cross-cutting concerns. - -### Why Use AOP? - -AOP offers a pluggable way to dynamically add additional concerns before, after, or around the actual logic. For instance, consider a class `A` with multiple methods: - -```java -class A { - public void m1() { ... } - public void m2() { ... } - public void m3() { ... } - public void m4() { ... } - public void m5() { ... } - public void n1() { ... } - public void n2() { ... } - public void p1() { ... } - public void p2() { ... } - public void p3() { ... } -} -``` - -To maintain logs and send notifications after calling methods starting with `m`, you would traditionally have to write this logic in each method. However, if the client decides to change the notification requirement, you would need to update all methods, leading to maintenance problems. - -With AOP, you define additional concerns like logging and notification separately and manage them via configuration. This makes maintenance easier, as changes can be made in a single place. - -### Where to Use AOP? - -AOP is mainly used for: - -1. Declarative enterprise services such as transaction management. -2. Implementing custom aspects. - -### AOP Concepts and Terminology - -**Join Point**: A point in the program such as method execution, exception handling, etc. Spring supports only method execution join points. - -**Advice**: An action taken by an aspect at a join point. Types of advice include: -- **Before Advice**: Executes before a join point. -- **After Returning Advice**: Executes after a join point completes normally. -- **After Throwing Advice**: Executes if a method exits by throwing an exception. -- **After (finally) Advice**: Executes after a join point regardless of its exit. -- **Around Advice**: Executes before and after a join point. - -**Pointcut**: An expression language of AOP that matches join points. - -**Introduction**: Introduction of additional methods and fields for a type, allowing new interfaces for advised objects. - -**Target Object**: The object being advised by one or more aspects, also known as the proxied object. - -**Aspect**: A class containing advices, join points, etc. - -**Interceptor**: An aspect containing only one advice. - -**AOP Proxy**: Implements aspect contracts, created by the AOP framework. In Spring, it can be a JDK dynamic proxy or a CGLIB proxy. - -**Weaving**: The process of linking aspects with other application types to create an advised object, done at compile time, load time, or runtime. Spring AOP performs weaving at runtime. - -### AOP Implementations - -1. **AspectJ** -2. **Spring AOP** -3. **JBoss AOP** - -### Spring AOP Usage - -Spring AOP can be used in three ways, with the most common being the Spring AspectJ Annotation Style: - -1. By Spring 1.2 Old style (DTD based) -2. By AspectJ annotation style -3. By Spring XML configuration style - -### Spring AOP AspectJ Annotation Example - -**Annotations:** -- `@Aspect`: Declares the class as an aspect. -- `@Pointcut`: Declares the pointcut expression. -- **Advice Annotations:** - - `@Before`: Applied before the actual method. - - `@After`: Applied after the actual method and before returning the result. - - `@AfterReturning`: Applied after the method completes, allows access to the return value. - - `@Around`: Applied before and after the actual method. - - `@AfterThrowing`: Applied if the method throws an exception. - -**Example:** - -```java title="Operation.java" -package com.javatpoint; - -public class Operation { - public void msg() { System.out.println("msg method invoked"); } - public int m() { System.out.println("m method invoked"); return 2; } - public int k() { System.out.println("k method invoked"); return 3; } -} -``` - -(Aspect with Before Advice) -```java title="TrackOperation.java" -package com.javatpoint; - -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; -import org.aspectj.lang.annotation.Pointcut; - -@Aspect -public class TrackOperation { - @Pointcut("execution(* Operation.*(..))") - public void k() {} // Pointcut name - - @Before("k()") // Applying pointcut on before advice - public void myadvice(JoinPoint jp) { // This is advice - System.out.println("additional concern"); - // System.out.println("Method Signature: " + jp.getSignature()); - } -} -``` - -(Spring Configuration) -```xml title="applicationContext.xml" - - - - - - - - -``` - -(Main Class) -```java title="Test.java" -package com.javatpoint; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class Test { - public static void main(String[] args) { - ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); - Operation e = (Operation) context.getBean("opBean"); - System.out.println("calling msg..."); - e.msg(); - System.out.println("calling m..."); - e.m(); - System.out.println("calling k..."); - e.k(); - } -} -``` - -**Output:** -``` -calling msg... -additional concern -msg() method invoked -calling m... -additional concern -m() method invoked -calling k... -additional concern -k() method invoked -``` - -The additional concern is printed before each method invocation. - -### Other Examples - -#### @After Example - -```java title="TrackOperation.java" -@After("k()") // Applying pointcut on after advice -public void myadvice(JoinPoint jp) { - System.out.println("additional concern"); - // System.out.println("Method Signature: " + jp.getSignature()); -} -``` - -#### @AfterReturning Example -```java title="TrackOperation.java" -@AfterReturning(pointcut = "execution(* Operation.*(..))", returning = "result") -public void myadvice(JoinPoint jp, Object result) { - System.out.println("additional concern"); - System.out.println("Method Signature: " + jp.getSignature()); - System.out.println("Result in advice: " + result); - System.out.println("end of after returning advice..."); -} -``` - -#### aop:before Example (XML Configuration) -```java title="TrackOperation.java" -package com.javatpoint; -import org.aspectj.lang.JoinPoint; -public class TrackOperation { - public void myadvice(JoinPoint jp) { // It is advice - System.out.println("additional concern"); - // System.out.println("Method Signature: " + jp.getSignature()); - } -} -``` - - -```xml title="applicationContext.xml" - - - - - - - -``` - -#### aop:after Example (XML Configuration) -```xml - - - - - - - -``` - -#### aop:after-returning Example (XML Configuration) -```xml - - - - - - - -``` - -### Summary -Spring AOP helps in separating cross-cutting concerns like logging, transaction management, etc., from the business logic. This modular approach makes maintenance and evolution of the codebase easier and more manageable. \ No newline at end of file diff --git a/docs/java/Spring-and-Spring-Boot/dependency-injection.md b/docs/java/Spring-and-Spring-Boot/dependency-injection.md deleted file mode 100644 index b6db59ea7..000000000 --- a/docs/java/Spring-and-Spring-Boot/dependency-injection.md +++ /dev/null @@ -1,243 +0,0 @@ ---- -id: dependency injection -title: dependency injection -sidebar_label: dependency injection in spring -sidebar_position: 3 -tags: [java, spring,core-java, programming, java core, java spring, java web] -description: in thi tutorial you will learn about how to injetch dependencies in classe and objects which is core concept of java ---- -### IoC Container - -The IoC container in the Spring Framework is responsible for managing the lifecycle and configuration of application objects. It instantiates, configures, and assembles the dependencies between objects based on the configuration provided (usually in an XML file or through annotations). The IoC container performs three main tasks: -1. Instantiates the application classes. -2. Configures the objects. -3. Assembles the dependencies between the objects. - -There are two types of IoC containers in Spring: - -1. **BeanFactory** -2. **ApplicationContext** - -#### Difference between BeanFactory and ApplicationContext - -Both `org.springframework.beans.factory.BeanFactory` and `org.springframework.context.ApplicationContext` act as IoC containers. However, the `ApplicationContext` interface extends the `BeanFactory` interface and adds additional functionality such as integration with Spring's AOP, message resource handling (for internationalization), event propagation, and application-layer specific contexts like `WebApplicationContext` for web applications. Therefore, using `ApplicationContext` is generally preferred over `BeanFactory`. - -### Using BeanFactory - -The `XmlBeanFactory` is an implementation of the `BeanFactory` interface. To use `BeanFactory`, create an instance of `XmlBeanFactory` as shown below: - -```java -Resource resource = new ClassPathResource("applicationContext.xml"); -BeanFactory factory = new XmlBeanFactory(resource); -``` - -The constructor of `XmlBeanFactory` takes a `Resource` object, so you need to pass a `Resource` object to create an instance of `BeanFactory`. - -### Using ApplicationContext - -The `ClassPathXmlApplicationContext` class is an implementation of the `ApplicationContext` interface. To use `ApplicationContext`, instantiate `ClassPathXmlApplicationContext` as shown below: - -```java -ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); -``` - -The constructor of `ClassPathXmlApplicationContext` takes a string representing the name of the XML file to create an instance of `ApplicationContext`. - -### Dependency Injection in Spring - -Dependency Injection (DI) is a design pattern that reduces tight coupling between objects by injecting their dependencies from external sources, making the code easier to manage and test. Spring supports DI through two main methods: -1. **Constructor Injection** -2. **Setter Injection** - -#### Constructor Injection - -Constructor injection is done using the `` sub-element within the `` element in the XML configuration file. Here's an example: - - - -```java title="Employee.java" -package com.codeharborehub; - -public class Employee { - private int id; - private String name; - - public Employee() { System.out.println("default constructor"); } - - public Employee(int id) { this.id = id; } - - public Employee(String name) { this.name = name; } - - public Employee(int id, String name) { - this.id = id; - this.name = name; - } - - void show() { - System.out.println(id + " " + name); - } -} -``` -```xml title="applicationContext.xml" - - - - - - - -``` - - -```java title="Test.java" -package com.codeharborehub; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.xml.XmlBeanFactory; -import org.springframework.core.io.*; - -public class Test { - public static void main(String[] args) { - Resource r = new ClassPathResource("applicationContext.xml"); - BeanFactory factory = new XmlBeanFactory(r); - - Employee e = (Employee) factory.getBean("e"); - e.show(); - } -} -``` - -#### Setter Injection - -Setter injection is done using the `` element within the `` element in the XML configuration file. Here's an example: - -```java title="Employee.java" -package com.codeharborehub; - -public class Employee { - private int id; - private String name; - private String city; - - public int getId() { return id; } - public void setId(int id) { this.id = id; } - - public String getName() { return name; } - public void setName(String name) { this.name = name; } - - public String getCity() { return city; } - public void setCity(String city) { this.city = city; } - - void display() { - System.out.println(id + " " + name + " " + city); - } -} -``` -```xml title="applicationContext.xml" - - - - - - 20 - - - Arun - - - ghaziabad - - - -``` - -```java title="Test.java" -package com.codeharborehub; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.xml.XmlBeanFactory; -import org.springframework.core.io.*; - -public class Test { - public static void main(String[] args) { - Resource r = new ClassPathResource("applicationContext.xml"); - BeanFactory factory = new XmlBeanFactory(r); - - Employee e = (Employee) factory.getBean("obj"); - e.display(); - } -} -``` - -### Difference between Constructor and Setter Injection - -1. **Partial Dependency**: Partial dependencies can be injected using setter injection but not with constructor injection. -2. **Overriding**: Setter injection overrides constructor injection. -3. **Changes**: Setter injection allows for more flexibility in changing the values without creating a new instance, unlike constructor injection. - -### Dependency Injection with Factory Method in Spring - -Spring allows for the injection of beans using factory methods. This can be done by specifying `factory-method` and optionally `factory-bean` attributes in the `` element. - -**Example:** - -```java title="A.java" -package com.codeharborehub; - -public class A { - private static final A obj = new A(); - private A() { System.out.println("private constructor"); } - - public static A getA() { - System.out.println("factory method"); - return obj; - } - - public void msg() { - System.out.println("hello user"); - } -} -``` - -```xml title="applicationContext.xml" - - - - - -``` - -```java title="Test.java" -package com.codeharborehub; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class Test { - public static void main(String[] args) { - ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); - A a = (A) context.getBean("a"); - a.msg(); - } -} -``` - -**Output:** - -``` -private constructor -factory method -hello user -``` \ No newline at end of file diff --git a/docs/java/Spring-and-Spring-Boot/introduction-to-spring.md b/docs/java/Spring-and-Spring-Boot/introduction-to-spring.md deleted file mode 100644 index f263d911c..000000000 --- a/docs/java/Spring-and-Spring-Boot/introduction-to-spring.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -id: introduction-to-spring -title: Introduction to Spring -sidebar_label: Introduction to Spring -sidebar_position: 1 -tags: [java, spring,core-java, programming, java core, java spring, java web] -description: in thi tutorial you will learn about what is spring framework and why it is required and how to use it ---- - - - -This spring tutorial provides in-depth concepts of the Spring Framework with simplified examples. It was developed by Rod Johnson in 2003. The Spring framework makes the easy development of JavaEE applications. - -It is helpful for beginners and experienced persons. - -![Spring Framework](https://static.javatpoint.com/images/spimages/spring1.png) - -## Why Learn Spring? - -Spring is the most popular application development framework for enterprise Java. Millions of developers around the world use the Spring Framework to create high-performing, easily testable, and reusable code. - -Spring framework is an open-source Java platform. It was initially written by Rod Johnson and was first released under the Apache 2.0 license in June 2003. - -Spring is lightweight when it comes to size and transparency. The basic version of the Spring framework is around 2MB. - -The core features of the Spring Framework can be used in developing any Java application, but there are extensions for building web applications on top of the Java EE platform. The Spring framework aims to make J2EE development easier to use and promotes good programming practices by enabling a POJO-based programming model. - -## Spring Framework - -Spring is a lightweight framework. It can be thought of as a framework of frameworks because it provides support to various frameworks such as Struts, Hibernate, Tapestry, EJB, JSF, etc. The framework, in a broader sense, can be defined as a structure where we find solutions to various technical problems. - -The Spring framework comprises several modules such as IOC, AOP, DAO, Context, ORM, WEB MVC, etc. We will learn these modules on the next page. Let's understand the IOC and Dependency Injection first. - -## Advantages of Spring Framework - -There are many advantages of the Spring Framework. They are as follows: - -1. **Predefined Templates**: Spring framework provides templates for JDBC, Hibernate, JPA, etc. technologies. So there is no need to write too much code. It hides the basic steps of these technologies. For example, with JdbcTemplate, you don't need to write code for exception handling, creating connections, creating statements, committing transactions, closing connections, etc. You only need to write the code for executing queries. Thus, it saves a lot of JDBC code. - -2. **Loose Coupling**: Spring applications are loosely coupled because of dependency injection. - -3. **Easy to Test**: Dependency Injection makes it easier to test applications. EJB or Struts applications require a server to run, but the Spring framework doesn't require a server. - -4. **Lightweight**: The Spring framework is lightweight because of its POJO implementation. The Spring Framework doesn't force the programmer to inherit any class or implement any interface, making it non-invasive. - -5. **Fast Development**: The Dependency Injection feature of the Spring Framework and its support for various frameworks make JavaEE application development easy. - -6. **Powerful Abstraction**: It provides powerful abstraction to JavaEE specifications such as JMS, JDBC, JPA, and JTA. - -7. **Declarative Support**: - -## Applications of Spring - -The benefits of using the Spring Framework include: - -- **POJO Based**: Spring enables developers to develop enterprise-class applications using POJOs. This means you do not need an EJB container product such as an application server; you can use a robust servlet container such as Tomcat. - -- **Modular**: Spring is organized in a modular fashion. Although there are many packages and classes, you only need to worry about the ones you need. - -- **Integration with Existing Frameworks**: Spring does not reinvent the wheel; it uses existing technologies like ORM frameworks, logging frameworks, JEE, Quartz, JDK timers, and other view technologies. - -- **Testability**: Testing a Spring application is simple because environment-dependent code is moved into this framework. Using JavaBean-style POJOs makes it easier to use dependency injection for injecting test data. - -- **Web MVC**: Spring's web framework is a well-designed web MVC framework, providing a great alternative to web frameworks like Struts. - -- **Central Exception Handling**: Spring provides a convenient API to translate technology-specific exceptions (e.g., JDBC, Hibernate, JDO) into consistent, unchecked exceptions. - -- **Lightweight**: Lightweight IoC containers are beneficial for developing and deploying applications on computers with limited memory and CPU resources. - -- **Transaction Management**: Spring provides a consistent transaction management interface that can scale from local to global transactions. - -## Spring Modules - -The Spring framework comprises many modules such as core, beans, context, expression language, AOP, Aspects, Instrumentation, JDBC, ORM, OXM, JMS, Transaction, Web, Servlet, Struts, etc. These modules are grouped into Test, Core Container, AOP, Aspects, Instrumentation, Data Access/Integration, and Web (MVC/Remoting). - -![Spring Modules](https://static.javatpoint.com/images/sp/spmodules.jpg) - -### Test - -This layer provides support for testing with JUnit and TestNG. - -### Spring Core Container - -The Spring Core container contains core, beans, context, and expression language (EL) modules. - -#### Core and Beans - -These modules provide IOC and Dependency Injection features. - -#### Context - -This module supports internationalization (I18N), EJB, JMS, and Basic Remoting. - -#### Expression Language - -It is an extension to the EL defined in JSP. It provides support for setting and getting property values, method invocation, accessing collections and indexers, named variables, logical and arithmetic operators, retrieval of objects by name, etc. - -### AOP, Aspects, and Instrumentation - -These modules support aspect-oriented programming implementation where you can use Advices, Pointcuts, etc., to decouple the code. - -The Aspects module provides support for integration with AspectJ. - -The Instrumentation module provides support for class instrumentation and classloader implementations. - -### Data Access/Integration - -This group comprises JDBC, ORM, OXM, JMS, and Transaction modules. These modules provide support for interacting with databases. - -### Web - -This group comprises Web, Web-Servlet, Web-Struts, and Web-Portlet modules. These modules provide support for creating web applications. -Sure! Here’s a conclusion section for the Spring tutorial: - -## Conclusion - -The Spring Framework is a powerful, versatile, and comprehensive platform for developing Java applications. Its modular architecture allows developers to focus on specific aspects of application development without being bogged down by unnecessary complexity. The benefits of using Spring, such as its lightweight nature, robust transaction management, and ease of integration with other technologies, make it an excellent choice for both beginners and experienced developers. - -By leveraging Spring's core features, like dependency injection and aspect-oriented programming, developers can create maintainable, testable, and high-performing applications. Whether you're building a simple web application or a complex enterprise system, Spring provides the tools and frameworks necessary to streamline development and promote best practices. - -As you continue to explore and learn more about Spring, you'll discover how its flexibility and extensive ecosystem can help you tackle a wide range of development challenges efficiently. diff --git a/docs/java/Spring-and-Spring-Boot/object-relational-model.md b/docs/java/Spring-and-Spring-Boot/object-relational-model.md deleted file mode 100644 index e936c1887..000000000 --- a/docs/java/Spring-and-Spring-Boot/object-relational-model.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -id: object-relational-model -title: Spring with ORM Frameworks -sidebar_label: Spring with ORM Frameworks -sidebar_position: 5 -tags: [java, spring,core-java, programming, java core, java spring, java web,ORM,hibernate] -description: in thi tutorial you will learn about object relational model which will tell that how spring work with tables inspite of being object oriented. ---- - - - -### Spring with ORM Frameworks - -Spring provides an API to seamlessly integrate with ORM frameworks such as Hibernate, JPA (Java Persistence API), JDO (Java Data Objects), Oracle Toplink, and iBATIS. Leveraging ORM frameworks with Spring offers several advantages: - -#### Advantages of Spring Framework with ORM Frameworks: - -1. **Reduced Coding**: Spring eliminates the need to write boilerplate code for tasks like managing database connections, transactions, etc. - -2. **Easy Testing**: Spring's Inversion of Control (IoC) approach facilitates easier testing of applications. - -3. **Enhanced Exception Handling**: Spring provides its own API for exception handling when used with ORM frameworks. - -4. **Integrated Transaction Management**: Spring allows wrapping mapping code with an explicit template wrapper class or using AOP-style method interceptors for transaction management. - -#### Hibernate and Spring Integration: - -Integrating Hibernate with Spring is straightforward. Instead of configuring database information in a `hibernate.cfg.xml` file, you can provide all the necessary information in the `applicationContext.xml` file. This simplifies configuration and reduces the amount of code required. - -#### Advantages of Spring Framework with Hibernate: - -Spring provides the `HibernateTemplate` class, which streamlines the interaction with Hibernate. This eliminates the need for many manual steps such as creating configurations, building session factories, managing sessions, transactions, etc. - -Consider the comparison between traditional Hibernate usage and Spring with Hibernate: - -**Traditional Hibernate:** -```java -Configuration cfg = new Configuration(); -cfg.configure("hibernate.cfg.xml"); -SessionFactory factory = cfg.buildSessionFactory(); -Session session = factory.openSession(); -Transaction t = session.beginTransaction(); -Employee e1 = new Employee(111, "arun", 40000); -session.persist(e1); -t.commit(); -session.close(); -``` - -**Using HibernateTemplate with Spring:** -```java -Employee e1 = new Employee(111, "arun", 40000); -hibernateTemplate.save(e1); -``` - -#### Methods of `HibernateTemplate` class: - -| No. | Method | Description | -|-----|-----------------------------------|---------------------------------------------------------| -| 1) | `void persist(Object entity)` | Persists the given object. | -| 2) | `Serializable save(Object entity)`| Persists the given object and returns its ID. | -| 3) | `void saveOrUpdate(Object entity)`| Persists or updates the given object based on ID. | -| 4) | `void update(Object entity)` | Updates the given object. | -| 5) | `void delete(Object entity)` | Deletes the given object based on ID. | -| 6) | `Object get(Class entityClass, Serializable id)` | Retrieves a persistent object based on ID. | -| 7) | `Object load(Class entityClass, Serializable id)`| Lazy-loads a persistent object based on ID. | -| 8) | `List loadAll(Class entityClass)` | Retrieves all persistent objects of a given type. | - -### Steps for Hibernate and Spring Integration: - -1. **Create Database Table**: (Optional) Create a table in the database. - -2. **Create `applicationContext.xml`**: Configure data source, session factory, and other Hibernate-related beans. - -3. **Create `Employee.java`**: Define the persistent class. - -4. **Create `employee.hbm.xml`**: Mapping file for `Employee` class. - -5. **Create `EmployeeDao.java`**: DAO class using `HibernateTemplate` to interact with the database. - -6. **Create `InsertTest.java`**: Test class to demonstrate saving an employee object. - -### Example of Hibernate and Spring Integration: - -#### Directory Structure: - -``` -java -|--- com - |--- codeharbourhub - |--- Employee.java - |--- EmployeeDao.java - |--- InsertTest.java -resources -|--- applicationContext.xml -|--- employee.hbm.xml -``` - -#### 1) Create Table in the Database: - -```sql -CREATE TABLE EMPLOYEE ( - ID NUMBER(10) NOT NULL, - NAME VARCHAR2(255), - SALARY FLOAT, - PRIMARY KEY (ID) -); -``` - -#### 2) Create Employee.java file: - -```java title="Employee.java" -package com.codeharbourhub; - -public class Employee { - private int id; - private String name; - private float salary; - - // Getters and Setters -} -``` - -#### 3) `employee.hbm.xml`: - -```xml title="employee.hbm.xml" - - - - - - - - - - - - - -``` - -#### 4) `EmployeeDao.java`: - -```java title="EmployeeDao.java" -package com.codeharbourhub; - -import org.springframework.orm.hibernate3.HibernateTemplate; -import java.util.List; - -public class EmployeeDao { - HibernateTemplate template; - - public void setTemplate(HibernateTemplate template) { - this.template = template; - } - - // Method to save employee - public void saveEmployee(Employee e) { - template.save(e); - } - - // Method to update employee - public void updateEmployee(Employee e) { - template.update(e); - } - - // Method to delete employee - public void deleteEmployee(Employee e) { - template.delete(e); - } - - // Method to return one employee of given id - public Employee getById(int id) { - Employee e = (Employee) template.get(Employee.class, id); - return e; - } - - // Method to return all employees - public List getEmployees() { - List list = template.loadAll(Employee.class); - return list; - } -} -``` - -#### 5) `applicationContext.xml`: - -```xml title="applicationContext.xml" - - - - - - - - - - - - - - - - employee.hbm.xml - - - - - - - org.hibernate.dialect.Oracle9Dialect - update - true - - - - - - - - - - - - - -``` - -#### 6) `InsertTest.java`: - -```java title="InsertTest.java" -package com.codeharbourhub; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.xml.XmlBeanFactory; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; - -public class InsertTest { - public static void main(String[] args) { - Resource r = new ClassPathResource("applicationContext.xml"); - BeanFactory factory = new XmlBeanFactory(r); - - EmployeeDao dao = (EmployeeDao) factory.getBean("d"); - - Employee e = new Employee(); - e.setId(114); - e.setName("varun"); - e.setSalary(50000); - - dao.saveEmployee(e); - } -} -``` - -Now, upon executing `InsertTest.java`, the record will be successfully inserted into the Oracle database. -In this tutorial, we explored the integration of Hibernate with the Spring framework, leveraging Spring's powerful features to simplify the development process. Here's a summary of the key points covered: - -1. **Integration Overview**: - - Spring offers seamless integration with ORM (Object-Relational Mapping) frameworks like Hibernate, JPA, JDO, Oracle Toplink, and iBATIS. - - The integration provides advantages such as reduced boilerplate code, easier testing through IoC (Inversion of Control), improved exception handling, and integrated transaction management. - -2. **Hibernate and Spring Integration**: - - Hibernate applications typically require a `hibernate.cfg.xml` file to configure database information. However, when integrating with Spring, this configuration can be provided in the `applicationContext.xml` file. - - Spring simplifies Hibernate usage by providing classes like `HibernateTemplate`, reducing the need for manual configuration and session management. - -3. **Benefits of Spring with Hibernate**: - - With Spring, developers can utilize the `HibernateTemplate` class, significantly reducing the amount of code required compared to using Hibernate alone. - - The `HibernateTemplate` class provides methods for common operations like persisting, updating, and deleting objects, as well as fetching objects by ID or loading all objects of a particular type. - -4. **Steps for Integration**: - - The integration process involves several steps, including creating database tables, defining Hibernate mapping files (`employee.hbm.xml`), implementing the persistent class (`Employee.java`), creating a DAO (Data Access Object) class (`EmployeeDao.java`), and configuring the Spring application context (`applicationContext.xml`). - - Finally, a test class (`InsertTest.java`) is used to demonstrate the integration by saving an instance of the `Employee` class using the `EmployeeDao`. - -5. **Configuration**: - - The `applicationContext.xml` file contains configuration details such as DataSource setup, session factory configuration, Hibernate properties, and bean definitions for the `HibernateTemplate` and DAO classes. - -6. **Execution**: - - Upon executing the `InsertTest` class, the Spring context is initialized, and the `EmployeeDao` bean is obtained from the context. An instance of `Employee` is created and saved using the DAO's `saveEmployee` method, demonstrating successful integration and data persistence. - -By following these steps, developers can seamlessly integrate Hibernate with Spring, leveraging the powerful features of both frameworks to build robust and maintainable Java applications. \ No newline at end of file diff --git a/docs/java/Spring-and-Spring-Boot/requestparam-annotation.md b/docs/java/Spring-and-Spring-Boot/requestparam-annotation.md deleted file mode 100644 index 85d257731..000000000 --- a/docs/java/Spring-and-Spring-Boot/requestparam-annotation.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -id: overview-of-requestparam -title: Overview of @RequestParam in Spring Boot -sidebar_label: Overview ---- - -In Spring Boot, the `@RequestParam` annotation is used to extract query parameters, form parameters, and parts of multi-part requests from the URL. This annotation is part of the Spring Web module and binds HTTP request parameters to controller method arguments. - -## Usage - -The `@RequestParam` annotation can be used in a controller method to extract parameters from the query string of the URL. - -### Example - -```java -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class MyController { - - @GetMapping("/greet") - public String greet(@RequestParam(name = "name", defaultValue = "World") String name) { - return "Hello, " + name + "!"; - } -} -``` - -In this example: -- A GET request to `/greet?name=John` returns `"Hello, John!"`. -- A GET request to `/greet` returns `"Hello, World!"` due to the default value. - -## Required Parameters - -By default, `@RequestParam` is required. If the parameter is not present in the request, Spring will throw an exception. - -### Example - -```java -@GetMapping("/greet") -public String greet(@RequestParam String name) { - return "Hello, " + name + "!"; -} -``` - -If the `name` parameter is missing in the above example, Spring will throw a `MissingServletRequestParameterException`. - -## Optional Parameters - -To make a request parameter optional, set the `required` attribute to `false`. - -### Example - -```java -@GetMapping("/greet") -public String greet(@RequestParam(required = false) String name) { - return "Hello, " + (name != null ? name : "World") + "!"; -} -``` - -## Default Values - -You can provide a default value for a parameter using the `defaultValue` attribute. If the parameter is not present in the request, the default value will be used. - -### Example - -```java -@GetMapping("/greet") -public String greet(@RequestParam(name = "name", defaultValue = "World") String name) { - return "Hello, " + name + "!"; -} -``` - -## Multiple Parameters - -You can use multiple `@RequestParam` annotations in a single method to bind multiple parameters. - -### Example - -```java -@GetMapping("/add") -public String add(@RequestParam int a, @RequestParam int b) { - return "Sum: " + (a + b); -} -``` - -A GET request to `/add?a=5&b=3` would return `"Sum: 8"`. - -## List Parameters - -If a request parameter can have multiple values, you can bind it to a `List`. - -### Example - -```java -@GetMapping("/numbers") -public String numbers(@RequestParam List numbers) { - return "Numbers: " + numbers; -} -``` - -A GET request to `/numbers?numbers=1&numbers=2&numbers=3` would return `"Numbers: [1, 2, 3]"`. - -## Conclusion - -The `@RequestParam` annotation in Spring Boot is a powerful tool for extracting parameters from HTTP requests. It allows for required and optional parameters, default values, and can handle multiple and list parameters. By understanding and using `@RequestParam`, you can create more flexible and robust web applications. diff --git a/docs/java/Spring-and-Spring-Boot/spring-environment-setup.md b/docs/java/Spring-and-Spring-Boot/spring-environment-setup.md deleted file mode 100644 index a38ae27bd..000000000 --- a/docs/java/Spring-and-Spring-Boot/spring-environment-setup.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -id: spring-environment-setup -title: Spring Environment Setup -sidebar_label: spring environment setup -sidebar_position: 2 -tags: [java, spring,core-java, programming, java core, java spring, java web] -description: in thi tutorial you will learn about how to install and use spring framework in you local computer environment. and make your first java spring project in ecllips ---- - -# Spring Environment Setup - -## Step 1 - Setup Java Development Kit (JDK) - -You can download the latest version of SDK from Oracle's Java site − [Java SE Downloads](https://www.oracle.com/java/technologies/javase-downloads.html). You will find instructions for installing JDK in the downloaded files, follow the given instructions to install and configure the setup. Finally, set PATH and JAVA_HOME environment variables to refer to the directory that contains `java` and `javac`, typically `java_install_dir/bin` and `java_install_dir` respectively. - -If you are running Windows and have installed the JDK in `C:\jdk1.6.0_15`, you would have to put the following line in your `C:\autoexec.bat` file. - -```shell -set PATH=C:\jdk1.6.0_15\bin;%PATH% -set JAVA_HOME=C:\jdk1.6.0_15 -``` - -Alternatively, on Windows NT/2000/XP, you will have to right-click on My Computer, select Properties → Advanced → Environment Variables. Then, you will have to update the PATH value and click the OK button. - -On Unix (Solaris, Linux, etc.), if the SDK is installed in `/usr/local/jdk1.6.0_15` and you use the C shell, you will have to put the following into your `.cshrc` file. - -```shell -setenv PATH /usr/local/jdk1.6.0_15/bin:$PATH -setenv JAVA_HOME /usr/local/jdk1.6.0_15 -``` - -Alternatively, if you use an Integrated Development Environment (IDE) like Borland JBuilder, Eclipse, IntelliJ IDEA, or Sun ONE Studio, you will have to compile and run a simple program to confirm that the IDE knows where you have installed Java. Otherwise, you will have to carry out a proper setup as given in the document of the IDE. - -## Step 2 - Install Apache Common Logging API - -You can download the latest version of the Apache Commons Logging API from [Apache Commons Logging](https://commons.apache.org/logging/). Once you download the installation, unpack the binary distribution into a convenient location. For example, in `C:\commons-logging-1.1.1` on Windows, or `/usr/local/commons-logging-1.1.1` on Linux/Unix. This directory will have the following jar files and other supporting documents, etc. - -Make sure you set your CLASSPATH variable on this directory properly otherwise you will face a problem while running your application. - -## Step 3 - Setup Eclipse IDE - -All the examples in this tutorial have been written using Eclipse IDE. So we would suggest you should have the latest version of Eclipse installed on your machine. - -To install Eclipse IDE, download the latest Eclipse binaries from [Eclipse Downloads](https://www.eclipse.org/downloads/). Once you download the installation, unpack the binary distribution into a convenient location. For example, in `C:\eclipse` on Windows, or `/usr/local/eclipse` on Linux/Unix and finally set the PATH variable appropriately. - -Eclipse can be started by executing the following commands on Windows machines, or you can simply double-click on `eclipse.exe`. - -```shell -%C:\eclipse\eclipse.exe -``` - -Eclipse can be started by executing the following commands on Unix (Solaris, Linux, etc.) machines − - -```shell -$/usr/local/eclipse/eclipse -``` - -After a successful startup, if everything is fine then it should display the following result − - -## Step 4 - Setup Spring Framework Libraries - -Now if everything is fine, then you can proceed to set up your Spring framework. Following are the simple steps to download and install the framework on your machine. - -1. Make a choice whether you want to install Spring on Windows or Unix, and then proceed to the next step to download the `.zip` file for Windows and `.tz` file for Unix. - -2. Download the latest version of Spring framework binaries from [Spring Releases](https://repo.spring.io/release/org/springframework/spring). - -At the time of developing this tutorial, `spring-framework-4.1.6.RELEASE-dist.zip` was downloaded on a Windows machine. After the downloaded file was unzipped, it gives the following directory structure inside `E:\spring`. - - - -You will find all the Spring libraries in the directory `E:\spring\libs`. Make sure you set your CLASSPATH variable on this directory properly otherwise you will face a problem while running your application. If you are using Eclipse, then it is not required to set CLASSPATH because all the settings will be done through Eclipse. - -Once you are done with this last step, you are ready to proceed to your first Spring example. - -## Steps to Create Spring Application in Eclipse IDE - -Let's see the 5 steps to create the first Spring application using Eclipse IDE. - -### 1. Create the Java Project - -Go to File menu → New → Project → Java Project. Write the project name e.g., `firstspring` and click Finish. Now the Java project is created. - -### 2. Add Spring Jar Files - -There are mainly three jar files required to run this application. - -- `org.springframework.core-3.0.1.RELEASE-A` -- `com.springsource.org.apache.commons.logging-1.1.1` -- `org.springframework.beans-3.0.1.RELEASE-A` - -To load the jar files in Eclipse IDE, right-click on your project → Build Path → Add external archives → select all the required jar files → Finish. - -### 3. Create Java Class - -In this case, we are simply creating the `Student` class with a `name` property. The name of the student will be provided by the XML file. It is just a simple example, not the actual use of Spring. We will see the actual use in the Dependency Injection chapter. To create the Java class, right-click on `src` → New → Class → Write the class name e.g., `Student` → Finish. Write the following code: - -```java -package com.javatpoint; - -public class Student { - private String name; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public void displayInfo() { - System.out.println("Hello: " + name); - } -} -``` - -This is a simple bean class, containing only one property `name` with its getter and setter methods. This class contains one extra method named `displayInfo()` that prints the student name with a hello message. - -### 4. Create the XML File - -To create the XML file click on `src` → New → File → Give the file name such as `applicationContext.xml` → Finish. Open the `applicationContext.xml` file, and write the following code: - -```xml - - - - - - - - -``` - -The `bean` element is used to define the bean for the given class. The `property` sub-element of `bean` specifies the property of the `Student` class named `name`. The value specified in the `property` element will be set in the `Student` class object by the IOC container. - -### 5. Create the Test Class - -Create the Java class e.g., `Test`. Here we are getting the object of the `Student` class from the IOC container using the `getBean()` method of `BeanFactory`. Let's see the code of the test class. - -```java -package com.javatpoint; - -import org.springframework.beans.factory.BeanFactory; -import org.springframework.beans.factory.xml.XmlBeanFactory; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; - -public class Test { - public static void main(String[] args) { - Resource resource = new ClassPathResource("applicationContext.xml"); - BeanFactory factory = new XmlBeanFactory(resource); - - Student student = (Student) factory.getBean("studentbean"); - student.displayInfo(); - } -} -``` - ---- - -## Conclusion - -Setting up the Java Development Kit (JDK), Apache Commons Logging API, Eclipse IDE, and Spring Framework libraries are essential steps in preparing your development environment for building Java applications with the Spring Framework. By following these steps, you ensure that your environment is properly configured, enabling you to focus on writing and running your Spring applications efficiently. - -Once your setup is complete, creating your first Spring application becomes straightforward with the help of Eclipse IDE. This guide walked you through the steps to create a simple Spring application, demonstrating the power and flexibility of the Spring Framework. - -With your environment ready and your first application up and running, you're well on your way to exploring the many features and capabilities of Spring. Happy coding! diff --git a/docs/java/Spring-and-Spring-Boot/spring-mvc.md b/docs/java/Spring-and-Spring-Boot/spring-mvc.md deleted file mode 100644 index 1135b9f7d..000000000 --- a/docs/java/Spring-and-Spring-Boot/spring-mvc.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -id: spring-mvc -title: introduction to spring mvc -sidebar_label: Introduction to Spring mvc -sidebar_position: 6 -tags: [java, spring,core-java, programming, java core, java spring, java web,java-mvc,model,view,controller,mvc in] -description: in thi tutorial you will learn about what is MVC and how to sue it in java and it works with java with example ---- -### Spring MVC Tutorial - -Spring MVC is a Java framework used for building web applications. It implements the Model-View-Controller (MVC) design pattern and provides features like Inversion of Control and Dependency Injection. - -#### Spring Web Model-View-Controller - -![Spring Web Model-View-Controller](https://static.javatpoint.com/sppages/images/spring-web-model-view-controller.png) - -- **Model:** Contains the data of the application. It can be a single object or a collection of objects. -- **Controller:** Contains the business logic of the application. Marked with the `@Controller` annotation. -- **View:** Represents the provided information in a particular format. JSP+JSTL is commonly used for creating view pages. - -#### Front Controller - -In Spring Web MVC, the `DispatcherServlet` class acts as the front controller, managing the flow of the Spring MVC application. - -![Flow of Spring Web MVC](https://static.javatpoint.com/sppages/images/flow-of-spring-web-mvc.png) - -- All incoming requests are intercepted by the `DispatcherServlet`. -- The `DispatcherServlet` forwards the request to the appropriate controller. -- The controller returns a `ModelAndView` object. -- The `DispatcherServlet` invokes the specified view component. - -#### Advantages of Spring MVC Framework - -- **Separate roles:** Each role is fulfilled by a specialized object, promoting better code organization. -- **Lightweight:** Utilizes a lightweight servlet container for application development and deployment. -- **Powerful Configuration:** Provides robust configuration for both framework and application classes. -- **Rapid Development:** Facilitates fast and parallel development. -- **Reusable Business Code:** Allows the reuse of existing business objects. -- **Easy to Test:** Supports the creation of JavaBeans classes for easy testing. - -#### Spring Web MVC Framework Example - -##### Required Jar files or Maven Dependency - -If using Maven, add the following dependencies to the `pom.xml` file: - -```xml title="pom.xml" - - - org.springframework - spring-webmvc - 5.1.1.RELEASE - - - - - javax.servlet - servlet-api - 3.0-alpha-1 - -``` - -##### Create the Controller Class - -```java title="controller.java" -package com.javatpoint; - -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class HelloController { - @RequestMapping("/") - public String display() { - return "index"; - } -} -``` - -##### Provide the entry of controller in the `web.xml` file - -```xml title="web.xml" - - spring - org.springframework.web.servlet.DispatcherServlet - 1 - - - spring - / - -``` - -##### Define the bean in the XML file (`spring-servlet.xml`) - -```xml - - - - - - - - - - - - - -``` - -##### Display the message in the JSP page (`index.jsp`) - -```jsp - - -

    Welcome to Spring MVC Tutorial

    - - -``` - -In this tutorial, we've seen how to set up a basic Spring MVC application. With this setup, incoming requests are handled by the `DispatcherServlet`, which maps them to the appropriate controller. The controller then returns a view, which is rendered to the user. - - -##### Create Multiple Controllers - -Let's extend our example to include multiple controllers, each handling different requests. - -1. **Add Dependencies to `pom.xml`** - - Ensure that the Spring Web MVC dependency is included in the `pom.xml` file. - -2. **Create the Request Page (`index.jsp`)** - - Create a simple JSP page containing links to different controllers. - - ```jsp - - -
    Spring MVC || - Spring Boot - - - ``` - -3. **Create Controller Classes** - - We'll create two controller classes, each handling a different request. - - - - ```java title="HelloController.java" - package com.javatpoint; - - import org.springframework.stereotype.Controller; - import org.springframework.web.bind.annotation.RequestMapping; - - @Controller - public class HelloController1 { - @RequestMapping("/hello1") - public String display() { - return "viewpage1"; - } - } - ``` - - - ```java title="hellocontroller2.java" - package com.javatpoint; - - import org.springframework.stereotype.Controller; - import org.springframework.web.bind.annotation.RequestMapping; - - @Controller - public class HelloController2 { - @RequestMapping("/hello2") - public String display() { - return "viewpage2"; - } - } - ``` - -4. **Provide the Entry of Controllers in `web.xml`** - - Ensure that the `DispatcherServlet` is configured to map requests correctly. - -5. **Define the Bean in the XML File (`spring-servlet.xml`)** - - Define the view resolver to map logical view names to physical JSP files. - -6. **Create the View Pages** - - Create JSP pages corresponding to each controller. - - **viewpage1.jsp** - - ```jsp - - -

    Welcome to Spring MVC Tutorial

    - - - ``` - - **viewpage2.jsp** - - ```jsp - - -

    Welcome to Spring Boot Tutorial

    - - - ``` - -By following these steps, you can create a Spring MVC application with multiple controllers, each handling specific requests and returning corresponding views. - -This concludes the extended example of a Spring MVC framework. You can now deploy the project and start the server to see the application in action. \ No newline at end of file diff --git a/docs/java/Thymeleaf-in-java/Iteration-and-evalution.md b/docs/java/Thymeleaf-in-java/Iteration-and-evalution.md deleted file mode 100644 index 725f6af57..000000000 --- a/docs/java/Thymeleaf-in-java/Iteration-and-evalution.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: Iteration and Evalution in Thymeleaf -title: Iteration and Evalution in Thymeleaf -sidebar_label: Iteration and Evalution in Thymeleaf -sidebar_position: 1 -tags: [java, mvc,thymleaf, programming, java core, java spring, java web, AOP, aspect oriented] -description: in thi tutorial you will learn about Iteration and Evalution in Thymeleaf ---- - -### Introduction -In this guide, we'll explore Thymeleaf's iteration and conditional evaluation capabilities, focusing on the practical implementation within a web application. We'll cover iteration basics, keeping iteration status, lazy retrieval of data, and conditional evaluation. - -### Iteration Basics -The product list page is essential for displaying a collection of products. We utilize Thymeleaf's `th:each` attribute to iterate over the products and generate HTML dynamically. - -```html -
    - - - - -``` - -### Keeping Iteration Status -Thymeleaf provides a mechanism for keeping track of iteration status using the `iterStat` variable. This allows us to apply styling or logic based on the current iteration's properties. - -```html - -``` - -### Lazy Retrieval of Data -To optimize data retrieval, Thymeleaf supports lazy loading of context variables. This ensures that data is retrieved only when needed, improving performance. - -```java -context.setVariable( - "users", - new LazyContextVariable>() { - @Override - protected List loadValue() { - return databaseRepository.findAllUsers(); - } - }); -``` - -### Conditional Evaluation -Thymeleaf offers simple conditionals (`th:if` and `th:unless`) and switch statements (`th:switch` / `th:case`) for conditional rendering of HTML elements. - -```html -view -``` - -### Conclusion -By leveraging Thymeleaf's iteration and conditional evaluation features, we can create dynamic and responsive web pages that adapt to different data scenarios. This enhances user experience and improves the efficiency of our web application. \ No newline at end of file diff --git a/docs/java/Thymeleaf-in-java/_category_.json b/docs/java/Thymeleaf-in-java/_category_.json deleted file mode 100644 index 00de609b0..000000000 --- a/docs/java/Thymeleaf-in-java/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Thymeleaf in Java", - "position": 15, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about Thymeleaf the web framework of java and also learn about MVC model from near" - } - } \ No newline at end of file diff --git a/docs/java/Thymeleaf-in-java/introduction-to-thymeleaf.md b/docs/java/Thymeleaf-in-java/introduction-to-thymeleaf.md deleted file mode 100644 index 570ba8e58..000000000 --- a/docs/java/Thymeleaf-in-java/introduction-to-thymeleaf.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -id: Introduction to Thymeleaf -title: Introduction to Thymeleaf -sidebar_label: Introduction to Thymeleaf -sidebar_position: 1 -tags: [java, mvc,thymleaf, programming, java core, java spring, java web, AOP, aspect oriented] -description: in thi tutorial you will learn about introduction thymeleaf and basics of MVC ---- -### What is Thymeleaf? -Thymeleaf is a modern server-side Java template engine designed for both web and standalone environments. It can process various types of content including HTML, XML, JavaScript, CSS, and plain text. The primary objective of Thymeleaf is to offer an elegant and highly maintainable approach to creating templates. It introduces the concept of Natural Templates, allowing logic injection without compromising the template's usability as a design prototype. Thymeleaf is built with web standards in mind, particularly HTML5, enabling the creation of fully validating templates. - -### What kind of templates can Thymeleaf process? -Thymeleaf supports six template modes: -- HTML -- XML -- TEXT -- JAVASCRIPT -- CSS -- RAW - -These modes encompass markup and textual templates, with HTML and XML modes accepting respective input types. Thymeleaf does not perform validation on HTML templates but enforces well-formedness rules for XML templates. The TEXT mode caters to non-markup templates, such as text emails or documentation. - -### Dialects: The Standard Dialect -Thymeleaf is highly extensible, allowing detailed customization of template processing. It employs a concept called dialects, which consist of processors applying logic to template artifacts. Thymeleaf's core library includes the Standard Dialect, offering comprehensive functionality for most users. - -### Using Texts -#### A multi-language welcome -Thymeleaf facilitates internationalization (i18n) through text externalization, enabling the extraction of template fragments into separate files. These fragments, called "messages," are identified by keys and can be easily replaced with equivalent texts in other languages. Thymeleaf employs the `#{...}` syntax to specify text corresponding to a specific message. The location of externalized text is configurable, typically residing in .properties files. By default, Thymeleaf uses the Standard Message Resolver, which expects messages in properties files corresponding to the template's name and locale. -Certainly! - -In our example, let's consider a simple home page for a grocery site. The initial version includes a title and a welcome message: - -```html - - - - Good Thymes Virtual Grocery - - - - -

    Welcome to our grocery store!

    - - -``` - -While this HTML code is valid and can be displayed by any browser, it's not strictly compliant with HTML5 standards due to the non-standard attributes such as `th:text`. Thymeleaf allows the use of these attributes for its functionalities. - -The `th:text` attribute evaluates its value expression and sets the result as the body of the host tag. In this case, it replaces the default welcome message with the message identified by the key `home.welcome`. - -Now, let's externalize this text for internationalization. We'll create a properties file for each supported language. For example, for Spanish: - - -```properties title="home.properties" -home.welcome=¡Bienvenido a nuestra tienda de comestibles! -``` - -This file contains the translated welcome message for Spanish-speaking users. - -With Thymeleaf, this setup allows for easy management of text across different languages, enhancing the user experience of our grocery site. -Certainly, here's the content presented in the desired format: - ---- - - -```java title="HomeController.java" -public class HomeController implements IGTVGController { - public void process(final IWebExchange webExchange, final ITemplateEngine templateEngine, final Writer writer) throws Exception { - WebContext ctx = new WebContext(webExchange, webExchange.getLocale()); - templateEngine.process("home", ctx, writer); - } -} -``` - -```java title="IContext.java" -public interface IContext { - public Locale getLocale(); - public boolean containsVariable(final String name); - public Set getVariableNames(); - public Object getVariable(final String name); -} -``` - -```java title="IContext.java" -public interface IWebContext extends IContext { - public IWebExchange getExchange(); -} -``` - -**Creating WebContext** -```java -WebContext ctx = new WebContext(webExchange, webExchange.getLocale()); -``` - -**Processing Template** -```java -templateEngine.process("home", ctx, writer); -``` - -**Processed HTML with Spanish Locale** -```html - - - - Good Thymes Virtual Grocery - - - - -

    ¡Bienvenido a nuestra tienda de comestibles!

    - - -``` - -**Unescaped Text in Thymeleaf** -```html -

    Welcome to our grocery store!

    -``` - -**Adding Date Variable to Context** -```java -public void process(final IWebExchange webExchange, final ITemplateEngine templateEngine, final Writer writer) throws Exception { - SimpleDateFormat dateFormat = new SimpleDateFormat("dd MMMM yyyy"); - Calendar cal = Calendar.getInstance(); - WebContext ctx = new WebContext(webExchange, webExchange.getLocale()); - ctx.setVariable("today", dateFormat.format(cal.getTime())); - templateEngine.process("home", ctx, writer); -} -``` - -**Displaying Date Variable in Template** -```html - -

    Welcome to our grocery store!

    -

    Today is: 13 February 2011

    - -``` - -**Unescaped Text with HTML Tags** -```html -

    Welcome to our fantastic grocery store!

    -``` - -**Conclusion:** - -Thymeleaf is a powerful server-side Java template engine designed for web and standalone environments. It offers extensive capabilities for processing various types of content including HTML, XML, JavaScript, CSS, and plain text. - -Key concepts within Thymeleaf include: - -1. **Contexts**: Thymeleaf contexts, represented by objects implementing the `IContext` interface, provide the necessary data for template execution, including variables and locale information. In web applications, the `IWebContext` interface extends `IContext` to provide additional functionality, such as access to HTTP request and response objects. - -2. **Processing Templates**: Thymeleaf processes templates using the `ITemplateEngine` interface, where a context object containing the required data is passed along with the template name and an output writer. - -3. **Internationalization**: Thymeleaf supports internationalization (i18n) through externalization of text fragments into properties files, allowing for easy translation of content into multiple languages. This is achieved using special syntax such as `#{...}` for message resolution. - -4. **Unescaped Text**: Thymeleaf provides the `th:utext` attribute for displaying unescaped text, preserving HTML markup within the text content. - -5. **Variables and Expressions**: Thymeleaf allows the use of variables and expressions within templates, enabling dynamic content generation. Variables are accessed using the `${...}` syntax, and expressions can range from simple variable references to complex object navigation using languages like OGNL (Object-Graph Navigation Language). - -In conclusion, Thymeleaf offers a robust and flexible solution for template processing in Java web applications, providing developers with powerful tools for creating dynamic and internationalized web content. - diff --git a/docs/java/Thymeleaf-in-java/syntax-in-thymleaf.md b/docs/java/Thymeleaf-in-java/syntax-in-thymleaf.md deleted file mode 100644 index 682b99b37..000000000 --- a/docs/java/Thymeleaf-in-java/syntax-in-thymleaf.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -id: Syntaxes in Thymeleaf -title: Syntaxes in Thymeleaf -sidebar_label: Syntaxes in Thymeleaf -sidebar_position: 2 -tags: [java, mvc,thymleaf, programming, java core, java spring, java web, AOP, aspect oriented] -description: in thi tutorial you will learn about basic syntaxes in thymeleaf and how to use them ---- - -Thymeleaf Standard Expressions offer a versatile way to dynamically generate content in web applications. These expressions can be used within HTML attributes to manipulate data, create links, handle messages, and more. Here's a summary of the key features and expressions: - -1. **Simple expressions:** - - Variable Expressions: `${...}` - - Selection Variable Expressions: `*{...}` - - Message Expressions: `#{...}` - - Link URL Expressions: `@{...}` - - Fragment Expressions: `~{...}` - -2. **Literals:** - - Text literals: `'one text'`, `'Another one!'` - - Number literals: `0`, `34`, `3.0`, `12.3` - - Boolean literals: `true`, `false` - - Null literal: `null` - - Literal tokens: `one`, `sometext`, `main` - -3. **Text operations:** - - String concatenation: `+` - - Literal substitutions: `|The name is ${name}|` - - Arithmetic operations: `+`, `-`, `*`, `/`, `%` - - Boolean operations: `and`, `or`, `!`, `not` - - Comparisons and equality: `>`, `<`, `>=`, `<=`, `==`, `!=` - -4. **Conditional operators:** - - If-then: `(if) ? (then)` - - If-then-else: `(if) ? (then) : (else)` - - Default: `(value) ?: (defaultvalue)` - -5. **Special tokens:** - - No-Operation: `_` - -6. **Expression Utility Objects:** - - Utility objects like `#execInfo`, `#messages`, `#uris`, `#conversions`, etc. - -7. **Data Conversion / Formatting:** - - Double-brace syntax for applying data conversion: `${{...}}` - -Thymeleaf expressions offer a powerful way to manipulate data and generate dynamic content in web applications. By leveraging these expressions, developers can create more flexible and interactive user experiences. Let's delve into an example: - -Suppose you have a web page displaying user information fetched from a database. Using Thymeleaf expressions, you can dynamically populate the page with user-specific data: - -```html -
    -

    Name: John.

    -

    Surname: Doe.

    -

    Age: 27.

    -
    -``` - -In this example, `${user}` represents the user object retrieved from the server-side, and `*{...}` expressions access properties of this object. The Elvis operator `?:` provides a default value if the age property is null. - -Thymeleaf's expressive syntax enables developers to build dynamic web applications with ease, providing a seamless user experience. - -Thymeleaf's Standard Expressions provide a robust framework for dynamic content generation in web applications. Let's explore in more detail how each type of expression can be used and provide some practical examples: - -### Simple Expressions: - -#### Variable Expressions: -Variable expressions `${...}` are used to access variables stored in the context. These variables can be any Java objects made available to the template. - -Example: -```html -

    Welcome, Guest!

    -``` - -#### Selection Variable Expressions: -Selection variable expressions `*{...}` are similar to variable expressions, but they operate on a selected object, usually set using the `th:object` attribute. - -Example: -```html -
    -

    Name: John.

    -
    -``` - -#### Message Expressions: -Message expressions `#{...}` are used for internationalization and localization. They fetch messages from property files based on the current locale. - -Example: -```html -

    Welcome to our website!

    -``` - -#### Link URL Expressions: -Link URL expressions `@{...}` are used to create URLs within templates. They can include dynamic parameters. - -Example: -```html -View Profile -``` - -#### Fragment Expressions: -Fragment expressions `~{...}` are used to include fragments of markup from other templates. They are typically used with `th:insert` or `th:replace`. - -Example: -```html -
    -``` - -### Literals: - -#### Text literals: -Text literals are enclosed in single quotes and can contain any characters. - -Example: -```html -

    This is a 'text' literal.

    -``` - -#### Number literals: -Number literals represent numeric values. - -Example: -```html -

    The answer is 42.

    -``` - -#### Boolean literals: -Boolean literals represent true or false values. - -Example: -```html -
    Logged in
    -``` - -#### Null literal: -The null literal represents a null value. - -Example: -```html -
    User not found
    -``` - -#### Literal tokens: -Literal tokens allow simplified expressions for certain common cases. - -Example: -```html -
    ...
    -``` - -### Text Operations: - -Thymeleaf provides several text operations for manipulating strings: - -#### String concatenation: -String concatenation can be achieved using the `+` operator. - -Example: -```html -

    Hello, John!

    -``` - -#### Literal substitutions: -Literal substitutions allow formatting strings with variable values without using explicit concatenation. - -Example: -```html -

    Welcome back, John!

    -``` - -#### Arithmetic operations: -Thymeleaf supports basic arithmetic operations like addition, subtraction, multiplication, division, and modulus. - -Example: -```html -

    Total: 25.00

    -``` - -#### Boolean operations: -Boolean operations like `and`, `or`, `not` can be used for logical operations. - -Example: -```html -
    Welcome, Guest!
    -``` - -#### Comparisons and equality: -Thymeleaf supports comparison and equality operations using symbols like `>`, `<`, `>=`, `<=`, `==`, `!=`. - -Example: -```html -
    Adult
    -``` - -#### Conditional expressions: -Conditional expressions can be used to evaluate different expressions based on a condition. - -Example: -```html -

    -``` - -### Expression Utility Objects: - -Thymeleaf provides utility objects for performing common tasks within expressions: - -- `#execInfo`: Information about the template being processed. -- `#messages`: Methods for obtaining externalized messages. -- `#uris`: Methods for escaping parts of URLs. -- `#conversions`: Methods for executing conversion services. -- `#dates`: Methods for formatting java.util.Date objects. -- `#calendars`: Methods for java.util.Calendar objects. -- `#temporals`: Methods for dealing with dates and times using the java.time API. -- `#numbers`: Methods for formatting numeric objects. -- `#strings`: Methods for String objects. -- `#objects`: Methods for objects in general. -- `#bools`: Methods for boolean evaluation. -- `#arrays`: Methods for arrays. -- `#lists`: Methods for lists. -- `#sets`: Methods for sets. -- `#maps`: Methods for maps. -- `#aggregates`: Methods for creating aggregates on arrays or collections. -- `#ids`: Methods for dealing with id attributes that might be repeated. - -These utility objects provide additional functionalities within expressions, making it easier to work with various types of data. - -### Data Conversion / Formatting: - -Thymeleaf allows for data conversion and formatting using a double-brace syntax `${{...}}`. - -Example: -```html -

    Last login: 2024-06-01 10:00 AM

    -``` - -This syntax instructs Thymeleaf to apply data conversion, such as formatting a date object before rendering it in the template. - -### Conclusion: - -Thymeleaf's Standard Expressions provide a powerful and flexible way to generate dynamic content in web applications. By leveraging these expressions, developers can create sophisticated templates that adapt to various data sources and user interactions, enhancing the overall user experience. \ No newline at end of file diff --git a/docs/java/_category_.json b/docs/java/_category_.json deleted file mode 100644 index 4f91b9b40..000000000 --- a/docs/java/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Java", - "position": 10, - "link": { - "type": "generated-index", - "description": "Java is a general-purpose programming language that is class-based, object-oriented, and designed to have as few implementation dependencies as possible. It is intended to let application developers write once, run anywhere (WORA), meaning that compiled Java code can run on all platforms that support Java without the need for recompilation. Java applications are typically compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. The syntax of Java is similar to C and C++, but it has fewer low-level facilities than either of them. As of 2019, Java was one of the most popular programming languages in use according to GitHub, particularly for client-server web applications, with a reported 9 million developers. Java was originally developed by James Gosling at Sun Microsystems (which has since been acquired by Oracle Corporation) and released in 1995 as a core component of Sun Microsystems Java platform." - } - } \ No newline at end of file diff --git a/docs/java/advanced-topics-and-best-practices/_category_.json b/docs/java/advanced-topics-and-best-practices/_category_.json deleted file mode 100644 index 5c7ea20ab..000000000 --- a/docs/java/advanced-topics-and-best-practices/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Advanced Topics and Best Practices in Java", - "position": 16, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about advanced topics and best practices in Java." - } -} \ No newline at end of file diff --git a/docs/java/advanced-topics-and-best-practices/advanced-java-topics.md b/docs/java/advanced-topics-and-best-practices/advanced-java-topics.md deleted file mode 100644 index 63228de66..000000000 --- a/docs/java/advanced-topics-and-best-practices/advanced-java-topics.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: advanced-java-topics -title: Advanced Java Topics -sidebar_label: Advanced Java Topics -sidebar_position: 1 -tags: [java, advanced-java-topics] -description: In this tutorial, you will learn about advanced Java topics such as Java Generics, Java Reflection, Java Annotations, Java Multithreading, Java Serialization, and Java Networking. ---- -Java offers a plethora of advanced topics that allow developers to build sophisticated and high-performance applications. Here are some advanced topics in Java: - -1. **Generics**: Generics enable the creation of classes, interfaces, and methods that operate on types specified at compile time. They provide compile-time type safety and facilitate the creation of reusable and type-safe code. - -2. **Concurrency**: Concurrency and multi-threading allow programs to execute multiple tasks simultaneously, improving performance and responsiveness. Java provides robust concurrency utilities such as the `java.util.concurrent` package, `ExecutorService`, `Thread`, and `Runnable` interfaces. - -3. **Lambda Expressions and Functional Programming**: Lambda expressions introduced in Java 8 enable functional programming paradigms in Java. They allow developers to write more concise and expressive code by treating functions as first-class citizens. - -4. **Streams API**: The Streams API introduced in Java 8 provides a powerful way to process collections of data in a functional-style manner. Streams enable developers to perform aggregate operations on collections, such as filter, map, reduce, and collect, in a declarative way. - -5. **Optional**: The `Optional` class introduced in Java 8 represents a container object that may or may not contain a non-null value. It helps to eliminate null pointer exceptions and provides more robust handling of potentially absent values. - -6. **Annotations and Reflection**: Annotations allow developers to add metadata to code, which can be used by tools and frameworks for configuration and processing. Reflection enables runtime inspection and manipulation of classes, interfaces, fields, and methods. - -7. **JVM Internals**: Understanding Java Virtual Machine (JVM) internals can help optimize application performance and troubleshoot runtime issues. Topics include memory management, garbage collection, class loading, and bytecode execution. - -8. **Design Patterns**: Design patterns are reusable solutions to common problems encountered in software design. Familiarity with design patterns such as Singleton, Factory, Observer, Strategy, and Decorator can help improve code maintainability and scalability. - -9. **Security**: Java provides robust security features, including cryptography, secure coding practices, authentication, authorization, and secure communication protocols. Understanding security concepts is essential for developing secure and resilient applications. - -10. **Distributed Computing**: Java offers various APIs and frameworks for building distributed systems, such as Java RMI (Remote Method Invocation), Java EE (Enterprise Edition), Spring Framework, and microservices architecture. Distributed computing topics include networking, messaging, serialization, and clustering. - -11. **Performance Optimization**: Techniques for optimizing Java application performance include profiling, code optimization, caching, asynchronous processing, parallelism, and tuning JVM settings. - -12. **Modern Frameworks and Technologies**: Explore modern Java frameworks and technologies such as Spring Boot, Hibernate, Apache Kafka, Apache Spark, MicroProfile, Quarkus, and Jakarta EE for building scalable, resilient, and cloud-native applications. - -These advanced topics in Java empower developers to build robust, scalable, and efficient applications that meet the demands of modern software development. Continued learning and exploration of these topics are essential for staying current and proficient in Java development. \ No newline at end of file diff --git a/docs/java/advanced-topics-and-best-practices/java-best-practices-and-code-standards.md b/docs/java/advanced-topics-and-best-practices/java-best-practices-and-code-standards.md deleted file mode 100644 index 1a0e6a856..000000000 --- a/docs/java/advanced-topics-and-best-practices/java-best-practices-and-code-standards.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -id: java-best-practices-and-code-standards -title: Java Best Practices and Code Standards -sidebar_label: Java Best Practices and Code Standards -sidebar_position: 2 -tags: [java, java-best-practices, code-standards] -description: In this tutorial, you will learn about Java best practices and code standards that you should follow to write clean, maintainable, and efficient Java code. ---- -Adhering to best practices and code standards is crucial for writing maintainable, efficient, and readable Java code. Here are some Java best practices and code standards to follow: - -### Code Formatting and Style - -1. **Consistent Indentation**: Use a consistent indentation style (e.g., tabs or spaces) to improve code readability. -2. **Naming Conventions**: Follow standard naming conventions for classes, methods, variables, and constants (e.g., CamelCase for class names, camelCase for methods and variables, UPPER_CASE for constants). -3. **Use Descriptive Names**: Choose meaningful and descriptive names for classes, methods, and variables to enhance code clarity. -4. **Limit Line Length**: Keep lines of code relatively short (usually 80-120 characters) to improve readability and avoid horizontal scrolling. -5. **Code Organization**: Organize code logically into packages, classes, methods, and blocks to make it easier to navigate and understand. - -### Coding Practices - -6. **Avoid Magic Numbers and Strings**: Replace magic numbers and strings with named constants or enums to improve code maintainability and readability. -7. **Avoid Hardcoding**: Externalize configuration values and other constants to properties files or environment variables instead of hardcoding them in the code. -8. **Avoid Nested Conditionals**: Refactor nested conditionals and loops to improve code clarity and reduce complexity. -9. **Avoid Deep Nesting**: Limit the depth of nested blocks to improve code readability and maintainability. -10. **Error Handling**: Handle exceptions gracefully by providing meaningful error messages and logging appropriate information. -11. **Resource Management**: Close resources (e.g., files, database connections, network connections) explicitly using try-with-resources or finally blocks to prevent resource leaks. -12. **Use Immutable Objects**: Prefer immutable objects wherever possible to avoid unintended modifications and ensure thread safety. - -### Object-Oriented Principles - -13. **Single Responsibility Principle (SRP)**: Each class should have a single responsibility, and classes should be cohesive with well-defined roles. -14. **Open/Closed Principle (OCP)**: Classes should be open for extension but closed for modification. Favor composition over inheritance. -15. **Liskov Substitution Principle (LSP)**: Subtypes should be substitutable for their base types without affecting the correctness of the program. -16. **Interface Segregation Principle (ISP)**: Clients should not be forced to depend on interfaces they do not use. Keep interfaces focused and cohesive. -17. **Dependency Inversion Principle (DIP)**: Depend upon abstractions, not concrete implementations. Use dependency injection to decouple components. - -### Documentation and Comments - -18. **Javadoc Comments**: Use Javadoc comments to document classes, methods, and important variables. Describe the purpose, behavior, parameters, return values, and exceptions thrown by methods. -19. **Self-Explanatory Code**: Write code that is self-explanatory and easy to understand without relying heavily on comments. Comments should complement code, not duplicate it. - -### Testing - -20. **Unit Testing**: Write unit tests to verify the behavior of individual units of code (e.g., methods, classes) in isolation. Use testing frameworks like JUnit or TestNG. -21. **Test Coverage**: Aim for high test coverage to ensure that most of your code is tested and behavior is validated under various scenarios. - -### Continuous Integration and Deployment - -22. **CI/CD Pipeline**: Implement continuous integration and continuous deployment (CI/CD) pipelines to automate code integration, testing, and deployment processes. -23. **Version Control**: Use version control systems like Git to manage source code changes, collaborate with team members, and track project history. - -### Performance Optimization - -24. **Optimize Hotspots**: Identify and optimize performance bottlenecks using profiling tools. Focus on optimizing critical sections of code that contribute significantly to overall performance. - -### Security - -25. **Security Best Practices**: Follow security best practices to prevent common vulnerabilities such as injection attacks, XSS, CSRF, and data leaks. Validate input, sanitize output, and protect sensitive data. - -By following these Java best practices and code standards, you can write cleaner, more maintainable, and reliable code that meets industry standards and best practices. Regular code reviews and continuous learning are essential to ensure adherence to these practices and improve code quality over time. \ No newline at end of file diff --git a/docs/java/advanced-topics-and-best-practices/java-performance-tuning-and-optimization.md b/docs/java/advanced-topics-and-best-practices/java-performance-tuning-and-optimization.md deleted file mode 100644 index 625b68d2b..000000000 --- a/docs/java/advanced-topics-and-best-practices/java-performance-tuning-and-optimization.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: java-performance-tuning-and-optimization -title: Java Performance Tuning and Optimization -sidebar_label: Java Performance Tuning and Optimization -sidebar_position: 3 -tags: [java, java-performance-tuning-and-optimization] -description: In this tutorial, you will learn about Java performance tuning and optimization techniques to improve the performance of Java applications. ---- -Java performance tuning and optimization involve identifying and addressing bottlenecks and inefficiencies in Java applications to improve their speed, efficiency, and scalability. Here are some tips and techniques for Java performance tuning and optimization: - -### 1. Profiling and Benchmarking - -1. **Use Profiling Tools**: Profile your application using tools like VisualVM, YourKit, or Java Mission Control to identify performance bottlenecks, memory leaks, and CPU hotspots. -2. **Benchmarking**: Use benchmarking frameworks like JMH (Java Microbenchmark Harness) to measure the performance of specific code snippets and methods. - -### 2. Memory Management - -3. **Garbage Collection (GC) Optimization**: Tune garbage collection settings (e.g., heap size, garbage collector algorithm) based on application characteristics and requirements. -4. **Minimize Object Creation**: Avoid unnecessary object creation, especially in tight loops, by reusing objects, using object pooling, or using primitive types instead of wrapper classes. -5. **Optimize Data Structures**: Choose appropriate data structures (e.g., ArrayList vs. LinkedList) and algorithms to minimize memory usage and improve performance. - -### 3. Multithreading and Concurrency - -6. **Thread Pooling**: Use thread pools (e.g., ExecutorService) to manage threads efficiently and avoid the overhead of creating and destroying threads frequently. -7. **Synchronization**: Minimize the use of synchronization where possible and use thread-safe alternatives (e.g., ConcurrentHashMap, AtomicInteger) to reduce contention and improve concurrency. -8. **Asynchronous Programming**: Utilize asynchronous programming models (e.g., CompletableFuture, Reactive Streams) to improve responsiveness and scalability, especially in I/O-bound applications. - -### 4. I/O Operations - -9. **Buffering**: Use buffered I/O streams to minimize disk or network I/O overhead by reducing the number of system calls and disk accesses. -10. **Non-blocking I/O**: Utilize non-blocking I/O (NIO) APIs (e.g., java.nio) for handling I/O operations asynchronously and efficiently, especially in high-concurrency scenarios. - -### 5. Algorithm Optimization - -11. **Optimize Algorithms**: Choose efficient algorithms and data structures for specific tasks to reduce time complexity and improve performance (e.g., sorting algorithms, searching algorithms). -12. **Lazy Loading**: Implement lazy loading to defer the initialization of resources or data until they are actually needed, reducing startup time and memory footprint. - -### 6. JVM Tuning - -13. **Heap and Stack Allocation**: Adjust JVM heap size (-Xms and -Xmx) and stack size (-Xss) based on application requirements and memory usage patterns. -14. **JIT Compilation**: Enable Just-In-Time (JIT) compilation optimizations (e.g., -XX:+AggressiveOpts) to improve runtime performance by optimizing frequently executed code paths. -15. **Class Loading Optimization**: Reduce class loading overhead by minimizing the number of classes loaded at runtime and optimizing class loading patterns. - -### 7. Caching - -16. **In-Memory Caching**: Utilize in-memory caching solutions (e.g., Ehcache, Guava Cache) to cache frequently accessed data and reduce database or network overhead. -17. **Query Result Caching**: Cache query results or computed values to avoid redundant computations and improve response time, especially in database-intensive applications. - -### 8. External Services - -18. **Connection Pooling**: Use connection pooling libraries (e.g., HikariCP) to reuse database or network connections efficiently and avoid the overhead of establishing new connections. -19. **Retry and Timeout Policies**: Implement retry and timeout policies for external service calls to handle transient failures gracefully and prevent resource leaks. - -### 9. Monitoring and Tuning - -20. **Continuous Monitoring**: Monitor application performance metrics (e.g., CPU usage, memory usage, response time) in production environments to identify performance degradation and scalability issues. -21. **Iterative Tuning**: Continuously analyze and tune performance based on real-world usage patterns, user feedback, and performance benchmarks. - -### Conclusion - -Java performance tuning and optimization require a combination of profiling, benchmarking, code optimization, and system tuning techniques. By identifying and addressing performance bottlenecks, Java applications can achieve better responsiveness, scalability, and efficiency. Regular performance testing and tuning are essential to maintain optimal performance as applications evolve and grow. \ No newline at end of file diff --git a/docs/java/arrays-and-collections/_category_.json b/docs/java/arrays-and-collections/_category_.json deleted file mode 100644 index 68a48365a..000000000 --- a/docs/java/arrays-and-collections/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Arrays and collections in Java", - "position": 6, - "link": { - "type": "generated-index", - "description": "In this section, you'll learn about arrays and collections in Java." - } - } \ No newline at end of file diff --git a/docs/java/arrays-and-collections/array-lists-and-collections-framework.md b/docs/java/arrays-and-collections/array-lists-and-collections-framework.md deleted file mode 100644 index 0c844be66..000000000 --- a/docs/java/arrays-and-collections/array-lists-and-collections-framework.md +++ /dev/null @@ -1,154 +0,0 @@ ---- -id: array-lists-and-collections-framework -title: ArrayLists and Collections Framework -sidebar_label: ArrayLists and Collections Framework -sidebar_position: 2 -tags: [java, array-lists-and-collections-framework] -description: In this tutorial, you will learn about ArrayLists and the Collections Framework in Java. ---- - -# ArrayLists and the Collections Framework in Java - -## Introduction - -Java's Collections Framework provides a set of classes and interfaces for storing and manipulating groups of data as a single unit. `ArrayList` is one of the most commonly used classes in this framework, offering dynamic arrays that can grow and shrink in size. - -## ArrayList - -An `ArrayList` is a resizable array that provides more functionality and flexibility compared to a standard array. It is part of the `java.util` package. - -### Declaration - -To use `ArrayList`, you need to import it from the `java.util` package. - -### Syntax - -```java -import java.util.ArrayList; - -ArrayList arrayListName = new ArrayList<>(); -``` - -### Example - -```java -import java.util.ArrayList; - -public class Main { - public static void main(String[] args) { - ArrayList names = new ArrayList<>(); - - // Adding elements - names.add("Alice"); - names.add("Bob"); - names.add("Charlie"); - - // Accessing elements - System.out.println(names.get(0)); // Outputs: Alice - - // Modifying elements - names.set(1, "Robert"); - - // Removing elements - names.remove(2); - - // Iterating over the ArrayList - for (String name : names) { - System.out.println(name); - } - } -} -``` - -### Common Methods - -- `add(element)`: Adds an element to the end of the list. -- `add(index, element)`: Inserts an element at the specified index. -- `get(index)`: Returns the element at the specified index. -- `set(index, element)`: Replaces the element at the specified index with the specified element. -- `remove(index)`: Removes the element at the specified index. -- `remove(element)`: Removes the first occurrence of the specified element. -- `size()`: Returns the number of elements in the list. -- `clear()`: Removes all elements from the list. -- `isEmpty()`: Returns `true` if the list contains no elements. - -## Collections Framework - -The Collections Framework provides a unified architecture for representing and manipulating collections. It includes interfaces, implementations, and algorithms. - -### Interfaces - -- `Collection`: The root interface for all collections. -- `List`: An ordered collection (also known as a sequence). `ArrayList` and `LinkedList` are its implementations. -- `Set`: A collection that contains no duplicate elements. `HashSet` and `TreeSet` are its implementations. -- `Queue`: A collection used to hold multiple elements prior to processing. `LinkedList` and `PriorityQueue` are its implementations. -- `Map`: An object that maps keys to values. `HashMap` and `TreeMap` are its implementations. - -### Example: Using Different Collections - -```java -import java.util.*; - -public class Main { - public static void main(String[] args) { - // List example - List list = new ArrayList<>(); - list.add("Apple"); - list.add("Banana"); - list.add("Orange"); - System.out.println("List: " + list); - - // Set example - Set set = new HashSet<>(); - set.add("Apple"); - set.add("Banana"); - set.add("Apple"); // Duplicate element will not be added - System.out.println("Set: " + set); - - // Queue example - Queue queue = new LinkedList<>(); - queue.add("Apple"); - queue.add("Banana"); - queue.add("Orange"); - System.out.println("Queue: " + queue); - System.out.println("Queue poll: " + queue.poll()); // Removes and returns the head of the queue - - // Map example - Map map = new HashMap<>(); - map.put("Apple", 1); - map.put("Banana", 2); - map.put("Orange", 3); - System.out.println("Map: " + map); - System.out.println("Map get: " + map.get("Banana")); // Returns the value for the specified key - } -} -``` - -### Algorithms - -The `Collections` class provides static methods that operate on collections, such as sorting and searching. - -#### Example: Sorting a List - -```java -import java.util.*; - -public class Main { - public static void main(String[] args) { - List list = new ArrayList<>(); - list.add("Banana"); - list.add("Apple"); - list.add("Orange"); - - Collections.sort(list); // Sorts the list in natural order - System.out.println("Sorted List: " + list); - - Collections.sort(list, Collections.reverseOrder()); // Sorts the list in reverse order - System.out.println("Reverse Sorted List: " + list); - } -} -``` - -## Conclusion - -The Collections Framework in Java provides a powerful and flexible set of classes and interfaces for managing groups of objects. `ArrayList` is a versatile and commonly used class within this framework. Understanding how to use `ArrayList` and other collections, as well as the algorithms provided by the `Collections` class, is crucial for effective Java programming. diff --git a/docs/java/arrays-and-collections/arrays-in-java.md b/docs/java/arrays-and-collections/arrays-in-java.md deleted file mode 100644 index 3501dd552..000000000 --- a/docs/java/arrays-and-collections/arrays-in-java.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -id: arrays-in-java -title: Arrays in Java -sidebar_label: Arrays in Java -sidebar_position: 1 -tags: [java, arrays, programming, java arrays] -description: In this tutorial, we will learn about arrays in Java. We will learn about what arrays are, how to declare and initialize arrays, how to access elements in an array, and how to use arrays in Java. ---- - -# Arrays in Java - -## Introduction - -Arrays in Java are used to store multiple values of the same type in a single variable, instead of declaring separate variables for each value. Arrays are a fundamental data structure that can help in organizing and managing data efficiently. - -## Array Declaration - -### Syntax - -To declare an array, specify the data type followed by square brackets and the array name. - -```java -dataType[] arrayName; -``` - -### Example - -```java -int[] numbers; -String[] names; -``` - -## Array Initialization - -### Static Initialization - -You can initialize an array at the time of declaration with a set of values. - -```java -int[] numbers = {1, 2, 3, 4, 5}; -String[] names = {"Alice", "Bob", "Charlie"}; -``` - -### Dynamic Initialization - -You can also allocate memory for the array using the `new` keyword and then assign values to the array elements. - -```java -int[] numbers = new int[5]; // Array of 5 integers -numbers[0] = 1; -numbers[1] = 2; -numbers[2] = 3; -numbers[3] = 4; -numbers[4] = 5; -``` - -## Accessing Array Elements - -Array elements are accessed using their index, which starts from 0. - -### Example - -```java -int[] numbers = {1, 2, 3, 4, 5}; -System.out.println(numbers[0]); // Outputs: 1 -System.out.println(numbers[4]); // Outputs: 5 -``` - -## Looping Through Arrays - -### For Loop - -You can use a `for` loop to iterate through all the elements of an array. - -```java -int[] numbers = {1, 2, 3, 4, 5}; -for (int i = 0; i < numbers.length; i++) { - System.out.println(numbers[i]); -} -``` - -### Enhanced For Loop (For-Each Loop) - -The enhanced `for` loop provides a simpler way to iterate through the elements of an array. - -```java -int[] numbers = {1, 2, 3, 4, 5}; -for (int number : numbers) { - System.out.println(number); -} -``` - -## Multi-Dimensional Arrays - -Java supports multi-dimensional arrays, which are arrays of arrays. - -### Two-Dimensional Array - -#### Declaration and Initialization - -```java -int[][] matrix = { - {1, 2, 3}, - {4, 5, 6}, - {7, 8, 9} -}; -``` - -#### Accessing Elements - -```java -System.out.println(matrix[0][0]); // Outputs: 1 -System.out.println(matrix[2][2]); // Outputs: 9 -``` - -#### Looping Through a Two-Dimensional Array - -```java -for (int i = 0; i < matrix.length; i++) { - for (int j = 0; j < matrix[i].length; j++) { - System.out.print(matrix[i][j] + " "); - } - System.out.println(); -} -``` - -### Example: Matrix Addition - -```java -public class MatrixAddition { - public static void main(String[] args) { - int[][] matrix1 = { - {1, 2, 3}, - {4, 5, 6}, - {7, 8, 9} - }; - - int[][] matrix2 = { - {9, 8, 7}, - {6, 5, 4}, - {3, 2, 1} - }; - - int[][] sum = new int[3][3]; - - for (int i = 0; i < matrix1.length; i++) { - for (int j = 0; j < matrix1[i].length; j++) { - sum[i][j] = matrix1[i][j] + matrix2[i][j]; - } - } - - // Display the result - for (int[] row : sum) { - for (int element : row) { - System.out.print(element + " "); - } - System.out.println(); - } - } -} -``` - -## Conclusion - -Arrays are a powerful and essential feature in Java, allowing you to store and manage collections of data efficiently. Understanding how to declare, initialize, and manipulate arrays, as well as how to use multi-dimensional arrays, is crucial for effective Java programming. diff --git a/docs/java/arrays-and-collections/sorting-and-searching-arrays.md b/docs/java/arrays-and-collections/sorting-and-searching-arrays.md deleted file mode 100644 index f2bc84b20..000000000 --- a/docs/java/arrays-and-collections/sorting-and-searching-arrays.md +++ /dev/null @@ -1,137 +0,0 @@ ---- -id: sorting-and-searching-arrays -title: Sorting and Searching Arrays -sidebar_label: Sorting and Searching Arrays -sidebar_position: 4 -tags: [java, arrays, sorting, searching, programming, java arrays, java sorting, java searching] -description: In this tutorial, we will learn how to sort and search arrays in Java. We will learn how to sort arrays using the Arrays class and how to search arrays using the Arrays class and the Arrays.binarySearch method. ---- - -# Sorting and Searching Arrays in Java - -## Introduction - -Sorting and searching are common operations performed on arrays in Java. Sorting arranges the elements of an array in a specific order, while searching finds the position of a particular element in the array. - -## Sorting Arrays - -### Arrays.sort() Method - -The `Arrays.sort()` method is used to sort arrays in ascending order. For arrays of primitive types, it uses a modified quicksort algorithm. For arrays of objects, it uses the natural ordering of the elements or a specified comparator. - -#### Example - -```java -import java.util.Arrays; - -public class Main { - public static void main(String[] args) { - int[] numbers = {5, 2, 7, 1, 9}; - Arrays.sort(numbers); - System.out.println(Arrays.toString(numbers)); // Outputs: [1, 2, 5, 7, 9] - } -} -``` - -### Sorting Arrays in Descending Order - -To sort arrays in descending order, you can use the `Comparator.reverseOrder()` method along with `Arrays.sort()` for arrays of objects, or you can reverse the array after sorting for arrays of primitive types. - -#### Example - -```java -import java.util.Arrays; -import java.util.Comparator; - -public class Main { - public static void main(String[] args) { - Integer[] numbers = {5, 2, 7, 1, 9}; - Arrays.sort(numbers, Comparator.reverseOrder()); - System.out.println(Arrays.toString(numbers)); // Outputs: [9, 7, 5, 2, 1] - } -} -``` - -### Sorting Arrays of Objects - -When sorting arrays of objects, the objects must implement the `Comparable` interface or you must provide a custom `Comparator`. - -#### Example - -```java -import java.util.Arrays; -import java.util.Comparator; - -class Person implements Comparable { - private String name; - private int age; - - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public int getAge() { - return age; - } - - @Override - public int compareTo(Person other) { - return Integer.compare(this.age, other.age); - } - - @Override - public String toString() { - return "Person{" + - "name='" + name + '\'' + - ", age=" + age + - '}'; - } -} - -public class Main { - public static void main(String[] args) { - Person[] people = { - new Person("Alice", 25), - new Person("Bob", 30), - new Person("Charlie", 20) - }; - - Arrays.sort(people); - System.out.println(Arrays.toString(people)); // Sorted by age - } -} -``` - -## Searching Arrays - -### Arrays.binarySearch() Method - -The `Arrays.binarySearch()` method is used to search for a specified element in a sorted array. It returns the index of the element if found, otherwise it returns a negative value. - -#### Example - -```java -import java.util.Arrays; - -public class Main { - public static void main(String[] args) { - int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9}; - int index = Arrays.binarySearch(numbers, 5); - System.out.println("Index of 5: " + index); // Outputs: 4 - } -} -``` - -### Note - -- The array must be sorted before using `Arrays.binarySearch()`. -- If the element is not found, the method returns the insertion point (negative value). - -## Conclusion - -Sorting and searching are essential operations performed on arrays in Java. The `Arrays.sort()` method is used to sort arrays, and `Arrays.binarySearch()` is used to search for elements in sorted arrays. Understanding these operations allows you to efficiently manage and manipulate array data in Java. diff --git a/docs/java/arrays-and-collections/using-arrays-and-collections.md b/docs/java/arrays-and-collections/using-arrays-and-collections.md deleted file mode 100644 index 6dd25a3a1..000000000 --- a/docs/java/arrays-and-collections/using-arrays-and-collections.md +++ /dev/null @@ -1,197 +0,0 @@ ---- -id: using-arrays-and-collections -title: Using Arrays and Collections -sidebar_label: Using Arrays and Collections -sidebar_position: 3 -tags: [java, arrays, collections, programming, java arrays, java collections] -description: In this tutorial, we will learn how to use arrays and collections in Java. We will learn how to declare, initialize, and access elements in arrays. We will also learn how to use collections, such as ArrayLists, in Java. ---- - -# Using Arrays and Collections in Java - -## Introduction - -Arrays and collections are fundamental structures in Java that allow you to store and manipulate groups of data efficiently. While arrays are fixed in size and type, collections provide more flexible and dynamic data handling capabilities. - -## Using Arrays - -### Declaration and Initialization - -#### Single-Dimensional Arrays - -```java -int[] numbers = {1, 2, 3, 4, 5}; -String[] names = {"Alice", "Bob", "Charlie"}; -``` - -#### Multi-Dimensional Arrays - -```java -int[][] matrix = { - {1, 2, 3}, - {4, 5, 6}, - {7, 8, 9} -}; -``` - -### Accessing Array Elements - -```java -int firstNumber = numbers[0]; // Accessing the first element -int matrixElement = matrix[1][2]; // Accessing the element at row 2, column 3 -``` - -### Modifying Array Elements - -```java -numbers[1] = 10; // Changing the second element to 10 -matrix[0][0] = 99; // Changing the first element of the first row to 99 -``` - -### Iterating Over Arrays - -#### Using For Loop - -```java -for (int i = 0; i < numbers.length; i++) { - System.out.println(numbers[i]); -} -``` - -#### Using Enhanced For Loop - -```java -for (int number : numbers) { - System.out.println(number); -} -``` - -## Using Collections - -Java's Collections Framework provides a set of classes and interfaces for managing groups of objects. Collections offer more flexibility compared to arrays, such as dynamic sizing and various data structures like lists, sets, and maps. - -### List Interface - -#### ArrayList - -```java -import java.util.ArrayList; - -public class Main { - public static void main(String[] args) { - ArrayList names = new ArrayList<>(); - - // Adding elements - names.add("Alice"); - names.add("Bob"); - names.add("Charlie"); - - // Accessing elements - System.out.println(names.get(0)); // Outputs: Alice - - // Modifying elements - names.set(1, "Robert"); - - // Removing elements - names.remove(2); - - // Iterating over the ArrayList - for (String name : names) { - System.out.println(name); - } - } -} -``` - -### Set Interface - -#### HashSet - -```java -import java.util.HashSet; - -public class Main { - public static void main(String[] args) { - HashSet names = new HashSet<>(); - - // Adding elements - names.add("Alice"); - names.add("Bob"); - names.add("Alice"); // Duplicate element will not be added - - // Checking if an element exists - if (names.contains("Alice")) { - System.out.println("Alice is in the set."); - } - - // Iterating over the HashSet - for (String name : names) { - System.out.println(name); - } - } -} -``` - -### Map Interface - -#### HashMap - -```java -import java.util.HashMap; - -public class Main { - public static void main(String[] args) { - HashMap map = new HashMap<>(); - - // Adding key-value pairs - map.put("Apple", 1); - map.put("Banana", 2); - map.put("Orange", 3); - - // Accessing values - System.out.println("Banana: " + map.get("Banana")); - - // Checking if a key exists - if (map.containsKey("Apple")) { - System.out.println("Apple is in the map."); - } - - // Iterating over the HashMap - for (String key : map.keySet()) { - System.out.println(key + ": " + map.get(key)); - } - } -} -``` - -### Queue Interface - -#### LinkedList - -```java -import java.util.LinkedList; -import java.util.Queue; - -public class Main { - public static void main(String[] args) { - Queue queue = new LinkedList<>(); - - // Adding elements - queue.add("Alice"); - queue.add("Bob"); - queue.add("Charlie"); - - // Accessing and removing the head of the queue - System.out.println("Head: " + queue.poll()); - - // Iterating over the Queue - for (String name : queue) { - System.out.println(name); - } - } -} -``` - -## Conclusion - -Using arrays and collections in Java provides various ways to handle groups of data effectively. Arrays are suitable for fixed-size data, while collections offer dynamic and flexible data structures. Understanding both allows you to choose the appropriate data structure based on your specific needs and application requirements. diff --git a/docs/java/arrays-and-collections/working-with-arrays-and-collections.md b/docs/java/arrays-and-collections/working-with-arrays-and-collections.md deleted file mode 100644 index 14f21ca64..000000000 --- a/docs/java/arrays-and-collections/working-with-arrays-and-collections.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -id: working-with-arrays-and-collections -title: Working with Arrays and Collections -sidebar_label: Working with Arrays and Collections -sidebar_position: 5 -tags: [java, arrays, collections, programming, java arrays, java collections] -description: In this tutorial, we will learn how to work with arrays and collections in Java. We will learn how to declare, initialize, and access elements in arrays. We will also learn how to use collections, such as ArrayLists, in Java. ---- - -# Working with Arrays and Collections in Java - -## Introduction - -Arrays and collections are essential data structures in Java that allow you to store and manipulate groups of elements. This guide covers common operations and techniques for working with both arrays and collections. - -## Arrays - -### Declaration and Initialization - -#### Single-Dimensional Arrays - -```java -// Declaration and initialization -int[] numbers = {1, 2, 3, 4, 5}; -String[] names = {"Alice", "Bob", "Charlie"}; -``` - -#### Multi-Dimensional Arrays - -```java -// Declaration and initialization -int[][] matrix = { - {1, 2, 3}, - {4, 5, 6}, - {7, 8, 9} -}; -``` - -### Accessing and Modifying Elements - -```java -// Accessing elements -int firstNumber = numbers[0]; -int matrixElement = matrix[1][2]; - -// Modifying elements -numbers[1] = 10; -matrix[0][0] = 99; -``` - -### Iterating Over Arrays - -```java -// Using for loop -for (int i = 0; i < numbers.length; i++) { - System.out.println(numbers[i]); -} - -// Using enhanced for loop -for (int number : numbers) { - System.out.println(number); -} -``` - -## Collections - -### List Interface - -#### ArrayList - -```java -import java.util.ArrayList; - -// Declaration and initialization -ArrayList names = new ArrayList<>(); -names.add("Alice"); -names.add("Bob"); -names.add("Charlie"); - -// Accessing and modifying elements -String firstElement = names.get(0); -names.set(1, "Robert"); - -// Iterating over the ArrayList -for (String name : names) { - System.out.println(name); -} -``` - -### Set Interface - -#### HashSet - -```java -import java.util.HashSet; - -// Declaration and initialization -HashSet set = new HashSet<>(); -set.add("Apple"); -set.add("Banana"); -set.add("Apple"); // Duplicate element will not be added - -// Iterating over the HashSet -for (String element : set) { - System.out.println(element); -} -``` - -### Map Interface - -#### HashMap - -```java -import java.util.HashMap; - -// Declaration and initialization -HashMap map = new HashMap<>(); -map.put("Apple", 1); -map.put("Banana", 2); -map.put("Orange", 3); - -// Accessing elements -int value = map.get("Banana"); - -// Iterating over the HashMap -for (String key : map.keySet()) { - System.out.println(key + ": " + map.get(key)); -} -``` - -### Queue Interface - -#### LinkedList - -```java -import java.util.LinkedList; -import java.util.Queue; - -// Declaration and initialization -Queue queue = new LinkedList<>(); -queue.add("Apple"); -queue.add("Banana"); -queue.add("Orange"); - -// Accessing and removing elements -String head = queue.poll(); - -// Iterating over the Queue -for (String element : queue) { - System.out.println(element); -} -``` - -## Conclusion - -Working with arrays and collections in Java allows you to efficiently manage and manipulate groups of data. Whether you're using arrays for fixed-size collections or collections for dynamic data handling, mastering these data structures is essential for effective Java programming. diff --git a/docs/java/basic-syntax-and-data-types/_category_.json b/docs/java/basic-syntax-and-data-types/_category_.json deleted file mode 100644 index 8d5eb3d39..000000000 --- a/docs/java/basic-syntax-and-data-types/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Basic Syntax and Data Types of Java", - "position": 3, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the basic syntax of the Java programming language and the different data types that Java supports." - } - } \ No newline at end of file diff --git a/docs/java/basic-syntax-and-data-types/java-syntax-and-structure.md b/docs/java/basic-syntax-and-data-types/java-syntax-and-structure.md deleted file mode 100644 index a71458dd6..000000000 --- a/docs/java/basic-syntax-and-data-types/java-syntax-and-structure.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: java-syntax-and-structure -title: Java Syntax and Structure -sidebar_label: Java Syntax and Structure -sidebar_position: 1 -tags: - [ - java, - syntax, - structure, - programming, - java syntax and structure, - java programming language, - java features, - ] -description: In this tutorial, we will learn about the syntax and structure of the Java programming language. We will learn about the basic structure of a Java program, Java syntax, and the rules that govern the Java programming language. ---- - -# Java Syntax and Structure - -## Introduction - -Understanding the basic syntax and structure of Java is essential for writing effective Java programs. This guide covers the fundamental elements of Java syntax and how to structure a Java program. - -## Basic Syntax - -### Hello World Example - -The simplest Java program is a "Hello, World!" application. Here's what it looks like: - -```java -public class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` - -### Explanation - -- **Class Declaration**: Every Java program must have at least one class definition. The class name should match the filename. In this case, `HelloWorld` is the class name. -- **Main Method**: The `main` method is the entry point of any Java application. It is always written as `public static void main(String[] args)`. -- **Statements**: Each statement ends with a semicolon (`;`). The `System.out.println` method prints the specified message to the console. - -## Comments - -Comments are used to explain code and are ignored by the compiler. - -- **Single-line comments** start with `//`. - -```java -// This is a single-line comment -``` - -- **Multi-line comments** are enclosed in `/* ... */`. - -```java -/* - This is a multi-line comment - that spans multiple lines. - */ -``` diff --git a/docs/java/basic-syntax-and-data-types/operators-and-expressions.md b/docs/java/basic-syntax-and-data-types/operators-and-expressions.md deleted file mode 100644 index 7d2ab6c19..000000000 --- a/docs/java/basic-syntax-and-data-types/operators-and-expressions.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -id: operators-and-expressions -title: Operators and Expressions -sidebar_label: Operators and Expressions -sidebar_position: 3 -tags: - [java, operators, expressions, programming, java operators, java expressions] -description: In this tutorial, we will learn about operators and expressions in Java. We will learn about the different types of operators available in Java, how to use them, and how to create expressions using operators. ---- - -## Operators - -Java supports various operators for arithmetic, comparison, logical operations, etc. - -### Arithmetic Operators - -- `+` (addition) -- `-` (subtraction) -- `*` (multiplication) -- `/` (division) -- `%` (modulus) - -Example: - -```java -int sum = 10 + 5; // 15 -int difference = 10 - 5; // 5 -``` - -### Comparison Operators - -- `==` (equal to) -- `!=` (not equal to) -- `>` (greater than) -- `<` (less than) -- `>=` (greater than or equal to) -- `<=` (less than or equal to) - -Example: - -```java -boolean isEqual = (10 == 10); // true -boolean isGreater = (10 > 5); // true -``` - -### Logical Operators - -- `&&` (logical AND) -- `||` (logical OR) -- `!` (logical NOT) - -Example: - -```java -boolean result = (true && false); // false -boolean orResult = (true || false); // true -``` - - - -## Conclusion - -Understanding Java syntax and structure is crucial for writing effective and efficient Java programs. By mastering these basics, you can begin to build more complex and powerful applications. - diff --git a/docs/java/basic-syntax-and-data-types/variables-and-data-types.md b/docs/java/basic-syntax-and-data-types/variables-and-data-types.md deleted file mode 100644 index b423eb39b..000000000 --- a/docs/java/basic-syntax-and-data-types/variables-and-data-types.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -id: variables-and-data-types -title: Variables and Data Types -sidebar_label: Variables and Data Types -sidebar_position: 2 -tags: - [java, variables, data types, programming, java variables, java data types] -description: In this tutorial, we will learn about variables and data types in Java. We will learn about what variables are, how to declare and initialize variables, and the different data types available in Java. ---- - -## Data Types - -Java is a strongly-typed language, meaning every variable must be declared with a data type. - -### Primitive Data Types - -- **int**: Integer type. -- **double**: Double-precision floating point. -- **char**: Character type. -- **boolean**: Boolean type (true or false). - -Example: - -```java -int number = 10; -double price = 9.99; -char letter = 'A'; -boolean isJavaFun = true; -``` - -### Reference Data Types - -Reference types refer to objects and include arrays, classes, interfaces, etc. - -Example: - -```java -String message = "Hello, World!"; -int[] numbers = {1, 2, 3, 4, 5}; -``` - -## Variables - -Variables store data values. They must be declared before use. - -### Variable Declaration - -```java -int age; -String name; -``` - -### Variable Initialization - -```java -age = 25; -name = "Alice"; -``` - -### Combined Declaration and Initialization - -```java -int age = 25; -String name = "Alice"; -``` diff --git a/docs/java/build-automation-with-maven/_category_.json b/docs/java/build-automation-with-maven/_category_.json deleted file mode 100644 index af12858ac..000000000 --- a/docs/java/build-automation-with-maven/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Build Automation with Maven in Java", - "position": 15, - "link": { - "type": "generated-index", - "description": "In this section, you will learn how to automate the build process of your Java applications using Maven. You will learn how to create a Maven project, how to build and run your project, and how to manage dependencies using Maven." - } -} \ No newline at end of file diff --git a/docs/java/build-automation-with-maven/configuring-and-building-projects-with-maven.md b/docs/java/build-automation-with-maven/configuring-and-building-projects-with-maven.md deleted file mode 100644 index 3c563a919..000000000 --- a/docs/java/build-automation-with-maven/configuring-and-building-projects-with-maven.md +++ /dev/null @@ -1,97 +0,0 @@ -Configuring and building projects with Maven involves setting up the project structure, defining dependencies, and specifying build settings in the `pom.xml` file. Here's a step-by-step guide on how to configure and build projects with Maven: - -### 1. Project Structure - -Ensure that your project follows the standard Maven project structure: - -``` -project-name -├── src -│ ├── main -│ │ ├── java # Source code files -│ │ └── resources # Non-Java resources -│ └── test -│ ├── java # Test source code files -│ └── resources # Test resources -└── pom.xml # Project Object Model (POM) file -``` - -### 2. Configure `pom.xml` - -Edit the `pom.xml` file to configure your project. Here's a basic `pom.xml` template: - -```xml - - 4.0.0 - - com.example - project-name - 1.0.0 - jar - - - - - - - - - - - - - - - -``` - -- **`groupId`**: Identifies your project uniquely across all projects. -- **`artifactId`**: The name of the project. -- **`version`**: The version of the project. -- **`packaging`**: The type of packaging for the project (e.g., jar, war, pom). -- **`dependencies`**: Define project dependencies here. -- **`build`**: Configure build settings and plugins. - -### 3. Define Dependencies - -Add dependencies to the `` section of the `pom.xml` file. Specify the group id, artifact id, and version of each dependency. - -```xml - - - org.springframework - spring-core - 5.3.8 - - - -``` - -### 4. Build the Project - -Execute Maven commands to build the project: - -- **Compile**: `mvn compile` -- **Test**: `mvn test` -- **Package**: `mvn package` -- **Install**: `mvn install` -- **Clean**: `mvn clean` - -### 5. Run Maven Goals - -Execute custom Maven goals or plugins configured in the `pom.xml` file. - -```bash -mvn -``` - -### 6. Explore Maven Plugins - -Explore Maven plugins to automate various tasks in your project, such as code generation, code quality checks, and deployment. - -### Conclusion - -By following these steps, you can configure and build your projects with Maven effectively. Maven simplifies project management, dependency management, and build processes, making it a popular choice for Java projects. \ No newline at end of file diff --git a/docs/java/build-automation-with-maven/introduction-to-maven.md b/docs/java/build-automation-with-maven/introduction-to-maven.md deleted file mode 100644 index 58e2ffe43..000000000 --- a/docs/java/build-automation-with-maven/introduction-to-maven.md +++ /dev/null @@ -1,45 +0,0 @@ -Building automation with Maven simplifies the process of managing and building Java projects. Maven provides a standardized way to define project structures, manage dependencies, and execute build tasks. Here's an introduction to building automation with Maven: - -### What is Building Automation? - -Building automation refers to the process of automating various tasks involved in building and managing software projects. These tasks include compiling source code, managing dependencies, running tests, packaging artifacts, and deploying applications. - -### Why Use Maven for Building Automation? - -1. **Standardization**: Maven follows conventions and standard project structures, making it easy for developers to understand and navigate projects. - -2. **Dependency Management**: Maven centralizes dependency management, allowing developers to declare project dependencies and automatically resolve and download them from remote repositories. - -3. **Build Lifecycle**: Maven defines a standard build lifecycle with predefined phases (e.g., compile, test, package) that can be executed using simple commands. - -4. **Plugin Ecosystem**: Maven provides a rich ecosystem of plugins to extend its functionality and automate various tasks, such as code generation, code quality checks, and deployment. - -### Key Concepts in Maven - -1. **Project Object Model (POM)**: Maven uses a Project Object Model (POM) file, `pom.xml`, to define project configurations, dependencies, and build settings. - -2. **Plugins**: Maven plugins provide additional goals to execute custom tasks during the build process. Plugins can be configured in the `pom.xml` file to automate various tasks. - -3. **Dependencies**: Maven manages project dependencies by resolving them from remote repositories and including them in the project's classpath. - -4. **Build Lifecycle**: Maven defines a standard build lifecycle consisting of phases such as compile, test, package, install, and deploy. Developers can execute these build phases using Maven commands (`mvn `). - -### Maven Build Lifecycle Phases - -- **Clean Lifecycle**: Cleans the project by removing compiled files and other artifacts. -- **Default Lifecycle**: Builds and packages the project. It includes phases like compile, test, package, install, and deploy. -- **Site Lifecycle**: Generates project documentation and reports. - -### Getting Started with Maven - -1. **Install Maven**: Download and install Maven from the official Apache Maven website. - -2. **Create a Maven Project**: Use the `mvn archetype:generate` command to generate a Maven project from a predefined archetype. - -3. **Edit `pom.xml`**: Modify the `pom.xml` file to define project configurations, dependencies, and build settings. - -4. **Execute Maven Commands**: Use Maven commands (`mvn `) to compile, test, package, and deploy your project. - -### Conclusion - -Maven simplifies building automation by providing a standardized and flexible framework for managing and building Java projects. By following Maven's conventions and best practices, developers can streamline the build process and improve project maintainability and scalability. \ No newline at end of file diff --git a/docs/java/build-automation-with-maven/managing-dependencies-and-plugins.md b/docs/java/build-automation-with-maven/managing-dependencies-and-plugins.md deleted file mode 100644 index 561e61f41..000000000 --- a/docs/java/build-automation-with-maven/managing-dependencies-and-plugins.md +++ /dev/null @@ -1,95 +0,0 @@ -Managing dependencies and plugins is a crucial aspect of configuring and building projects with Maven. Here's how you can manage dependencies and plugins in your Maven project: - -### Managing Dependencies - -Maven manages project dependencies using the `` section of the `pom.xml` file. You can specify the dependencies your project requires, including their group id, artifact id, and version. - -```xml - - - org.springframework - spring-core - 5.3.8 - - - -``` - -Maven resolves dependencies automatically by downloading them from remote repositories such as Maven Central Repository. You can also specify additional repositories if needed. - -```xml - - - my-repo - https://example.com/repo - - -``` - -### Managing Plugins - -Maven plugins extend Maven's functionality and allow you to automate various tasks in your project. You can configure plugins in the `` section of the `pom.xml` file. - -```xml - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 1.8 - 1.8 - - - - - -``` - -### Dependency and Plugin Versions - -It's important to specify the versions of dependencies and plugins to ensure consistency and compatibility across builds. You can define versions as properties to avoid duplication and make it easier to manage them. - -```xml - - 5.3.8 - - - - - org.springframework - spring-core - ${spring.version} - - -``` - -### Dependency Scope - -Maven supports different dependency scopes to control their visibility and usage during the build process. Common dependency scopes include `compile`, `test`, `runtime`, and `provided`. - -```xml - - - junit - junit - 4.13.2 - test - - -``` - -### Plugin Goals - -Plugins can define multiple goals that can be executed during the build process. You can specify the plugin goal to execute by using the `mvn :` command. - -```bash -mvn clean -mvn compiler:compile -mvn surefire:test -``` - -### Conclusion - -By effectively managing dependencies and plugins in your Maven project, you can ensure that your build process is efficient, reliable, and consistent. Maven's dependency management and plugin system simplify project configuration and automation, making it a popular choice for Java developers. \ No newline at end of file diff --git a/docs/java/control-statements/_category_.json b/docs/java/control-statements/_category_.json deleted file mode 100644 index ddb779500..000000000 --- a/docs/java/control-statements/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Control Statements in Java", - "position": 4, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about control statements in Java. Control statements are used to control the flow of execution in a program. You will learn about decision-making statements, looping statements, and branching statements in Java." - } - } \ No newline at end of file diff --git a/docs/java/control-statements/conditional-statements.md b/docs/java/control-statements/conditional-statements.md deleted file mode 100644 index d23d9d500..000000000 --- a/docs/java/control-statements/conditional-statements.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -id: conditional-statements -title: Conditional Statements -sidebar_label: Conditional Statements -sidebar_position: 1 -tags: - [ - java, - conditional statements, - if else, - switch case, - programming, - java conditional statements, - ] -description: In this tutorial, we will learn about conditional statements in Java. We will learn about the different types of conditional statements available in Java, how to use them, and how they can be used to control the flow of a program. ---- - -# Conditional Statements in Java - -## Introduction - -Conditional statements in Java are used to execute different blocks of code based on certain conditions. These statements allow you to control the flow of your program and make decisions during runtime. - -## Types of Conditional Statements - -### If Statement - -The `if` statement evaluates a boolean expression and executes a block of code if the expression is true. - -**Syntax:** - -```java -if (condition) { - // code to be executed if the condition is true -} -``` - -**Example:** - -```java -int number = 10; -if (number > 0) { - System.out.println("The number is positive."); -} -``` - -### If-Else Statement - -The `if-else` statement provides an alternative block of code that executes if the boolean expression is false. - -**Syntax:** - -```java -if (condition) { - // code to be executed if the condition is true -} else { - // code to be executed if the condition is false -} -``` - -**Example:** - -```java -int number = -10; -if (number > 0) { - System.out.println("The number is positive."); -} else { - System.out.println("The number is negative or zero."); -} -``` - -### If-Else-If Ladder - -The `if-else-if` ladder allows you to check multiple conditions in sequence. The first condition that evaluates to true will have its corresponding block executed. - -**Syntax:** - -```java -if (condition1) { - // code to be executed if condition1 is true -} else if (condition2) { - // code to be executed if condition2 is true -} else { - // code to be executed if all conditions are false -} -``` - -**Example:** - -```java -int number = 0; -if (number > 0) { - System.out.println("The number is positive."); -} else if (number < 0) { - System.out.println("The number is negative."); -} else { - System.out.println("The number is zero."); -} -``` - -### Nested If Statements - -You can nest `if` or `if-else` statements within another `if` or `if-else` statement to create more complex conditions. - -**Syntax:** - -```java -if (condition1) { - // code to be executed if condition1 is true - if (condition2) { - // code to be executed if condition2 is true - } -} -``` - -**Example:** - -```java -int number = 5; -if (number > 0) { - if (number % 2 == 0) { - System.out.println("The number is positive and even."); - } else { - System.out.println("The number is positive and odd."); - } -} -``` - -### Switch Statement - -The `switch` statement is used to execute one block of code among many based on the value of a variable or expression. It is a cleaner alternative to using multiple `if-else-if` statements. - -**Syntax:** - -```java -switch (expression) { - case value1: - // code to be executed if expression equals value1 - break; - case value2: - // code to be executed if expression equals value2 - break; - // you can have any number of case statements - default: - // code to be executed if none of the cases match - break; -} -``` - -**Example:** - -```java -int day = 3; -switch (day) { - case 1: - System.out.println("Monday"); - break; - case 2: - System.out.println("Tuesday"); - break; - case 3: - System.out.println("Wednesday"); - break; - case 4: - System.out.println("Thursday"); - break; - case 5: - System.out.println("Friday"); - break; - case 6: - System.out.println("Saturday"); - break; - case 7: - System.out.println("Sunday"); - break; - default: - System.out.println("Invalid day"); - break; -} -``` - -## Conclusion - -Conditional statements are essential for controlling the flow of your Java programs. By using `if`, `if-else`, `if-else-if`, nested `if` statements, and `switch` statements, you can make your programs more dynamic and responsive to different conditions. - -``` - -You can add this content to your Markdown file in Visual Studio Code by following the same steps as before. -``` diff --git a/docs/java/control-statements/loops-in-java.md b/docs/java/control-statements/loops-in-java.md deleted file mode 100644 index 25d8477a7..000000000 --- a/docs/java/control-statements/loops-in-java.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -id: loops-in-java -title: Loops in Java -sidebar_label: Loops in Java -sidebar_position: 2 -tags: [java, loops, for loop, while loop, do while loop, programming, java loops] -description: In this tutorial, we will learn about loops in Java. We will learn about the different types of loops available in Java, how to use them, and how they can be used to repeat a block of code multiple times. ---- - - -# Loops in Java - -## Introduction - -Loops in Java are used to execute a block of code repeatedly until a specified condition is met. They are essential for tasks that require repetition, such as iterating over arrays or performing a series of calculations. - -## Types of Loops - -### For Loop - -The `for` loop is used when you know in advance how many times you want to execute a statement or a block of statements. - -**Syntax:** - -```java -for (initialization; condition; update) { - // code to be executed -} -``` - -**Example:** - -```java -for (int i = 0; i < 5; i++) { - System.out.println("Iteration: " + i); -} -``` - -### Enhanced For Loop (For-Each Loop) - -The enhanced `for` loop, also known as the `for-each` loop, is used to iterate over elements in arrays or collections. - -**Syntax:** - -```java -for (type element : array) { - // code to be executed -} -``` - -**Example:** - -```java -int[] numbers = {1, 2, 3, 4, 5}; -for (int number : numbers) { - System.out.println("Number: " + number); -} -``` - -### While Loop - -The `while` loop is used when you do not know in advance how many times you need to execute a block of code. It repeats the block as long as the specified condition is true. - -**Syntax:** - -```java -while (condition) { - // code to be executed -} -``` - -**Example:** - -```java -int i = 0; -while (i < 5) { - System.out.println("Iteration: " + i); - i++; -} -``` - -### Do-While Loop - -The `do-while` loop is similar to the `while` loop, but it ensures that the code block is executed at least once before checking the condition. - -**Syntax:** - -```java -do { - // code to be executed -} while (condition); -``` - -**Example:** - -```java -int i = 0; -do { - System.out.println("Iteration: " + i); - i++; -} while (i < 5); -``` - -## Control Statements - -### Break Statement - -The `break` statement is used to exit a loop prematurely when a certain condition is met. - -**Example:** - -```java -for (int i = 0; i < 10; i++) { - if (i == 5) { - break; - } - System.out.println("Iteration: " + i); -} -``` - -### Continue Statement - -The `continue` statement is used to skip the current iteration of the loop and proceed to the next iteration. - -**Example:** - -```java -for (int i = 0; i < 10; i++) { - if (i == 5) { - continue; - } - System.out.println("Iteration: " + i); -} -``` - -## Nested Loops - -You can nest loops within each other to handle more complex situations. - -**Example:** - -```java -for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - System.out.println("i: " + i + ", j: " + j); - } -} -``` - -## Conclusion - -Loops are fundamental constructs in Java that help execute code repeatedly based on specified conditions. Understanding how to use `for`, `while`, and `do-while` loops, along with control statements like `break` and `continue`, is essential for efficient programming. \ No newline at end of file diff --git a/docs/java/control-statements/switch-and-ternary-statements.md b/docs/java/control-statements/switch-and-ternary-statements.md deleted file mode 100644 index 5f88420c7..000000000 --- a/docs/java/control-statements/switch-and-ternary-statements.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -id: switch-and-ternary-statements -title: Switch and Ternary Statements -sidebar_label: Switch and Ternary Statements -sidebar_position: 3 -tags: [java, switch, ternary, programming, java switch, java ternary] -description: In this tutorial, we will learn about switch and ternary statements in Java. We will learn about the switch statement, how to use it, and how it can be used to replace multiple if-else statements. We will also learn about the ternary operator, how to use it, and how it can be used to write concise conditional expressions in Java. ---- - -# Switch and Ternary Statements in Java - -## Introduction - -Switch and ternary statements are control flow tools in Java that help manage decision-making processes within your code. The `switch` statement provides a way to handle multiple conditions based on the value of a single variable, while the ternary operator offers a concise way to execute one of two possible expressions based on a condition. - -## Switch Statement - -The `switch` statement is used to execute one block of code among many based on the value of a variable or expression. It is particularly useful when you have multiple potential values for a variable and want to execute different code blocks depending on that value. - -### Syntax - -```java -switch (expression) { - case value1: - // code to be executed if expression equals value1 - break; - case value2: - // code to be executed if expression equals value2 - break; - // you can have any number of case statements - default: - // code to be executed if none of the cases match - break; -} -``` - -### Example - -```java -int day = 3; -switch (day) { - case 1: - System.out.println("Monday"); - break; - case 2: - System.out.println("Tuesday"); - break; - case 3: - System.out.println("Wednesday"); - break; - case 4: - System.out.println("Thursday"); - break; - case 5: - System.out.println("Friday"); - break; - case 6: - System.out.println("Saturday"); - break; - case 7: - System.out.println("Sunday"); - break; - default: - System.out.println("Invalid day"); - break; -} -``` - -### Points to Remember - -- Each `case` must be followed by a constant value and a colon. -- The `break` statement is used to terminate a case and prevent fall-through to subsequent cases. -- The `default` case is optional and executes if none of the other cases match. It is similar to the `else` clause in an `if-else` statement. - -## Ternary Operator - -The ternary operator is a shorthand way of writing an `if-else` statement. It is used to assign a value to a variable based on a condition. - -### Syntax - -```java -variable = (condition) ? expressionTrue : expressionFalse; -``` - -### Example - -```java -int a = 10; -int b = 20; - -int max = (a > b) ? a : b; -System.out.println("The maximum value is " + max); -``` - -### Explanation - -- The condition `a > b` is evaluated. -- If the condition is true, `a` is assigned to `max`. -- If the condition is false, `b` is assigned to `max`. - -### Points to Remember - -- The ternary operator is composed of three parts: a condition, an expression to execute if the condition is true, and an expression to execute if the condition is false. -- It is a more concise way to write simple `if-else` statements and can make the code more readable when used appropriately. - -## Conclusion - -Switch and ternary statements are powerful tools for managing control flow in Java programs. The `switch` statement is useful for handling multiple conditions based on a single variable, while the ternary operator offers a compact way to perform conditional assignments. Understanding how to use these constructs effectively can enhance your ability to write clear and efficient Java code. diff --git a/docs/java/exception-handling/_category_.json b/docs/java/exception-handling/_category_.json deleted file mode 100644 index 1cea9eae7..000000000 --- a/docs/java/exception-handling/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Exception Handling in Java", - "position": 8, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about exception handling in Java. You will learn about the different types of exceptions in Java, how to handle exceptions, and how to create your own custom exceptions." - } - } \ No newline at end of file diff --git a/docs/java/exception-handling/checked-vs-unchecked-exceptions.md b/docs/java/exception-handling/checked-vs-unchecked-exceptions.md deleted file mode 100644 index 7405c9262..000000000 --- a/docs/java/exception-handling/checked-vs-unchecked-exceptions.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -id: checked-vs-unchecked-exceptions -title: Checked vs Unchecked Exceptions in Java -sidebar_label: Checked vs Unchecked Exceptions -sidebar_position: 2 -tags: [java, exceptions, programming, checked-exceptions, unchecked-exceptions] -description: In this tutorial, you will learn about checked and unchecked exceptions in Java. We will learn about the differences between checked and unchecked exceptions, how to handle them, and when to use them in Java programs. ---- - -# Checked vs Unchecked Exceptions in Java - -## Introduction - -Exceptions in Java are categorized into two main types: checked exceptions and unchecked exceptions. Understanding the differences between these two types is crucial for effective exception handling in Java. - -## Checked Exceptions - -### Definition - -Checked exceptions are exceptions that are checked at compile-time. This means that the compiler ensures that these exceptions are either caught or declared in the method signature using the `throws` keyword. - -### Characteristics - -- **Compile-time Checking**: The compiler enforces handling of these exceptions. -- **Must be Caught or Declared**: Methods that can throw checked exceptions must either catch them or declare them using the `throws` keyword. -- **Typically Used for Recoverable Conditions**: Checked exceptions are often used for conditions from which the program can recover, such as I/O errors, network errors, and file not found exceptions. - -### Example - -```java -import java.io.File; -import java.io.FileReader; -import java.io.IOException; - -public class CheckedExceptionExample { - public static void main(String[] args) { - try { - FileReader file = new FileReader("file.txt"); - } catch (IOException e) { - System.out.println("File not found or unable to read the file"); - } - } -} -``` - -### Common Checked Exceptions - -- `IOException` -- `SQLException` -- `FileNotFoundException` -- `ClassNotFoundException` - -## Unchecked Exceptions - -### Definition - -Unchecked exceptions are exceptions that are not checked at compile-time. These are subclasses of `RuntimeException`. The compiler does not enforce handling of these exceptions, meaning they do not need to be declared or caught. - -### Characteristics - -- **Runtime Checking**: These exceptions occur during the execution of the program. -- **No Requirement to Catch or Declare**: Methods are not required to handle or declare these exceptions. -- **Typically Used for Programming Errors**: Unchecked exceptions are often used to indicate programming errors, such as logic errors or improper use of an API. - -### Example - -```java -public class UncheckedExceptionExample { - public static void main(String[] args) { - try { - int result = 10 / 0; - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } - } -} -``` - -### Common Unchecked Exceptions - -- `NullPointerException` -- `ArrayIndexOutOfBoundsException` -- `ArithmeticException` -- `IllegalArgumentException` - -## Key Differences - -| Feature | Checked Exceptions | Unchecked Exceptions | -|-----------------------------|-----------------------------------------|---------------------------------------| -| **Compile-time Checking** | Yes | No | -| **Handling Requirement** | Must be caught or declared | No requirement to catch or declare | -| **Inheritance** | Extends `Exception` | Extends `RuntimeException` | -| **Typical Use** | For recoverable conditions (e.g., I/O) | For programming errors (e.g., null pointers) | - -## When to Use - -### Checked Exceptions - -- Use checked exceptions when the client code should be aware of and recover from the exception. -- Ideal for scenarios where the error is due to external factors (e.g., network issues, file handling). - -### Unchecked Exceptions - -- Use unchecked exceptions to indicate programming errors that can be avoided by the developer. -- Ideal for scenarios where the error is due to a bug in the code (e.g., null pointer access, array out-of-bounds). - -## Example Comparison - -### Checked Exception Example - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class CheckedExceptionDemo { - public static void main(String[] args) { - try { - BufferedReader reader = new BufferedReader(new FileReader("file.txt")); - String line = reader.readLine(); - System.out.println(line); - reader.close(); - } catch (IOException e) { - System.out.println("An I/O error occurred: " + e.getMessage()); - } - } -} -``` - -### Unchecked Exception Example - -```java -public class UncheckedExceptionDemo { - public static void main(String[] args) { - String str = null; - try { - System.out.println(str.length()); - } catch (NullPointerException e) { - System.out.println("A null pointer exception occurred: " + e.getMessage()); - } - } -} -``` - -## Conclusion - -Understanding the distinction between checked and unchecked exceptions is essential for writing robust Java applications. Checked exceptions force you to handle potential error conditions at compile time, making your code more resilient to expected issues. Unchecked exceptions, on the other hand, highlight potential bugs in your code that should be fixed by the developer. Proper use of both types of exceptions can lead to cleaner, more maintainable code. diff --git a/docs/java/exception-handling/exception-basics-and-try-catch.md b/docs/java/exception-handling/exception-basics-and-try-catch.md deleted file mode 100644 index e720b4843..000000000 --- a/docs/java/exception-handling/exception-basics-and-try-catch.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -id: exception-basics-and-try-catch -title: Exception Basics and Try-Catch -sidebar_label: Exception Basics and Try-Catch -sidebar_position: 1 -tags: [java, exceptions, programming, exception-handling, java exceptions] -description: In this tutorial, we will learn about exceptions in Java. We will learn about what exceptions are, why they are important, and how to handle exceptions using try-catch blocks in Java programs. ---- - -# Exceptions Basics and Try-Catch in Java - -## Introduction - -Exceptions are events that disrupt the normal flow of a program's execution. In Java, exceptions provide a way to handle errors or other exceptional conditions in a controlled manner. Java provides a robust exception handling mechanism to manage runtime errors, making it easier to debug and maintain code. - -## Types of Exceptions - -### Checked Exceptions - -Checked exceptions are exceptions that are checked at compile-time. These exceptions must be either caught or declared in the method signature using the `throws` keyword. - -#### Example - -```java -import java.io.File; -import java.io.FileReader; -import java.io.IOException; - -public class CheckedExceptionExample { - public static void main(String[] args) { - try { - FileReader file = new FileReader("file.txt"); - } catch (IOException e) { - System.out.println("File not found or unable to read the file"); - } - } -} -``` - -### Unchecked Exceptions - -Unchecked exceptions are exceptions that are not checked at compile-time. These are subclasses of `RuntimeException`. They occur during the execution of the program and can be caught, but are not required to be declared in the method signature. - -#### Example - -```java -public class UncheckedExceptionExample { - public static void main(String[] args) { - try { - int result = 10 / 0; - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } - } -} -``` - -### Errors - -Errors are serious issues that a reasonable application should not try to catch. They are usually related to the environment in which the application is running (e.g., `OutOfMemoryError`). - -## Exception Hierarchy - -- `Throwable` - - `Exception` - - `RuntimeException` - - Checked exceptions (e.g., `IOException`, `SQLException`) - - `Error` (e.g., `OutOfMemoryError`, `StackOverflowError`) - -## Try-Catch Block - -### Syntax - -The `try` block contains code that might throw an exception, and the `catch` block contains code to handle the exception. - -```java -try { - // Code that may throw an exception -} catch (ExceptionType e) { - // Code to handle the exception -} -``` - -### Example - -```java -public class TryCatchExample { - public static void main(String[] args) { - try { - int[] numbers = {1, 2, 3}; - System.out.println(numbers[5]); // This will throw ArrayIndexOutOfBoundsException - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Array index is out of bounds"); - } - } -} -``` - -## Multiple Catch Blocks - -You can have multiple catch blocks to handle different types of exceptions. - -### Example - -```java -public class MultipleCatchExample { - public static void main(String[] args) { - try { - int[] numbers = {1, 2, 3}; - System.out.println(numbers[5]); - int result = 10 / 0; - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Array index is out of bounds"); - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } - } -} -``` - -## Finally Block - -The `finally` block is used to execute important code such as closing resources, regardless of whether an exception is thrown or not. - -### Syntax - -```java -try { - // Code that may throw an exception -} catch (ExceptionType e) { - // Code to handle the exception -} finally { - // Code to be executed regardless of an exception -} -``` - -### Example - -```java -public class FinallyExample { - public static void main(String[] args) { - try { - int result = 10 / 0; - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } finally { - System.out.println("This is the finally block"); - } - } -} -``` - -## Try-With-Resources - -The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. - -### Syntax - -```java -try (ResourceType resource = new ResourceType()) { - // Use the resource -} catch (ExceptionType e) { - // Code to handle the exception -} -``` - -### Example - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class TryWithResourcesExample { - public static void main(String[] args) { - try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { - String line; - while ((line = br.readLine()) != null) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println("File not found or unable to read the file"); - } - } -} -``` - -## Conclusion - -Understanding exceptions and how to handle them is crucial for writing robust and maintainable Java code. Using try-catch blocks appropriately allows you to manage runtime errors gracefully and ensure your program can handle unexpected conditions without crashing. diff --git a/docs/java/exception-handling/exception-handling-best-practices.md b/docs/java/exception-handling/exception-handling-best-practices.md deleted file mode 100644 index 5104ce577..000000000 --- a/docs/java/exception-handling/exception-handling-best-practices.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -id: exception-handling-best-practices -title: Exception Handling Best Practices -sidebar_label: Exception Handling Best Practices -sidebar_position: 4 -tags: [java, exceptions, programming, exception-handling, java exceptions] -description: In this tutorial, we will discuss some best practices for exception handling in Java. We will cover topics such as when to use checked and unchecked exceptions, how to create custom exceptions, and how to handle exceptions effectively in Java programs. ---- - -# Exception Handling Best Practices in Java - -## Introduction - -Exception handling is a critical aspect of writing robust and reliable Java applications. Effective exception handling improves code maintainability, debugging, and overall user experience. Here are some best practices to follow when dealing with exceptions in Java. - -## 1. Use Specific Exceptions - -**Best Practice**: Catch specific exceptions rather than catching general `Exception` types. - -**Why**: Catching specific exceptions allows you to handle different types of errors differently and provides more precise error messages to users or logs. - -**Example**: - -```java -try { - // Code that may throw IOException -} catch (IOException e) { - // Handle IOException -} -``` - -## 2. Handle Exceptions Appropriately - -**Best Practice**: Handle exceptions at the appropriate level in the code hierarchy. - -**Why**: Handling exceptions closer to where they occur provides better context and makes it easier to understand and maintain the code. - -**Example**: - -```java -public void readFile(String fileName) { - try { - // Code that may throw FileNotFoundException - } catch (FileNotFoundException e) { - // Handle FileNotFoundException - } -} -``` - -## 3. Log Exceptions - -**Best Practice**: Log exceptions with meaningful messages and stack traces. - -**Why**: Logging exceptions provides valuable information for debugging and troubleshooting issues in production environments. - -**Example**: - -```java -try { - // Code that may throw IOException -} catch (IOException e) { - logger.error("An error occurred while processing the file: " + e.getMessage()); - logger.debug("Stack trace:", e); -} -``` - -## 4. Use Finally Block for Cleanup - -**Best Practice**: Use the `finally` block to release resources and perform cleanup operations. - -**Why**: The `finally` block ensures that critical cleanup tasks are executed, even if an exception occurs. - -**Example**: - -```java -InputStream inputStream = null; -try { - inputStream = new FileInputStream("file.txt"); - // Code that may throw IOException -} catch (IOException e) { - // Handle IOException -} finally { - if (inputStream != null) { - try { - inputStream.close(); - } catch (IOException e) { - // Handle IOException - } - } -} -``` - -## 5. Consider Checked vs Unchecked Exceptions - -**Best Practice**: Use checked exceptions for recoverable conditions and unchecked exceptions for programming errors. - -**Why**: Checked exceptions force developers to handle exceptional conditions, while unchecked exceptions are typically used for unrecoverable errors. - -**Example**: - -```java -public void openFile(String fileName) throws FileNotFoundException { - // Code that may throw FileNotFoundException -} - -public void processRequest() { - try { - openFile("file.txt"); - } catch (FileNotFoundException e) { - // Handle FileNotFoundException - } -} -``` - -## 6. Use Try-With-Resources - -**Best Practice**: Use the try-with-resources statement for automatic resource management. - -**Why**: Try-with-resources automatically closes resources at the end of the block, reducing the risk of resource leaks. - -**Example**: - -```java -try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { - // Code that reads from the file -} catch (IOException e) { - // Handle IOException -} -``` - -## Conclusion - -Exception handling is an integral part of writing robust Java applications. By following these best practices, you can improve the reliability, maintainability, and debuggability of your code, resulting in a better user experience and fewer production issues. diff --git a/docs/java/exception-handling/throwing-and-catching-exceptions.md b/docs/java/exception-handling/throwing-and-catching-exceptions.md deleted file mode 100644 index 877c093ba..000000000 --- a/docs/java/exception-handling/throwing-and-catching-exceptions.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -id: throwing-and-catching-exceptions -title: Throwing and Catching Exceptions -sidebar_label: Throwing and Catching Exceptions -sidebar_position: 3 -tags: [java, exceptions, programming, throwing-exceptions, catching-exceptions] -description: In this tutorial, you will learn how to throw and catch exceptions in Java. We will learn how to throw exceptions using the `throw` statement and how to catch exceptions using the `try-catch` block in Java programs. ---- - -# Throwing and Catching Exceptions in Java - -## Introduction - -In Java, exceptions are thrown to indicate exceptional conditions that may occur during the execution of a program. Exceptions can be thrown explicitly using the `throw` keyword or can be thrown implicitly by the Java runtime system. - -## Throwing Exceptions - -### Syntax - -Exceptions can be thrown explicitly using the `throw` keyword followed by an instance of the exception class. - -```java -throw new ExceptionType("Error message"); -``` - -### Example - -```java -public class ThrowExceptionExample { - public static void main(String[] args) { - int age = -5; - if (age < 0) { - throw new IllegalArgumentException("Age cannot be negative"); - } - } -} -``` - -## Catching Exceptions - -### Syntax - -Exceptions are caught using the `try-catch` block. The `try` block contains the code that may throw an exception, and the `catch` block handles the exception. - -```java -try { - // Code that may throw an exception -} catch (ExceptionType e) { - // Code to handle the exception -} -``` - -### Example - -```java -public class CatchExceptionExample { - public static void main(String[] args) { - try { - int result = 10 / 0; // This will throw ArithmeticException - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } - } -} -``` - -## Multiple Catch Blocks - -You can have multiple catch blocks to handle different types of exceptions. - -### Example - -```java -public class MultipleCatchExample { - public static void main(String[] args) { - try { - int[] numbers = {1, 2, 3}; - System.out.println(numbers[5]); // This will throw ArrayIndexOutOfBoundsException - int result = 10 / 0; // This will throw ArithmeticException - } catch (ArrayIndexOutOfBoundsException e) { - System.out.println("Array index is out of bounds"); - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } - } -} -``` - -## Finally Block - -The `finally` block is used to execute important code such as closing resources, regardless of whether an exception is thrown or not. - -### Syntax - -```java -try { - // Code that may throw an exception -} catch (ExceptionType e) { - // Code to handle the exception -} finally { - // Code to be executed regardless of an exception -} -``` - -### Example - -```java -public class FinallyExample { - public static void main(String[] args) { - try { - int result = 10 / 0; // This will throw ArithmeticException - } catch (ArithmeticException e) { - System.out.println("Cannot divide by zero"); - } finally { - System.out.println("This is the finally block"); - } - } -} -``` - -## Try-With-Resources - -The try-with-resources statement is a try statement that declares one or more resources. A resource is an object that must be closed after the program is finished with it. The try-with-resources statement ensures that each resource is closed at the end of the statement. - -### Syntax - -```java -try (ResourceType resource = new ResourceType()) { - // Use the resource -} catch (ExceptionType e) { - // Code to handle the exception -} -``` - -### Example - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class TryWithResourcesExample { - public static void main(String[] args) { - try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { - String line; - while ((line = br.readLine()) != null) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println("File not found or unable to read the file"); - } - } -} -``` - -## Conclusion - -Throwing and catching exceptions are essential aspects of Java programming, allowing you to handle unexpected conditions and errors gracefully. By understanding how to throw and catch exceptions, as well as how to use the `finally` block and try-with-resources statement, you can write more robust and reliable Java code. diff --git a/docs/java/file-handling-and-io/_category_.json b/docs/java/file-handling-and-io/_category_.json deleted file mode 100644 index e908d5844..000000000 --- a/docs/java/file-handling-and-io/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "File Handling in Java", - "position": 9, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about File Handling in Java. You will learn how to create, read, write, and delete files in Java. You will also learn how to handle exceptions in file handling." - } - } \ No newline at end of file diff --git a/docs/java/file-handling-and-io/reading-and-writing-files.md b/docs/java/file-handling-and-io/reading-and-writing-files.md deleted file mode 100644 index 581ec7ede..000000000 --- a/docs/java/file-handling-and-io/reading-and-writing-files.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -id: reading-and-writing-files -title: Reading and Writing Files in Java -sidebar_label: Reading and Writing Files -sidebar_position: 2 -tags: [java, file handling, io, programming, java file handling, java io] -description: In this tutorial, you will learn how to read from and write to files in Java. We will learn how to read text files, binary files, and write to text files using Java. ---- - -# Reading and Writing Files in Java - -## Introduction - -Reading and writing files is a common task in Java programming. Java provides several classes for handling file I/O operations, such as `FileInputStream`, `FileOutputStream`, `BufferedReader`, `BufferedWriter`, `FileReader`, and `FileWriter`. This guide covers basic file reading and writing operations using these classes. - -## 1. Reading Files - -### Reading Text Files - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class ReadTextFileExample { - public static void main(String[] args) { - try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) { - String line; - while ((line = reader.readLine()) != null) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Reading Binary Files - -```java -import java.io.FileInputStream; -import java.io.IOException; - -public class ReadBinaryFileExample { - public static void main(String[] args) { - try (FileInputStream fis = new FileInputStream("example.bin")) { - int byteData; - while ((byteData = fis.read()) != -1) { - System.out.print((char) byteData); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 2. Writing Files - -### Writing Text Files - -```java -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; - -public class WriteTextFileExample { - public static void main(String[] args) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"))) { - writer.write("Hello, World!"); - writer.newLine(); - writer.write("This is a new line."); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Writing Binary Files - -```java -import java.io.FileOutputStream; -import java.io.IOException; - -public class WriteBinaryFileExample { - public static void main(String[] args) { - try (FileOutputStream fos = new FileOutputStream("example.bin")) { - byte[] data = { 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33 }; - fos.write(data); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## Conclusion - -Reading and writing files in Java is straightforward using the classes provided in the `java.io` package. Whether you need to handle text files or binary files, Java provides the necessary tools to perform file I/O operations efficiently. By understanding and using these classes effectively, you can manipulate files in your Java applications with ease. diff --git a/docs/java/file-handling-and-io/serialization-and-deserialization.md b/docs/java/file-handling-and-io/serialization-and-deserialization.md deleted file mode 100644 index 64a396611..000000000 --- a/docs/java/file-handling-and-io/serialization-and-deserialization.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -id: serialization-and-deserialization -title: Serialization and Deserialization in Java -sidebar_label: Serialization and Deserialization -sidebar_position: 3 -tags: [java, file handling, serialization, deserialization] -description: In this tutorial, you will learn about serialization and deserialization in Java. We will learn how to serialize and deserialize objects in Java using the `Serializable` interface and the `ObjectInputStream` and `ObjectOutputStream` classes. ---- - -# Serialization and Deserialization in Java - -## Introduction - -Serialization is the process of converting Java objects into a stream of bytes, which can be saved to a file, sent over the network, or stored in a database. Deserialization is the reverse process of converting a stream of bytes back into Java objects. Serialization is commonly used for data persistence, caching, and communication between distributed systems. - -## Serialization - -### Serialization Process - -To serialize an object in Java, you need to implement the `Serializable` interface. The object's class and all of its member variables must be serializable. - -```java -import java.io.FileOutputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -public class SerializationExample { - public static void main(String[] args) { - try (FileOutputStream fos = new FileOutputStream("data.ser"); - ObjectOutputStream oos = new ObjectOutputStream(fos)) { - MyClass obj = new MyClass(); - oos.writeObject(obj); - System.out.println("Object serialized successfully"); - } catch (Exception e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} - -class MyClass implements Serializable { - // Serializable class - private int id; - private String name; - // Constructors, methods, etc. -} -``` - -## Deserialization - -### Deserialization Process - -To deserialize an object in Java, you need to read the serialized data from a file or stream and convert it back into an object. The object's class must be available in the classpath. - -```java -import java.io.FileInputStream; -import java.io.ObjectInputStream; - -public class DeserializationExample { - public static void main(String[] args) { - try (FileInputStream fis = new FileInputStream("data.ser"); - ObjectInputStream ois = new ObjectInputStream(fis)) { - MyClass obj = (MyClass) ois.readObject(); - System.out.println("Object deserialized successfully"); - } catch (Exception e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Serialization ID - -Java objects have a unique identifier called a Serialization ID (serialVersionUID), which is used during deserialization to ensure compatibility between serialized and deserialized objects. It's recommended to explicitly declare this ID to prevent versioning issues. - -```java -private static final long serialVersionUID = 123456789L; -``` - -## Best Practices - -1. **Implement Serializable**: Ensure that the class you want to serialize implements the `Serializable` interface. - -2. **Handle Versioning**: Declare a `serialVersionUID` to control versioning and prevent compatibility issues. - -3. **Handle Transient Fields**: Use the `transient` keyword to exclude fields from serialization that are not relevant for persistence. - -4. **Close Resources**: Always close streams and resources properly after serialization and deserialization. - -5. **Consider Security**: Be cautious when deserializing data from untrusted sources to avoid security vulnerabilities. - -## Conclusion - -Serialization and deserialization are powerful features in Java for persisting and transferring object data. By following best practices and understanding the serialization process, you can efficiently store and retrieve objects in your Java applications. diff --git a/docs/java/file-handling-and-io/working-with-files-and-directories.md b/docs/java/file-handling-and-io/working-with-files-and-directories.md deleted file mode 100644 index f790dd96c..000000000 --- a/docs/java/file-handling-and-io/working-with-files-and-directories.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -id: working-with-files-and-directories -title: Working with Files and Directories in Java -sidebar_label: Working with Files and Directories -sidebar_position: 1 -tags: [java, files, directories, programming, java files, java directories] -description: In this tutorial, we will learn how to work with files and directories in Java. We will learn how to read from and write to files, create directories, list files in a directory, and more. ---- - -# Working with Files and Directories in Java - -## Introduction - -Working with files and directories is a common task in Java programming. Java provides the `java.io` and `java.nio.file` packages to handle file and directory operations. This guide covers basic file and directory operations, such as creating, reading, writing, and deleting files and directories. - -## 1. Creating Files and Directories - -### Creating a File - -```java -import java.io.File; -import java.io.IOException; - -public class FileCreationExample { - public static void main(String[] args) { - try { - File file = new File("example.txt"); - if (file.createNewFile()) { - System.out.println("File created successfully"); - } else { - System.out.println("File already exists"); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Creating a Directory - -```java -import java.io.File; - -public class DirectoryCreationExample { - public static void main(String[] args) { - File directory = new File("example"); - if (directory.mkdir()) { - System.out.println("Directory created successfully"); - } else { - System.out.println("Failed to create directory"); - } - } -} -``` - -## Conclusion - -Java provides comprehensive APIs for working with files and directories, allowing you to perform various operations such as creating, reading, writing, and deleting files and directories. By understanding and using these APIs effectively, you can manipulate files and directories in your Java applications with ease. diff --git a/docs/java/file-handling-and-io/working-with-io-channels.md b/docs/java/file-handling-and-io/working-with-io-channels.md deleted file mode 100644 index e582dbbd1..000000000 --- a/docs/java/file-handling-and-io/working-with-io-channels.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -id: working-with-io-channels -title: Working with I/O Channels in Java -sidebar_label: Working with I/O Channels -sidebar_position: 4 -tags: [java, io, channels, programming, java io, java channels] -description: In this tutorial, we will learn how to work with I/O channels in Java. We will learn what I/O channels are, how to create and use them, and how to read from and write to channels. ---- - -# Working with I/O Channels in Java - -## Introduction - -I/O channels provide a higher-level abstraction for reading from and writing to streams in Java. Java NIO (New I/O) provides the `java.nio.channels` package, which includes various channel classes for performing I/O operations efficiently. This guide covers basic operations with I/O channels, including reading from and writing to files. - -## 1. Reading from Channels - -### Reading from a File Channel - -```java -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -public class ReadFromChannelExample { - public static void main(String[] args) { - try (FileInputStream fis = new FileInputStream("input.txt"); - FileChannel channel = fis.getChannel()) { - ByteBuffer buffer = ByteBuffer.allocate(1024); - int bytesRead = channel.read(buffer); - while (bytesRead != -1) { - buffer.flip(); - while (buffer.hasRemaining()) { - System.out.print((char) buffer.get()); - } - buffer.clear(); - bytesRead = channel.read(buffer); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 2. Writing to Channels - -### Writing to a File Channel - -```java -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; - -public class WriteToChannelExample { - public static void main(String[] args) { - try (FileOutputStream fos = new FileOutputStream("output.txt"); - FileChannel channel = fos.getChannel()) { - String data = "Hello, World!"; - ByteBuffer buffer = ByteBuffer.wrap(data.getBytes()); - channel.write(buffer); - System.out.println("Data written to file successfully"); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 3. Closing Channels - -### Closing a Channel - -```java -import java.io.IOException; -import java.nio.channels.FileChannel; -import java.nio.file.Paths; - -public class CloseChannelExample { - public static void main(String[] args) { - try (FileChannel channel = FileChannel.open(Paths.get("file.txt"))) { - // Channel operations - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 4. File Channel Properties - -### File Channel Properties - -File channels provide various properties and methods for querying information about the channel, such as its size, position, and whether it is open. - -```java -import java.io.IOException; -import java.nio.channels.FileChannel; -import java.nio.file.Paths; - -public class ChannelPropertiesExample { - public static void main(String[] args) { - try (FileChannel channel = FileChannel.open(Paths.get("file.txt"))) { - System.out.println("File size: " + channel.size() + " bytes"); - System.out.println("Current position: " + channel.position()); - System.out.println("Is open? " + channel.isOpen()); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## Conclusion - -I/O channels provide a powerful and efficient way to perform I/O operations in Java. By using file channels, you can read from and write to files with improved performance and flexibility. Understanding how to work with I/O channels is essential for developing high-performance Java applications. diff --git a/docs/java/file-handling-and-io/working-with-io-readers-and-writers.md b/docs/java/file-handling-and-io/working-with-io-readers-and-writers.md deleted file mode 100644 index c0ff149b9..000000000 --- a/docs/java/file-handling-and-io/working-with-io-readers-and-writers.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: working-with-io-readers-and-writers -title: Working with I/O Readers and Writers in Java -sidebar_label: Working with I/O Readers and Writers -sidebar_position: 5 -tags: [java, io, readers, writers, programming, java io, java readers, java writers] -description: In this tutorial, we will learn how to work with I/O readers and writers in Java. We will learn what I/O readers and writers are, how to create and use them, and how to read from and write to files using readers and writers. ---- - -# Working with I/O Readers and Writers in Java - -## Introduction - -I/O readers and writers in Java provide higher-level abstractions for reading characters from and writing characters to streams. These classes are suitable for handling character-based data, such as text files. This guide covers basic operations with I/O readers and writers, including reading from and writing to files. - -## 1. Reading from Readers - -### Reading from a FileReader - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class ReadFromReaderExample { - public static void main(String[] args) { - try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) { - String line; - while ((line = reader.readLine()) != null) { - System.out.println(line); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 2. Writing to Writers - -### Writing to a FileWriter - -```java -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; - -public class WriteToWriterExample { - public static void main(String[] args) { - try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { - writer.write("Hello, World!"); - writer.newLine(); - writer.write("This is a new line."); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 3. Closing Readers and Writers - -### Closing a Reader or Writer - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class CloseReaderExample { - public static void main(String[] args) { - try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { - // Reader operations - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 4. Reader and Writer Properties - -### Reader and Writer Properties - -Readers and writers provide various properties and methods for querying information about the stream, such as the current position, whether the stream is ready, and whether the end of the stream has been reached. - -```java -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - -public class ReaderPropertiesExample { - public static void main(String[] args) { - try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) { - System.out.println("Is ready? " + reader.ready()); - System.out.println("Has reached end of stream? " + (reader.readLine() == null)); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## Conclusion - -I/O readers and writers in Java provide convenient abstractions for working with character-based data. By using readers and writers, you can efficiently read from and write to files, streams, and other sources of character data. Understanding how to work with I/O readers and writers is essential for developing Java applications that handle text-based data effectively. - - -You can add this content to your Markdown file in Visual Studio Code by following the same steps as before. \ No newline at end of file diff --git a/docs/java/file-handling-and-io/working-with-io-streams.md b/docs/java/file-handling-and-io/working-with-io-streams.md deleted file mode 100644 index bfafc0bfd..000000000 --- a/docs/java/file-handling-and-io/working-with-io-streams.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -id: working-with-io-streams -title: Working with I/O Streams in Java -sidebar_label: Working with I/O Streams -sidebar_position: 6 -tags: [java, io, streams, programming, java io, java streams] -description: In this tutorial, we will learn how to work with I/O streams in Java. We will learn what I/O streams are, how to create and use them, and how to read from and write to streams. ---- - -# Working with I/O Streams in Java - -## Introduction - -I/O streams in Java provide a way to read from and write to various sources, such as files, network connections, and in-memory buffers. Java I/O streams are categorized into two types: byte streams and character streams. This guide covers basic operations with I/O streams, including reading from and writing to files using byte and character streams. - -## 1. Byte Streams - -### Reading from a File Using FileInputStream - -```java -import java.io.FileInputStream; -import java.io.IOException; - -public class ReadFromByteStreamExample { - public static void main(String[] args) { - try (FileInputStream fis = new FileInputStream("input.txt")) { - int byteData; - while ((byteData = fis.read()) != -1) { - System.out.print((char) byteData); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Writing to a File Using FileOutputStream - -```java -import java.io.FileOutputStream; -import java.io.IOException; - -public class WriteToByteStreamExample { - public static void main(String[] args) { - try (FileOutputStream fos = new FileOutputStream("output.txt")) { - String data = "Hello, World!"; - byte[] bytes = data.getBytes(); - fos.write(bytes); - System.out.println("Data written to file successfully"); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## 2. Character Streams - -### Reading from a File Using FileReader - -```java -import java.io.FileReader; -import java.io.IOException; - -public class ReadFromCharacterStreamExample { - public static void main(String[] args) { - try (FileReader reader = new FileReader("input.txt")) { - int charData; - while ((charData = reader.read()) != -1) { - System.out.print((char) charData); - } - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -### Writing to a File Using FileWriter - -```java -import java.io.FileWriter; -import java.io.IOException; - -public class WriteToCharacterStreamExample { - public static void main(String[] args) { - try (FileWriter writer = new FileWriter("output.txt")) { - writer.write("Hello, World!"); - writer.write("\n"); - writer.write("This is a new line."); - System.out.println("Data written to file successfully"); - } catch (IOException e) { - System.out.println("An error occurred: " + e.getMessage()); - } - } -} -``` - -## Conclusion - -I/O streams provide a flexible and efficient way to perform input and output operations in Java. By using byte streams for binary data and character streams for text data, you can easily read from and write to various sources in your Java applications. Understanding how to work with I/O streams is essential for developing Java applications that handle I/O operations effectively. diff --git a/docs/java/generics/Generic Classes.md b/docs/java/generics/Generic Classes.md deleted file mode 100644 index 642267288..000000000 --- a/docs/java/generics/Generic Classes.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -id: generic-classes -title: Generic Classes -sidebar_label: Generic Classes -sidebar_position: 2 -tags: [java, generics] -description: In this tutorial, we will explore how to create and use generic classes in JAVA. ---- - -# Generic Classes - -- Generic classes in Java allow you to define classes with placeholders for types. - -- These placeholders can then be replaced with actual types when creating instances of the class. This provides flexibility and type safety. - -- To define a generic class, you use angle brackets `<>` to declare type parameters. These parameters can be used throughout the class definition. - -```java -// T is the placeholder representing the type of the item stored in the Box. -public class Box { - private T item; - - public void setItem(T item) { - this.item = item; - } - - public T getItem() { - return item; - } -} -``` - -When you create an instance of `Box` and specify a type, such as `Box`, T is replaced with `Integer`, and the `Box` class effectively becomes a container for integers. - -```java -public class Main { - public static void main(String[] args) { - Box integerBox = new Box<>(); - integerBox.setItem(10); - System.out.println("Item in the integer box: " + integerBox.getItem()); - - Box stringBox = new Box<>(); - stringBox.setItem("Hello, World!"); - System.out.println("Item in the string box: " + stringBox.getItem()); - } -} -``` - -The above Java program demonstrates the usage of a generic class Box with two different types (`Integer` and `String`). diff --git a/docs/java/generics/Generic methods.md b/docs/java/generics/Generic methods.md deleted file mode 100644 index 33c16f29c..000000000 --- a/docs/java/generics/Generic methods.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -id: generic-methods -title: Generic methods -sidebar_label: Generic methods -sidebar_position: 3 -tags: [java, generics] -description: In this tutorial, we will explore explore how to create and use generic methods in JAVA. ---- - -# Generic methods - -- Generic methods allow you to create methods that work with different types without specifying the actual type until the method is called. - -- The syntax for defining a generic method involves placing type parameters in angle brackets before the return type. - -```java -public class ArrayPrinter { - // Generic method to print an array of any type - public static void printArray(T[] array) { - for (T item : array) { - System.out.print(item + " "); - } - System.out.println(); - } - - public static void main(String[] args) { - Integer[] intArray = {1, 2, 3, 4, 5}; - String[] stringArray = {"apple", "banana", "orange"}; - - // Print the Integer array - System.out.print("Integer Array: "); - printArray(intArray); - - // Print the String array - System.out.print("String Array: "); - printArray(stringArray); - } -} -``` - -- The above code is to demonstrate the use of a generic method printArray that can print elements of arrays of any type. diff --git a/docs/java/generics/Introduction to Generics.md b/docs/java/generics/Introduction to Generics.md deleted file mode 100644 index 49205ec73..000000000 --- a/docs/java/generics/Introduction to Generics.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: introduction-generics -title: Introduction to Generics in Java -sidebar_label: Introduction to Generics -sidebar_position: 1 -tags: [java, generics] -description: In this tutorial, we will explore what exactly the generics is and the its importance. ---- - -# Introduction to Generics in Java - -- Imagine you’re running a grocery store, and you want to organize your shelves to hold different types of products. - -- Traditionally, you might have separate shelves for fruits, vegetables, dairy products, and so on. - -- Instead of having separate shelves for each type of product, you have a set of flexible shelves that can hold any type of product. - -- Now, let’s think about generics in terms of organizing these shelves. - -- The beauty of generics here is that you don’t need to create separate shelves for each type of product. You can use the same generic shelves for different types of items, making your store more flexible and efficient. - -- In programming, this flexibility is incredibly valuable. You can create generic data structures or functions that work with any type of data, just like our generic shelves can hold any type of product in the grocery store. This makes your code more adaptable and reusable, which is a big win in terms of efficiency and maintainability. - -- `Generics`, refer to a way of writing code that allows types (classes and interfaces) to be parameterized. - -- This means that instead of specifying concrete types for variables, methods, or classes, you can use placeholders that are later replaced by actual types when the code is used. - -- The primary purpose of generics is to enable the creation of reusable components that can work with any data type. - -- They provide a way to write code that is type-safe, meaning that it can catch type errors at compile time rather than at runtime. This helps in identifying and fixing bugs earlier in the development process, which ultimately leads to more robust and reliable software. diff --git a/docs/java/generics/Wildcards.md b/docs/java/generics/Wildcards.md deleted file mode 100644 index 56f92c51b..000000000 --- a/docs/java/generics/Wildcards.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -id: wildcards-generics -title: Wildcards -sidebar_label: Wildcards -sidebar_position: 4 -tags: [java, generics] -description: In this tutorial, we will explore about how wildcards used in generics with examples. ---- - -# Wildcards - -- wildcard types are used to make generic types more flexible, particularly when dealing with collections. - -- They allow you to define generic types that can accept a wider range of subtypes. Wildcard types are represented using the ? symbol. - -- There are two main types of wildcard bounds: - -## Upper Bounded Wildcards (``): - -- These wildcards restrict the unknown type to be a specific type or a subtype of that type. - -- They allow you to specify that a generic type parameter should be an instance of a class or a subclass of that class. - -```java -import java.util.*; - -class UpperBoundExample { - static double sum(List list) { - double sum = 0.0; - for (Number num : list) { - sum += num.doubleValue(); - } - return sum; - } - - public static void main(String[] args) { - List integers = Arrays.asList(1, 2, 3, 4, 5); - System.out.println("Sum of integers: " + sum(integers)); - - List doubles = Arrays.asList(1.1, 2.2, 3.3, 4.4, 5.5); - System.out.println("Sum of doubles: " + sum(doubles)); - } -} - -``` - -- In the sum method, the parameter `List` accepts a list of any type that extends Number. So, both `List` and `List` can be passed to this method. - -## Lower Bounded Wildcards (``): - -- These wildcards restrict the unknown type to be a specific type or a supertype of that type. - -- They allow you to specify that a generic type parameter should be an instance of a class or a superclass of that class. - -```java -import java.util.*; - -class LowerBoundExample { - static void addIntegers(List list) { - for (int i = 1; i <= 5; i++) { - list.add(i); - } - } - - public static void main(String[] args) { - List numbers = new ArrayList<>(); - addIntegers(numbers); - System.out.println("Numbers: " + numbers); - } -} -``` - - -- In the addIntegers method, the parameter `List` accepts a list of any type that is a superclass of Integer. So, `List` or `List` can be passed to this method. diff --git a/docs/java/gui-programming-with-swing/_category_.json b/docs/java/gui-programming-with-swing/_category_.json deleted file mode 100644 index 66920de5c..000000000 --- a/docs/java/gui-programming-with-swing/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "GUI Programming with Swing in Java", - "position": 12, - "link": { - "type": "generated-index", - "description": "In this section, we will learn how to create GUI applications using Swing in Java. We will cover the basics of Swing, how to create GUI components, how to layout them, how to handle events, how to create dialogs, how to create menus, and how to create frames. We will also learn how to create a simple calculator application using Swing." - } -} \ No newline at end of file diff --git a/docs/java/gui-programming-with-swing/creating-gui-components.md b/docs/java/gui-programming-with-swing/creating-gui-components.md deleted file mode 100644 index 060149664..000000000 --- a/docs/java/gui-programming-with-swing/creating-gui-components.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -id: creating-gui-components -title: Creating GUI Components in Java -sidebar_label: Creating GUI Components -sidebar_position: 2 -tags: [java, swing, gui, programming, java swing] -description: In this tutorial, we will learn about creating GUI components in Java using Swing. We will learn about how to create various GUI components such as buttons, labels, text fields, and more. ---- -Creating GUI components in Java Swing involves instantiating and configuring various classes provided by the Swing framework. Here's an overview of how to create some common GUI components: - -### 1. JFrame (Main Window) - -```java -import javax.swing.*; - -public class MyFrame extends JFrame { - public MyFrame() { - super("My Application"); // Set window title - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Close operation - setSize(400, 300); // Set window size - setLocationRelativeTo(null); // Center window - setVisible(true); // Make window visible - } - - public static void main(String[] args) { - new MyFrame(); // Create an instance of MyFrame - } -} -``` - -### 2. JPanel (Container) - -```java -import javax.swing.*; - -public class MyPanel extends JPanel { - public MyPanel() { - add(new JButton("Click Me")); // Add a button to the panel - } - - public static void main(String[] args) { - JFrame frame = new JFrame("My Panel"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.add(new MyPanel()); // Add an instance of MyPanel to the frame - frame.pack(); // Pack the components - frame.setLocationRelativeTo(null); // Center window - frame.setVisible(true); // Make window visible - } -} -``` - -### 3. JButton (Button) - -```java -import javax.swing.*; - -public class MyButton extends JFrame { - public MyButton() { - super("Button Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JButton button = new JButton("Click Me"); - button.addActionListener(e -> JOptionPane.showMessageDialog(this, "Button clicked!")); - add(button); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new MyButton(); - } -} -``` - -### 4. JLabel (Label) - -```java -import javax.swing.*; - -public class MyLabel extends JFrame { - public MyLabel() { - super("Label Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JLabel label = new JLabel("Hello, Swing!"); - add(label); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new MyLabel(); - } -} -``` - -### 5. JTextField (Text Field) - -```java -import javax.swing.*; - -public class MyTextField extends JFrame { - public MyTextField() { - super("Text Field Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JTextField textField = new JTextField(20); // Set preferred width - add(textField); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new MyTextField(); - } -} -``` - -### 6. JTextArea (Text Area) - -```java -import javax.swing.*; - -public class MyTextArea extends JFrame { - public MyTextArea() { - super("Text Area Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - JTextArea textArea = new JTextArea(10, 30); // Set rows and columns - JScrollPane scrollPane = new JScrollPane(textArea); // Add scroll bars - add(scrollPane); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new MyTextArea(); - } -} -``` - -These examples demonstrate how to create various GUI components in Java Swing. By instantiating and configuring these components, you can build rich and interactive user interfaces for your Java applications. \ No newline at end of file diff --git a/docs/java/gui-programming-with-swing/event-handling-and-listeners.md b/docs/java/gui-programming-with-swing/event-handling-and-listeners.md deleted file mode 100644 index b73519404..000000000 --- a/docs/java/gui-programming-with-swing/event-handling-and-listeners.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -id: event-handling-and-listeners -title: Event Handling and Listeners in Java -sidebar_label: Event Handling and Listeners -sidebar_position: 3 -tags: [java, swing, event handling, listeners] -description: In this tutorial, we will learn about event handling and listeners in Java. We will learn about how to handle events in Java Swing applications using event listeners. ---- -Event handling in Java Swing involves registering event listeners to respond to user interactions with GUI components. Here's an overview of how to handle events using listeners: - -### 1. ActionListener (Button Click) - -```java -import javax.swing.*; -import java.awt.event.*; - -public class ButtonClickExample extends JFrame implements ActionListener { - private JButton button; - - public ButtonClickExample() { - super("Button Click Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - button = new JButton("Click Me"); - button.addActionListener(this); // Register ActionListener - add(button); - - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - @Override - public void actionPerformed(ActionEvent e) { - if (e.getSource() == button) { - JOptionPane.showMessageDialog(this, "Button clicked!"); - } - } - - public static void main(String[] args) { - new ButtonClickExample(); - } -} -``` - -### 2. MouseListener (Mouse Click) - -```java -import javax.swing.*; -import java.awt.event.*; - -public class MouseClickExample extends JFrame implements MouseListener { - public MouseClickExample() { - super("Mouse Click Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton button = new JButton("Click Me"); - button.addMouseListener(this); // Register MouseListener - add(button); - - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - @Override - public void mouseClicked(MouseEvent e) { - JOptionPane.showMessageDialog(this, "Mouse clicked!"); - } - - @Override - public void mousePressed(MouseEvent e) {} - - @Override - public void mouseReleased(MouseEvent e) {} - - @Override - public void mouseEntered(MouseEvent e) {} - - @Override - public void mouseExited(MouseEvent e) {} - - public static void main(String[] args) { - new MouseClickExample(); - } -} -``` - -### 3. KeyListener (Keyboard Input) - -```java -import javax.swing.*; -import java.awt.event.*; - -public class KeyInputExample extends JFrame implements KeyListener { - public KeyInputExample() { - super("Key Input Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JTextField textField = new JTextField(20); - textField.addKeyListener(this); // Register KeyListener - add(textField); - - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - @Override - public void keyTyped(KeyEvent e) {} - - @Override - public void keyPressed(KeyEvent e) { - JOptionPane.showMessageDialog(this, "Key pressed: " + e.getKeyChar()); - } - - @Override - public void keyReleased(KeyEvent e) {} - - public static void main(String[] args) { - new KeyInputExample(); - } -} -``` - -### 4. ItemListener (Checkbox/Radio Button Selection) - -```java -import javax.swing.*; -import java.awt.event.*; - -public class ItemSelectionExample extends JFrame implements ItemListener { - public ItemSelectionExample() { - super("Item Selection Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JCheckBox checkBox = new JCheckBox("Check Me"); - checkBox.addItemListener(this); // Register ItemListener - add(checkBox); - - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - @Override - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange() == ItemEvent.SELECTED) { - JOptionPane.showMessageDialog(this, "Item selected!"); - } - } - - public static void main(String[] args) { - new ItemSelectionExample(); - } -} -``` - -These examples demonstrate how to handle various events in Java Swing using event listeners. By implementing and registering listeners, you can respond to user interactions with GUI components and perform appropriate actions in your application. \ No newline at end of file diff --git a/docs/java/gui-programming-with-swing/introduction-to-swing.md b/docs/java/gui-programming-with-swing/introduction-to-swing.md deleted file mode 100644 index 5ee7dd7ae..000000000 --- a/docs/java/gui-programming-with-swing/introduction-to-swing.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -id: introduction-to-swing -title: Introduction to Swing -sidebar_label: Introduction to Swing -sidebar_position: 1 -tags: [java, swing, gui, programming, java swing] -description: In this tutorial, we will learn about Swing, a GUI toolkit for Java. We will learn about what Swing is, how it is used to create graphical user interfaces in Java, and some of the components provided by Swing. ---- - - -## Introduction to Swing - -Swing is a GUI (Graphical User Interface) toolkit for Java. It provides a set of lightweight components that allow developers to create rich, platform-independent graphical user interfaces for Java applications. Swing was introduced as part of the Java Foundation Classes (JFC) in Java 2 (JDK 1.2) and has been the primary GUI toolkit for Java desktop applications since then. - -### Features of Swing - -1. **Platform Independence:** Swing components are written entirely in Java and are not dependent on the underlying operating system's native GUI components. This allows Swing applications to run on any platform that supports Java without modification. - -2. **Rich Set of Components:** Swing provides a wide range of components for building GUIs, including buttons, labels, text fields, checkboxes, radio buttons, list boxes, combo boxes, tables, trees, and more. These components can be customized and combined to create complex user interfaces. - -3. **Custom Look and Feel:** Swing supports pluggable look and feel (PLAF), allowing developers to customize the appearance of their applications. Swing applications can have the native look and feel of the underlying operating system or a custom look and feel defined by the developer. - -4. **Event-Driven Programming Model:** Swing follows an event-driven programming model, where user interactions (such as mouse clicks, keyboard input, and window events) trigger events that are handled by event listeners. This allows developers to create interactive and responsive user interfaces. - -5. **Layout Managers:** Swing provides layout managers that allow developers to arrange components within containers dynamically. Layout managers handle the sizing and positioning of components, ensuring that GUIs adapt to different screen sizes and resolutions. - -### Getting Started with Swing - -To start developing Swing applications, you need to have the Java Development Kit (JDK) installed on your system. Once you have the JDK installed, you can create Swing applications using any Java IDE (Integrated Development Environment) such as IntelliJ IDEA, Eclipse, or NetBeans, or you can use a simple text editor and the command line. - -### Example Swing Application - -Here's a simple "Hello, Swing!" application written in Java: - -```java -import javax.swing.*; - -public class HelloWorldSwing { - public static void createAndShowGUI() { - // Create and set up the window - JFrame frame = new JFrame("HelloWorldSwing"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - // Add the "Hello, Swing!" label to the window - JLabel label = new JLabel("Hello, Swing!", SwingConstants.CENTER); - frame.getContentPane().add(label); - - // Display the window - frame.pack(); - frame.setVisible(true); - } - - public static void main(String[] args) { - // Schedule a job for the event dispatch thread: - // creating and showing this application's GUI. - javax.swing.SwingUtilities.invokeLater(new Runnable() { - public void run() { - createAndShowGUI(); - } - }); - } -} -``` - -This code creates a simple Swing window with a label that displays "Hello, Swing!". It demonstrates the basic structure of a Swing application, including creating a JFrame window, adding components to the window, and displaying the window on the screen. - -### Conclusion - -Swing provides a powerful and flexible toolkit for building GUI applications in Java. With its platform independence, rich set of components, and customizability, Swing remains a popular choice for developing desktop applications in Java. Whether you're building a simple calculator or a complex business application, Swing offers the tools you need to create modern, responsive user interfaces. \ No newline at end of file diff --git a/docs/java/gui-programming-with-swing/working-with-dialogs-and-frames.md b/docs/java/gui-programming-with-swing/working-with-dialogs-and-frames.md deleted file mode 100644 index 730edecec..000000000 --- a/docs/java/gui-programming-with-swing/working-with-dialogs-and-frames.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: working-with-dialogs-and-frames -title: Working with Dialogs and Frames in Java Swing -sidebar_label: Working with Dialogs and Frames -sidebar_position: 5 -tags: [java, swing, dialogs, frames] -description: In this tutorial, we will learn about working with dialogs and frames in Java Swing. We will learn how to create and use dialog boxes and frames in Swing applications. ---- -Working with dialogs and frames in Java Swing allows you to create pop-up windows and additional application windows for various purposes. Here's how you can work with dialogs and frames: - -### 1. JOptionPane (Dialog) - -```java -import javax.swing.*; - -public class JOptionPaneExample { - public static void main(String[] args) { - JFrame frame = new JFrame("JOptionPane Example"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton button = new JButton("Click Me"); - button.addActionListener(e -> { - JOptionPane.showMessageDialog(frame, "Hello, Swing!", "Message", JOptionPane.INFORMATION_MESSAGE); - }); - - frame.add(button); - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } -} -``` - -### 2. JDialog (Custom Dialog) - -```java -import javax.swing.*; - -public class JDialogExample { - public static void main(String[] args) { - JFrame frame = new JFrame("JDialog Example"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JButton button = new JButton("Show Dialog"); - button.addActionListener(e -> { - JDialog dialog = new JDialog(frame, "Custom Dialog", true); - dialog.add(new JLabel("This is a custom dialog")); - dialog.pack(); - dialog.setLocationRelativeTo(frame); - dialog.setVisible(true); - }); - - frame.add(button); - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } -} -``` - -### 3. JFrame (Additional Frame) - -```java -import javax.swing.*; - -public class AdditionalFrameExample { - public static void main(String[] args) { - JFrame frame1 = new JFrame("Frame 1"); - frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame1.setSize(300, 200); - frame1.setLocationRelativeTo(null); - frame1.setVisible(true); - - JFrame frame2 = new JFrame("Frame 2"); - frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame2.setSize(300, 200); - frame2.setLocationRelativeTo(null); - frame2.setVisible(true); - } -} -``` - -### 4. Closing Listener for JFrame - -```java -import javax.swing.*; -import java.awt.event.*; - -public class JFrameClosingListener { - public static void main(String[] args) { - JFrame frame = new JFrame("JFrame Closing Listener"); - frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - frame.addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - int option = JOptionPane.showConfirmDialog(frame, "Are you sure you want to exit?", "Confirm Exit", JOptionPane.YES_NO_OPTION); - if (option == JOptionPane.YES_OPTION) { - frame.dispose(); - } - } - }); - frame.setSize(300, 200); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - } -} -``` - -These examples demonstrate how to work with dialogs and frames in Java Swing. By creating and customizing instances of `JOptionPane`, `JDialog`, and `JFrame`, you can add pop-up dialogs and additional windows to your Swing applications. \ No newline at end of file diff --git a/docs/java/gui-programming-with-swing/working-with-layout-managers.md b/docs/java/gui-programming-with-swing/working-with-layout-managers.md deleted file mode 100644 index a427404b8..000000000 --- a/docs/java/gui-programming-with-swing/working-with-layout-managers.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -id: working-with-layout-managers -title: Working with Layout Managers in Java Swing -sidebar_label: Working with Layout Managers -sidebar_position: 4 -tags: [java, swing, layout-managers] -description: In this tutorial, we will learn about working with layout managers in Java Swing. We will learn about different layout managers available in Swing and how to use them to create user interfaces. ---- -Working with layout managers in Java Swing allows you to dynamically arrange GUI components within containers, ensuring that your user interface adapts to different screen sizes and resolutions. Here's an overview of some common layout managers and how to use them: - -### 1. BorderLayout - -```java -import javax.swing.*; - -public class BorderLayoutExample extends JFrame { - public BorderLayoutExample() { - super("BorderLayout Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JPanel panel = new JPanel(new BorderLayout()); - panel.add(new JButton("North"), BorderLayout.NORTH); - panel.add(new JButton("South"), BorderLayout.SOUTH); - panel.add(new JButton("East"), BorderLayout.EAST); - panel.add(new JButton("West"), BorderLayout.WEST); - panel.add(new JButton("Center"), BorderLayout.CENTER); - - add(panel); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new BorderLayoutExample(); - } -} -``` - -### 2. FlowLayout - -```java -import javax.swing.*; - -public class FlowLayoutExample extends JFrame { - public FlowLayoutExample() { - super("FlowLayout Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JPanel panel = new JPanel(new FlowLayout()); - panel.add(new JButton("Button 1")); - panel.add(new JButton("Button 2")); - panel.add(new JButton("Button 3")); - panel.add(new JButton("Button 4")); - - add(panel); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new FlowLayoutExample(); - } -} -``` - -### 3. GridLayout - -```java -import javax.swing.*; - -public class GridLayoutExample extends JFrame { - public GridLayoutExample() { - super("GridLayout Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JPanel panel = new JPanel(new GridLayout(3, 2)); - panel.add(new JButton("Button 1")); - panel.add(new JButton("Button 2")); - panel.add(new JButton("Button 3")); - panel.add(new JButton("Button 4")); - panel.add(new JButton("Button 5")); - panel.add(new JButton("Button 6")); - - add(panel); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new GridLayoutExample(); - } -} -``` - -### 4. BoxLayout - -```java -import javax.swing.*; - -public class BoxLayoutExample extends JFrame { - public BoxLayoutExample() { - super("BoxLayout Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); - panel.add(new JButton("Button 1")); - panel.add(new JButton("Button 2")); - panel.add(new JButton("Button 3")); - - add(panel); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new BoxLayoutExample(); - } -} -``` - -### 5. GridBagLayout - -```java -import javax.swing.*; -import java.awt.*; - -public class GridBagLayoutExample extends JFrame { - public GridBagLayoutExample() { - super("GridBagLayout Example"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - JPanel panel = new JPanel(new GridBagLayout()); - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridx = 0; - gbc.gridy = 0; - panel.add(new JButton("Button 1"), gbc); - gbc.gridx = 1; - panel.add(new JButton("Button 2"), gbc); - gbc.gridx = 0; - gbc.gridy = 1; - gbc.gridwidth = 2; - panel.add(new JButton("Button 3"), gbc); - - add(panel); - pack(); - setLocationRelativeTo(null); - setVisible(true); - } - - public static void main(String[] args) { - new GridBagLayoutExample(); - } -} -``` - -These examples demonstrate how to use various layout managers in Java Swing to arrange GUI components within containers. By selecting the appropriate layout manager and configuring its parameters, you can create flexible and responsive user interfaces for your Java applications. \ No newline at end of file diff --git a/docs/java/home.md b/docs/java/home.md deleted file mode 100644 index 2559efe0f..000000000 --- a/docs/java/home.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: java-home -title: Java Tutorial Overview -sidebar_label: Overview -sidebar_position: 1 -tags: [java, overview] -description: In this tutorial, you will learn about Java programming language, its features, and its applications. ---- - -Java is a high-level, class-based, object-oriented programming language that is designed to have as few implementation dependencies as possible. It is a general-purpose programming language intended to let application developers write once, run anywhere (WORA), meaning that compiled Java code can run on all platforms that support Java without the need for recompilation. Java applications are typically compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. - -Java is one of the most popular programming languages in the world. It is widely used in web development, enterprise software development, mobile app development, and game development. Java is also the primary language used for developing Android applications. - - -## What we will learn in this tutorial? - -In this tutorial, you will learn about Java programming language, its features, and its applications. You will also learn how to set up a Java development environment on your computer and write your first Java program. - -## What is Java? - -- Java is a high-level, class-based, object-oriented programming language. -- It is designed to have as few implementation dependencies as possible. -- It is a general-purpose programming language intended to let application developers write once, run anywhere (WORA). -- Java applications are typically compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. -- Java is one of the most popular programming languages in the world. -- It is widely used in web development, enterprise software development, mobile app development, and game development. -- Java is also the primary language used for developing Android applications. -- Java was originally developed by James Gosling at Sun Microsystems (which has since been acquired by Oracle Corporation). -- The first version of Java was released in 1995. -- Java is currently maintained and developed by Oracle Corporation. - -## Features of Java - -- **Simple**: Java is designed to be easy to learn and use. It has a clean and readable syntax that makes it easy to write and maintain code. -- **Object-Oriented**: Java is an object-oriented programming language. It supports the concepts of classes and objects, inheritance, polymorphism, and encapsulation. -- **Platform-Independent**: Java applications are compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. This makes Java platform-independent. -- **Secure**: Java is designed with security in mind. It provides a secure runtime environment that protects against viruses and other malicious software. -- **Robust**: Java is designed to be robust and reliable. It includes features such as automatic memory management (garbage collection) and exception handling that help developers write bug-free code. -- **Architecture-Neutral**: Java is designed to be architecture-neutral. It does not depend on any specific hardware or operating system, making it suitable for a wide range of devices and platforms. -- **Portable**: Java is designed to be portable. It allows developers to write code once and run it on any platform that supports Java. -- **High Performance**: Java is designed to be high-performance. It includes features such as just-in-time (JIT) compilation that optimize the performance of Java applications. -- **Multithreaded**: Java supports multithreading, allowing developers to write programs that can perform multiple tasks simultaneously. -- **Dynamic**: Java is a dynamic language. It supports dynamic loading of classes and dynamic compilation of code, making it easy to extend and modify Java applications at runtime. -- **Distributed**: Java includes features that support distributed computing, such as Remote Method Invocation (RMI) and Java Naming and Directory Interface (JNDI). - -## Applications of Java - -Java is used in a wide range of applications, including: - -- **Web Development**: Java is widely used in web development. It is used to build dynamic websites, web applications, and web services. Java web frameworks such as Spring, Struts, and Hibernate are popular among web developers. -- **Enterprise Software Development**: Java is widely used in enterprise software development. It is used to build large-scale, mission-critical applications for businesses and organizations. Java Enterprise Edition (Java EE) provides a set of APIs and services for building enterprise applications. -- **Mobile App Development**: Java is the primary language used for developing Android applications. Android Studio, the official IDE for Android development, uses Java as its primary programming language. -- **Game Development**: Java is used in game development. It is used to build desktop games, mobile games, and online games. Java game development libraries such as LibGDX and jMonkeyEngine are popular among game developers. -- **Scientific Computing**: Java is used in scientific computing. It is used to build scientific applications, simulations, and data analysis tools. Java libraries such as Apache Commons Math and JFreeChart are popular among scientists and researchers. -- **Embedded Systems**: Java is used in embedded systems. It is used to build embedded applications for devices such as smartphones, tablets, smart TVs, and IoT devices. Java Micro Edition (Java ME) provides a set of APIs and services for building embedded applications. -- **Desktop Applications**: Java is used to build desktop applications. It is used to build cross-platform desktop applications that can run on Windows, macOS, and Linux. Java desktop frameworks such as JavaFX and Swing are popular among desktop developers. -- **Cloud Computing**: Java is used in cloud computing. It is used to build cloud-based applications, services, and platforms. Java libraries such as Apache Hadoop and Apache Spark are popular among cloud developers. -- **Big Data Analytics**: Java is used in big data analytics. It is used to build data processing applications, data visualization tools, and data mining algorithms. Java libraries such as Apache Flink and Apache Mahout are popular among data scientists and analysts. -- **Artificial Intelligence**: Java is used in artificial intelligence. It is used to build AI applications, machine learning algorithms, and neural networks. Java libraries such as Weka and Deeplearning4j are popular among AI developers. -- **Internet of Things (IoT)**: Java is used in IoT. It is used to build IoT applications, smart devices, and connected systems. Java libraries such as Eclipse IoT and ThingSpeak are popular among IoT developers. -- **Blockchain Development**: Java is used in blockchain development. It is used to build blockchain applications, smart contracts, and decentralized applications. Java libraries such as Web3j and Hyperledger Fabric are popular among blockchain developers. -- **Cybersecurity**: Java is used in cybersecurity. It is used to build security applications, encryption algorithms, and network security tools. Java libraries such as Bouncy Castle and OWASP Java Encoder are popular among cybersecurity professionals. - -## Conclusion - -Java is a powerful and versatile programming language that is widely used in a variety of applications. It is known for its simplicity, reliability, and performance. Whether you are a beginner or an experienced developer, learning Java can open up a world of opportunities for you. In this tutorial, you will learn the basics of Java programming and how to get started with Java development. Let's get started! \ No newline at end of file diff --git a/docs/java/introduction-to-java/_category_.json b/docs/java/introduction-to-java/_category_.json deleted file mode 100644 index 0af2c3630..000000000 --- a/docs/java/introduction-to-java/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Introduction To Java", - "position": 2, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the basics of Java programming language. You will learn about the features of Java, its installation, and how to write and run your first Java program." - } - } \ No newline at end of file diff --git a/docs/java/introduction-to-java/setup-java-development-environment.md b/docs/java/introduction-to-java/setup-java-development-environment.md deleted file mode 100644 index b947c4425..000000000 --- a/docs/java/introduction-to-java/setup-java-development-environment.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: setup-java-development-environment -title: Setup Java Development Environment -sidebar_label: Setup Java Development Environment -sidebar_position: 3 -tags: [java, setup java development environment] -description: In this tutorial, you will learn how to set up a Java development environment on your computer. ---- - -# Setting Up a Java Environment - -## Introduction - -Before you can start programming in Java, you need to set up your development environment. This typically involves installing the necessary software and configuring your system to compile and run Java code. - -## Steps to Set Up Java Environment - -1. **Install Java Development Kit (JDK)**: - - - Visit the official Oracle website or adoptopenjdk.net to download the latest version of the JDK. - - Follow the installation instructions provided for your operating system (Windows, macOS, or Linux). - - After installation, set the `JAVA_HOME` environment variable to the JDK installation directory. - -2. **Install Integrated Development Environment (IDE)** (Optional but recommended): - - - Choose an IDE suitable for Java development, such as Eclipse, IntelliJ IDEA, or NetBeans. - - Download and install the IDE from the respective official websites. - - Configure the IDE to use the installed JDK. - -3. **Set Up Java Development Tools**: - - - If you're not using an IDE, you can set up your development environment using text editors like Visual Studio Code, Sublime Text, or Atom. - - Install Java extensions or plugins for your chosen text editor to enable syntax highlighting, code completion, and other useful features. - -4. **Verify Installation**: - - - Open a terminal or command prompt and type `java -version` to verify that Java is installed and the correct version is displayed. - - Similarly, type `javac -version` to verify that the Java compiler is installed and accessible. - -5. **Configure Build Tools** (Optional): - - - Consider using build automation tools like Apache Maven or Gradle to manage dependencies and build Java projects. - - Install the desired build tool and configure it according to your project requirements. - -6. **Setup Environment Variables** (Optional but recommended): - - Set up environment variables such as `PATH` to include the JDK's `bin` directory, which allows you to run Java commands from any directory in the terminal or command prompt. - -## Conclusion - -Setting up a Java environment is an essential step for any Java developer. By following these steps, you can ensure that your system is properly configured to compile, run, and manage Java applications efficiently. Whether you choose to use an IDE or a text editor, having a well-configured environment will streamline your development workflow and make it easier to write, test, and debug Java code. diff --git a/docs/java/introduction-to-java/what-is-java.md b/docs/java/introduction-to-java/what-is-java.md deleted file mode 100644 index 13f2e26d5..000000000 --- a/docs/java/introduction-to-java/what-is-java.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -id: what-is-java -title: What is Java? -sidebar_label: What is Java? -sidebar_position: 1 -tags: [java, what-is-java, introduction-to-java] -description: In this tutorial, you will learn about Java programming language, what it is, its features, and its applications. ---- - -# Introduction to Java - -## What is Java? - -Java is a versatile and widely-used programming language known for its portability, performance, and security features. Developed by Sun Microsystems (now owned by Oracle Corporation), Java was first released in 1995. It has since become one of the most popular programming languages in the world, particularly for building enterprise-level applications, mobile apps, and web services. - -## Key Features of Java - -- **Platform Independence**: Java programs can run on any device or platform that has a Java Virtual Machine (JVM) installed, making it highly portable. -- **Object-Oriented**: Java is an object-oriented programming (OOP) language, which means it focuses on creating objects that encapsulate data and behavior. -- **Robustness**: Java's strong memory management, exception handling, and type checking mechanisms contribute to its robustness, making it suitable for building reliable software. -- **Security**: Java's built-in security features, such as the sandbox environment and bytecode verification, help protect against malicious code. -- **Performance**: While Java was initially criticized for its performance, advancements in JVM implementations and optimizations have made it a high-performance language, especially for server-side applications. - -## Java Development Ecosystem - -Java has a vast ecosystem of libraries, frameworks, and tools that facilitate various aspects of software development: - -- **Integrated Development Environments (IDEs)**: Popular IDEs for Java development include Eclipse, IntelliJ IDEA, and NetBeans, offering features like code completion, debugging, and project management. - -- **Libraries and Frameworks**: Java boasts numerous libraries and frameworks for different purposes, such as Spring Framework for building enterprise applications, Hibernate for object-relational mapping, and Apache Maven for project management and build automation. - -- **Community Support**: Java has a large and active community of developers who contribute to open-source projects, share knowledge through forums and blogs, and provide support to fellow developers. - -## Java Editions - -Over the years, Java has evolved into different editions, each catering to specific platforms and use cases: - -- **Java Standard Edition (Java SE)**: Also known as Core Java, this edition provides the basic foundation for Java development, including core APIs for desktop and server applications. - -- **Java Enterprise Edition (Java EE)**: Java EE extends the Java SE platform with additional APIs and features for building scalable, distributed enterprise applications. - -- **Java Micro Edition (Java ME)**: Optimized for resource-constrained devices, Java ME is used for developing applications for mobile devices, embedded systems, and other small-scale platforms. - -- **JavaFX**: A platform for creating rich internet applications (RIAs), JavaFX allows developers to build modern, visually appealing user interfaces for desktop, mobile, and web applications. - -## Conclusion - -Java's versatility, performance, and extensive ecosystem make it a popular choice for a wide range of development projects, from enterprise applications to mobile apps and web services. Its platform independence, robustness, and security features continue to attract developers worldwide, ensuring Java's relevance in the ever-evolving landscape of software development. diff --git a/docs/java/introduction-to-java/why-learn-java.md b/docs/java/introduction-to-java/why-learn-java.md deleted file mode 100644 index 93d15b085..000000000 --- a/docs/java/introduction-to-java/why-learn-java.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -id: why-learn-java -title: Why Learn Java? -sidebar_label: Why Learn Java? -sidebar_position: 2 -tags: [java, why-learn-java] -description: In this tutorial, you will learn why you should learn Java programming language and its benefits. ---- - -# Why Learn Java? - -## Introduction - -Java is one of the most popular and widely-used programming languages in the world, and there are several compelling reasons why learning Java can be beneficial. - -## Reasons to Learn Java - -- **Versatility**: Java is a versatile language that can be used for a wide range of applications, including web development, mobile app development, enterprise software, scientific computing, and more. - -- **Platform Independence**: Java programs can run on any device or platform that has a Java Virtual Machine (JVM) installed, making it highly portable and accessible. - -- **Job Opportunities**: Java developers are in high demand across various industries, including finance, healthcare, e-commerce, and technology. Learning Java can open up numerous career opportunities and increase your marketability as a software developer. - -- **Strong Ecosystem**: Java has a vast ecosystem of libraries, frameworks, and tools that simplify and accelerate the development process. Whether you're building a web application with Spring Boot or an Android app with Android Studio, Java provides the necessary resources to streamline your development workflow. - -- **Object-Oriented Programming (OOP)**: Java is an object-oriented programming language, which means it emphasizes the concept of objects and classes. Learning Java helps you understand fundamental OOP principles, such as encapsulation, inheritance, and polymorphism, which are transferable skills applicable to other programming languages. - -- **Community Support**: Java has a large and active community of developers who contribute to open-source projects, share knowledge through forums and blogs, and provide support to fellow developers. Being part of the Java community can help you learn from others, stay updated on industry trends, and collaborate on interesting projects. - -- **Backward Compatibility**: Java places a strong emphasis on backward compatibility, which means code written in older versions of Java can still run on newer versions without major modifications. This ensures that Java applications remain stable and reliable over time, reducing maintenance costs and compatibility issues. - -## Conclusion - -Whether you're a beginner programmer looking to learn your first language or an experienced developer seeking to expand your skill set, learning Java offers numerous benefits. Its versatility, platform independence, job opportunities, strong ecosystem, OOP principles, community support, and backward compatibility make it a valuable language to master in today's competitive software development landscape. diff --git a/docs/java/jdbc-and-databases/_category_.json b/docs/java/jdbc-and-databases/_category_.json deleted file mode 100644 index a24f1c8d6..000000000 --- a/docs/java/jdbc-and-databases/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "JDBC and Databases in Java", - "position": 13, - "link": { - "type": "generated-index", - "description": "In this section, you will learn how to use JDBC to interact with databases in Java. You will learn how to connect to a database, query data, and update data. You will also learn about the different types of databases and how to use them in Java." - } -} \ No newline at end of file diff --git a/docs/java/jdbc-and-databases/connecting-to-a-database.md b/docs/java/jdbc-and-databases/connecting-to-a-database.md deleted file mode 100644 index 67dd7e2ce..000000000 --- a/docs/java/jdbc-and-databases/connecting-to-a-database.md +++ /dev/null @@ -1,72 +0,0 @@ -To connect to a database using JDBC, you need to follow these steps: - -1. **Load the JDBC Driver**: Load the appropriate JDBC driver for the database you want to connect to. The driver class must be included in your classpath. - -2. **Establish Connection**: Create a connection to the database by providing the database URL, username, and password. - -3. **Create Statement**: Create a Statement object to execute SQL queries against the database. - -4. **Execute Query**: Execute SQL queries using the Statement object. - -5. **Process Results**: Process the results returned by the query. - -6. **Close Resources**: Close the ResultSet, Statement, and Connection objects when you're done to release database resources. - -Here's an example of how to connect to a MySQL database using JDBC: - -```java -import java.sql.*; - -public class MySQLExample { - public static void main(String[] args) { - // Database connection parameters - String url = "jdbc:mysql://localhost:3306/mydatabase"; - String username = "username"; - String password = "password"; - - // JDBC objects - Connection connection = null; - Statement statement = null; - ResultSet resultSet = null; - - try { - // Load the MySQL JDBC driver - Class.forName("com.mysql.cj.jdbc.Driver"); - - // Establish connection - connection = DriverManager.getConnection(url, username, password); - - // Create statement - statement = connection.createStatement(); - - // Execute query - resultSet = statement.executeQuery("SELECT * FROM mytable"); - - // Process results - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - // Process other columns as needed - System.out.println("ID: " + id + ", Name: " + name); - } - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } catch (SQLException e) { - e.printStackTrace(); - } finally { - // Close resources - try { - if (resultSet != null) resultSet.close(); - if (statement != null) statement.close(); - if (connection != null) connection.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } -} -``` - -Replace `"jdbc:mysql://localhost:3306/mydatabase"`, `"username"`, and `"password"` with your actual database URL, username, and password respectively. - -Remember to handle exceptions properly and close resources in a finally block to ensure proper cleanup even if an exception occurs. \ No newline at end of file diff --git a/docs/java/jdbc-and-databases/executing-sql-statements-and-transactions.md b/docs/java/jdbc-and-databases/executing-sql-statements-and-transactions.md deleted file mode 100644 index 554cc7cf1..000000000 --- a/docs/java/jdbc-and-databases/executing-sql-statements-and-transactions.md +++ /dev/null @@ -1,87 +0,0 @@ -To execute SQL statements and transactions using JDBC, you can use the Statement and PreparedStatement interfaces. Here's how you can execute SQL statements and transactions: - -### Executing SQL Statements - -1. **Statement**: Use when you have a static SQL query that does not contain user input. - -```java -try { - Statement statement = connection.createStatement(); - ResultSet resultSet = statement.executeQuery("SELECT * FROM my_table"); - // Process ResultSet - statement.close(); -} catch (SQLException e) { - e.printStackTrace(); -} -``` - -2. **PreparedStatement**: Use when you have a dynamic SQL query that may contain user input. - -```java -try { - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM my_table WHERE id = ?"); - preparedStatement.setInt(1, 1); // Set parameter values - ResultSet resultSet = preparedStatement.executeQuery(); - // Process ResultSet - preparedStatement.close(); -} catch (SQLException e) { - e.printStackTrace(); -} -``` - -### Executing Transactions - -1. **Auto-commit Mode**: By default, JDBC operates in auto-commit mode, where each SQL statement is automatically committed as soon as it is executed. To start a transaction, you need to disable auto-commit. - -```java -try { - connection.setAutoCommit(false); // Disable auto-commit - // Execute SQL statements - connection.commit(); // Commit transaction -} catch (SQLException e) { - e.printStackTrace(); - try { - connection.rollback(); // Rollback transaction if an exception occurs - } catch (SQLException ex) { - ex.printStackTrace(); - } -} finally { - try { - connection.setAutoCommit(true); // Enable auto-commit - } catch (SQLException ex) { - ex.printStackTrace(); - } -} -``` - -2. **Savepoints**: You can set savepoints within a transaction to mark points where you can rollback to if necessary. - -```java -try { - connection.setAutoCommit(false); // Disable auto-commit - // Execute SQL statements - Savepoint savepoint = connection.setSavepoint("savepoint1"); // Set savepoint - // More SQL statements - connection.rollback(savepoint); // Rollback to savepoint - connection.commit(); // Commit transaction -} catch (SQLException e) { - e.printStackTrace(); - try { - connection.rollback(); // Rollback transaction if an exception occurs - } catch (SQLException ex) { - ex.printStackTrace(); - } -} finally { - try { - connection.setAutoCommit(true); // Enable auto-commit - } catch (SQLException ex) { - ex.printStackTrace(); - } -} -``` - -### Note: - -- Always handle exceptions properly and close resources in a finally block to ensure proper cleanup. -- Use PreparedStatement to prevent SQL injection attacks and improve performance. -- Transactions are typically used when you need to execute multiple SQL statements as a single unit of work, ensuring data consistency. \ No newline at end of file diff --git a/docs/java/jdbc-and-databases/introduction-to-jdbc.md b/docs/java/jdbc-and-databases/introduction-to-jdbc.md deleted file mode 100644 index d885e7905..000000000 --- a/docs/java/jdbc-and-databases/introduction-to-jdbc.md +++ /dev/null @@ -1,89 +0,0 @@ - - -## Introduction to JDBC - -Java Database Connectivity (JDBC) is a Java API for connecting and interacting with relational databases from Java programs. It provides a standard interface for Java applications to access databases, execute SQL queries, and manipulate database data. - -### Key Components of JDBC - -1. **Driver Manager**: Manages a list of database drivers. It is responsible for loading the appropriate driver based on the database URL provided by the application. - -2. **Driver**: Implements the JDBC interfaces to communicate with a specific type of database. Each database vendor provides its own JDBC driver. - -3. **Connection**: Represents a connection to a database. It is used to establish communication with the database and provides methods for executing SQL statements. - -4. **Statement**: Represents an SQL statement to be executed against the database. It can be a simple statement, a prepared statement, or a callable statement. - -5. **ResultSet**: Represents the result of a query executed against the database. It provides methods for navigating through the rows of the result set and retrieving column values. - -### Steps to Use JDBC - -1. **Load the Driver**: Register the JDBC driver using `Class.forName()` or let the DriverManager automatically load the appropriate driver. - -2. **Establish Connection**: Create a connection to the database using `DriverManager.getConnection()` method by providing the database URL, username, and password. - -3. **Create Statement**: Create a Statement object using the connection to execute SQL queries. - -4. **Execute Query**: Execute SQL queries using the Statement object. For example, `executeQuery()` for SELECT queries and `executeUpdate()` for INSERT, UPDATE, DELETE queries. - -5. **Process Results**: Process the results returned by the query using the ResultSet object. - -6. **Close Resources**: Close the ResultSet, Statement, and Connection objects when they are no longer needed to release database resources. - -### Example Code Snippet - -```java -import java.sql.*; - -public class JDBCDemo { - public static void main(String[] args) { - try { - // Load the driver - Class.forName("com.mysql.cj.jdbc.Driver"); - - // Establish connection - String url = "jdbc:mysql://localhost:3306/mydatabase"; - String username = "username"; - String password = "password"; - Connection connection = DriverManager.getConnection(url, username, password); - - // Create statement - Statement statement = connection.createStatement(); - - // Execute query - ResultSet resultSet = statement.executeQuery("SELECT * FROM employees"); - - // Process results - while (resultSet.next()) { - int id = resultSet.getInt("id"); - String name = resultSet.getString("name"); - double salary = resultSet.getDouble("salary"); - System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary); - } - - // Close resources - resultSet.close(); - statement.close(); - connection.close(); - } catch (ClassNotFoundException | SQLException e) { - e.printStackTrace(); - } - } -} -``` - -### JDBC Drivers - -There are four types of JDBC drivers: - -1. **Type 1 (JDBC-ODBC Bridge)**: Uses ODBC (Open Database Connectivity) to connect to databases. It requires native code and is platform-dependent. - -2. **Type 2 (Native-API Driver)**: Uses a database-specific native library to communicate with the database. It is platform-dependent and requires native code. - -3. **Type 3 (Network Protocol Driver)**: Communicates with a middle-tier server using a database-independent protocol, which then communicates with the database. It is platform-independent but requires additional software. - -4. **Type 4 (Thin Driver, JDBC Net Pure Java Driver)**: Communicates directly with the database using a pure Java implementation. It is platform-independent and does not require additional software. - -### Conclusion - -JDBC provides a powerful and flexible API for Java applications to interact with relational databases. By following the JDBC architecture and using appropriate drivers, developers can easily connect to databases, execute SQL queries, and manage database data from their Java programs. \ No newline at end of file diff --git a/docs/java/methods-and-functions/_category_.json b/docs/java/methods-and-functions/_category_.json deleted file mode 100644 index ff3cbcd9e..000000000 --- a/docs/java/methods-and-functions/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Methods and Functions", - "position": 5, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the methods and functions that are available in the Java programming language. You will learn about the different types of methods and functions, how to define them, and how to use them in your programs. You will also learn about the different types of parameters that can be passed to methods and functions, and how to return values from them. Finally, you will learn about the different types of methods and functions that are available in the Java API, and how to use them in your programs." - } - } \ No newline at end of file diff --git a/docs/java/methods-and-functions/method-declaration-and-syntax.md b/docs/java/methods-and-functions/method-declaration-and-syntax.md deleted file mode 100644 index e58fbf07c..000000000 --- a/docs/java/methods-and-functions/method-declaration-and-syntax.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: method-declaration-and-syntax -title: Method Declaration and Syntax -sidebar_label: Method Declaration and Syntax -sidebar_position: 1 -tags: [java, methods, functions, programming, java methods, java functions] -description: In this tutorial, we will learn about methods and functions in Java. We will learn about what methods are, how to declare and define methods, and how to call methods in Java. ---- - - -# Method Declaration and Syntax in Java - -## Introduction - -Methods in Java are blocks of code that perform a specific task and can be called upon whenever needed. They help in organizing code, improving reusability, and making programs more modular and maintainable. - -## Method Declaration - -A method declaration in Java defines a method's name, return type, and parameters. Here's the basic syntax for declaring a method: - -### Syntax - -```java -accessModifier returnType methodName(parameters) { - // method body -} -``` - -### Example - -```java -public int add(int a, int b) { - return a + b; -} -``` - -### Explanation - -- **Access Modifier**: Defines the visibility of the method. Common access modifiers include `public`, `private`, `protected`, and the default (package-private). -- **Return Type**: Specifies the type of value the method returns. If the method does not return any value, use `void`. -- **Method Name**: The name of the method. It should be a valid identifier and follow camelCase naming convention. -- **Parameters**: A comma-separated list of input parameters. Each parameter consists of a data type and a variable name. diff --git a/docs/java/methods-and-functions/method-overloading-and-recursion.md b/docs/java/methods-and-functions/method-overloading-and-recursion.md deleted file mode 100644 index 84871658b..000000000 --- a/docs/java/methods-and-functions/method-overloading-and-recursion.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -id: method-overloading-and-recursion -title: Method Overloading and Recursion -sidebar_label: Method Overloading and Recursion -sidebar_position: 3 -tags: - [ - java, - methods, - functions, - programming, - java methods, - java functions, - method overloading, - recursion, - ] -description: In this tutorial, we will learn about method overloading and recursion in Java. We will learn about what method overloading is, how to overload methods in Java, and how to use recursion to solve problems in Java. ---- - -# Method Overloading and Recursion in Java - -## Introduction - -Methods are an essential part of Java programming. Understanding advanced concepts like method overloading and recursion can help you write more efficient and flexible code. - -## Method Overloading - -Method overloading allows multiple methods with the same name but different parameters to coexist within a class. It is a way to define multiple methods that do similar things but with different input parameters. - -### Syntax - -```java -returnType methodName(parameterList1) { - // method body -} - -returnType methodName(parameterList2) { - // method body -} -``` - -### Example - -```java -public class Main { - public static void main(String[] args) { - Main obj = new Main(); - - System.out.println(obj.add(5, 3)); // Calls add(int, int) - System.out.println(obj.add(2.5, 3.7)); // Calls add(double, double) - System.out.println(obj.add("Hello", "World")); // Calls add(String, String) - } - - public int add(int a, int b) { - return a + b; - } - - public double add(double a, double b) { - return a + b; - } - - public String add(String a, String b) { - return a + " " + b; - } -} -``` - -### Points to Remember - -- Overloaded methods must have different parameter lists (number or type of parameters). -- Overloaded methods can have different return types, but the return type alone is not sufficient to distinguish overloaded methods. -- Overloaded methods can have different access modifiers and throw different exceptions. - -## Recursion - -Recursion is a programming technique where a method calls itself to solve a problem. It is useful for problems that can be broken down into smaller, similar subproblems. - -### Syntax - -```java -returnType methodName(parameters) { - if (baseCondition) { - // base case to stop recursion - return baseResult; - } else { - // recursive case - return methodName(modifiedParameters); - } -} -``` - -### Example: Factorial Calculation - -```java -public class Main { - public static void main(String[] args) { - Main obj = new Main(); - int number = 5; - int result = obj.factorial(number); - System.out.println("Factorial of " + number + " is " + result); - } - - public int factorial(int n) { - if (n <= 1) { - return 1; - } else { - return n * factorial(n - 1); - } - } -} -``` - -### Example: Fibonacci Series - -```java -public class Main { - public static void main(String[] args) { - Main obj = new Main(); - int number = 10; - for (int i = 0; i < number; i++) { - System.out.print(obj.fibonacci(i) + " "); - } - } - - public int fibonacci(int n) { - if (n <= 1) { - return n; - } else { - return fibonacci(n - 1) + fibonacci(n - 2); - } - } -} -``` - -### Points to Remember - -- A recursive method must have a base case to terminate the recursion and prevent infinite loops. -- Recursive solutions are often more elegant but may be less efficient due to repeated calculations and function call overhead. -- Consider the stack depth and memory usage when using recursion, as deep recursion can lead to `StackOverflowError`. - -## Conclusion - -Method overloading and recursion are powerful concepts in Java that enhance the flexibility and functionality of your code. Method overloading allows you to define multiple methods with the same name but different parameters, improving code readability and reusability. Recursion enables you to solve complex problems by breaking them down into simpler subproblems, though it requires careful handling to ensure termination and efficiency. diff --git a/docs/java/methods-and-functions/method-parameters-and-return-values.md b/docs/java/methods-and-functions/method-parameters-and-return-values.md deleted file mode 100644 index fbb94df7a..000000000 --- a/docs/java/methods-and-functions/method-parameters-and-return-values.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -id: method-parameters-and-return-values -title: Method Parameters and Return Values -sidebar_label: Method Parameters and Return Values -sidebar_position: 2 -tags: [java, methods, functions, programming, java methods, java functions, method parameters, return values] -description: In this tutorial, we will learn about method parameters and return values in Java. We will learn about how to define methods with parameters and return values, how to call methods with arguments, and how to handle return values from methods in Java. ---- - - -## Method Example - -Here are a few examples to illustrate different types of methods: - -### Method with No Parameters and No Return Value - -```java -public void printHello() { - System.out.println("Hello, World!"); -} -``` - -### Method with Parameters and a Return Value - -```java -public int multiply(int x, int y) { - return x * y; -} -``` - -### Method with No Parameters but a Return Value - -```java -public String getGreeting() { - return "Hello, Java!"; -} -``` - -### Method with Multiple Parameters - -```java -public double calculateArea(double width, double height) { - return width * height; -} -``` - -## Calling Methods - -To call a method, use the method name followed by parentheses. If the method requires parameters, provide the appropriate arguments within the parentheses. - -### Example - -```java -public class Main { - public static void main(String[] args) { - Main obj = new Main(); - - // Calling a method with no parameters and no return value - obj.printHello(); - - // Calling a method with parameters and a return value - int result = obj.add(5, 3); - System.out.println("Sum: " + result); - - // Calling a method with no parameters but a return value - String greeting = obj.getGreeting(); - System.out.println(greeting); - - // Calling a method with multiple parameters - double area = obj.calculateArea(5.5, 4.0); - System.out.println("Area: " + area); - } - - public void printHello() { - System.out.println("Hello, World!"); - } - - public int add(int a, int b) { - return a + b; - } - - public String getGreeting() { - return "Hello, Java!"; - } - - public double calculateArea(double width, double height) { - return width * height; - } -} diff --git a/docs/java/multithreading-and-concurrency/_category_.json b/docs/java/multithreading-and-concurrency/_category_.json deleted file mode 100644 index 7104efd56..000000000 --- a/docs/java/multithreading-and-concurrency/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Multithreading and Concurrency in Java", - "position": 10, - "link": { - "type": "generated-index", - "description": "In this section, you'll learn about multithreading and concurrency in Java. You'll learn how to create and manage threads, synchronize threads, and handle exceptions in multithreaded programs. You'll also learn about the Java Concurrency API, which provides high-level concurrency features and utilities." - } -} \ No newline at end of file diff --git a/docs/java/multithreading-and-concurrency/introduction-to-multithreading.md b/docs/java/multithreading-and-concurrency/introduction-to-multithreading.md deleted file mode 100644 index ceb83c46b..000000000 --- a/docs/java/multithreading-and-concurrency/introduction-to-multithreading.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -id: introduction-to-multithreading -title: Introduction to Multithreading in Java -sidebar_label: Introduction to Multithreading -sidebar_position: 1 -tags: [java, multithreading, concurrency, programming, java multithreading] -description: In this tutorial, we will learn about multithreading in Java. We will learn about what multithreading is, why it is important, and how to create and manage threads in Java. ---- - -# Introduction to Multithreading in Java - -## Introduction - -Multithreading is a powerful feature in Java that allows concurrent execution of two or more threads, which can significantly enhance the performance of your applications; this capability is particularly beneficial when dealing with tasks that can be performed in parallel, such as handling multiple user requests in a server application or performing complex calculations in the background without freezing the user interface. - -## 1. Understanding Threads - -A thread, in the context of Java programming, is the smallest unit of a process that can be scheduled for execution; it shares the process resources, including memory and open files, but executes independently, which means multiple threads can exist within the same application, executing simultaneously and potentially interacting with one another. - -## 2. Creating Threads - -### Implementing the Runnable Interface - -One of the most common ways to create a thread in Java is by implementing the `Runnable` interface, which requires you to define the `run` method; this method contains the code that constitutes the new thread’s task. - -```java -public class MyRunnable implements Runnable { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - Thread thread = new Thread(new MyRunnable()); - thread.start(); - } -} -``` - -### Extending the Thread Class - -Alternatively, you can create a thread by extending the `Thread` class itself, which allows you to directly override the `run` method; however, this approach is less flexible compared to implementing `Runnable`, as Java does not support multiple inheritance. - -```java -public class MyThread extends Thread { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - MyThread thread = new MyThread(); - thread.start(); - } -} -``` - -## 3. Thread Lifecycle - -Understanding the lifecycle of a thread is crucial for effective multithreading; a thread in Java can be in one of several states, including `New`, `Runnable`, `Blocked`, `Waiting`, `Timed Waiting`, and `Terminated`. Each of these states represents a distinct phase in the thread’s execution process. - -### New - -When a thread is first created, it is in the `New` state, meaning it has been instantiated but not yet started. - -### Runnable - -Once the thread’s `start` method is called, it enters the `Runnable` state; it is now ready to run and is waiting for the thread scheduler to allocate CPU time. - -### Blocked - -A thread enters the `Blocked` state when it is waiting for a monitor lock to enter or re-enter a synchronized block or method. - -### Waiting - -A thread is in the `Waiting` state when it is waiting indefinitely for another thread to perform a particular action. - -### Timed Waiting - -This state is similar to `Waiting`, but it has a specified waiting time; for instance, a thread can enter this state when it calls `sleep` or `join` with a timeout. - -### Terminated - -After a thread has completed its execution, it enters the `Terminated` state; the thread has now finished running, and it cannot be restarted. - -## 4. Synchronization - -In a multithreaded environment, multiple threads can access shared resources, which can lead to inconsistent data if not managed properly; synchronization is the mechanism that ensures that only one thread can access a resource at a time, thereby preventing data corruption and ensuring thread safety. - -### Synchronized Methods - -You can synchronize a method by using the `synchronized` keyword; this ensures that only one thread can execute the method at a time on the same object. - -```java -public synchronized void synchronizedMethod() { - // critical section -} -``` - -### Synchronized Blocks - -For more fine-grained control, you can use synchronized blocks, which allow you to synchronize a specific section of code rather than the entire method. - -```java -public void method() { - synchronized(this) { - // critical section - } -} -``` - -## Conclusion - -Multithreading in Java is a complex yet incredibly powerful feature that allows for the concurrent execution of tasks, which can significantly improve the performance and responsiveness of your applications; understanding how to create, manage, and synchronize threads is essential for developing robust multithreaded applications. By leveraging the capabilities of multithreading, you can build applications that efficiently utilize system resources and provide a better user experience. diff --git a/docs/java/multithreading-and-concurrency/multithreading-best-practices.md b/docs/java/multithreading-and-concurrency/multithreading-best-practices.md deleted file mode 100644 index 4f28a5bce..000000000 --- a/docs/java/multithreading-and-concurrency/multithreading-best-practices.md +++ /dev/null @@ -1,278 +0,0 @@ ---- -id: multithreading-best-practices -title: Multithreading Best Practices in Java -sidebar_label: Multithreading Best Practices -sidebar_position: 7 -tags: [java, multithreading, concurrency, best practices] -description: In this tutorial, we will learn about multithreading best practices in Java. We will learn about some of the best practices to follow when working with multithreading and concurrency in Java. ---- - -# Multithreading Best Practices in Java - -## Introduction - -Multithreading can significantly improve the performance and responsiveness of Java applications. However, it also introduces complexity and potential issues such as race conditions, deadlocks, and thread safety problems. Following best practices helps in managing these complexities effectively. - -## 1. Use High-Level Concurrency Utilities - -### Leverage the `java.util.concurrent` Package - -Use high-level concurrency utilities provided in the `java.util.concurrent` package instead of manually managing threads. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ConcurrentExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -## 2. Avoid Synchronization If Possible - -### Use Immutable Objects - -Immutable objects are inherently thread-safe. Whenever possible, design your classes to be immutable. - -```java -public final class ImmutableClass { - private final int value; - - public ImmutableClass(int value) { - this.value = value; - } - - public int getValue() { - return value; - } -} -``` - -### Use Concurrent Collections - -Use thread-safe collections like `ConcurrentHashMap` instead of manually synchronizing standard collections. - -```java -import java.util.concurrent.ConcurrentHashMap; -import java.util.Map; - -public class ConcurrentCollectionExample { - private final Map concurrentMap = new ConcurrentHashMap<>(); - - public void increment(String key) { - concurrentMap.merge(key, 1, Integer::sum); - } -} -``` - -## 3. Minimize Locking Scope - -### Use Synchronized Blocks Instead of Methods - -Limit the scope of synchronized blocks to the smallest possible section of code. - -```java -public class Counter { - private int count = 0; - - public void increment() { - synchronized (this) { - count++; - } - } - - public int getCount() { - synchronized (this) { - return count; - } - } -} -``` - -### Use Read-Write Locks - -Read-write locks allow multiple threads to read simultaneously while maintaining exclusive access for write operations. - -```java -import java.util.concurrent.locks.ReentrantReadWriteLock; - -public class ReadWriteLockExample { - private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - private int value; - - public void writeValue(int value) { - lock.writeLock().lock(); - try { - this.value = value; - } finally { - lock.writeLock().unlock(); - } - } - - public int readValue() { - lock.readLock().lock(); - try { - return value; - } finally { - lock.readLock().unlock(); - } - } -} -``` - -## 4. Use Thread Pools - -### Prefer Executors Over Manual Thread Management - -Using an `ExecutorService` helps manage a pool of threads, reducing the overhead of thread creation and destruction. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -## 5. Handle Exceptions in Threads - -### Use UncaughtExceptionHandler - -Set an `UncaughtExceptionHandler` to handle exceptions that occur in threads. - -```java -public class ExceptionHandlingExample { - public static void main(String[] args) { - Thread thread = new Thread(() -> { - throw new RuntimeException("Exception in thread"); - }); - - thread.setUncaughtExceptionHandler((t, e) -> { - System.out.println("Caught exception: " + e.getMessage()); - }); - - thread.start(); - } -} -``` - -## 6. Avoid Deadlocks - -### Use Lock Ordering - -Ensure that locks are acquired and released in a consistent order to avoid deadlocks. - -```java -public class DeadlockAvoidance { - private final Object lock1 = new Object(); - private final Object lock2 = new Object(); - - public void method1() { - synchronized (lock1) { - synchronized (lock2) { - System.out.println("method1"); - } - } - } - - public void method2() { - synchronized (lock1) { - synchronized (lock2) { - System.out.println("method2"); - } - } - } -} -``` - -### Use Try-Lock - -Use `tryLock` to attempt acquiring a lock without blocking indefinitely. - -```java -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -public class TryLockExample { - private final Lock lock = new ReentrantLock(); - - public void performTask() { - if (lock.tryLock()) { - try { - System.out.println("Lock acquired, performing task"); - } finally { - lock.unlock(); - } - } else { - System.out.println("Could not acquire lock, task not performed"); - } - } -} -``` - -## 7. Ensure Thread Safety - -### Volatile Variables - -Use `volatile` for variables that are accessed by multiple threads to ensure visibility of changes. - -```java -public class VolatileExample { - private volatile boolean running = true; - - public void stop() { - running = false; - } - - public void run() { - while (running) { - // Perform task - } - } -} -``` - -### Atomic Variables - -Use atomic variables like `AtomicInteger` for thread-safe operations on single variables. - -```java -import java.util.concurrent.atomic.AtomicInteger; - -public class AtomicExample { - private final AtomicInteger count = new AtomicInteger(0); - - public void increment() { - count.incrementAndGet(); - } - - public int getCount() { - return count.get(); - } -} -``` - -## Conclusion - -Following these best practices can help you write efficient, safe, and maintainable multithreaded applications in Java. Leveraging high-level concurrency utilities, minimizing locking, and ensuring thread safety are crucial steps towards managing concurrency effectively. diff --git a/docs/java/multithreading-and-concurrency/multithreading-design-patterns.md b/docs/java/multithreading-and-concurrency/multithreading-design-patterns.md deleted file mode 100644 index 6d0fc44e2..000000000 --- a/docs/java/multithreading-and-concurrency/multithreading-design-patterns.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -id: multithreading-design-patterns -title: Multithreading Design Patterns in Java -sidebar_label: Multithreading Design Patterns -sidebar_position: 6 -tags: [java, multithreading, concurrency, design patterns] -description: In this tutorial, we will learn about multithreading design patterns in Java. We will learn about some of the common design patterns used in multithreading and concurrency in Java. ---- - -# Multithreading Design Patterns in Java - -## Introduction - -Multithreading design patterns provide structured solutions for handling concurrency in Java applications. These patterns help manage thread creation, synchronization, and communication, ensuring efficient and safe multithreaded program execution. - -## 1. Thread-Safe Singleton - -The Singleton pattern ensures that a class has only one instance and provides a global point of access to it. In a multithreaded environment, ensuring thread safety is crucial. - -### Double-Checked Locking - -This approach reduces the overhead of acquiring a lock by first checking the locking criterion without locking. - -```java -public class Singleton { - private static volatile Singleton instance; - - private Singleton() { } - - public static Singleton getInstance() { - if (instance == null) { - synchronized (Singleton.class) { - if (instance == null) { - instance = new Singleton(); - } - } - } - return instance; - } -} -``` - -## 2. Producer-Consumer Pattern - -The Producer-Consumer pattern separates the work of producing data from consuming it, using a shared buffer. - -### Using BlockingQueue - -`BlockingQueue` handles the synchronization between producers and consumers. - -```java -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -public class ProducerConsumerExample { - private static final int BUFFER_SIZE = 10; - private static final BlockingQueue buffer = new ArrayBlockingQueue<>(BUFFER_SIZE); - - public static void main(String[] args) { - Thread producer = new Thread(() -> { - try { - int value = 0; - while (true) { - buffer.put(value); - System.out.println("Produced: " + value); - value++; - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }); - - Thread consumer = new Thread(() -> { - try { - while (true) { - int value = buffer.take(); - System.out.println("Consumed: " + value); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }); - - producer.start(); - consumer.start(); - } -} -``` - -## 3. Future and Callable - -The Future and Callable pattern allows concurrent tasks to return a result and be managed asynchronously. - -### Using Callable and Future - -`Callable` represents a task that returns a result, while `Future` represents the result of an asynchronous computation. - -```java -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - -public class FutureCallableExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - Callable task = () -> { - int result = 0; - for (int i = 0; i < 10; i++) { - result += i; - } - return result; - }; - - Future future = executorService.submit(task); - - try { - Integer result = future.get(); - System.out.println("Result: " + result); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } finally { - executorService.shutdown(); - } - } -} -``` - -## 4. Read-Write Lock Pattern - -The Read-Write Lock pattern allows multiple threads to read a resource concurrently while ensuring exclusive access for write operations. - -### Using ReentrantReadWriteLock - -`ReentrantReadWriteLock` allows multiple readers or one writer at a time. - -```java -import java.util.concurrent.locks.ReentrantReadWriteLock; - -public class ReadWriteLockExample { - private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); - private static int sharedData = 0; - - public static void main(String[] args) { - Runnable readTask = () -> { - lock.readLock().lock(); - try { - System.out.println("Read: " + sharedData); - } finally { - lock.readLock().unlock(); - } - }; - - Runnable writeTask = () -> { - lock.writeLock().lock(); - try { - sharedData++; - System.out.println("Written: " + sharedData); - } finally { - lock.writeLock().unlock(); - } - }; - - Thread writer = new Thread(writeTask); - Thread reader1 = new Thread(readTask); - Thread reader2 = new Thread(readTask); - - writer.start(); - reader1.start(); - reader2.start(); - } -} -``` - -## 5. Thread Pool Pattern - -The Thread Pool pattern manages a pool of worker threads, assigning tasks to them instead of creating new threads for each task. - -### Using ExecutorService - -`ExecutorService` simplifies thread pool management. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -## 6. Balking Pattern - -The Balking pattern prevents an object from performing an action if it is in an inappropriate state. - -### Example of Balking Pattern - -```java -public class BalkingExample { - private boolean isRunning = false; - - public synchronized void start() { - if (isRunning) { - return; // Balking: exit method if already running - } - isRunning = true; - new Thread(this::run).start(); - } - - private void run() { - System.out.println("Task started"); - // Task execution logic here - } - - public static void main(String[] args) { - BalkingExample example = new BalkingExample(); - example.start(); - example.start(); // Second call will balk - } -} -``` - -## 7. Worker Thread Pattern - -The Worker Thread pattern assigns tasks to a fixed number of threads, allowing for reuse of thread resources. - -### Example of Worker Thread Pattern - -```java -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.LinkedBlockingQueue; - -public class WorkerThreadExample { - public static void main(String[] args) { - BlockingQueue taskQueue = new LinkedBlockingQueue<>(); - WorkerThread[] workers = new WorkerThread[3]; - - for (int i = 0; i < workers.length; i++) { - workers[i] = new WorkerThread(taskQueue); - workers[i].start(); - } - - for (int i = 0; i < 10; i++) { - taskQueue.add(() -> System.out.println("Task is running by " + Thread.currentThread().getName())); - } - } -} - -class WorkerThread extends Thread { - private BlockingQueue taskQueue; - - public WorkerThread(BlockingQueue taskQueue) { - this.taskQueue = taskQueue; - } - - @Override - public void run() { - while (true) { - try { - Runnable task = taskQueue.take(); - task.run(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - break; - } - } - } -} -``` - -## Conclusion - -Understanding and applying multithreading design patterns can greatly enhance the performance and reliability of your Java applications. By leveraging these patterns, you can manage concurrency more effectively and avoid common pitfalls associated with multithreading. diff --git a/docs/java/multithreading-and-concurrency/synchronization-and-concurrent-collections.md b/docs/java/multithreading-and-concurrency/synchronization-and-concurrent-collections.md deleted file mode 100644 index 35edbb35c..000000000 --- a/docs/java/multithreading-and-concurrency/synchronization-and-concurrent-collections.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -id: synchronization-and-concurrent-collections -title: Synchronization and Concurrent Collections in Java -sidebar_label: Synchronization and Concurrent Collections -sidebar_position: 3 -tags: [java, multithreading, concurrency, synchronization, concurrent collections] -description: In this tutorial, we will learn about synchronization and concurrent collections in Java. We will learn about how to synchronize threads and use concurrent collections in Java. ---- - -# Synchronization and Concurrent Collections in Java - -## Introduction - -In a multithreaded environment, multiple threads may try to access and modify shared resources concurrently, leading to inconsistent data and unpredictable behavior. Synchronization is a mechanism that ensures that only one thread can access a resource at a time, providing thread safety. Concurrent collections in Java provide a way to handle collections in a multithreaded environment without requiring explicit synchronization. - -## 1. Synchronization - -### Synchronized Methods - -Synchronized methods ensure that only one thread can execute a method at a time on the same object. This is achieved by using the `synchronized` keyword. - -```java -public class Counter { - private int count = 0; - - public synchronized void increment() { - count++; - } - - public synchronized int getCount() { - return count; - } -} -``` - -### Synchronized Blocks - -Synchronized blocks provide more fine-grained control over synchronization. You can synchronize only a specific block of code rather than the entire method. - -```java -public class Counter { - private int count = 0; - - public void increment() { - synchronized (this) { - count++; - } - } - - public int getCount() { - synchronized (this) { - return count; - } - } -} -``` - -### Reentrant Lock - -The `ReentrantLock` class provides an alternative to using synchronized methods and blocks. It offers more flexibility, such as the ability to try acquiring the lock without blocking. - -```java -import java.util.concurrent.locks.ReentrantLock; - -public class Counter { - private int count = 0; - private ReentrantLock lock = new ReentrantLock(); - - public void increment() { - lock.lock(); - try { - count++; - } finally { - lock.unlock(); - } - } - - public int getCount() { - lock.lock(); - try { - return count; - } finally { - lock.unlock(); - } - } -} -``` - -## 2. Concurrent Collections - -Java provides several concurrent collection classes that are designed for use in multithreaded environments. These classes handle synchronization internally, making them safer and easier to use than manually synchronized collections. - -### ConcurrentHashMap - -`ConcurrentHashMap` is a thread-safe implementation of `HashMap`. It allows concurrent read and write operations without locking the entire map. - -```java -import java.util.concurrent.ConcurrentHashMap; - -public class ConcurrentHashMapExample { - public static void main(String[] args) { - ConcurrentHashMap map = new ConcurrentHashMap<>(); - - map.put("A", 1); - map.put("B", 2); - - System.out.println(map.get("A")); - } -} -``` - -### CopyOnWriteArrayList - -`CopyOnWriteArrayList` is a thread-safe variant of `ArrayList` where all mutative operations (add, set, etc.) are implemented by making a fresh copy of the underlying array. - -```java -import java.util.concurrent.CopyOnWriteArrayList; - -public class CopyOnWriteArrayListExample { - public static void main(String[] args) { - CopyOnWriteArrayList list = new CopyOnWriteArrayList<>(); - - list.add("A"); - list.add("B"); - - for (String item : list) { - System.out.println(item); - } - } -} -``` - -### BlockingQueue - -`BlockingQueue` is a thread-safe queue that supports operations that wait for the queue to become non-empty when retrieving an element and wait for space to become available in the queue when storing an element. - -```java -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -public class BlockingQueueExample { - public static void main(String[] args) throws InterruptedException { - BlockingQueue queue = new ArrayBlockingQueue<>(10); - - queue.put("A"); - System.out.println(queue.take()); - } -} -``` - -## Conclusion - -Synchronization and concurrent collections are essential tools for developing thread-safe Java applications. Synchronization ensures that only one thread can access a resource at a time, preventing data inconsistency and race conditions. Concurrent collections, on the other hand, provide built-in thread safety for common data structures, making it easier to develop concurrent applications without the need for explicit synchronization. - -Understanding how to use these tools effectively will help you build robust and efficient multithreaded applications in Java. diff --git a/docs/java/multithreading-and-concurrency/thread-class-and-runnable-interface.md b/docs/java/multithreading-and-concurrency/thread-class-and-runnable-interface.md deleted file mode 100644 index e88916883..000000000 --- a/docs/java/multithreading-and-concurrency/thread-class-and-runnable-interface.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -id: thread-class-and-runnable-interface -title: Thread Class and Runnable Interface in Java -sidebar_label: Thread Class and Runnable Interface -sidebar_position: 2 -tags: [java, multithreading, concurrency, thread class, runnable interface] -description: In this tutorial, we will learn about the Thread class and Runnable interface in Java. We will learn about how to create and manage threads using the Thread class and Runnable interface in Java. ---- - -# Thread Class and Runnable Interface in Java - -## Introduction - -Multithreading is a feature that allows concurrent execution of two or more parts of a program. Threads are the smallest unit of processing that can be scheduled by an operating system. In Java, you can create and manage threads using either the `Thread` class or the `Runnable` interface. - -## 1. The Thread Class - -### Creating a Thread by Extending the Thread Class - -To create a thread by extending the `Thread` class, you need to create a new class that extends `Thread` and override its `run` method. The `run` method is where the code for the thread's task is placed. - -```java -public class MyThread extends Thread { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - MyThread thread = new MyThread(); - thread.start(); // Start the thread - } -} -``` - -### Key Methods in the Thread Class - -- `start()`: Starts the execution of the thread; the JVM calls the `run` method of this thread. -- `run()`: Contains the code that constitutes the new thread's task. -- `sleep(long millis)`: Causes the currently executing thread to sleep for the specified number of milliseconds. -- `join()`: Waits for this thread to die. -- `interrupt()`: Interrupts the thread. - -## 2. The Runnable Interface - -### Creating a Thread by Implementing the Runnable Interface - -To create a thread by implementing the `Runnable` interface, you need to create a new class that implements `Runnable` and provide an implementation of the `run` method. You then create a `Thread` object, passing the `Runnable` object to its constructor, and call the `start` method on the `Thread` object. - -```java -public class MyRunnable implements Runnable { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - MyRunnable myRunnable = new MyRunnable(); - Thread thread = new Thread(myRunnable); - thread.start(); // Start the thread - } -} -``` - -### Benefits of Using Runnable - -- **Flexibility**: Your class can extend another class while still implementing `Runnable`. -- **Separation of Concerns**: By implementing `Runnable`, you separate the task from the thread management, which can lead to cleaner and more modular code. - -## 3. Comparing Thread Class and Runnable Interface - -### Thread Class - -- **Inheritance**: Since Java does not support multiple inheritance, extending the `Thread` class means your class cannot extend any other class. -- **Convenience**: Slightly more convenient if you don't need to extend any other class, as you don't need to pass a `Runnable` to a `Thread`. - -### Runnable Interface - -- **Flexibility**: Allows your class to extend another class while still implementing `Runnable`. -- **Reusability**: You can pass the same `Runnable` instance to multiple `Thread` objects. - -### Example of Multiple Threads with Runnable - -```java -public class MyRunnable implements Runnable { - private String threadName; - - MyRunnable(String name) { - this.threadName = name; - } - - @Override - public void run() { - for (int i = 0; i < 5; i++) { - System.out.println(threadName + " running " + i); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - System.out.println("Thread interrupted"); - } - } - System.out.println(threadName + " finished"); - } - - public static void main(String[] args) { - Thread thread1 = new Thread(new MyRunnable("Thread 1")); - Thread thread2 = new Thread(new MyRunnable("Thread 2")); - - thread1.start(); - thread2.start(); - } -} -``` - -## Conclusion - -Both the `Thread` class and the `Runnable` interface provide ways to create and manage threads in Java. Choosing between the two depends on your specific needs and design preferences. Implementing the `Runnable` interface is often preferred for its flexibility and cleaner separation of concerns, while extending the `Thread` class can be more convenient when inheritance is not an issue. diff --git a/docs/java/multithreading-and-concurrency/thread-pools-and-executors.md b/docs/java/multithreading-and-concurrency/thread-pools-and-executors.md deleted file mode 100644 index aa058b496..000000000 --- a/docs/java/multithreading-and-concurrency/thread-pools-and-executors.md +++ /dev/null @@ -1,188 +0,0 @@ ---- -id: thread-pools-and-executors -title: Thread Pools and Executors in Java -sidebar_label: Thread Pools and Executors -sidebar_position: 5 -tags: [java, multithreading, concurrency, thread pools, executors] -description: In this tutorial, we will learn about thread pools and executors in Java. We will learn about how to create and manage thread pools using executors in Java. ---- - -# Thread Pools and Executors in Java - -## Introduction - -In Java, thread pools and executors are part of the `java.util.concurrent` package, providing a high-level framework for managing a pool of threads. This allows efficient execution of multiple tasks concurrently without the overhead of creating new threads for each task. Using thread pools improves performance and resource management in concurrent applications. - -## 1. Thread Pools - -A thread pool is a collection of reusable threads that can be used to execute multiple tasks. Instead of creating a new thread for each task, a thread pool reuses existing threads, reducing the overhead associated with thread creation and destruction. - -### Benefits of Using Thread Pools - -- **Resource Management**: Limits the number of active threads, preventing resource exhaustion. -- **Performance**: Reduces the overhead of creating and destroying threads. -- **Scalability**: Efficiently handles a large number of tasks. - -## 2. Executors - -The `Executor` framework in Java provides a higher-level replacement for working directly with threads. It provides various implementations for managing thread pools. - -### Creating a Simple Executor - -The `Executor` interface provides a simple way to execute tasks asynchronously. - -```java -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -public class SimpleExecutorExample { - public static void main(String[] args) { - Executor executor = Executors.newSingleThreadExecutor(); - executor.execute(() -> System.out.println("Task is running")); - } -} -``` - -### ExecutorService - -`ExecutorService` extends `Executor` and provides methods for managing the lifecycle of tasks and the executor itself. - -### Fixed Thread Pool - -Creates a thread pool with a fixed number of threads. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class FixedThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -### Cached Thread Pool - -Creates a thread pool that creates new threads as needed, but will reuse previously constructed threads when they are available. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class CachedThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -### Scheduled Thread Pool - -Creates a thread pool that can schedule commands to run after a given delay, or to execute periodically. - -```java -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -public class ScheduledThreadPoolExample { - public static void main(String[] args) { - ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); - - scheduledExecutorService.schedule(() -> { - System.out.println("Task executed after 3 seconds"); - }, 3, TimeUnit.SECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> { - System.out.println("Periodic task executed every 2 seconds"); - }, 1, 2, TimeUnit.SECONDS); - - // Use this line to gracefully shutdown after a delay for demonstration purposes - scheduledExecutorService.schedule(() -> scheduledExecutorService.shutdown(), 10, TimeUnit.SECONDS); - } -} -``` - -## 3. Managing ExecutorService Lifecycle - -### Shutting Down an ExecutorService - -Properly shutting down an `ExecutorService` is crucial to ensure all tasks are completed and resources are released. - -- **shutdown()**: Initiates an orderly shutdown in which previously submitted tasks are executed, but no new tasks will be accepted. -- **shutdownNow()**: Attempts to stop all actively executing tasks and halts the processing of waiting tasks. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ExecutorServiceShutdownExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); // Initiates an orderly shutdown - // executorService.shutdownNow(); // Attempts to stop all executing tasks immediately - } -} -``` - -### Awaiting Termination - -You can wait for the executor service to complete its tasks before proceeding. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -public class ExecutorServiceAwaitTerminationExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - - try { - if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { - executorService.shutdownNow(); - } - } catch (InterruptedException e) { - executorService.shutdownNow(); - } - } -} -``` - -## Conclusion - -Thread pools and executors provide an efficient way to manage and execute multiple tasks concurrently in Java. They offer better resource management, improved performance, and scalability. By leveraging the `Executor` framework and various types of thread pools, you can build robust and high-performing multithreaded applications. - -You can add this content to your Markdown file in Visual Studio Code by following the same steps as before. \ No newline at end of file diff --git a/docs/java/multithreading-and-concurrency/working-with-threads-and-executors.md b/docs/java/multithreading-and-concurrency/working-with-threads-and-executors.md deleted file mode 100644 index d03972bd9..000000000 --- a/docs/java/multithreading-and-concurrency/working-with-threads-and-executors.md +++ /dev/null @@ -1,253 +0,0 @@ ---- -id: working-with-threads-and-executors -title: Working with Threads and Executors in Java -sidebar_label: Working with Threads and Executors -sidebar_position: 4 -tags: [java, multithreading, concurrency, threads, executors] -description: In this tutorial, we will learn about working with threads and executors in Java. We will learn about how to create and manage threads using executors in Java. ---- - -# Working with Threads and Executors in Java - -## Introduction - -Managing multiple threads efficiently is crucial for building high-performance and responsive applications. Java provides powerful tools like threads and executors to handle concurrent tasks. This guide covers how to create and manage threads, use executors for better resource management, and handle thread synchronization. - -## 1. Creating and Managing Threads - -### Extending the Thread Class - -Creating a thread by extending the `Thread` class involves overriding its `run` method. - -```java -public class MyThread extends Thread { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - MyThread thread = new MyThread(); - thread.start(); - } -} -``` - -### Implementing the Runnable Interface - -Implementing the `Runnable` interface provides more flexibility, as your class can extend another class. - -```java -public class MyRunnable implements Runnable { - @Override - public void run() { - System.out.println("Thread is running"); - } - - public static void main(String[] args) { - Thread thread = new Thread(new MyRunnable()); - thread.start(); - } -} -``` - -## 2. Synchronization - -### Synchronized Methods - -To prevent thread interference and memory consistency errors, use synchronized methods. - -```java -public class Counter { - private int count = 0; - - public synchronized void increment() { - count++; - } - - public synchronized int getCount() { - return count; - } -} -``` - -### Synchronized Blocks - -For finer control, use synchronized blocks within methods. - -```java -public class Counter { - private int count = 0; - - public void increment() { - synchronized (this) { - count++; - } - } - - public int getCount() { - synchronized (this) { - return count; - } - } -} -``` - -## 3. Executors - -The `Executor` framework simplifies thread management by providing a higher-level API for managing a pool of threads. - -### Creating a Simple Executor - -Use the `Executor` interface to run tasks asynchronously. - -```java -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - -public class SimpleExecutorExample { - public static void main(String[] args) { - Executor executor = Executors.newSingleThreadExecutor(); - executor.execute(() -> System.out.println("Task is running")); - } -} -``` - -### ExecutorService - -`ExecutorService` extends `Executor` with methods for managing the lifecycle of both the tasks and the executor. - -### Fixed Thread Pool - -A fixed thread pool is useful for running a fixed number of threads. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class FixedThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -### Cached Thread Pool - -A cached thread pool creates new threads as needed but reuses previously constructed threads when available. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class CachedThreadPoolExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newCachedThreadPool(); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - } -} -``` - -### Scheduled Thread Pool - -A scheduled thread pool can schedule commands to run after a given delay or periodically. - -```java -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -public class ScheduledThreadPoolExample { - public static void main(String[] args) { - ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); - - scheduledExecutorService.schedule(() -> { - System.out.println("Task executed after 3 seconds"); - }, 3, TimeUnit.SECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> { - System.out.println("Periodic task executed every 2 seconds"); - }, 1, 2, TimeUnit.SECONDS); - - // Use this line to gracefully shutdown after a delay for demonstration purposes - scheduledExecutorService.schedule(() -> scheduledExecutorService.shutdown(), 10, TimeUnit.SECONDS); - } -} -``` - -## 4. Managing ExecutorService Lifecycle - -### Shutting Down an ExecutorService - -Shut down the `ExecutorService` to stop accepting new tasks and gracefully terminate existing tasks. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class ExecutorServiceShutdownExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - // executorService.shutdownNow(); // Attempts to stop all executing tasks immediately - } -} -``` - -### Awaiting Termination - -Wait for the `ExecutorService` to complete its tasks before proceeding. - -```java -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -public class ExecutorServiceAwaitTerminationExample { - public static void main(String[] args) { - ExecutorService executorService = Executors.newFixedThreadPool(3); - - for (int i = 0; i < 10; i++) { - executorService.execute(() -> { - System.out.println("Task is running by " + Thread.currentThread().getName()); - }); - } - - executorService.shutdown(); - - try { - if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { - executorService.shutdownNow(); - } - } catch (InterruptedException e) { - executorService.shutdownNow(); - } - } -} -``` - -## Conclusion - -Using threads and executors efficiently allows you to manage concurrent tasks and improve the performance of your Java applications. By leveraging the `Executor` framework and proper synchronization techniques, you can build robust, scalable, and high-performing multithreaded applications. diff --git a/docs/java/networking-in-java/_category_.json b/docs/java/networking-in-java/_category_.json deleted file mode 100644 index 72d3b3ae6..000000000 --- a/docs/java/networking-in-java/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Networking and I/O in Java", - "position": 11, - "link": { - "type": "generated-index", - "description": "In this section, you'll learn how to use Java to interact with the network and the file system. You'll learn how to use Java's networking classes to create sockets and connect to servers, and how to use Java's I/O classes to read and write files." - } -} \ No newline at end of file diff --git a/docs/java/networking-in-java/client-server-communication.md b/docs/java/networking-in-java/client-server-communication.md deleted file mode 100644 index 9f3215e78..000000000 --- a/docs/java/networking-in-java/client-server-communication.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -id: client-server-communication -title: Client-Server Communication in Java -sidebar_label: Client-Server Communication -sidebar_position: 1 -tags: [java, networking, client-server, communication] -description: In this tutorial, we will learn about client-server communication in Java. We will learn about how to create a client-server application in Java using sockets and streams. ---- - -# Client-Server Communication in Java - -## Introduction - -Client-server communication is a foundational concept in network programming, where clients request services and servers provide them. Java provides robust libraries to facilitate this communication using sockets. - -## 1. Basic Concepts - -### Client-Server Architecture - -In client-server architecture, the client initiates communication and requests a service, while the server processes the request and sends a response. - -### Sockets - -A socket is an endpoint for communication between two machines. Java's `java.net` package provides the `Socket` class for client-side communication and the `ServerSocket` class for server-side communication. - -## 2. Creating a Simple Server - -### Server Code - -The server listens for incoming connections on a specified port. - -```java -import java.io.IOException; -import java.io.OutputStream; -import java.net.ServerSocket; -import java.net.Socket; - -public class SimpleServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - System.out.println("New client connected"); - OutputStream output = socket.getOutputStream(); - output.write("Hello, Client!".getBytes()); - socket.close(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 3. Creating a Simple Client - -### Client Code - -The client connects to the server using the server's IP address and port. - -```java -import java.io.IOException; -import java.io.InputStream; -import java.net.Socket; - -public class SimpleClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (Socket socket = new Socket(hostname, port)) { - InputStream input = socket.getInputStream(); - byte[] buffer = new byte[1024]; - int bytesRead = input.read(buffer); - System.out.println("Server response: " + new String(buffer, 0, bytesRead)); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 4. Handling Multiple Clients - -### Multithreaded Server - -To handle multiple clients concurrently, use a thread for each client connection. - -```java -import java.io.IOException; -import java.io.OutputStream; -import java.net.ServerSocket; -import java.net.Socket; - -public class MultithreadedServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - System.out.println("New client connected"); - new ServerThread(socket).start(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} - -class ServerThread extends Thread { - private Socket socket; - - public ServerThread(Socket socket) { - this.socket = socket; - } - - public void run() { - try { - OutputStream output = socket.getOutputStream(); - output.write("Hello, Client!".getBytes()); - socket.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 5. Using Data Streams - -### Server with Data Streams - -Use `DataInputStream` and `DataOutputStream` for reading and writing data in a more structured way. - -```java -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -public class DataStreamServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - new DataStreamServerThread(socket).start(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} - -class DataStreamServerThread extends Thread { - private Socket socket; - - public DataStreamServerThread(Socket socket) { - this.socket = socket; - } - - public void run() { - try (DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - DataInputStream input = new DataInputStream(socket.getInputStream())) { - - String message = input.readUTF(); - System.out.println("Received: " + message); - output.writeUTF("Hello, Client! Received your message: " + message); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Client with Data Streams - -```java -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; - -public class DataStreamClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (Socket socket = new Socket(hostname, port); - DataOutputStream output = new DataOutputStream(socket.getOutputStream()); - DataInputStream input = new DataInputStream(socket.getInputStream())) { - - output.writeUTF("Hello, Server!"); - String response = input.readUTF(); - System.out.println("Server response: " + response); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 6. Using Object Streams - -### Server with Object Streams - -Object streams allow you to send and receive Java objects. - -```java -import java.io.*; -import java.net.ServerSocket; -import java.net.Socket; - -public class ObjectStreamServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - new ObjectStreamServerThread(socket).start(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} - -class ObjectStreamServerThread extends Thread { - private Socket socket; - - public ObjectStreamServerThread(Socket socket) { - this.socket = socket; - } - - public void run() { - try (ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream input = new ObjectInputStream(socket.getInputStream())) { - - String message = (String) input.readObject(); - System.out.println("Received: " + message); - output.writeObject("Hello, Client! Received your message: " + message); - } catch (IOException | ClassNotFoundException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Client with Object Streams - -```java -import java.io.*; -import java.net.Socket; - -public class ObjectStreamClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (Socket socket = new Socket(hostname, port); - ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream input = new ObjectInputStream(socket.getInputStream())) { - - output.writeObject("Hello, Server!"); - String response = (String) input.readObject(); - System.out.println("Server response: " + response); - } catch (IOException | ClassNotFoundException ex) { - ex.printStackTrace(); - } - } -} -``` - -## Conclusion - -Client-server communication in Java can be efficiently managed using sockets. By following these examples, you can create simple or complex client-server applications that handle multiple clients, use data streams for structured communication, and even transfer Java objects. Understanding these fundamental concepts and best practices will help you build robust and scalable networked applications. diff --git a/docs/java/networking-in-java/networking-best-practices.md b/docs/java/networking-in-java/networking-best-practices.md deleted file mode 100644 index d609c96c5..000000000 --- a/docs/java/networking-in-java/networking-best-practices.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: networking-best-practices -title: Networking Best Practices in Java -sidebar_label: Networking Best Practices -sidebar_position: 6 -tags: [java, networking, best practices] -description: In this tutorial, we will learn about networking best practices in Java. We will learn about some of the best practices to follow when working with networking in Java. ---- - -## Networking Best Practices - -### 1. Use Asynchronous Operations - - Utilize asynchronous operations, such as non-blocking I/O or asynchronous APIs, to prevent blocking the main thread and improve the responsiveness of your application. - -### 2. Proper Resource Management - - Ensure proper management of network resources, such as sockets, streams, and connections, by closing them when they are no longer needed. Use try-with-resources or finally blocks to ensure resources are released even in the event of exceptions. - -### 3. Thread Safety - - Ensure thread safety when working with shared network resources. Use synchronization mechanisms or thread-safe data structures to prevent race conditions and data corruption. - -### 4. Configure Timeouts - - Configure appropriate timeouts for network operations to prevent your application from hanging indefinitely if a network request/response takes too long. Set reasonable connection, read, and write timeouts based on your application's requirements. - -### 5. Handle Errors Gracefully - - Implement robust error handling mechanisms to handle network-related exceptions gracefully. Provide meaningful error messages to users and log detailed error information for troubleshooting purposes. - -### 6. Use Secure Protocols - - When transmitting sensitive data over the network, use secure protocols such as HTTPS (for HTTP communication) or SSL/TLS (for other protocols) to encrypt data and protect it from interception or tampering. - -### 7. Monitor Network Traffic - - Monitor network traffic and performance metrics to identify potential bottlenecks or issues in your network infrastructure. Use network monitoring tools to track network usage, latency, and error rates. - -### 8. Implement Retry Logic - - Implement retry logic for network operations to handle transient failures, such as network timeouts or temporary connectivity issues. Use exponential backoff algorithms to gradually increase the delay between retries and prevent overwhelming the server with repeated requests. - -### 9. Validate Input - - Validate input data received from the network to prevent security vulnerabilities such as injection attacks or buffer overflows. Sanitize user input and use input validation mechanisms to ensure data integrity and security. - -### 10. Follow Protocol Specifications - - Adhere to the specifications and standards of the protocols you are using for network communication. Ensure your application complies with the protocol's requirements and recommendations to ensure interoperability and compatibility with other systems. - -By following these best practices, you can develop robust, secure, and reliable networked applications in Java. \ No newline at end of file diff --git a/docs/java/networking-in-java/socket-programming-and-url-connections.md b/docs/java/networking-in-java/socket-programming-and-url-connections.md deleted file mode 100644 index 6b55e85db..000000000 --- a/docs/java/networking-in-java/socket-programming-and-url-connections.md +++ /dev/null @@ -1,262 +0,0 @@ ---- -id: socket-programming-and-url-connections -title: Socket Programming and URL Connections in Java -sidebar_label: Socket Programming and URL Connections -sidebar_position: 2 -tags: [java, networking, socket programming, url connections] -description: In this tutorial, we will learn about socket programming and URL connections in Java. We will learn about how to create client-server applications using sockets and how to work with URL connections in Java. ---- - -# Socket Programming and URL Connections in Java - -## Introduction - -Socket programming and URL connections are fundamental for network communication in Java. Sockets allow for low-level communication between devices over a network, while URL connections provide higher-level access to resources on the web. - -## 1. Socket Programming - -### What is a Socket? - -A socket is an endpoint for communication between two machines. Java's `java.net` package provides the `Socket` class for client-side communication and the `ServerSocket` class for server-side communication. - -### Creating a Simple Server - -The server listens for incoming connections on a specified port. - -```java -import java.io.IOException; -import java.io.OutputStream; -import java.net.ServerSocket; -import java.net.Socket; - -public class SimpleServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - System.out.println("New client connected"); - OutputStream output = socket.getOutputStream(); - output.write("Hello, Client!".getBytes()); - socket.close(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Creating a Simple Client - -The client connects to the server using the server's IP address and port. - -```java -import java.io.IOException; -import java.io.InputStream; -import java.net.Socket; - -public class SimpleClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (Socket socket = new Socket(hostname, port)) { - InputStream input = socket.getInputStream(); - byte[] buffer = new byte[1024]; - int bytesRead = input.read(buffer); - System.out.println("Server response: " + new String(buffer, 0, bytesRead)); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Handling Multiple Clients - -To handle multiple clients concurrently, use a thread for each client connection. - -```java -import java.io.IOException; -import java.io.OutputStream; -import java.net.ServerSocket; -import java.net.Socket; - -public class MultithreadedServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - while (true) { - Socket socket = serverSocket.accept(); - System.out.println("New client connected"); - new ServerThread(socket).start(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} - -class ServerThread extends Thread { - private Socket socket; - - public ServerThread(Socket socket) { - this.socket = socket; - } - - public void run() { - try { - OutputStream output = socket.getOutputStream(); - output.write("Hello, Client!".getBytes()); - socket.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 2. URL Connections - -### What is a URL Connection? - -A URL connection provides communication links to resources on the web. Java's `java.net` package includes the `URLConnection` class for accessing the attributes of a resource and `HttpURLConnection` for HTTP-specific features. - -### Creating a Simple URL Connection - -The following example demonstrates how to create a simple URL connection to read data from a web page. - -```java -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; - -public class SimpleURLConnection { - public static void main(String[] args) { - String urlString = "http://www.example.com"; - try { - URL url = new URL(urlString); - URLConnection urlConnection = url.openConnection(); - BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); - String inputLine; - while ((inputLine = in.readLine()) != null) { - System.out.println(inputLine); - } - in.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Using HttpURLConnection - -`HttpURLConnection` provides additional functionality for HTTP requests such as setting request methods (GET, POST, etc.), reading response headers, and handling redirects. - -```java -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; - -public class HttpURLConnectionExample { - public static void main(String[] args) { - String urlString = "http://www.example.com"; - try { - URL url = new URL(urlString); - HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); - httpConn.setRequestMethod("GET"); - - int responseCode = httpConn.getResponseCode(); - System.out.println("Response Code: " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); - String inputLine; - StringBuffer response = new StringBuffer(); - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - in.close(); - - System.out.println(response.toString()); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Sending a POST Request - -The following example demonstrates how to send a POST request using `HttpURLConnection`. - -```java -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; - -public class HttpPostExample { - public static void main(String[] args) { - String urlString = "http://www.example.com/login"; - String urlParameters = "username=user&password=pass"; - try { - URL url = new URL(urlString); - HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); - httpConn.setRequestMethod("POST"); - httpConn.setDoOutput(true); - - OutputStream os = httpConn.getOutputStream(); - os.write(urlParameters.getBytes()); - os.flush(); - os.close(); - - int responseCode = httpConn.getResponseCode(); - System.out.println("Response Code: " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream())); - String inputLine; - StringBuffer response = new StringBuffer(); - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - in.close(); - - System.out.println(response.toString()); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 3. Best Practices - -### Use High-Level Libraries - -For complex HTTP operations, consider using higher-level libraries such as Apache HttpClient or OkHttp. - -### Handle Exceptions Gracefully - -Network operations are prone to various exceptions. Ensure that your application handles these gracefully and provides useful error messages to the user. - -### Clean Up Resources - -Always close streams and connections in a `finally` block or use try-with-resources to ensure resources are cleaned up properly. - -### Use Secure Connections - -When dealing with sensitive data, always use HTTPS instead of HTTP to ensure data encryption. - -## Conclusion - -Java provides robust support for both low-level socket programming and higher-level URL connections. By understanding and utilizing these features, you can build powerful and efficient networked applications. Following best practices will help you manage resources and ensure secure, reliable communication. diff --git a/docs/java/networking-in-java/working-with-http-and-https.md b/docs/java/networking-in-java/working-with-http-and-https.md deleted file mode 100644 index d02229e1b..000000000 --- a/docs/java/networking-in-java/working-with-http-and-https.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -id: working-with-http-and-https -title: Working with HTTP and HTTPS in Java -sidebar_label: Working with HTTP and HTTPS -sidebar_position: 4 -tags: [java, networking, http, https] -description: In this tutorial, we will learn about working with HTTP and HTTPS in Java. We will learn about how to make HTTP and HTTPS requests in Java using the `HttpURLConnection` class. ---- - -# Working with HTTP and HTTPS in Java - -## Introduction - -HTTP (Hypertext Transfer Protocol) and HTTPS (HTTP Secure) are protocols used for communication between clients and servers over the internet. Java provides powerful libraries for making HTTP requests and handling responses. - -## 1. Making HTTP Requests - -### Using HttpURLConnection - -`HttpURLConnection` is a built-in Java class for sending HTTP requests and receiving responses. - -```java -import java.io.*; -import java.net.*; - -public class HttpExample { - public static void main(String[] args) { - String urlString = "http://www.example.com"; - try { - URL url = new URL(urlString); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - - int responseCode = connection.getResponseCode(); - System.out.println("Response Code: " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String inputLine; - StringBuffer response = new StringBuffer(); - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - in.close(); - - System.out.println("Response: " + response.toString()); - connection.disconnect(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Using HttpClient (Apache HttpClient Library) - -Apache HttpClient is a popular library for making HTTP requests and handling responses. Add the HttpClient dependency to your project's `pom.xml` file: - -```xml - - org.apache.httpcomponents - httpclient - 4.5.13 - -``` - -Then, you can use HttpClient to make requests: - -```java -import org.apache.http.client.methods.*; -import org.apache.http.impl.client.*; - -public class HttpClientExample { - public static void main(String[] args) { - String urlString = "http://www.example.com"; - try (CloseableHttpClient client = HttpClients.createDefault()) { - HttpGet request = new HttpGet(urlString); - CloseableHttpResponse response = client.execute(request); - - System.out.println("Response Code: " + response.getStatusLine().getStatusCode()); - - BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String inputLine; - StringBuffer responseBody = new StringBuffer(); - while ((inputLine = reader.readLine()) != null) { - responseBody.append(inputLine); - } - reader.close(); - - System.out.println("Response: " + responseBody.toString()); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 2. Making HTTPS Requests - -### Using HttpsURLConnection - -For HTTPS requests, use `HttpsURLConnection`, which is a subclass of `HttpURLConnection`. - -```java -import javax.net.ssl.*; -import java.io.*; -import java.net.*; - -public class HttpsExample { - public static void main(String[] args) { - String urlString = "https://www.example.com"; - try { - URL url = new URL(urlString); - HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - - int responseCode = connection.getResponseCode(); - System.out.println("Response Code: " + responseCode); - - BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); - String inputLine; - StringBuffer response = new StringBuffer(); - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); - } - in.close(); - - System.out.println("Response: " + response.toString()); - connection.disconnect(); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Using HttpClient with SSLContext - -Apache HttpClient can also be used for making HTTPS requests by configuring an `SSLContext`. - -```java -import org.apache.http.client.methods.*; -import org.apache.http.conn.ssl.*; -import org.apache.http.impl.client.*; - -public class HttpsClientExample { - public static void main(String[] args) { - String urlString = "https://www.example.com"; - try { - SSLContext sslContext = SSLContexts.custom() - .loadTrustMaterial(null, new TrustSelfSignedStrategy()) - .build(); - CloseableHttpClient client = HttpClients.custom() - .setSSLContext(sslContext) - .build(); - - HttpGet request = new HttpGet(urlString); - CloseableHttpResponse response = client.execute(request); - - System.out.println("Response Code: " + response.getStatusLine().getStatusCode()); - - BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); - String inputLine; - StringBuffer responseBody = new StringBuffer(); - while ((inputLine = reader.readLine()) != null) { - responseBody.append(inputLine); - } - reader.close(); - - System.out.println("Response: " + responseBody.toString()); - } catch (IOException | NoSuchAlgorithmException | KeyStoreException | KeyManagementException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 3. Best Practices - -### Handle Exceptions - -HTTP operations can throw various exceptions such as `IOException`, `SSLHandshakeException`, etc. Handle these exceptions gracefully to provide useful error messages to users. - -### Use Connection Pooling - -For frequent HTTP requests, use connection pooling to reduce the overhead of creating and closing connections. - -### Use Asynchronous Requests - -For improved performance, consider using asynchronous HTTP clients to handle multiple requests concurrently. - -### Secure HTTPS Connections - -When dealing with sensitive data, always use HTTPS to ensure secure communication over the internet. - -## Conclusion - -Java provides powerful libraries for making HTTP and HTTPS requests, allowing developers to communicate with web servers easily. Understanding how to use these libraries effectively will enable you to build robust and secure networked applications. Following best practices will help you manage resources efficiently and ensure reliable communication. - - -You can add this content to your Markdown file in Visual Studio Code by following the same steps as before. \ No newline at end of file diff --git a/docs/java/networking-in-java/working-with-tcp-and-udp.md b/docs/java/networking-in-java/working-with-tcp-and-udp.md deleted file mode 100644 index 18da94e4a..000000000 --- a/docs/java/networking-in-java/working-with-tcp-and-udp.md +++ /dev/null @@ -1,189 +0,0 @@ ---- -id: working-with-tcp-and-udp -title: Working with TCP and UDP in Java -sidebar_label: Working with TCP and UDP -sidebar_position: 3 -tags: [java, networking, tcp, udp] -description: In this tutorial, we will learn about working with TCP and UDP in Java. We will learn about how to create TCP and UDP clients and servers in Java using sockets and datagrams. ---- - -# Working with TCP and UDP in Java - -## Introduction - -Java provides robust support for both TCP (Transmission Control Protocol) and UDP (User Datagram Protocol) through the `java.net` package. TCP is a connection-oriented protocol that ensures reliable data transmission, while UDP is a connectionless protocol that allows for faster, albeit less reliable, communication. - -## 1. TCP (Transmission Control Protocol) - -### What is TCP? - -TCP is a connection-oriented protocol that provides reliable, ordered, and error-checked delivery of data between applications. It is widely used for applications that require guaranteed delivery, such as web servers and email. - -### Creating a TCP Server - -A TCP server listens for incoming connections on a specified port and establishes a connection with clients. - -```java -import java.io.*; -import java.net.*; - -public class TCPServer { - public static void main(String[] args) { - int port = 12345; - try (ServerSocket serverSocket = new ServerSocket(port)) { - System.out.println("Server is listening on port " + port); - - while (true) { - Socket socket = serverSocket.accept(); - System.out.println("New client connected"); - - new ServerThread(socket).start(); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} - -class ServerThread extends Thread { - private Socket socket; - - public ServerThread(Socket socket) { - this.socket = socket; - } - - public void run() { - try (InputStream input = socket.getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(input)); - OutputStream output = socket.getOutputStream(); - PrintWriter writer = new PrintWriter(output, true)) { - - String message; - while ((message = reader.readLine()) != null) { - System.out.println("Received: " + message); - writer.println("Server response: " + message); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Creating a TCP Client - -A TCP client connects to the server using the server's IP address and port. - -```java -import java.io.*; -import java.net.*; - -public class TCPClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (Socket socket = new Socket(hostname, port); - OutputStream output = socket.getOutputStream(); - PrintWriter writer = new PrintWriter(output, true); - InputStream input = socket.getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(input))) { - - writer.println("Hello, Server"); - String response = reader.readLine(); - System.out.println(response); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 2. UDP (User Datagram Protocol) - -### What is UDP? - -UDP is a connectionless protocol that allows for quick transmission of data without establishing a connection. It is suitable for applications that can tolerate some data loss but require fast communication, such as video streaming and online gaming. - -### Creating a UDP Server - -A UDP server listens for incoming datagrams on a specified port. - -```java -import java.net.*; - -public class UDPServer { - public static void main(String[] args) { - int port = 12345; - try (DatagramSocket socket = new DatagramSocket(port)) { - System.out.println("Server is listening on port " + port); - - byte[] buffer = new byte[1024]; - while (true) { - DatagramPacket packet = new DatagramPacket(buffer, buffer.length); - socket.receive(packet); - - String received = new String(packet.getData(), 0, packet.getLength()); - System.out.println("Received: " + received); - - String response = "Server response: " + received; - byte[] responseBytes = response.getBytes(); - DatagramPacket responsePacket = new DatagramPacket(responseBytes, responseBytes.length, packet.getAddress(), packet.getPort()); - socket.send(responsePacket); - } - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -### Creating a UDP Client - -A UDP client sends datagrams to the server. - -```java -import java.net.*; - -public class UDPClient { - public static void main(String[] args) { - String hostname = "localhost"; - int port = 12345; - try (DatagramSocket socket = new DatagramSocket()) { - String message = "Hello, Server"; - byte[] buffer = message.getBytes(); - - InetAddress address = InetAddress.getByName(hostname); - DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port); - socket.send(packet); - - byte[] responseBuffer = new byte[1024]; - DatagramPacket responsePacket = new DatagramPacket(responseBuffer, responseBuffer.length); - socket.receive(responsePacket); - - String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); - System.out.println("Server response: " + response); - } catch (IOException ex) { - ex.printStackTrace(); - } - } -} -``` - -## 3. Best Practices - -### TCP Best Practices - -- **Use Buffered Streams:** For better performance, wrap input and output streams in buffered streams. -- **Graceful Shutdown:** Ensure both client and server close their sockets properly to free up resources. -- **Handle Exceptions:** Network operations can throw various exceptions; handle them appropriately. -- **Thread Safety:** If handling multiple clients, ensure thread safety by using synchronization or concurrent collections. - -### UDP Best Practices - -- **Handle Packet Loss:** Since UDP does not guarantee delivery, design your application to handle potential packet loss. -- **Use Small Packets:** Keep packets small to reduce the chance of fragmentation and loss. -- **Handle Out-of-Order Packets:** UDP does not guarantee packet order, so implement logic to reorder packets if necessary. - -## Conclusion - -Java provides powerful libraries for TCP and UDP communication, allowing for both reliable and fast network communication. Understanding how to implement and use these protocols effectively will enable you to build robust networked applications. Following best practices will help you manage resources efficiently and ensure reliable communication. diff --git a/docs/java/networking-in-java/working-with-web-sockets.md b/docs/java/networking-in-java/working-with-web-sockets.md deleted file mode 100644 index 06892d691..000000000 --- a/docs/java/networking-in-java/working-with-web-sockets.md +++ /dev/null @@ -1,176 +0,0 @@ ---- -id: working-with-web-sockets -title: Working with Web Sockets in Java -sidebar_label: Working with Web Sockets -sidebar_position: 5 -tags: [java, networking, web sockets] -description: In this tutorial, we will learn about working with web sockets in Java. We will learn about how to create a web socket client and server in Java using the `WebSocket` API. ---- - -# Working with Websockets in Java - -## Introduction - -Websockets provide a full-duplex communication channel over a single, long-lived connection between a client and a server. Java provides libraries for implementing both websocket clients and servers. - -## 1. Websocket Server - -### Using Tyrus (Reference Implementation for JSR 356) - -Tyrus is the reference implementation for JSR 356, the Java API for websocket. You can create a websocket server using Tyrus. - -1. Add Tyrus dependency to your `pom.xml`: - - ```xml - - org.glassfish.tyrus - tyrus-server - 1.17 - - ``` - -2. Implement a websocket endpoint: - - ```java - import javax.websocket.*; - import javax.websocket.server.*; - - @ServerEndpoint("/websocket") - public class MyWebSocketServer { - - @OnOpen - public void onOpen(Session session) { - System.out.println("Client connected"); - } - - @OnMessage - public String onMessage(String message) { - System.out.println("Received message: " + message); - return "Server received: " + message; - } - - @OnClose - public void onClose(Session session) { - System.out.println("Connection closed"); - } - } - ``` - -### Using Spring Framework - -Spring Framework provides support for building websocket servers with the `WebSocketHandler` interface. - -1. Add Spring Websocket dependency to your `pom.xml`: - - ```xml - - org.springframework.boot - spring-boot-starter-websocket - - ``` - -2. Implement a WebSocketHandler: - - ```java - import org.springframework.web.socket.*; - import org.springframework.web.socket.handler.TextWebSocketHandler; - - public class MyWebSocketHandler extends TextWebSocketHandler { - - @Override - public void afterConnectionEstablished(WebSocketSession session) throws Exception { - System.out.println("Connection established"); - } - - @Override - protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { - System.out.println("Received message: " + message.getPayload()); - session.sendMessage(new TextMessage("Server received: " + message.getPayload())); - } - } - ``` - -## 2. Websocket Client - -### Using Tyrus - -You can create a websocket client using Tyrus. - -1. Add Tyrus dependency to your `pom.xml` (same as server): - -2. Implement a websocket client: - - ```java - import javax.websocket.*; - import java.net.URI; - - @ClientEndpoint - public class MyWebSocketClient { - - @OnOpen - public void onOpen(Session session) { - System.out.println("Connected to server"); - session.getAsyncRemote().sendText("Hello, Server"); - } - - @OnMessage - public void onMessage(String message) { - System.out.println("Received message from server: " + message); - } - - @OnClose - public void onClose(Session session) { - System.out.println("Connection closed"); - } - - public static void main(String[] args) { - String uri = "ws://localhost:8080/websocket"; - WebSocketContainer container = ContainerProvider.getWebSocketContainer(); - try { - container.connectToServer(MyWebSocketClient.class, URI.create(uri)); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - } - ``` - -### Using Spring Framework - -1. Add Spring Websocket dependency to your `pom.xml` (same as server): - -2. Implement a WebSocketHandler: - - ```java - import org.springframework.web.socket.*; - import org.springframework.web.socket.handler.TextWebSocketHandler; - - public class MyWebSocketHandler extends TextWebSocketHandler { - - @Override - public void afterConnectionEstablished(WebSocketSession session) throws Exception { - System.out.println("Connected to server"); - session.sendMessage(new TextMessage("Hello, Server")); - } - - @Override - protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { - System.out.println("Received message from server: " + message.getPayload()); - } - - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { - System.out.println("Connection closed"); - } - } - ``` - -## 3. Best Practices - -- **Keep Messages Lightweight:** Minimize the size of messages exchanged over the websocket connection to improve performance. -- **Handle Errors Gracefully:** Implement error handling mechanisms to deal with connection failures, timeouts, and other issues. -- **Use Secure Websockets (WSS):** For secure communication, use WSS (Websockets over HTTPS) instead of WS. - -## Conclusion - -Websockets provide a powerful mechanism for real-time communication between clients and servers. In Java, you can implement websocket servers and clients using libraries like Tyrus and Spring Websocket. Understanding how to use these libraries effectively will enable you to build robust and scalable websocket-based applications. diff --git a/docs/java/object-oriented-programming/_category_.json b/docs/java/object-oriented-programming/_category_.json deleted file mode 100644 index eb9b88705..000000000 --- a/docs/java/object-oriented-programming/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Object Oriented Programming in Java", - "position": 7, - "link": { - "type": "generated-index", - "description": "In this section, you will learn about the Object Oriented Programming concepts in Java. These concepts are the main building blocks of Java programming language." - } - } \ No newline at end of file diff --git a/docs/java/object-oriented-programming/classes-and-objects.md b/docs/java/object-oriented-programming/classes-and-objects.md deleted file mode 100644 index 52822024c..000000000 --- a/docs/java/object-oriented-programming/classes-and-objects.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -id: classes-and-objects -title: Classes and Objects in Java -sidebar_label: Classes and Objects -sidebar_position: 1 -tags: [java, classes, objects, programming, java classes, java objects] -description: In this tutorial, we will learn about classes and objects in Java. We will learn about what classes and objects are, how to define classes, how to create objects of a class, and how to access and use objects in Java. ---- - -# Classes and Objects in Java - -## Introduction - -Classes and objects are fundamental concepts in Java's object-oriented programming (OOP) paradigm. A class serves as a blueprint for creating objects, encapsulating data for the object, and methods to manipulate that data. - -## Defining a Class - -### Syntax - -```java -class ClassName { - // Fields (variables) - dataType fieldName; - - // Constructor - public ClassName(parameters) { - // Initialization code - } - - // Methods - returnType methodName(parameters) { - // Method code - } -} -``` - -### Example - -```java -public class Person { - // Fields - private String name; - private int age; - - // Constructor - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - // Getter for name - public String getName() { - return name; - } - - // Setter for name - public void setName(String name) { - this.name = name; - } - - // Getter for age - public int getAge() { - return age; - } - - // Setter for age - public void setAge(int age) { - this.age = age; - } - - // Method to display person details - public void display() { - System.out.println("Name: " + name + ", Age: " + age); - } -} -``` - -## Creating Objects - -### Syntax - -```java -ClassName objectName = new ClassName(parameters); -``` - -### Example - -```java -public class Main { - public static void main(String[] args) { - // Creating an object of the Person class - Person person1 = new Person("Alice", 30); - - // Accessing object methods - person1.display(); - - // Modifying object properties - person1.setName("Alice Smith"); - person1.setAge(31); - - // Displaying modified details - person1.display(); - } -} -``` - -## Constructors - -A constructor is a special method that is called when an object is instantiated. It is used to initialize the object. - -### Example - -```java -public class Person { - private String name; - private int age; - - // No-argument constructor - public Person() { - this.name = "Unknown"; - this.age = 0; - } - - // Parameterized constructor - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - // Other methods... -} -``` - -## Methods - -Methods define the behavior of objects created from a class. They can be used to perform operations on the object's data. - -### Example - -```java -public class Calculator { - // Method to add two numbers - public int add(int a, int b) { - return a + b; - } - - // Method to subtract two numbers - public int subtract(int a, int b) { - return a - b; - } - - // Method to multiply two numbers - public int multiply(int a, int b) { - return a * b; - } - - // Method to divide two numbers - public double divide(int a, int b) { - if (b == 0) { - throw new IllegalArgumentException("Division by zero is not allowed."); - } - return (double) a / b; - } -} -``` - -## Access Modifiers - -Access modifiers define the visibility of classes, methods, and variables. The most common access modifiers are: - -- `public`: The member is accessible from any other class. -- `private`: The member is accessible only within its own class. -- `protected`: The member is accessible within its own package and by subclasses. -- `default` (no modifier): The member is accessible only within its own package. - -### Example - -```java -public class Example { - public int publicField; - private int privateField; - protected int protectedField; - int defaultField; // Default access - - public void publicMethod() {} - private void privateMethod() {} - protected void protectedMethod() {} - void defaultMethod() {} // Default access -} -``` - -## Conclusion - -Understanding classes and objects is crucial for mastering Java's object-oriented programming. By defining classes, creating objects, and using methods and constructors, you can build robust and modular applications. diff --git a/docs/java/object-oriented-programming/custom-exceptions-in-java.md b/docs/java/object-oriented-programming/custom-exceptions-in-java.md deleted file mode 100644 index 81fd39eb2..000000000 --- a/docs/java/object-oriented-programming/custom-exceptions-in-java.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -id: custom-exceptions-in-java -title: Custom Exceptions in Java -sidebar_label: Custom Exceptions -sidebar_position: 5 -tags: [java, exceptions, programming, custom-exceptions, java exceptions] -description: In this tutorial, you will learn how to create and use custom exceptions in Java. We will learn how to define custom exception classes, throw exceptions, and handle exceptions in Java programs. ---- - -# Custom Exceptions in Java - -## Introduction - -Custom exceptions in Java allow you to create your own exception classes to handle specific error conditions in a more meaningful way. By creating custom exceptions, you can provide more informative error messages and handle specific scenarios that are unique to your application. - -## Creating Custom Exceptions - -### Steps to Create a Custom Exception - -1. **Extend the Exception class or one of its subclasses**: Most commonly, you extend `Exception` for checked exceptions or `RuntimeException` for unchecked exceptions. -2. **Provide constructors**: Include constructors that take a message, a cause, or both, as parameters. - -### Example: Creating a Custom Checked Exception - -#### Definition - -```java -public class InvalidAgeException extends Exception { - // Default constructor - public InvalidAgeException() { - super(); - } - - // Constructor that accepts a message - public InvalidAgeException(String message) { - super(message); - } - - // Constructor that accepts a message and a cause - public InvalidAgeException(String message, Throwable cause) { - super(message, cause); - } - - // Constructor that accepts a cause - public InvalidAgeException(Throwable cause) { - super(cause); - } -} -``` - -#### Usage - -```java -public class Person { - private int age; - - public void setAge(int age) throws InvalidAgeException { - if (age < 0 || age > 150) { - throw new InvalidAgeException("Age must be between 0 and 150."); - } - this.age = age; - } -} - -public class Main { - public static void main(String[] args) { - Person person = new Person(); - try { - person.setAge(200); - } catch (InvalidAgeException e) { - System.out.println("Caught exception: " + e.getMessage()); - } - } -} -``` - -### Example: Creating a Custom Unchecked Exception - -#### Definition - -```java -public class InvalidParameterException extends RuntimeException { - // Default constructor - public InvalidParameterException() { - super(); - } - - // Constructor that accepts a message - public InvalidParameterException(String message) { - super(message); - } - - // Constructor that accepts a message and a cause - public InvalidParameterException(String message, Throwable cause) { - super(message, cause); - } - - // Constructor that accepts a cause - public InvalidParameterException(Throwable cause) { - super(cause); - } -} -``` - -#### Usage - -```java -public class Calculator { - public int divide(int numerator, int denominator) { - if (denominator == 0) { - throw new InvalidParameterException("Denominator cannot be zero."); - } - return numerator / denominator; - } -} - -public class Main { - public static void main(String[] args) { - Calculator calculator = new Calculator(); - try { - int result = calculator.divide(10, 0); - } catch (InvalidParameterException e) { - System.out.println("Caught exception: " + e.getMessage()); - } - } -} -``` - -## Best Practices for Custom Exceptions - -- **Inherit from the appropriate base exception class**: Use `Exception` for checked exceptions and `RuntimeException` for unchecked exceptions. -- **Provide multiple constructors**: Include constructors that take messages and causes to provide more context. -- **Use meaningful exception names**: The name of the exception class should clearly indicate the error condition it represents. -- **Document the exception**: Provide Javadoc comments to explain when and why the custom exception should be used. - -### Example with Documentation - -```java -/** - * Thrown to indicate that the age provided is invalid. - */ -public class InvalidAgeException extends Exception { - /** - * Constructs a new exception with {@code null} as its detail message. - */ - public InvalidAgeException() { - super(); - } - - /** - * Constructs a new exception with the specified detail message. - * - * @param message the detail message - */ - public InvalidAgeException(String message) { - super(message); - } - - /** - * Constructs a new exception with the specified detail message and cause. - * - * @param message the detail message - * @param cause the cause of the exception - */ - public InvalidAgeException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Constructs a new exception with the specified cause. - * - * @param cause the cause of the exception - */ - public InvalidAgeException(Throwable cause) { - super(cause); - } -} -``` - -## Conclusion - -Custom exceptions in Java provide a powerful mechanism for handling application-specific error conditions. By creating and using custom exceptions, you can make your error handling code more robust, readable, and maintainable. Ensure that you follow best practices when defining and using custom exceptions to maximize their effectiveness. diff --git a/docs/java/object-oriented-programming/design-patterns-in-java.md b/docs/java/object-oriented-programming/design-patterns-in-java.md deleted file mode 100644 index 62826b66e..000000000 --- a/docs/java/object-oriented-programming/design-patterns-in-java.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -id: design-patterns-in-java -title: Design Patterns in Java -sidebar_label: Design Patterns in Java -sidebar_position: 6 -tags: [java, design patterns, programming, java design patterns] -description: In this tutorial, we will learn about design patterns in Java. We will learn about what design patterns are, why they are important, and some common design patterns used in Java programming. ---- - -# Design Patterns in Java - -## Introduction - -Design patterns are proven solutions to common software design problems. They provide a template for how to solve a problem in various contexts. Understanding and using design patterns can help you write more robust, maintainable, and scalable code. - -## Types of Design Patterns - -Design patterns can be broadly classified into three categories: -1. **Creational Patterns**: Deal with object creation mechanisms. -2. **Structural Patterns**: Deal with object composition and structure. -3. **Behavioral Patterns**: Deal with object interaction and responsibility distribution. - -## Creational Patterns - -### Singleton Pattern - -Ensures a class has only one instance and provides a global point of access to it. - -#### Example - -```java -public class Singleton { - private static Singleton instance; - - private Singleton() { - // Private constructor to prevent instantiation - } - - public static Singleton getInstance() { - if (instance == null) { - instance = new Singleton(); - } - return instance; - } -} -``` - -### Factory Pattern - -Defines an interface for creating an object, but lets subclasses alter the type of objects that will be created. - -#### Example - -```java -public interface Shape { - void draw(); -} - -public class Circle implements Shape { - @Override - public void draw() { - System.out.println("Drawing Circle"); - } -} - -public class Rectangle implements Shape { - @Override - public void draw() { - System.out.println("Drawing Rectangle"); - } -} - -public class ShapeFactory { - public Shape getShape(String shapeType) { - if (shapeType == null) { - return null; - } - if (shapeType.equalsIgnoreCase("CIRCLE")) { - return new Circle(); - } else if (shapeType.equalsIgnoreCase("RECTANGLE")) { - return new Rectangle(); - } - return null; - } -} - -// Usage -public class Main { - public static void main(String[] args) { - ShapeFactory shapeFactory = new ShapeFactory(); - - Shape shape1 = shapeFactory.getShape("CIRCLE"); - shape1.draw(); - - Shape shape2 = shapeFactory.getShape("RECTANGLE"); - shape2.draw(); - } -} -``` - -## Structural Patterns - -### Adapter Pattern - -Allows incompatible interfaces to work together by wrapping an existing class with a new interface. - -#### Example - -```java -public interface MediaPlayer { - void play(String audioType, String fileName); -} - -public class AudioPlayer implements MediaPlayer { - @Override - public void play(String audioType, String fileName) { - if (audioType.equalsIgnoreCase("mp3")) { - System.out.println("Playing mp3 file: " + fileName); - } else { - System.out.println("Invalid media. " + audioType + " format not supported"); - } - } -} - -public interface AdvancedMediaPlayer { - void playVlc(String fileName); - void playMp4(String fileName); -} - -public class VlcPlayer implements AdvancedMediaPlayer { - @Override - public void playVlc(String fileName) { - System.out.println("Playing vlc file: " + fileName); - } - - @Override - public void playMp4(String fileName) { - // Do nothing - } -} - -public class Mp4Player implements AdvancedMediaPlayer { - @Override - public void playVlc(String fileName) { - // Do nothing - } - - @Override - public void playMp4(String fileName) { - System.out.println("Playing mp4 file: " + fileName); - } -} - -public class MediaAdapter implements MediaPlayer { - AdvancedMediaPlayer advancedMusicPlayer; - - public MediaAdapter(String audioType) { - if (audioType.equalsIgnoreCase("vlc")) { - advancedMusicPlayer = new VlcPlayer(); - } else if (audioType.equalsIgnoreCase("mp4")) { - advancedMusicPlayer = new Mp4Player(); - } - } - - @Override - public void play(String audioType, String fileName) { - if (audioType.equalsIgnoreCase("vlc")) { - advancedMusicPlayer.playVlc(fileName); - } else if (audioType.equalsIgnoreCase("mp4")) { - advancedMusicPlayer.playMp4(fileName); - } - } -} - -// Usage -public class Main { - public static void main(String[] args) { - AudioPlayer audioPlayer = new AudioPlayer(); - - audioPlayer.play("mp3", "song.mp3"); - audioPlayer.play("mp4", "video.mp4"); - audioPlayer.play("vlc", "movie.vlc"); - audioPlayer.play("avi", "clip.avi"); - } -} -``` - -## Behavioral Patterns - -### Observer Pattern - -Defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. - -#### Example - -```java -import java.util.ArrayList; -import java.util.List; - -public interface Observer { - void update(String message); -} - -public class ConcreteObserver implements Observer { - private String name; - - public ConcreteObserver(String name) { - this.name = name; - } - - @Override - public void update(String message) { - System.out.println(name + " received message: " + message); - } -} - -public interface Subject { - void registerObserver(Observer observer); - void removeObserver(Observer observer); - void notifyObservers(); -} - -public class ConcreteSubject implements Subject { - private List observers = new ArrayList<>(); - private String message; - - @Override - public void registerObserver(Observer observer) { - observers.add(observer); - } - - @Override - public void removeObserver(Observer observer) { - observers.remove(observer); - } - - @Override - public void notifyObservers() { - for (Observer observer : observers) { - observer.update(message); - } - } - - public void setMessage(String message) { - this.message = message; - notifyObservers(); - } -} - -// Usage -public class Main { - public static void main(String[] args) { - ConcreteSubject subject = new ConcreteSubject(); - - Observer observer1 = new ConcreteObserver("Observer 1"); - Observer observer2 = new ConcreteObserver("Observer 2"); - - subject.registerObserver(observer1); - subject.registerObserver(observer2); - - subject.setMessage("Hello, Observers!"); - - subject.removeObserver(observer1); - - subject.setMessage("Hello again!"); - } -} -``` - -## Conclusion - -Design patterns are essential for building efficient, reusable, and maintainable object-oriented software. By understanding and applying these patterns, you can solve common design problems and improve your code quality. The SOLID principles, combined with a good grasp of design patterns, will greatly enhance your ability to design robust Java applications. diff --git a/docs/java/object-oriented-programming/encapsulation-and-abstraction.md b/docs/java/object-oriented-programming/encapsulation-and-abstraction.md deleted file mode 100644 index 9cc87dffe..000000000 --- a/docs/java/object-oriented-programming/encapsulation-and-abstraction.md +++ /dev/null @@ -1,163 +0,0 @@ ---- -id: encapsulation-and-abstraction -title: Encapsulation and Abstraction in Java -sidebar_label: Encapsulation and Abstraction -sidebar_position: 3 -tags: [java, object-oriented-programming, encapsulation, abstraction] -description: In this tutorial, we will learn about encapsulation and abstraction in Java. We will learn about what encapsulation and abstraction are, how to use encapsulation to protect data, and how to use abstraction to hide implementation details in Java. ---- - -# Encapsulation and Abstraction in Java - -## Introduction - -Encapsulation and abstraction are two fundamental principles of object-oriented programming (OOP) in Java. Encapsulation involves bundling data and methods that operate on the data within a single unit, usually a class, and restricting access to some of the object's components. Abstraction, on the other hand, involves hiding the complex implementation details and showing only the essential features of the object. - -## Encapsulation - -### Definition - -Encapsulation is the mechanism of wrapping the data (variables) and code (methods) together as a single unit. In encapsulation, the variables of a class are hidden from other classes and can be accessed only through the methods of their current class. This is also known as data hiding. - -### Benefits - -- Improves maintainability and flexibility. -- Enhances data security by restricting direct access to data fields. -- Facilitates easier unit testing. - -### Implementation - -To achieve encapsulation in Java: -1. Declare the variables of a class as `private`. -2. Provide `public` setter and getter methods to modify and view the variables' values. - -### Example - -```java -public class Person { - // Private fields - private String name; - private int age; - - // Public getter for name - public String getName() { - return name; - } - - // Public setter for name - public void setName(String name) { - this.name = name; - } - - // Public getter for age - public int getAge() { - return age; - } - - // Public setter for age - public void setAge(int age) { - if (age > 0) { // Validation logic - this.age = age; - } - } -} - -public class Main { - public static void main(String[] args) { - Person person = new Person(); - person.setName("Alice"); - person.setAge(30); - - System.out.println("Name: " + person.getName()); - System.out.println("Age: " + person.getAge()); - } -} -``` - -## Abstraction - -### Definition - -Abstraction is the process of hiding the implementation details and showing only the functionality to the user. It helps in reducing programming complexity and effort by allowing the programmer to focus on what the object does instead of how it does it. - -### Benefits - -- Reduces complexity by hiding unnecessary details. -- Improves code readability and maintainability. -- Enhances security by restricting access to implementation details. - -### Implementation - -Abstraction in Java can be achieved using: -1. Abstract classes -2. Interfaces - -### Abstract Classes - -An abstract class is a class that cannot be instantiated. It is declared with the `abstract` keyword and can contain abstract methods (methods without a body) and concrete methods (methods with a body). - -#### Example - -```java -abstract class Animal { - // Abstract method (does not have a body) - public abstract void makeSound(); - - // Regular method - public void sleep() { - System.out.println("Sleeping..."); - } -} - -class Dog extends Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -public class Main { - public static void main(String[] args) { - Dog dog = new Dog(); - dog.makeSound(); // Outputs: Woof - dog.sleep(); // Outputs: Sleeping... - } -} -``` - -### Interfaces - -An interface in Java is a reference type, similar to a class, that can contain only constants, method signatures, default methods, static methods, and nested types. Interfaces cannot contain instance fields or constructors. Interfaces provide a way to achieve abstraction and multiple inheritance. - -#### Example - -```java -interface Animal { - void makeSound(); - void eat(); -} - -class Dog implements Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } - - @Override - public void eat() { - System.out.println("Eating..."); - } -} - -public class Main { - public static void main(String[] args) { - Dog dog = new Dog(); - dog.makeSound(); // Outputs: Woof - dog.eat(); // Outputs: Eating... - } -} -``` - -## Conclusion - -Encapsulation and abstraction are key principles of object-oriented programming that enhance code organization, readability, and maintainability. Encapsulation ensures that the internal representation of an object is hidden from the outside, while abstraction focuses on exposing only the necessary aspects of an object. Understanding these concepts is essential for writing effective and efficient Java programs. diff --git a/docs/java/object-oriented-programming/inheritance-and-polymorphism.md b/docs/java/object-oriented-programming/inheritance-and-polymorphism.md deleted file mode 100644 index aaa0dc45f..000000000 --- a/docs/java/object-oriented-programming/inheritance-and-polymorphism.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -id: inheritance-and-polymorphism -title: Inheritance and Polymorphism in Java -sidebar_label: Inheritance and Polymorphism -sidebar_position: 2 -tags: [java, object-oriented-programming, inheritance, polymorphism, programming, java inheritance, java polymorphism] -description: In this tutorial, we will learn about inheritance and polymorphism in Java. We will learn about how to create subclasses and superclasses, how to use inheritance to reuse code, and how to use polymorphism to create flexible and extensible code in Java. ---- - -# Inheritance and Polymorphism in Java - -## Introduction - -Inheritance and polymorphism are key concepts in Java's object-oriented programming (OOP) paradigm. Inheritance allows a class to inherit properties and methods from another class, while polymorphism enables objects to be treated as instances of their parent class rather than their actual class. - -## Inheritance - -### Definition - -Inheritance is a mechanism where one class (subclass or derived class) inherits the properties and behaviors (fields and methods) of another class (superclass or base class). - -### Syntax - -```java -class SubclassName extends SuperclassName { - // Additional fields and methods -} -``` - -### Example - -```java -// Superclass -public class Animal { - protected String name; - - public Animal(String name) { - this.name = name; - } - - public void makeSound() { - System.out.println("Some generic animal sound"); - } - - public void displayInfo() { - System.out.println("Name: " + name); - } -} - -// Subclass -public class Dog extends Animal { - - public Dog(String name) { - super(name); // Call the constructor of the superclass - } - - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -// Main class -public class Main { - public static void main(String[] args) { - Dog dog = new Dog("Buddy"); - dog.displayInfo(); // Inherited method - dog.makeSound(); // Overridden method - } -} -``` - -### Access Modifiers in Inheritance - -- `public`: Accessible everywhere. -- `protected`: Accessible in the same package and subclasses. -- `private`: Not accessible in subclasses. -- `default` (no modifier): Accessible only in the same package. - -## Polymorphism - -### Definition - -Polymorphism means "many forms" and it allows one interface to be used for a general class of actions. The specific action is determined by the exact nature of the situation. There are two types of polymorphism in Java: compile-time (method overloading) and runtime (method overriding). - -### Method Overloading (Compile-Time Polymorphism) - -Method overloading allows a class to have more than one method with the same name, but different parameters. - -#### Example - -```java -public class MathOperations { - // Overloaded method for adding two integers - public int add(int a, int b) { - return a + b; - } - - // Overloaded method for adding three integers - public int add(int a, int b, int c) { - return a + b + c; - } - - // Overloaded method for adding two double values - public double add(double a, double b) { - return a + b; - } -} -``` - -## Key Rules of Method Overloading -Remember these rules when overloading a method: - -The overloaded and overloading methods must be in the same class (Note: this includes any methods inherited, even implicitly, from a superclass). -The method parameters must change: either the number or the type of parameters must be different in the two methods. -The return type can be freely modified. -The access modifier (public, private, and so on) can be freely modified. -Thrown exceptions, if any, can be freely modified. - - -### Method Overriding (Runtime Polymorphism) - -Method overriding allows a subclass to provide a specific implementation of a method already defined in its superclass. - -#### Example - -```java -public class Animal { - public void makeSound() { - System.out.println("Some generic animal sound"); - } -} - -public class Dog extends Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -public class Cat extends Animal { - @Override - public void makeSound() { - System.out.println("Meow"); - } -} - -public class Main { - public static void main(String[] args) { - Animal myDog = new Dog(); - Animal myCat = new Cat(); - - myDog.makeSound(); // Outputs: Woof - myCat.makeSound(); // Outputs: Meow - } -} -``` -## Key Rules of Method Overriding -Remember these rules when overriding a method: - -The parameter list must not change: the overriding method must take the same number and type of parameters as the overridden method – otherwise, you would just be overloading the method. -The return type must not change (Note: if the method returns an object, a subclass of that object is allowed as the return type). -The access modifier must be either the same or a less restrictive one (for example, if the overridden method is protected, you can declare the overriding method as public, but not private). -Thrown checked exceptions, if any, can be removed or reduced by the overriding method. This means that the overriding method can throw the same checked exception as the overridden method, or a subclass of that checked exception, but not a broader exception. This restriction does not apply to unchecked exceptions. - -### Dynamic Method Dispatch - -Dynamic method dispatch is a mechanism by which a call to an overridden method is resolved at runtime rather than compile-time. It is the foundation of runtime polymorphism in Java. - -#### Example - -```java -public class Main { - public static void main(String[] args) { - Animal myAnimal; // Declare a reference variable of type Animal - - myAnimal = new Dog(); // myAnimal refers to a Dog object - myAnimal.makeSound(); // Outputs: Woof - - myAnimal = new Cat(); // myAnimal refers to a Cat object - myAnimal.makeSound(); // Outputs: Meow - } -} -``` - - - -## Conclusion - -Inheritance and polymorphism are powerful features of Java that enable code reusability and flexibility. Inheritance allows classes to inherit properties and methods from other classes, while polymorphism allows methods to behave differently based on the object that is invoking them. Understanding these concepts is essential for effective Java programming. diff --git a/docs/java/object-oriented-programming/interfaces-and-abstract-classes.md b/docs/java/object-oriented-programming/interfaces-and-abstract-classes.md deleted file mode 100644 index ead4316f3..000000000 --- a/docs/java/object-oriented-programming/interfaces-and-abstract-classes.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -id: interfaces-and-abstract-classes -title: Interfaces and Abstract Classes in Java -sidebar_label: Interfaces and Abstract Classes -sidebar_position: 8 -tags: [java, interfaces, abstract-classes, programming, java interfaces, java abstract classes] -description: In this tutorial, we will learn about interfaces and abstract classes in Java. We will learn about what interfaces and abstract classes are, how they are used, and the differences between them. ---- - -# Interfaces and Abstract Classes in Java - -## Introduction - -Interfaces and abstract classes are two fundamental concepts in Java that are used to achieve abstraction. Both are used to define abstract types that can be implemented or extended by concrete classes, but they serve different purposes and have different characteristics. - -## Abstract Classes - -### Definition - -An abstract class in Java is a class that cannot be instantiated on its own and is meant to be subclassed. It can contain abstract methods (methods without a body) as well as concrete methods (methods with a body). - -### Characteristics - -- Can have abstract and non-abstract methods. -- Can have instance variables. -- Can have constructors. -- Can extend only one class. -- Can implement multiple interfaces. - -### Example - -```java -abstract class Animal { - // Abstract method (does not have a body) - public abstract void makeSound(); - - // Concrete method - public void sleep() { - System.out.println("Sleeping..."); - } -} - -class Dog extends Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -public class Main { - public static void main(String[] args) { - Dog dog = new Dog(); - dog.makeSound(); // Outputs: Woof - dog.sleep(); // Outputs: Sleeping... - } -} -``` - -### When to Use - -Use an abstract class when you have a base class that should not be instantiated directly and you want to provide some common functionality to subclasses. - -## Interfaces - -### Definition - -An interface in Java is a reference type, similar to a class, that can contain only constants, method signatures, default methods, static methods, and nested types. Interfaces cannot contain instance fields or constructors. - -### Characteristics - -- All methods in an interface are implicitly `public` and `abstract` (except default and static methods). -- Cannot have instance variables (only constants). -- Cannot have constructors. -- A class can implement multiple interfaces. -- Provides a way to achieve multiple inheritance. - -### Example - -```java -interface Animal { - void makeSound(); -} - -class Dog implements Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -public class Main { - public static void main(String[] args) { - Dog dog = new Dog(); - dog.makeSound(); // Outputs: Woof - } -} -``` - -### Default Methods - -Interfaces can have default methods, which provide a default implementation. - -#### Example - -```java -interface Animal { - void makeSound(); - - default void sleep() { - System.out.println("Sleeping..."); - } -} - -class Dog implements Animal { - @Override - public void makeSound() { - System.out.println("Woof"); - } -} - -public class Main { - public static void main(String[] args) { - Dog dog = new Dog(); - dog.makeSound(); // Outputs: Woof - dog.sleep(); // Outputs: Sleeping... - } -} -``` - -### When to Use - -Use an interface when you want to define a contract that multiple classes can implement, regardless of where those classes are in the class hierarchy. - -## Key Differences - -- **Implementation**: Abstract classes can provide partial implementation, while interfaces cannot (except default methods). -- **Multiple Inheritance**: A class can implement multiple interfaces, but it can extend only one abstract class. -- **Fields**: Abstract classes can have instance fields, while interfaces cannot (only constants). -- **Constructors**: Abstract classes can have constructors, interfaces cannot. - -## Conclusion - -Both abstract classes and interfaces are powerful tools in Java for achieving abstraction. They allow you to define methods that must be implemented by derived classes or implementing classes. Choosing between them depends on the specific needs of your application, such as whether you need multiple inheritance or whether you want to provide common behavior in a base class. diff --git a/docs/java/object-oriented-programming/object-oriented-design-principles.md b/docs/java/object-oriented-programming/object-oriented-design-principles.md deleted file mode 100644 index ab8321bdc..000000000 --- a/docs/java/object-oriented-programming/object-oriented-design-principles.md +++ /dev/null @@ -1,196 +0,0 @@ ---- -id: object-oriented-design-principles -title: Object-Oriented Design Principles -sidebar_label: Object-Oriented Design Principles -sidebar_position: 4 -tags: [java, object-oriented programming, object-oriented design principles, programming, java object-oriented programming] -description: In this tutorial, we will learn about the object-oriented design principles in Java. We will learn about the different principles that are used to design object-oriented systems, how they can be applied to create better software, and how they can help in creating more maintainable and scalable code. ---- - -# Object-Oriented Design Principles in Java - -## Introduction - -Object-oriented design principles are guidelines that help you design robust, maintainable, and scalable software. These principles promote best practices for writing clean and efficient object-oriented code. Understanding and applying these principles is crucial for developing high-quality software. - -## SOLID Principles - -The SOLID principles are five key design principles that guide object-oriented design and programming. These principles were introduced by Robert C. Martin (Uncle Bob) and are widely recognized in the software development community. - -### Single Responsibility Principle (SRP) - -A class should have only one reason to change, meaning that a class should have only one job or responsibility. - -#### Example - -```java -public class Book { - private String title; - private String author; - - // Methods related to Book properties - public String getTitle() { return title; } - public void setTitle(String title) { this.title = title; } - public String getAuthor() { return author; } - public void setAuthor(String author) { this.author = author; } -} - -public class BookPrinter { - // Method to print book details - public void printBook(Book book) { - System.out.println("Title: " + book.getTitle()); - System.out.println("Author: " + book.getAuthor()); - } -} -``` - -### Open/Closed Principle (OCP) - -Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. This means you should be able to add new functionality without changing existing code. - -#### Example - -```java -public abstract class Shape { - public abstract double area(); -} - -public class Circle extends Shape { - private double radius; - - public Circle(double radius) { - this.radius = radius; - } - - @Override - public double area() { - return Math.PI * radius * radius; - } -} - -public class Rectangle extends Shape { - private double width; - private double height; - - public Rectangle(double width, double height) { - this.width = width; - this.height = height; - } - - @Override - public double area() { - return width * height; - } -} -``` - -### Liskov Substitution Principle (LSP) - -Objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program. This means that a subclass should enhance, not weaken, the functionality of the superclass. - -#### Example - -```java -public class Bird { - public void fly() { - System.out.println("Flying"); - } -} - -public class Sparrow extends Bird { - // Sparrow can fly, no problem here -} - -public class Ostrich extends Bird { - // Ostrich cannot fly, violating LSP - @Override - public void fly() { - throw new UnsupportedOperationException("Ostrich cannot fly"); - } -} -``` - -### Interface Segregation Principle (ISP) - -Clients should not be forced to depend on interfaces they do not use. This means that creating specific interfaces for each type of client improves code flexibility and maintenance. - -#### Example - -```java -public interface Worker { - void work(); -} - -public interface Eater { - void eat(); -} - -public class Human implements Worker, Eater { - @Override - public void work() { - System.out.println("Human working"); - } - - @Override - public void eat() { - System.out.println("Human eating"); - } -} - -public class Robot implements Worker { - @Override - public void work() { - System.out.println("Robot working"); - } -} -``` - -### Dependency Inversion Principle (DIP) - -High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions. - -#### Example - -```java -public interface Keyboard { - void type(); -} - -public class MechanicalKeyboard implements Keyboard { - @Override - public void type() { - System.out.println("Typing with mechanical keyboard"); - } -} - -public class Computer { - private Keyboard keyboard; - - public Computer(Keyboard keyboard) { - this.keyboard = keyboard; - } - - public void type() { - keyboard.type(); - } -} -``` - -## Additional Design Principles - -### DRY (Don't Repeat Yourself) - -Avoid duplication of code by abstracting common functionality into methods or classes. This reduces redundancy and improves maintainability. - -### KISS (Keep It Simple, Stupid) - -Write simple and straightforward code that is easy to understand. Avoid overcomplicating solutions, as simpler code is easier to maintain and debug. - -### YAGNI (You Aren't Gonna Need It) - -Do not add functionality until it is necessary. This principle helps in avoiding over-engineering and keeping the codebase manageable. - -## Conclusion - -Object-oriented design principles are essential for writing clean, maintainable, and scalable code. By adhering to SOLID principles and other best practices like DRY, KISS, and YAGNI, you can develop robust and efficient software applications. Understanding and applying these principles will significantly improve your skills as a Java developer. - diff --git a/docs/java/stream-apis/How can create streams.md b/docs/java/stream-apis/How can create streams.md deleted file mode 100644 index 8cdbd27d6..000000000 --- a/docs/java/stream-apis/How can create streams.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -id: creation-of-streams -title: How can create Streams? -sidebar_label: How can create Streams? -sidebar_position: 2 -tags: [java, stream-api] -description: In this tutorial, we will explore multitple ways to create streams in java. ---- - -# How can create Streams? - - -## 1. From collections: - -- You can create a stream from existing collections like lists, sets, or maps. It allows you to process each element of the collection easily without dealing with traditional loops. - -```java -public class StreamFromCollectionsExample { - public static void main(String[] args) { - List numbersList = new ArrayList<>(); - numbersList.add(1); - numbersList.add(2); - numbersList.add(3); - - // Creating a stream from a list - Stream streamFromList = numbersList.stream(); - - // Performing an operation on the stream - streamFromList.forEach(element -> System.out.println(element)); - } -} -``` - -## 2. From arrays: -- Similar to collections, you can create streams from arrays. It’s useful when you have data stored in an array format. - - -```java -public class StreamFromArraysExample { - public static void main(String[] args) { - int[] numbersArray = {1, 2, 3, 4, 5}; - - // Creating a stream from an array - Stream streamFromArray = Arrays.stream(numbersArray).boxed(); - - // Performing an operation on the stream - streamFromArray.forEach(element -> System.out.println(element)); - } -} -``` - - -## 3. Using Stream Factories: -- Java provides methods like Stream.of() or Arrays.stream() to directly create streams from given values or arrays. - -```java -public class StreamExample { - public static void main(String[] args) { - // Creating a stream using Stream.of() - Stream streamOfValues = Stream.of(1, 2, 3, 4, 5); - - // Performing an operation on the stream - streamOfValues.forEach(element -> System.out.println(element)); - } -} -``` diff --git a/docs/java/stream-apis/Introduction to stream apis.md b/docs/java/stream-apis/Introduction to stream apis.md deleted file mode 100644 index 4ab08b320..000000000 --- a/docs/java/stream-apis/Introduction to stream apis.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: introduction-stream-apis -title: Introduction to stream apis in Java -sidebar_label: Introduction to stream apis -sidebar_position: 1 -tags: [java, stream-api] -description: In this tutorial, we will explore what exactly the stream api is and the importance. ---- - -# Introduction to stream apis in Java - -- Java Stream APIs are a set of classes and interfaces introduced in Java 8 that make it easier to work with collections, such as lists or arrays, by providing a straightforward and readable approach to processing elements, instead of writing complex loops and conditionals to iterate over collections. -- With Stream APIs, you can chain multiple operations together in a fluent style, making it easier to understand the sequence of transformations applied to the data in a collection. - -## Why Use Stream APIs? - -- Stream APIs enable declarative programming, where you specify what you want to achieve rather than how to achieve it. - -- Stream APIs provide a rich set of built-in operations for common data processing tasks which are optimized and can be used directly without writing custom code, saving development time and effort. - -- Stream APIs support parallel processing, allowing operations to be executed concurrently on multiple threads. This can lead to significant performance improvements, especially when dealing with large datasets. - -- Stream APIs use lazy evaluation, meaning intermediate operations are only executed when necessary. This can lead to more efficient use of resources, as operations are only performed on elements that are actually needed in the final result. - -- Stream APIs encourage immutability by not modifying the original data source but instead producing new streams with the desired transformations applied. - -- In functional programming, functions are treated as first-class citizens, meaning they can be passed around as arguments to other functions or returned as results from other functions. Java Stream APIs utilize higher-order functions, like map, filter, and reduce, which can take other functions as arguments. diff --git a/docs/java/stream-apis/Parallel streams.md b/docs/java/stream-apis/Parallel streams.md deleted file mode 100644 index f67f52bf6..000000000 --- a/docs/java/stream-apis/Parallel streams.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -id: parallel-streams -title: Parallel streams -sidebar_label: Parallel streams -sidebar_position: 4 -tags: [java, stream-api] -description: In this tutorial, we will explore about parallel stream and its advantages and disadvantages with an example. ---- - -# Parallel streams - - -- Sequential execution does one task at a time, while parallel execution does multiple tasks simultaneously. -- When you use a parallel stream, Java automatically splits the data into smaller parts and assigns them to different processors (cores) in your computer. -- Each processor works on its chunk of data independently and then the results are combined. This can speed up processing, especially for large datasets, because multiple tasks are being done simultaneously, rather than one after another. - -```java -import java.util.Arrays; - -public class ParallelStreamExample { - public static void main(String[] args) { - // Create a large array of numbers - int[] numbers = new int[1000000]; - for (int i = 0; i < numbers.length; i++) { - numbers[i] = i + 1; - } - - // Sequential Stream: Summing up all numbers using a sequential stream - long startTime = System.currentTimeMillis(); - long sequentialSum = Arrays.stream(numbers) - .sum(); - long endTime = System.currentTimeMillis(); - System.out.println("Sequential sum: " + sequentialSum); - System.out.println("Time taken with sequential stream: " + (endTime - startTime) + " milliseconds"); - - // Parallel Stream: Summing up all numbers using a parallel stream - startTime = System.currentTimeMillis(); - long parallelSum = Arrays.stream(numbers) - .parallel() - .sum(); - endTime = System.currentTimeMillis(); - System.out.println("Parallel sum: " + parallelSum); - System.out.println("Time taken with parallel stream: " + (endTime - startTime) + " milliseconds"); - } -} -``` - -- After running this code, you should see the output showing the sum calculated using both sequential and parallel streams, along with the time taken for each approach. - -- Parallel processing can offer significant performance improvements and scalability but introduces complexity and potential challenges related to concurrency management. diff --git a/docs/java/stream-apis/Stream operations.md b/docs/java/stream-apis/Stream operations.md deleted file mode 100644 index 1c05b45b6..000000000 --- a/docs/java/stream-apis/Stream operations.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -id: stream-operations -title: Stream operations -sidebar_label: Stream operations -sidebar_position: 3 -tags: [java, stream-api] -description: In this tutorial, we will explore multiple opertions we can perform on the streams with examples. ---- - -# Stream operations - -- In Java’s Stream API, operations are broadly categorized into two types: Intermediate operations and Terminal operations. - -- Let’s break down each: - -## 1. Intermediate Operations - -- These operations transform the elements of the stream. -- They are lazy, meaning they don’t execute until a terminal operation is called. -- Intermediate operations return a new stream, allowing for chaining. -- Examples include `map`, `filter`, `sorted`, `distinct`, etc. - - -## 2. Terminal Operations - -- These operations produce a non-stream result. -- They execute the stream pipeline and produce a result or a side-effect. -- Once a terminal operation is invoked, the stream is consumed and cannot be reused. -- Examples include `forEach`, `collect`, `reduce`, `count`, `min`, `max`, etc. - - -## 3. Common stream operations - -## 3.1. Filtering: - -- This operation allows you to select elements from a collection based on a certain condition. - -```java -List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - -List evenNumbers = numbers.stream() - .filter(num -> num % 2 == 0) // intermediate operation - .collect(Collectors.toList()); // terminal operation - -// Output: [2, 4, 6, 8, 10] -System.out.println(evenNumbers); -``` - -## 3.2. Mapping: - -- This operation involves transforming each element of a collection according to a given function. - -```java -List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - -List squaredNumbers = numbers.stream() - .map(num -> num * num) - .collect(Collectors.toList()); - -// Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] -System.out.println(squaredNumbers); -``` - - -## 3.3. Reduction: - -- Reduction combines all elements of a stream to produce a single result. - -```java -List numbers = Arrays.asList(1, 2, 3, 4, 5); - -int sum = numbers.stream() - .reduce(0, (n1, n2) -> n1 + n2); // or .reduce(0, Integer::sum); - -// Output: 15 -System.out.println(sum); -``` - -## 3.4. Sorting: - -- Sorting rearranges the elements of a collection in a specified order. - -```java -List numbers = Arrays.asList(5, 2, 8, 1, 9, 3); - -List sortedNumbers = numbers.stream() - .sorted() - .collect(Collectors.toList()); - -// Output: [1, 2, 3, 5, 8, 9] -System.out.println(sortedNumbers); -``` - -## 3.5. Counting: - -- Counting calculates the number of elements in a collection. - -```java -List names = Arrays.asList("John", "Alice", "Bob", "Emily"); - -long count = names.stream() - .count(); - -// Output: 4 -System.out.println(count); -``` - -## 3.6. Grouping: - -- Grouping gathers elements of a collection based on a common property. - -```java -List names = Arrays.asList("John", "Alice", "Bob", "Emily"); - -Map> groupedNamesByLength = names.stream() - .collect(Collectors.groupingBy(String::length)); - -// Output: {3=[Bob], 5=[Alice, Emily], 4=[John]} -System.out.println(groupedNamesByLength); -``` - -## 3.7. Limiting and Skipping - -- Infinite Streams: Imagine a stream of water that never stops flowing. Similarly, an infinite stream in programming is a sequence of data that goes on forever. You can generate this stream of data dynamically, meaning it keeps producing new elements endlessly. -- Limiting: Think of it like putting a cap on how much water from the stream you want to collect. In programming, you might only want to take the first 10 numbers from an infinite stream of numbers. So, you set a limit to only take the first 10, and then the stream stops there. -- Skipping: Now, imagine you don’t want the first few numbers from the stream; you want to start collecting data from, say, the 11th number onward. Skipping allows you to do just that. It’s like bypassing the initial part of the stream and starting from a certain point. - -```java -public class InfiniteStreamsExample { - - public static void main(String[] args) { - // Generating an infinite stream of numbers starting from 1 - Stream infiniteStream = Stream.iterate(1, i -> i + 1); - - // Limiting: Taking only the first 10 elements from the infinite stream - Stream limitedStream = infiniteStream.limit(10); - - System.out.println("First 10 elements from the infinite stream:"); - limitedStream.forEach(System.out::println); - - // Generating the infinite stream again as it was consumed in the previous operation - infiniteStream = Stream.iterate(1, i -> i + 1); - - // Skipping: Skipping the first 5 elements and taking the next 10 elements - Stream skippedStream = infiniteStream.skip(5).limit(10); - - System.out.println("\nSkipping the first 5 elements and taking the next 10:"); - skippedStream.forEach(System.out::println); - } -} -``` diff --git a/docs/java/stream-apis/Using stream with custom objects.md b/docs/java/stream-apis/Using stream with custom objects.md deleted file mode 100644 index fbbb4d034..000000000 --- a/docs/java/stream-apis/Using stream with custom objects.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -id: using-stream-with-custom-objects -title: Using stream with custom objects -sidebar_label: Using stream with custom objects -sidebar_position: 5 -tags: [java, stream-api] -description: In this tutorial, we will explore how can we create streams and perform stream operations on custom objects. ---- - -# Using stream with custom objects - -- Suppose we have a class called Product representing products in a store. -- Each product has attributes such as id, name, price, and category. - -- We want to perform various operations using streams on a list of Product objects. - -```java -class Product { - private int id; - private String name; - private double price; - private String category; - - // All args contructor, getters, setters and toString method -} - -public class Main { - public static void main(String[] args) { - // Create a list of Product objects - List products = Arrays.asList( - new Product(1, "Laptop", 1200.00, "Electronics"), - new Product(2, "Chair", 75.50, "Furniture"), - new Product(3, "Headphones", 50.00, "Electronics"), - new Product(4, "Table", 150.00, "Furniture"), - new Product(5, "Mouse", 20.00, "Electronics") - ); - - // Filter products by category - List electronics = products.stream() - .filter(p -> p.getCategory().equals("Electronics")) - .collect(Collectors.toList()); - System.out.println("Electronics: " + electronics); - - // Map products to their names - List productNames = products.stream() - .map(Product::getName) - .collect(Collectors.toList()); - System.out.println("Product Names: " + productNames); - - // Calculate the total price of all products - double totalPrice = products.stream() - .mapToDouble(Product::getPrice) - .sum(); - System.out.println("Total Price: $" + totalPrice); - - // Find the cheapest product - Product cheapestProduct = products.stream() - .min((p1, p2) -> Double.compare(p1.getPrice(), p2.getPrice())) - .orElse(null); - System.out.println("Cheapest Product: " + cheapestProduct); - - // Sort products by price in descending order, and if prices are the same, sort by ID - List sortedByPriceDesc = products.stream() - .sorted(Comparator.comparingDouble(Product::getPrice).reversed() - .thenComparingInt(Product::getId)) - .toList(); - System.out.println("Sorted by price (descending) and then by ID: " + sortedByPriceDesc); - - // Group products by category - products.stream() - .collect(Collectors.groupingBy(Product::getCategory)) - .forEach((category, productList) -> { - System.out.println(category + ": " + productList); - }); - } -} -``` diff --git a/docs/java/unit-testing-with-junit/_category_.json b/docs/java/unit-testing-with-junit/_category_.json deleted file mode 100644 index 9c1833c23..000000000 --- a/docs/java/unit-testing-with-junit/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Unit Testing with JUnit in Java", - "position": 14, - "link": { - "type": "generated-index", - "description": "In this section, you will learn how to write unit tests with JUnit in Java. We will cover the basics of JUnit, how to write tests, and how to run them. We will also discuss some best practices for writing unit tests." - } -} \ No newline at end of file diff --git a/docs/java/unit-testing-with-junit/introduction-to-junit-framework.md b/docs/java/unit-testing-with-junit/introduction-to-junit-framework.md deleted file mode 100644 index a2c97e9d3..000000000 --- a/docs/java/unit-testing-with-junit/introduction-to-junit-framework.md +++ /dev/null @@ -1,77 +0,0 @@ -JUnit is a popular testing framework for Java that is widely used by developers to perform unit testing of Java applications. Here's an introduction to the JUnit framework: - -## Introduction to JUnit - -### What is JUnit? - -JUnit is a simple, open-source framework designed for writing and running automated tests in Java. It provides a set of annotations and APIs for creating and executing test cases, assertions for verifying expected outcomes, and test runners for executing tests and reporting results. - -### Key Features of JUnit - -1. **Annotations**: JUnit provides annotations such as `@Test`, `@Before`, `@After`, `@BeforeClass`, and `@AfterClass` to define test methods and setup/teardown methods. - -2. **Assertions**: JUnit provides a set of assertion methods in the `org.junit.Assert` class for validating expected outcomes in test cases. - -3. **Test Runners**: JUnit supports different test runners for executing tests, including `JUnitCore`, `JUnit4`, and IDE integrations with Eclipse, IntelliJ IDEA, and NetBeans. - -4. **Parameterized Tests**: JUnit allows you to run the same test method with different inputs by using parameterized tests. - -5. **Exception Testing**: JUnit provides mechanisms for testing expected exceptions by using the `@Test` annotation's `expected` attribute or the `@Rule` annotation with `ExpectedException`. - -### Example Test Class - -```java -import org.junit.*; - -public class MyMathTest { - - @BeforeClass - public static void setUpClass() { - // Setup once before any test methods run - } - - @AfterClass - public static void tearDownClass() { - // Cleanup once after all test methods have run - } - - @Before - public void setUp() { - // Setup before each test method - } - - @After - public void tearDown() { - // Cleanup after each test method - } - - @Test - public void testAdd() { - assertEquals(5, MyMath.add(2, 3)); - } - - @Test - public void testSubtract() { - assertEquals(2, MyMath.subtract(5, 3)); - } - - @Test(expected = ArithmeticException.class) - public void testDivideByZero() { - MyMath.divide(5, 0); - } -} -``` - -### How to Use JUnit - -1. **Add JUnit Dependency**: Include the JUnit library in your project's build path or dependency management tool (e.g., Maven, Gradle). - -2. **Write Test Classes**: Create test classes with test methods annotated with `@Test` and perform assertions using JUnit's assertion methods. - -3. **Run Tests**: Execute tests using a test runner such as JUnitCore or an IDE that supports JUnit (e.g., Eclipse, IntelliJ IDEA). - -4. **Analyze Results**: Review test results to identify failures and errors, and debug issues in your code. - -### Conclusion - -JUnit is a powerful testing framework for Java that simplifies the process of writing and running automated tests. By following best practices and leveraging JUnit's features, developers can ensure the reliability and quality of their Java applications. \ No newline at end of file diff --git a/docs/java/unit-testing-with-junit/test-suites-and-assertions.md b/docs/java/unit-testing-with-junit/test-suites-and-assertions.md deleted file mode 100644 index db931d5e9..000000000 --- a/docs/java/unit-testing-with-junit/test-suites-and-assertions.md +++ /dev/null @@ -1,64 +0,0 @@ -In JUnit, test suites allow you to group multiple test classes together to execute them as a single unit. Assertions are used to verify expected outcomes in test methods. Here's how you can work with test suites and assertions in JUnit: - -### Test Suites - -A test suite is a collection of test cases (i.e., test classes) that can be executed together. You can create a test suite to run multiple test classes at once. - -```java -import org.junit.runner.RunWith; -import org.junit.runners.Suite; - -@RunWith(Suite.class) -@Suite.SuiteClasses({MyMathTest.class, OtherTest.class}) -public class AllTests { - // This class is just a holder for the above annotations -} -``` - -### Assertions - -JUnit provides a set of assertion methods in the `org.junit.Assert` class to verify expected outcomes in test methods. - -```java -import static org.junit.Assert.*; - -public class MyMathTest { - - @Test - public void testAdd() { - assertEquals(5, MyMath.add(2, 3)); // Verifies that the actual result is equal to the expected value - } - - @Test - public void testSubtract() { - assertTrue(MyMath.subtract(5, 3) == 2); // Verifies that the condition is true - } - - @Test - public void testDivideByZero() { - try { - MyMath.divide(5, 0); - fail("Expected ArithmeticException was not thrown"); // Fails the test if the expected exception is not thrown - } catch (ArithmeticException e) { - // Expected exception - } - } -} -``` - -### Common Assertion Methods - -- `assertEquals(expected, actual)`: Verifies that the expected and actual values are equal. -- `assertTrue(condition)`: Verifies that the given condition is true. -- `assertFalse(condition)`: Verifies that the given condition is false. -- `assertNull(object)`: Verifies that the given object is null. -- `assertNotNull(object)`: Verifies that the given object is not null. -- `assertThrows(expectedException, executable)`: Verifies that the executable throws the expected exception. - -### Tips - -- Choose appropriate assertion methods based on the type of condition you want to verify. -- Use descriptive error messages to provide context when assertions fail. -- Combine multiple assertions in a single test method to verify different aspects of the code. - -By using test suites and assertions effectively in your JUnit tests, you can organize your tests efficiently and ensure that your code behaves as expected under different conditions. \ No newline at end of file diff --git a/docs/java/unit-testing-with-junit/writing-and-running-tests-withjunit.md b/docs/java/unit-testing-with-junit/writing-and-running-tests-withjunit.md deleted file mode 100644 index 4829e4bfe..000000000 --- a/docs/java/unit-testing-with-junit/writing-and-running-tests-withjunit.md +++ /dev/null @@ -1,72 +0,0 @@ -To write and run tests with the JUnit framework, you can follow these steps: - -### 1. Write Test Classes - -Create test classes containing test methods annotated with `@Test` to specify which methods should be executed as tests. Use JUnit's assertion methods to validate the expected behavior of your code. - -```java -import org.junit.*; -import static org.junit.Assert.*; - -public class MyMathTest { - - @Test - public void testAdd() { - assertEquals(5, MyMath.add(2, 3)); - } - - @Test - public void testSubtract() { - assertEquals(2, MyMath.subtract(5, 3)); - } - - @Test(expected = ArithmeticException.class) - public void testDivideByZero() { - MyMath.divide(5, 0); - } -} -``` - -### 2. Compile Test Classes - -Compile your test classes along with the classes being tested. Ensure that JUnit library is in your classpath. - -### 3. Run Tests - -Execute your tests using a test runner. You can use one of the following methods: - -- **JUnit Runner**: Run tests programmatically using `JUnitCore` class. - - ```java - import org.junit.runner.JUnitCore; - import org.junit.runner.Result; - import org.junit.runner.notification.Failure; - - public class TestRunner { - public static void main(String[] args) { - Result result = JUnitCore.runClasses(MyMathTest.class); - for (Failure failure : result.getFailures()) { - System.out.println(failure.toString()); - } - System.out.println(result.wasSuccessful()); - } - } - ``` - -- **IDE Integration**: Run tests directly from your IDE (e.g., Eclipse, IntelliJ IDEA) by right-clicking on the test class and selecting "Run as JUnit Test". - -- **Maven or Gradle**: Run tests using build automation tools like Maven or Gradle by executing test goals/tasks. - -### 4. Analyze Results - -Review the test results to identify any failures or errors. JUnit provides detailed information about which tests passed, which failed, and any exceptions that occurred during testing. - -### Tips: - -- Use `@Before` and `@After` annotations to execute setup and teardown methods before and after each test method. - -- Utilize parameterized tests with `@RunWith(Parameterized.class)` for testing multiple inputs. - -- Organize your test classes into separate packages and naming conventions (e.g., `MyClassTest`, `MyClassIntegrationTest`) for better organization. - -By following these steps, you can effectively write and run tests using the JUnit framework to ensure the quality and reliability of your Java applications. \ No newline at end of file diff --git a/docs/javascript/_category_.json b/docs/javascript/_category_.json index a559579d3..9fbbf122d 100644 --- a/docs/javascript/_category_.json +++ b/docs/javascript/_category_.json @@ -1,6 +1,6 @@ { "label": "JavaScript", - "position": 11, + "position": 4, "link": { "type": "generated-index", "description": "JavaScript is a programming language that enables you to create dynamically updating content, control multimedia, animate images, and much more. In this tutorial, you'll learn the basics of JavaScript and how to use it to create interactive web experiences." diff --git a/docs/javascript/data-types/non-primitive-types/object/creating-objects.md b/docs/javascript/data-types/non-primitive-types/object/creating-objects.md index a956384f4..709c57ef9 100644 --- a/docs/javascript/data-types/non-primitive-types/object/creating-objects.md +++ b/docs/javascript/data-types/non-primitive-types/object/creating-objects.md @@ -276,4 +276,4 @@ In the example above, the `personPrototype` object defines a `greet` method that ## Conclusion -In this tutorial, you learned how to create objects in JavaScript using object literals, constructors, classes, and the `Object.create()` method. Each method has its advantages and use cases, depending on the complexity and structure of the objects you need to create. Understanding these different methods will help you work with objects effectively in JavaScript. +In this tutorial, you learned how to create objects in JavaScript using object literals, constructors, classes, and the `Object.create()` method. Each method has its advantages and use cases, depending on the complexity and structure of the objects you need to create. Understanding these different methods will help you work with objects effectively in JavaScript. \ No newline at end of file diff --git a/docs/prompt engineering/prompts-basics.md b/docs/prompt engineering/prompts-basics.md deleted file mode 100644 index c84b0376e..000000000 --- a/docs/prompt engineering/prompts-basics.md +++ /dev/null @@ -1,64 +0,0 @@ -# Prompt Engineering Basics - -## Introduction -Prompt engineering is the process of designing and refining prompts to effectively communicate with language models. A well-crafted prompt can significantly enhance the model's performance and the quality of the generated output. - -## Key Concepts - -### 1. Clarity -Ensure that your prompts are clear and unambiguous. Avoid using vague language or complex structures that might confuse the model. - -**Example:** -- **Good Prompt:** "Translate the following English sentence to French: 'Hello, how are you?'" -- **Bad Prompt:** "Translate this." - -### 2. Specificity -Be specific about what you want the model to do. Provide detailed instructions to guide the model towards the desired output. - -**Example:** -- **Good Prompt:** "Summarize the following article in two sentences." -- **Bad Prompt:** "Summarize this." - -### 3. Context -Provide sufficient context for the model to understand the task. The more context you provide, the better the model can tailor its response. - -**Example:** -- **Good Prompt:** "Based on the following text, generate a summary: 'Artificial Intelligence (AI) is a branch of computer science that aims to create intelligent machines.'" -- **Bad Prompt:** "Generate a summary." - -## Best Practices - -### Use Examples -Including examples in your prompts can help the model understand the format and style of the desired output. - -**Example:** -- **Prompt:** "Translate the following sentences from English to Spanish: 'Good morning' -> 'Buenos días', 'Thank you' -> 'Gracias', 'See you later' ->" - -### Be Concise -While it's important to provide enough information, avoid making your prompts too lengthy. Aim for a balance between detail and brevity. - -**Example:** -- **Good Prompt:** "List three benefits of regular exercise." -- **Bad Prompt:** "Can you please list some benefits that people might experience if they engage in regular physical activity?" - -## Common Pitfalls - -### Ambiguity -Ambiguous prompts can lead to unpredictable results. Make sure your prompts are clear and specific. - -**Example:** -- **Ambiguous Prompt:** "Describe a tree." -- **Clear Prompt:** "Describe the physical characteristics of an oak tree." - -### Overloading -Avoid overloading the prompt with too many instructions or requests. Focus on one task at a time for best results. - -**Example:** -- **Overloaded Prompt:** "Translate this text to French and then summarize it." -- **Focused Prompt:** "Translate this text to French." - -## Conclusion -Effective prompt engineering is crucial for getting the best results from language models. By following these basics, you can create prompts that are clear, specific, and context-rich, leading to more accurate and useful outputs. - - - diff --git a/docs/prompt engineering/prompts-best-practices.md b/docs/prompt engineering/prompts-best-practices.md deleted file mode 100644 index 434aff4df..000000000 --- a/docs/prompt engineering/prompts-best-practices.md +++ /dev/null @@ -1,56 +0,0 @@ -# Best Practices for Prompt Engineering - -## Introduction -Following best practices in prompt engineering can significantly improve the quality and reliability of the outputs generated by language models. Here are some recommended practices to consider. - -## 1. Keep Prompts Clear and Concise -Ensure that your prompts are easy to understand and free of unnecessary complexity. Clear and concise prompts reduce ambiguity and help the model generate more accurate responses. - -**Example:** -- **Prompt:** "Translate 'Good morning' to Spanish." -- **Expected Output:** "Buenos días." - -## 2. Use Explicit Instructions -Provide detailed instructions to guide the model's response. Explicit instructions help the model understand the task better. - -**Example:** -- **Prompt:** "Write a brief summary of the following article: 'AI is transforming the tech industry by automating tasks and providing new insights.'" -- **Expected Output:** "AI is revolutionizing the tech industry by automating tasks and offering new insights." - -## 3. Include Context When Necessary -Provide context to the model to enhance its understanding of the task. Context can be previous conversation history, background information, or detailed descriptions. - -**Example:** -- **Prompt:** "Given the text 'The Great Wall of China is one of the seven wonders of the world,' summarize the main point." -- **Expected Output:** "The Great Wall of China is one of the seven wonders of the world." - -## 4. Test and Iterate -Experiment with different prompts and refine them based on the results. Iterative testing helps identify the most effective phrasing for your prompts. - -**Example:** -- **Initial Prompt:** "What is the weather?" -- **Refined Prompt:** "What is the current weather in New York City?" - -## 5. Use Structured Formats -Structure your prompts with clear headings or labels to organize information. Structured formats can help the model process and respond more accurately. - -**Example:** -- **Prompt:** "Question: What is the capital of France?\nAnswer:" -- **Expected Output:** "Paris" - -## 6. Leverage Few-Shot Learning -Provide a few examples to demonstrate the desired output. Few-shot learning helps the model recognize patterns and generate similar responses. - -**Example:** -- **Prompt:** "Translate the following phrases from English to French: 'Hello' -> 'Bonjour', 'Thank you' -> 'Merci', 'Goodbye' ->" -- **Expected Output:** "Au revoir" - -## 7. Avoid Overloading Prompts -Focus on one task at a time to prevent overwhelming the model with too many instructions. - -**Example:** -- **Overloaded Prompt:** "Translate this sentence to Spanish and then summarize the following text." -- **Focused Prompt:** "Translate this sentence to Spanish: 'How are you?'" - -## Conclusion -By following these best practices, you can enhance the effectiveness of your prompts and achieve more accurate and reliable outputs from language models. \ No newline at end of file diff --git a/docs/prompt engineering/prompts-examples.md b/docs/prompt engineering/prompts-examples.md deleted file mode 100644 index 16392cc79..000000000 --- a/docs/prompt engineering/prompts-examples.md +++ /dev/null @@ -1,36 +0,0 @@ -# Examples of Effective Prompts - -## Introduction -This document provides a variety of examples to illustrate effective prompt engineering. These examples demonstrate how to craft prompts for different tasks and scenarios. - -## 1. Translation -**Prompt:** "Translate the following sentence to German: 'Good night.'" -- **Expected Output:** "Gute Nacht." - -## 2. Summarization -**Prompt:** "Summarize the main idea of the following text: 'Artificial intelligence is changing the world by automating tasks and providing new insights.'" -- **Expected Output:** "AI is changing the world by automating tasks and offering new insights." - -## 3. Question and Answer -**Prompt:** "Question: What is the capital of Japan?\nAnswer:" -- **Expected Output:** "Tokyo" - -## 4. Text Completion -**Prompt:** "Once upon a time, in a land far, far away," -- **Expected Output:** "there lived a young prince who dreamed of adventures." - -## 5. Creative Writing -**Prompt:** "Write a poem about the beauty of nature." -- **Expected Output:** "The sun sets in hues of gold, \nWhispering secrets the leaves unfold. \nMountains stand tall, a majestic sight, \nNature's wonder, pure delight." - -## 6. Conversational AI -**Prompt:** "User: What's the weather like today?\nAI:" -- **Expected Output:** "The weather is sunny with a high of 75°F. Do you need a forecast for a specific location?" - -## 7. Code Generation -**Prompt:** "Write a Python function that returns the square of a number." -- **Expected Output:** -```python -def square(number): -return number * number -``` \ No newline at end of file diff --git a/docs/prompt engineering/prompts-strategies.md b/docs/prompt engineering/prompts-strategies.md deleted file mode 100644 index 15a3b8675..000000000 --- a/docs/prompt engineering/prompts-strategies.md +++ /dev/null @@ -1,63 +0,0 @@ -# Strategies for Effective Prompt Engineering - -## Introduction -Effective prompt engineering involves using various strategies to guide language models to produce desired outputs. This document outlines several strategies to enhance the performance and accuracy of prompts. - -## 1. Be Explicit and Specific -Provide clear and specific instructions in your prompts. Avoid ambiguity to reduce the chance of receiving irrelevant or incorrect responses. - -**Example:** -- **Prompt:** "Translate the following sentence to French: 'Good morning.'" -- **Expected Output:** "Bonjour." - -## 2. Use Examples -Incorporate examples in your prompts to show the model the desired format and style of the output. This can be especially helpful for tasks that require a specific structure. - -**Example:** -- **Prompt:** "Translate the following phrases from English to Spanish: 'Hello' -> 'Hola', 'Thank you' -> 'Gracias', 'Good night' ->" -- **Expected Output:** "Buenas noches" - -## 3. Provide Context -Include relevant context in your prompts to help the model understand the task better. Context can be previous conversation history, background information, or detailed instructions. - -**Example:** -- **Prompt:** "Based on the following text, summarize the main idea: 'Machine learning is a subset of artificial intelligence that involves training algorithms to learn from data and make predictions.'" -- **Expected Output:** "Machine learning trains algorithms to learn from data and make predictions." - -## 4. Break Down Complex Tasks -For complex tasks, break them down into smaller, manageable steps. This can make it easier for the model to follow the instructions and produce accurate results. - -**Example:** -- **Prompt:** "First, translate the sentence 'Good evening' to French. Then, write a greeting message using that translation." -- **Expected Output:** "Bonsoir. I hope you have a pleasant evening." - -## 5. Use Structured Prompts -Use structured prompts with clear headings or labels to guide the model. This can help in organizing the input and making the task more understandable. - -**Example:** -- **Prompt:** "Question: What is the capital of France?\nAnswer:" -- **Expected Output:** "Paris" - -## 6. Iterate and Refine -Experiment with different prompts and refine them based on the model's responses. Iterative refinement can help you identify the most effective way to phrase your prompts. - -**Example:** -- **Initial Prompt:** "Tell me about the weather." -- **Refined Prompt:** "Describe the current weather conditions in New York City." - -## 7. Leverage Few-Shot Learning -Provide a few examples of the desired output within the prompt. This helps the model understand the pattern and generate similar responses. - -**Example:** -- **Prompt:** "Translate the following phrases from English to German: 'Good morning' -> 'Guten Morgen', 'Good night' -> 'Gute Nacht', 'Thank you' ->" -- **Expected Output:** "Danke" - -## 8. Avoid Overloading the Prompt -Focus on one task at a time to avoid overloading the model with too much information or too many instructions. - -**Example:** -- **Overloaded Prompt:** "Translate this sentence to French and then summarize the following paragraph." -- **Focused Prompt:** "Translate this sentence to French: 'How are you?'" - -## Conclusion -By applying these strategies, you can create more effective prompts that guide language models to produce accurate, relevant, and high-quality outputs. Experimentation and refinement are key to mastering prompt engineering. diff --git a/docs/prompt engineering/prompts-tools.md b/docs/prompt engineering/prompts-tools.md deleted file mode 100644 index 0bdbeead1..000000000 --- a/docs/prompt engineering/prompts-tools.md +++ /dev/null @@ -1,42 +0,0 @@ -# Tools and Libraries for Prompt Engineering - -## Introduction -There are various tools and libraries available that can aid in prompt engineering. These resources can help streamline the process and improve the quality of your prompts. - -## 1. OpenAI Playground -The OpenAI Playground is an interactive web-based tool that allows you to experiment with different prompts and see how the language model responds. - -- **Website:** [OpenAI Playground](https://platform.openai.com/playground) - -## 2. GPT-3 Sandbox -GPT-3 Sandbox provides a user-friendly interface to interact with GPT-3. It offers features like prompt templates, examples, and customization options. - -- **Website:** [GPT-3 Sandbox](https://gpt3sandbox.com) - -## 3. AI Dungeon -AI Dungeon is a text-based adventure game that leverages language models. It's a great tool for exploring creative prompts and narrative generation. - -- **Website:** [AI Dungeon](https://play.aidungeon.io) - -## 4. Hugging Face Transformers -The Hugging Face Transformers library provides access to numerous pre-trained models, including GPT-3. It offers tools for prompt engineering and model fine-tuning. - -- **GitHub Repository:** [Hugging Face Transformers](https://github.com/huggingface/transformers) - -## 5. Prompt Toolkit -Prompt Toolkit is a Python library that helps in building interactive command-line applications. It can be used for creating sophisticated prompts and handling user inputs. - -- **GitHub Repository:** [Prompt Toolkit](https://github.com/prompt-toolkit/python-prompt-toolkit) - -## 6. TextBlob -TextBlob is a Python library for processing textual data. It provides simple APIs for common natural language processing (NLP) tasks, making it useful for prompt engineering. - -- **GitHub Repository:** [TextBlob](https://github.com/sloria/TextBlob) - -## 7. GPT-3 Python Wrapper -The GPT-3 Python Wrapper allows you to integrate GPT-3 into your Python projects easily. It provides functions to create prompts and handle responses. - -- **GitHub Repository:** [GPT-3 Python Wrapper](https://github.com/openai/openai-python) - -## Conclusion -Utilizing these tools and libraries can enhance your prompt engineering workflow and help you achieve better results when working with language models. \ No newline at end of file diff --git a/docs/prompt engineering/prompts-types.md b/docs/prompt engineering/prompts-types.md deleted file mode 100644 index a3baca71a..000000000 --- a/docs/prompt engineering/prompts-types.md +++ /dev/null @@ -1,56 +0,0 @@ -# Types of Prompts in Prompt Engineering - -## Introduction -Different types of prompts can be used to achieve various outcomes when interacting with language models. Understanding these types can help you choose the most appropriate prompt for your specific task. - -## 1. Instruction-Based Prompts -Instruction-based prompts provide explicit instructions to the model. They are direct and straightforward, making it clear what the user wants. - -**Example:** -- **Prompt:** "Translate the following English sentence to Spanish: 'Good evening.'" -- **Expected Output:** "Buenas noches." - -## 2. Example-Based Prompts -Example-based prompts give the model examples of the desired output. This helps the model understand the format and style you are looking for. - -**Example:** -- **Prompt:** "Translate the following phrases from English to French: 'Hello' -> 'Bonjour', 'Goodbye' -> 'Au revoir', 'Thank you' ->" -- **Expected Output:** "Merci" - -## 3. Contextual Prompts -Contextual prompts provide context to the model, which can help generate more accurate and relevant responses. The context can be a previous conversation, a passage of text, or any relevant information. - -**Example:** -- **Prompt:** "Based on the following text, summarize the main idea: 'Artificial Intelligence (AI) is transforming industries by automating tasks and providing insights through data analysis.'" -- **Expected Output:** "AI is revolutionizing industries by automating tasks and offering data-driven insights." - -## 4. Conversational Prompts -Conversational prompts simulate a dialogue between the user and the model. These are useful for chatbots and virtual assistants. - -**Example:** -- **Prompt:** "User: What is the weather like today?\nAssistant: The weather is sunny with a high of 75°F. Do you need a weather forecast for a specific location?" -- **Expected Output:** "User: Yes, for New York City." - -## 5. Creative Prompts -Creative prompts encourage the model to generate original and imaginative content. These are often used for writing, storytelling, and brainstorming. - -**Example:** -- **Prompt:** "Write a short story about a dragon who learns to fly." -- **Expected Output:** "Once upon a time, in a land far away, there lived a young dragon named Drako. Drako dreamed of soaring through the skies, but he had never learned to fly..." - -## 6. Query-Based Prompts -Query-based prompts ask the model to retrieve information or answer questions. These prompts are useful for research, fact-checking, and obtaining specific details. - -**Example:** -- **Prompt:** "What are the benefits of regular exercise?" -- **Expected Output:** "Regular exercise improves cardiovascular health, strengthens muscles, enhances flexibility, boosts mental health, and aids in weight management." - -## 7. Completion Prompts -Completion prompts ask the model to complete a given piece of text. This is useful for text generation, autocompletion, and expanding ideas. - -**Example:** -- **Prompt:** "The quick brown fox" -- **Expected Output:** "jumps over the lazy dog." - -## Conclusion -Understanding the different types of prompts allows you to leverage the full potential of language models. By choosing the appropriate prompt type, you can achieve more accurate, relevant, and creative outcomes. diff --git a/docusaurus.config.js b/docusaurus.config.js index cc6584f49..cdcad3ca4 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -140,17 +140,13 @@ const config = { Tutorials `, }, diff --git a/sidebars.js b/sidebars.js index 0ebd6ab1d..100a60dd9 100644 --- a/sidebars.js +++ b/sidebars.js @@ -4,13 +4,10 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }], - dsa: [{ type: 'autogenerated', dirName: 'dsa', }], javascript: [{ type: 'autogenerated', dirName: 'javascript', }], typescript: [{ type: 'autogenerated', dirName: 'typescript', }], react: [{ type: 'autogenerated', dirName: 'react', }], python: [{ type: 'autogenerated', dirName: 'python', }], - cpp: [{ type: 'autogenerated', dirName: 'cpp', }], - java: [{ type: 'autogenerated', dirName: 'java', }], html: [{ type: 'autogenerated', dirName: 'html', }], tailwindcss: [{ type: 'autogenerated', dirName: 'tailwind', }], }; From 75c97764d535eced0da82ef7ebe78debfb7b3bc5 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 26 Aug 2024 07:47:22 +0000 Subject: [PATCH 2/6] Restyled by clang-format --- docusaurus.config.js | 870 ++++++++++++++++++++++--------------------- sidebars.js | 32 +- 2 files changed, 462 insertions(+), 440 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index cdcad3ca4..4d1f9669b 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,5 +1,5 @@ -import { default as npm2yarn } from "@docusaurus/remark-plugin-npm2yarn"; -import { themes as prismThemes } from "prism-react-renderer"; +import {default as npm2yarn} from "@docusaurus/remark-plugin-npm2yarn"; +import {themes as prismThemes} from "prism-react-renderer"; const remarkMath = require("remark-math"); const rehypeKatex = require("rehype-katex"); @@ -9,134 +9,134 @@ require("dotenv").config(); /** @type {import('@docusaurus/types').Config} */ const config = { - title: "CodeHarborHub", - tagline: "A place to learn and grow", - favicon: "img/favicon_io/favicon.ico", - url: process.env.URL || "https://codeharborhub.github.io/", - baseUrl: "/", - customFields: { - admin: "Ajay Dhangar", - superman: "Shivay", - serviceId: process.env.EMAILJS_SERVICE_ID, - templateId: process.env.EMAILJS_TEMPLATE_ID, - userId: process.env.EMAILJS_USER_ID, - emailService: process.env.EMAIL_SERVICE, + title : "CodeHarborHub", + tagline : "A place to learn and grow", + favicon : "img/favicon_io/favicon.ico", + url : process.env.URL || "https://codeharborhub.github.io/", + baseUrl : "/", + customFields : { + admin : "Ajay Dhangar", + superman : "Shivay", + serviceId : process.env.EMAILJS_SERVICE_ID, + templateId : process.env.EMAILJS_TEMPLATE_ID, + userId : process.env.EMAILJS_USER_ID, + emailService : process.env.EMAIL_SERVICE, }, - organizationName: "codeharborhub", - projectName: "codeharborhub.github.io", + organizationName : "codeharborhub", + projectName : "codeharborhub.github.io", - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", + onBrokenLinks : "throw", + onBrokenMarkdownLinks : "warn", - presets: [ + presets : [ [ "@docusaurus/preset-classic", /** @type {import('@docusaurus/preset-classic').Options} */ ({ - debug: true, - docs: { - path: "docs", - sidebarPath: "sidebars.js", - numberPrefixParser: false, - showLastUpdateAuthor: true, - showLastUpdateTime: true, - admonitions: { - keywords: ["my-custom-admonition"], - extendDefaults: true, + debug : true, + docs : { + path : "docs", + sidebarPath : "sidebars.js", + numberPrefixParser : false, + showLastUpdateAuthor : true, + showLastUpdateTime : true, + admonitions : { + keywords : [ "my-custom-admonition" ], + extendDefaults : true, }, - editUrl: - "https://github.com/codeharborhub/codeharborhub.github.io/edit/main/", - remarkPlugins: [remarkMath], - rehypePlugins: [rehypeKatex], + editUrl : + "https://github.com/codeharborhub/codeharborhub.github.io/edit/main/", + remarkPlugins : [ remarkMath ], + rehypePlugins : [ rehypeKatex ], }, - pages: { - remarkPlugins: [npm2yarn], + pages : { + remarkPlugins : [ npm2yarn ], }, - blog: { - showReadingTime: true, - editUrl: - "https://github.com/codeharborhub/codeharborhub.github.io/edit/main/", - remarkPlugins: [[npm2yarn, { converters: ["pnpm"] }]], + blog : { + showReadingTime : true, + editUrl : + "https://github.com/codeharborhub/codeharborhub.github.io/edit/main/", + remarkPlugins : [ [ npm2yarn, {converters : [ "pnpm" ]} ] ], }, - theme: { - customCss: "./src/css/custom.css", + theme : { + customCss : "./src/css/custom.css", }, }), ], ], - stylesheets: [ + stylesheets : [ { - href: "https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css", - type: "text/css", - integrity: - "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM", - crossorigin: "anonymous", + href : "https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css", + type : "text/css", + integrity : + "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM", + crossorigin : "anonymous", }, ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - image: "img/nav-logo.jpg", - announcementBar: { - id: "announcementBar", - content: - '🔗 Check out our latest post: Docusaurus 3.5 Released! Like, comment, and share! 🚀', - isCloseable: true, - backgroundColor: "var(--ifm-color-primary)", - }, - - metadata: [ - { - name: "keywords", - content: - "CodeHarborHub, Docs, Tutorials, Courses, DSA, Problems, Solutions, Showcase, Community, Blog, Web Dev, Live Editor, Quiz, Tags, Donate, Careers, Team, GitHub, Products, LinkedIn, YouTube, Discord, Twitter, Privacy Policy, Terms of Service, Code of Conduct, Cookie Policy, Licensing, Web Development, React, JavaScript, Python, Java, Tailwind CSS, CPP, NextJs, MATLAB, Julia, HTML, CSS, TypeScript, DSA, Data Structures, Algorithms, Competitive Programming", - }, - { name: "twitter:card", content: "summary_large_image" }, - { name: "twitter:site", content: "@CodesWithAjay" }, - { name: "twitter:creator", content: "@CodesWithAjay" }, - { property: "og:type", content: "website" }, - { property: "og:site_name", content: "CodeHarborHub" }, - { - property: "og:title", - content: "CodeHarborHub - A place to learn and grow", - }, - { - property: "og:description", - content: - "CodeHarborHub is a place to learn and grow. We provide accessible and comprehensive educational resources to learners of all levels, from beginners to advanced professionals.", - }, - { - property: "og:image", - content: "https://codeharborhub.github.io/img/nav-logo.jpg", + themeConfig : + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + image : "img/nav-logo.jpg", + announcementBar : { + id : "announcementBar", + content : + '🔗 Check out our latest post: Docusaurus 3.5 Released! Like, comment, and share! 🚀', + isCloseable : true, + backgroundColor : "var(--ifm-color-primary)", }, - { property: "og:url", content: "https://codeharborhub.github.io" }, - ], - algolia: { - apiKey: "2c1a3331ebff51f76d2f247323ee4ba4", - indexName: "code-harbor-hub", - appId: "M9BCMBK1PH", - contextualSearch: false, - }, + metadata : [ + { + name : "keywords", + content : + "CodeHarborHub, Docs, Tutorials, Courses, DSA, Problems, Solutions, Showcase, Community, Blog, Web Dev, Live Editor, Quiz, Tags, Donate, Careers, Team, GitHub, Products, LinkedIn, YouTube, Discord, Twitter, Privacy Policy, Terms of Service, Code of Conduct, Cookie Policy, Licensing, Web Development, React, JavaScript, Python, Java, Tailwind CSS, CPP, NextJs, MATLAB, Julia, HTML, CSS, TypeScript, DSA, Data Structures, Algorithms, Competitive Programming", + }, + {name : "twitter:card", content : "summary_large_image"}, + {name : "twitter:site", content : "@CodesWithAjay"}, + {name : "twitter:creator", content : "@CodesWithAjay"}, + {property : "og:type", content : "website"}, + {property : "og:site_name", content : "CodeHarborHub"}, + { + property : "og:title", + content : "CodeHarborHub - A place to learn and grow", + }, + { + property : "og:description", + content : + "CodeHarborHub is a place to learn and grow. We provide accessible and comprehensive educational resources to learners of all levels, from beginners to advanced professionals.", + }, + { + property : "og:image", + content : "https://codeharborhub.github.io/img/nav-logo.jpg", + }, + {property : "og:url", content : "https://codeharborhub.github.io"}, + ], - navbar: { - title: "CodeHarborHub", - logo: { - alt: "CodeHarborHub Logo", - src: "img/nav-logo.jpg", + algolia : { + apiKey : "2c1a3331ebff51f76d2f247323ee4ba4", + indexName : "code-harbor-hub", + appId : "M9BCMBK1PH", + contextualSearch : false, }, - items: [ - { - type: "dropdown", - html: '📚 Docs', - position: "left", - items: [ - { - type: "html", - value: `
    Onions2.41yes
    + +## Conclusion + +In this tutorial, we learned about arrays in data structures and algorithms. We learned how to declare an array, access an array, update an array, find the length of an array, iterate through an array, and find the maximum and minimum elements in an array. Arrays are an important data structure that is used in many algorithms and data structures. \ No newline at end of file diff --git a/docs/dsa/arrays/arrays-insertionsort.md b/docs/dsa/arrays/arrays-insertionsort.md new file mode 100644 index 000000000..02eeecee6 --- /dev/null +++ b/docs/dsa/arrays/arrays-insertionsort.md @@ -0,0 +1,168 @@ +--- +id: arrays-insertionsort +title: Arrays - Insertion Sort +sidebar_label: Insertion Sort +sidebar_position: 4 +description: "Insertion Sort is a simple sorting algorithm that builds the final sorted array one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort." +tags: [dsa, arrays, sorting, insertion-sort, sorting-algorithms] +--- + +**Insertion Sort** is a simple sorting algorithm that builds the final sorted array one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. + +However, insertion sort provides several advantages: + +- **Simple implementation:** The code implementation of insertion sort is simple and easy to understand. +- **Efficient for small data sets:** Insertion sort is efficient for small data sets. +- **Adaptive:** It is adaptive, meaning it is efficient for data sets that are already substantially sorted. +- **Stable:** It is a stable sorting algorithm, meaning it preserves the relative order of equal elements. +- **In-place:** It requires only a constant amount of additional memory space. +- **Online:** It can sort a list as it receives it. +- **More efficient in practice:** It is more efficient in practice than other quadratic-time sorting algorithms like bubble sort and selection sort. +- **Simple to code:** It is simple to code and implement. + + + +
    + +The insertion sort algorithm takes value at a time from the unsorted part and places it in its correct position in the sorted part. The sorted part is built from left to right, and the unsorted part is on the right side of the array. The algorithm works by shifting the elements in the sorted part that are greater than the current element to the right, creating space for the current element to be inserted. + +:::info Key Points +- **Type:** Sorting Algorithm +- **Time Complexity:** + - **Best Case:** *O(n)* + - **Average Case:** *O(n2)* + - **Worst Case:** *O(n2)* +- **Space Complexity:** *O(1)* +- **Stable:** Yes +- **In-Place:** Yes +- **Online:** Yes +- **Adaptive:** Yes +- **Comparison Sort:** Yes +- **Suitable for:** Small data sets, partially sorted data sets +- **Efficient for:** Small data sets +- **Not efficient for:** Large data sets +- **Simple to code:** Yes +- **Efficient in practice:** Yes + +::: + +:::tip Real-World Analogy +Insertion sort can be compared to sorting a deck of cards. You start with an empty hand and pick one card at a time from the deck. You then insert the card into its correct position in your hand, shifting the other cards if necessary. This process is repeated until all the cards are sorted in your hand. + +## How Insertion Sort Works? + +Let's understand how the Insertion Sort algorithm works with an example: + +Consider an array `arr = [12, 11, 13, 5, 6]` that we want to sort in ascending order using the Insertion Sort algorithm. + +1. **Initial Array:** `[12, 11, 13, 5, 6]` +2. **Step 1:** Start from the second element (index 1) and compare it with the previous element. + - Compare `11` with `12`. Since `11` is smaller, swap them. + - **Array after Step 1:** `[11, 12, 13, 5, 6]` + - The array is partially sorted from index 0 to 1. + - The current array looks like this: `[11, 12, 13, 5, 6]` + - The sorted part is `[11, 12]`, and the unsorted part is `[13, 5, 6]`. + - The key element is `13`. + - The key element is compared with the elements in the sorted part. + - Since `13` is greater than `12`, no swap is needed. + - The array remains the same: `[11, 12, 13, 5, 6]` + - The array is partially sorted from index 0 to 2. + - The current array looks like this: `[11, 12, 13, 5, 6]` + - The sorted part is `[11, 12, 13]`, and the unsorted part is `[5, 6]`. + - The key element is `5`. + - The key element is compared with the elements in the sorted part. + - Since `5` is smaller than `13`, `12`, and `11`, it is moved to the left. + - **Array after Step 1:** `[5, 11, 12, 13, 6]` + - The array is partially sorted from index 0 to 3. + - The current array looks like this: `[5, 11, 12, 13, 6]` + - The sorted part is `[5, 11, 12, 13]`, and the unsorted part is `[6]`. + - The key element is `6`. + - The key element is compared with the elements in the sorted part. + - Since `6` is smaller than `13`, it is moved to the left. + - Since `6` is smaller than `12`, it is moved to the left. + - Since `6` is smaller than `11`, it is moved to the left. + - **Array after Step 1:** `[5, 6, 11, 12, 13]` + - The array is now sorted. + - The sorted array is `[5, 6, 11, 12, 13]`. + +3. **Final Sorted Array:** `[5, 6, 11, 12, 13]` +4. The array is now sorted in ascending order using the Insertion Sort algorithm. +5. The time complexity of the Insertion Sort algorithm is ***O(n2)*** in the worst-case scenario. +6. The space complexity of the Insertion Sort algorithm is ***O(1)***. +7. The Insertion Sort algorithm is efficient for small data sets and partially sorted data sets. + +## Visualization + +You can visualize the Insertion Sort algorithm using the following animation: + +
    + +
    + +You can select the Insertion Sort algorithm from the drop-down menu and visualize how it works on different arrays. + +::: + +## Algorithm + +The insertion sort algorithm works as follows: + +1. Start from the second element (index 1) and compare it with the previous elements. +2. If the current element is smaller than the previous element, swap them. +3. Repeat this process until the current element is greater than the previous element or until the first element is reached. +4. Move to the next element and repeat the process. +5. Continue this process until the entire array is sorted. +6. The array is now sorted. +7. The time complexity of the insertion sort algorithm is ***O(n2)*** in the worst-case scenario. +8. The space complexity of the insertion sort algorithm is ***O(1)***. + +## Pseudocode + +```plaintext +1. for i = 1 to n-1 +2. key = arr[i] +3. j = i - 1 +4. while j >= 0 and arr[j] > key +5. arr[j + 1] = arr[j] +6. j = j - 1 +7. arr[j + 1] = key +``` + +## Implementation + +Here's the implementation of the Insertion Sort algorithm in JavaScript: + +```javascript title="Insertion Sort" +function insertionSort(arr) { + const n = arr.length; + for (let i = 1; i < n; i++) { + let key = arr[i]; + let j = i - 1; + while (j >= 0 && arr[j] > key) { + arr[j + 1] = arr[j]; + j = j - 1; + } + arr[j + 1] = key; + } + return arr; +} + +const arr = [12, 11, 13, 5, 6]; +console.log(insertionSort(arr)); // Output: [5, 6, 11, 12, 13] +``` + +## Complexity Analysis + +The time complexity of the Insertion Sort algorithm is ***O(n2)*** in the worst-case scenario when the array is sorted in reverse order. The best-case time complexity is ***O(n)*** when the array is already sorted. + +The space complexity of the Insertion Sort algorithm is ***O(1)*** since it requires only a constant amount of additional memory space. + +## References + +- [Wikipedia - Insertion Sort](https://en.wikipedia.org/wiki/Insertion_sort) +- [GeeksforGeeks - Insertion Sort](https://www.geeksforgeeks.org/insertion-sort/) +- [Programiz - Insertion Sort](https://www.programiz.com/dsa/insertion-sort) +- [Khan Academy - Insertion Sort](https://www.khanacademy.org/computing/computer-science/algorithms/insertion-sort/a/insertion-sort) +- [TutorialsPoint - Insertion Sort](https://www.tutorialspoint.com/data_structures_algorithms/insertion_sort_algorithm.htm) +- [StudyTonight - Insertion Sort](https://www.studytonight.com/data-structures/insertion-sorting) +- [Insertion Sort Visualization](https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html) \ No newline at end of file diff --git a/docs/dsa/arrays/arrays-selectionsort.md b/docs/dsa/arrays/arrays-selectionsort.md new file mode 100644 index 000000000..706040c34 --- /dev/null +++ b/docs/dsa/arrays/arrays-selectionsort.md @@ -0,0 +1,152 @@ +--- +id: arrays-selectionsort-in-dsa +title: Arrays - Selection Sort in DSA +sidebar_label: Selection Sort +sidebar_position: 3 +description: "Selection Sort is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray." +tags: [dsa, arrays, sorting, selection-sort, algorithm of selection-sort, pseudocode of selection-sort, complexity of selection-sort, example of selection-sort, live example of selection-sort, explanation of selection-sort, quiz of selection-sort, conclusion of selection-sort] +--- + +**Selection Sort** is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. + + + +## Algorithm + +1. The selection sort algorithm divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. +2. The algorithm repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. +3. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. +4. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. +5. The array is sorted. +6. Exit. +7. The time complexity of the selection sort is O(n^2). +8. The space complexity of the selection sort is O(1). + +## Pseudocode + +```plaintext title="Selection Sort" +procedure selectionSort( A : list of sortable items ) + n = length(A) + for i = 0 to n-1 inclusive do + min = i + for j = i+1 to n inclusive do + if A[j] < A[min] then + min = j + end if + end for + swap(A[i], A[min]) + end for +end procedure +``` + +## Diagram + + +## Complexity + +The time complexity of the selection sort is O(n^2). The space complexity of the selection sort is O(1). + +## Example + +```js title="Selection Sort" +function selectionSort(arr) { + let n = arr.length; + for (let i = 0; i < n - 1; i++) { + let min = i; + for (let j = i + 1; j < n; j++) { + if (arr[j] < arr[min]) { + min = j; + } + } + let temp = arr[i]; + arr[i] = arr[min]; + arr[min] = temp; + } + return arr; +} + +const arr = [64, 25, 12, 22, 11]; + +console.log(selectionSort(arr)); // [11, 12, 22, 25, 64] +``` + +## Practice Problems + +- [Leetcode - Sort an Array](https://leetcode.com/problems/sort-an-array/) +- [HackerRank - The Full Counting Sort](https://www.hackerrank.com/challenges/countingsort4/problem) +- [Codeforces - Sort the Array](https://codeforces.com/problemset/problem/451/B) +- [CodeChef - Turbo Sort](https://www.codechef.com/problems/TSORT) + +## Quiz + +1. What is the time complexity of the selection sort? + - A) O(n) + - B) O(n^2) + - C) O(n log n) + - D) O(1) + - Correct Answer: B + +2. What is the space complexity of the selection sort? + - A) O(n) + - B) O(n^2) + - C) O(n log n) + - D) O(1) + - Correct Answer: D +- Explanation: The space complexity of the selection sort is O(1). + +3. What is the best-case time complexity of the selection sort? + - A) O(n) + - B) O(n^2) + - C) O(n log n) + - D) O(1) + - Correct Answer: B + +4. What is the worst-case time complexity of the selection sort? + - A) O(n) + - B) O(n^2) + - C) O(n log n) + - D) O(1) + - Correct Answer: B + +5. Is the selection sort stable? + - A) Yes + - B) No + - Correct Answer: A + + +:::info Try it yourself + +```js live +function selectionSort() { + let arr = [64, 25, 12, 22, 11]; + let n = arr.length; + for (let i = 0; i < n - 1; i++) { + let min = i; + for (let j = i + 1; j < n; j++) { + if (arr[j] < arr[min]) { + min = j; + } + } + let temp = arr[i]; + arr[i] = arr[min]; + arr[min] = temp; + } + return ( +
    +

    Selection Sort

    +

    Array: [64, 25, 12, 22, 11]

    +

    + Sorted Array: [{arr.join(", ")}] +

    +
    + ) +} +``` + +In the above example, we have an array of numbers `[64, 25, 12, 22, 11]`. We are using the selection sort algorithm to sort the array in ascending order. The selection sort algorithm divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. The sorted array is `[11, 12, 22, 25, 64]`. The time complexity of the selection sort is O(n^2) and the space complexity is O(1). + +::: + +## Conclusion + +In this article, we learned about the selection sort algorithm. Selection sort is an in-place comparison sorting algorithm that divides the input list into two parts: the sublist of items already sorted and the sublist of items remaining to be sorted. It repeatedly finds the minimum element from the unsorted part and puts it at the beginning of the unsorted part. The algorithm maintains two subarrays in a given array. The subarray which is already sorted and the remaining subarray which is unsorted. In every iteration of selection sort, the minimum element from the unsorted subarray is picked and moved to the sorted subarray. The time complexity of the selection sort is O(n^2) and the space complexity is O(1). Selection sort is a stable sorting algorithm. \ No newline at end of file diff --git a/docs/dsa/arrays/bucket-sort.md b/docs/dsa/arrays/bucket-sort.md new file mode 100644 index 000000000..8067ac6d2 --- /dev/null +++ b/docs/dsa/arrays/bucket-sort.md @@ -0,0 +1,204 @@ +--- +id: bucket-sort +title: Bucket sort +sidebar_label: Bucket sort +tags: + - DSA + - Python + - C++ + - Java + - Sorting + +description: "Thsi page containes Bucket Sort, with codes in python, java and c++ " +--- + +### Introduction to Bucket Sort + +Bucket sort is a comparison sorting algorithm that distributes elements into a number of "buckets." Each bucket is then sorted individually, either using another sorting algorithm or recursively applying the bucket sort. Finally, the sorted buckets are combined to form the final sorted array. Bucket sort is particularly useful for uniformly distributed data. + +### Steps of Bucket Sort + +1. **Create Buckets**: Initialize an empty array of buckets. +2. **Distribute Elements**: Distribute the elements of the input array into the appropriate buckets. +3. **Sort Buckets**: Sort each bucket individually. +4. **Concatenate Buckets**: Concatenate all sorted buckets to form the final sorted array. + +### Pseudocode + +```text +function bucketSort(array, bucketSize): + if length(array) == 0: + return array + + // Determine minimum and maximum values + minValue = min(array) + maxValue = max(array) + + // Initialize buckets + bucketCount = floor((maxValue - minValue) / bucketSize) + 1 + buckets = array of empty lists of size bucketCount + + // Distribute input array values into buckets + for i from 0 to length(array) - 1: + bucketIndex = floor((array[i] - minValue) / bucketSize) + append array[i] to buckets[bucketIndex] + + // Sort each bucket and concatenate them + sortedArray = [] + for i from 0 to bucketCount - 1: + sort(buckets[i]) // You can use any sorting algorithm + append buckets[i] to sortedArray + + return sortedArray +``` + +### Implementation in Python, C++, and Java + +#### Python Implementation + +```python +def bucket_sort(numbers, size=5): + if len(numbers) == 0: + return numbers + + # Determine minimum and maximum values + min_value = min(numbers) + max_value = max(numbers) + + # Initialize buckets + bucket_count = (max_value - min_value) // size + 1 + buckets = [[] for _ in range(bucket_count)] + + # Distribute input array values into buckets + for number in numbers: + bucket_index = (number - min_value) // size + buckets[bucket_index].append(number) + + # Sort each bucket and concatenate them + sorted_numbers = [] + for bucket in buckets: + sorted_numbers.extend(sorted(bucket)) + + return sorted_numbers + +# Example usage +data = [42, 32, 33, 52, 37, 47, 51] +sorted_data = bucket_sort(data) +print(sorted_data) # Output: [32, 33, 37, 42, 47, 51, 52] +``` + +#### C++ Implementation + +```cpp +#include +#include +#include +using namespace std; + +void bucketSort(vector& nums, int bucketSize) { + if (nums.empty()) + return; + + // Determine minimum and maximum values + int minValue = *min_element(nums.begin(), nums.end()); + int maxValue = *max_element(nums.begin(), nums.end()); + + // Initialize buckets + int numBuckets = (maxValue - minValue) / bucketSize + 1; + vector> buckets(numBuckets); + + // Distribute input array values into buckets + for (int num : nums) { + int bucketIndex = (num - minValue) / bucketSize; + buckets[bucketIndex].push_back(num); + } + + // Sort each bucket and concatenate them + nums.clear(); + for (auto& bucket : buckets) { + sort(bucket.begin(), bucket.end()); + nums.insert(nums.end(), bucket.begin(), bucket.end()); + } +} + +// Example usage +int main() { + vector data = {42, 32, 33, 52, 37, 47, 51}; + bucketSort(data, 5); + for (int num : data) { + cout << num << " "; + } + // Output: 32 33 37 42 47 51 52 + return 0; +} +``` + +#### Java Implementation + +```java +import java.util.ArrayList; +import java.util.Collections; + +public class BucketSort { + public static void bucketSort(int[] array, int bucketSize) { + if (array.length == 0) + return; + + // Determine minimum and maximum values + int minValue = array[0]; + int maxValue = array[0]; + for (int num : array) { + if (num < minValue) + minValue = num; + else if (num > maxValue) + maxValue = num; + } + + // Initialize buckets + int bucketCount = (maxValue - minValue) / bucketSize + 1; + ArrayList> buckets = new ArrayList<>(bucketCount); + for (int i = 0; i < bucketCount; i++) { + buckets.add(new ArrayList()); + } + + // Distribute input array values into buckets + for (int num : array) { + int bucketIndex = (num - minValue) / bucketSize; + buckets.get(bucketIndex).add(num); + } + + // Sort each bucket and concatenate them + int currentIndex = 0; + for (ArrayList bucket : buckets) { + Collections.sort(bucket); + for (int num : bucket) { + array[currentIndex++] = num; + } + } + } + + // Example usage + public static void main(String[] args) { + int[] data = {42, 32, 33, 52, 37, 47, 51}; + bucketSort(data, 5); + for (int num : data) { + System.out.print(num + " "); + } + // Output: 32 33 37 42 47 51 52 + } +} +``` + +### Complexity + +- **Time Complexity**: + + - Best Case: $O(n + k)$, where $n$ is the number of elements and $k$ is the number of buckets. + - Average Case: $O(n + k + n \log(\frac{n}{k}))$ + - Worst Case: $O(n^2)$, when all elements are placed in one bucket and a slow sorting algorithm (like bubble sort) is used within buckets. + +- **Space Complexity**: $O(n + k)$, for the input array and the buckets. + +### Conclusion + +Bucket sort is efficient for sorting uniformly distributed data and can achieve linear time complexity in the best case. However, it may degrade to quadratic time complexity in the worst case if elements are not uniformly distributed. It's essential to choose an appropriate bucket size and secondary sorting algorithm for optimal performance. By understanding its structure and implementation, you can effectively use bucket sort for various sorting tasks. diff --git a/docs/dsa/arrays/radix-sort.md b/docs/dsa/arrays/radix-sort.md new file mode 100644 index 000000000..a360eed45 --- /dev/null +++ b/docs/dsa/arrays/radix-sort.md @@ -0,0 +1,261 @@ +--- +id: radix-sort +title: Radix sort +sidebar_label: Radix Sort +tags: + - DSA + - Python + - C++ + - Java + - Sorting + +description: "This page explains Radix sort, with code implementations and resources for further learning." +--- + +# Radix Sort + +### Introduction to Radix Sort + +Radix sort is a non-comparative integer sorting algorithm. It sorts integers by processing individual digits. Starting from the least significant digit (LSD) to the most significant digit (MSD), it uses a stable subroutine sort (like counting sort) to handle the individual digits. The algorithm is efficient for sorting numbers with a fixed number of digits and works well when the range of digits is not excessively large. + +### Steps of Radix Sort (Pseudocode Steps) + +1. **Find the maximum number** to determine the number of digits. +2. **Initialize**: Set up a loop to process each digit from the least significant to the most significant. +3. **Digit by digit sorting**: + - Use a stable sort (e.g., counting sort) to sort based on the current digit. +4. **Repeat** until all digits are processed. + +### Example + +To perform radix sort on the array [170, 45, 75, 90, 802, 24, 2, 66], we follow these steps: +![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164537/Radix-Sort.png) + +Step 1: Find the largest element in the array, which is 802. It has three digits, so we will iterate three times, once for each significant place. + +Step 2: Sort the elements based on the unit place digits (X=0). We use a stable sorting technique, such as counting sort, to sort the digits at each significant place. + +Sorting based on the unit place: + +Perform counting sort on the array based on the unit place digits. +The sorted array based on the unit place is [170, 90, 802, 2, 24, 45, 75, 66]. + +![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164536/Radix-Sort--1.png) + +Step 3: Sort the elements based on the tens place digits. + +Sorting based on the tens place: + +Perform counting sort on the array based on the tens place digits. +The sorted array based on the tens place is [802, 2, 24, 45, 66, 170, 75, 90]. + +![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164535/Radix-Sort--2.png) + +Step 4: Sort the elements based on the hundreds place digits. + +Sorting based on the hundreds place: + +Perform counting sort on the array based on the hundreds place digits. +The sorted array based on the hundreds place is [2, 24, 45, 66, 75, 90, 170, 802]. + +![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164535/Radix-Sort--3.png) + +Step 5: The array is now sorted in ascending order. + +The final sorted array using radix sort is [2, 24, 45, 66, 75, 90, 170, 802]. + +![Example from GFG](https://media.geeksforgeeks.org/wp-content/uploads/20230609164534/Radix-Sort--4.png) + +### Pseudocode for Radix Sort + +```text +function radixSort(array): + maxNumber = findMax(array) + numberOfDigits = countDigits(maxNumber) + + for digit in 1 to numberOfDigits: + countingSortByDigit(array, digit) + +function findMax(array): + maxNumber = array[0] + for number in array: + if number > maxNumber: + maxNumber = number + return maxNumber + +function countDigits(number): + count = 0 + while number != 0: + number = number // 10 + count += 1 + return count + +function countingSortByDigit(array, digit): + count = array of size 10 initialized to 0 + output = array of same size as input array + + # Count occurrences of each digit + for number in array: + digitValue = (number // 10^(digit - 1)) % 10 + count[digitValue] += 1 + + # Change count[i] so that count[i] contains the position of this digit in output + for i from 1 to 9: + count[i] += count[i - 1] + + # Build the output array + for i from length(array) - 1 to 0: + digitValue = (array[i] // 10^(digit - 1)) % 10 + output[count[digitValue] - 1] = array[i] + count[digitValue] -= 1 + + # Copy the output array to the input array + for i from 0 to length(array) - 1: + array[i] = output[i] +``` + +### Radix Sort Implementation in Python, C++, and Java + +#### Python + +```python +def radix_sort(array): + def counting_sort_by_digit(array, digit): + count = [0] * 10 + output = [0] * len(array) + + for number in array: + digit_value = (number // 10**(digit - 1)) % 10 + count[digit_value] += 1 + + for i in range(1, 10): + count[i] += count[i - 1] + + for i in range(len(array) - 1, -1, -1): + digit_value = (array[i] // 10**(digit - 1)) % 10 + output[count[digit_value] - 1] = array[i] + count[digit_value] -= 1 + + for i in range(len(array)): + array[i] = output[i] + + max_number = max(array) + number_of_digits = len(str(max_number)) + + for digit in range(1, number_of_digits + 1): + counting_sort_by_digit(array, digit) + +# Example usage +arr = [170, 45, 75, 90, 802, 24, 2, 66] +radix_sort(arr) +print(arr) +``` + +#### C++ + +```cpp +#include +#include +#include + +void countingSortByDigit(std::vector& array, int digit) { + int size = array.size(); + std::vector output(size); + int count[10] = {0}; + + for (int i = 0; i < size; i++) { + int digitValue = (array[i] / digit) % 10; + count[digitValue]++; + } + + for (int i = 1; i < 10; i++) { + count[i] += count[i - 1]; + } + + for (int i = size - 1; i >= 0; i--) { + int digitValue = (array[i] / digit) % 10; + output[count[digitValue] - 1] = array[i]; + count[digitValue]--; + } + + for (int i = 0; i < size; i++) { + array[i] = output[i]; + } +} + +void radixSort(std::vector& array) { + int maxNumber = *max_element(array.begin(), array.end()); + for (int digit = 1; maxNumber / digit > 0; digit *= 10) { + countingSortByDigit(array, digit); + } +} + +// Example usage +int main() { + std::vector arr = {170, 45, 75, 90, 802, 24, 2, 66}; + radixSort(arr); + for (int num : arr) { + std::cout << num << " "; + } + return 0; +} +``` + +#### Java + +```java +import java.util.Arrays; + +public class RadixSort { + + public static void radixSort(int[] array) { + int maxNumber = Arrays.stream(array).max().getAsInt(); + for (int digit = 1; maxNumber / digit > 0; digit *= 10) { + countingSortByDigit(array, digit); + } + } + + private static void countingSortByDigit(int[] array, int digit) { + int size = array.length; + int[] output = new int[size]; + int[] count = new int[10]; + + for (int i = 0; i < size; i++) { + int digitValue = (array[i] / digit) % 10; + count[digitValue]++; + } + + for (int i = 1; i < 10; i++) { + count[i] += count[i - 1]; + } + + for (int i = size - 1; i >= 0; i--) { + int digitValue = (array[i] / digit) % 10; + output[count[digitValue] - 1] = array[i]; + count[digitValue]--; + } + + for (int i = 0; i < size; i++) { + array[i] = output[i]; + } + } + + public static void main(String[] args) { + int[] arr = {170, 45, 75, 90, 802, 24, 2, 66}; + radixSort(arr); + System.out.println(Arrays.toString(arr)); + } +} +``` + +### Complexity of Radix Sort + +- **Time Complexity**: $O(d⋅(n+k))$ + - $d$: Number of digits in the largest number. + - $n$: Number of elements in the array. + - $k$: Range of the digits for decimal system, $k = 10.$ +- **Space Complexity**: $O(n + k)$ + +### Conclusion + +Radix sort is a powerful sorting algorithm for integers or fixed-length strings. Its efficiency and non-comparative nature make it a valuable tool for specific use cases, especially where the number of digits or characters is limited. Understanding and implementing radix sort can significantly enhance the performance of sorting operations in such scenarios. diff --git a/docs/dsa/basic-concepts/_category_.json b/docs/dsa/basic-concepts/_category_.json new file mode 100644 index 000000000..b810bad9b --- /dev/null +++ b/docs/dsa/basic-concepts/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Basic Concepts", + "position": 5, + "link": { + "type": "generated-index", + "description": "Basic Concepts of Data Structures and Algorithms." + } + } \ No newline at end of file diff --git a/docs/dsa/basic-concepts/image-1.png b/docs/dsa/basic-concepts/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..cd127aab3647d3b8a854a7fb819e59273140fa37 GIT binary patch literal 12924 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 PPyteqRhFrgG79`3igf%< literal 0 HcmV?d00001 diff --git a/docs/dsa/basic-concepts/image.png b/docs/dsa/basic-concepts/image.png new file mode 100644 index 0000000000000000000000000000000000000000..8a263334fd992286c3d518de34ab71cf48d0de6e GIT binary patch literal 6623 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 literal 0 HcmV?d00001 diff --git a/docs/dsa/basic-concepts/space-complexity.md b/docs/dsa/basic-concepts/space-complexity.md new file mode 100644 index 000000000..8bf46a6ea --- /dev/null +++ b/docs/dsa/basic-concepts/space-complexity.md @@ -0,0 +1,212 @@ +--- +id: space-complexity +title: Space Complexity +sidebar_label: Space Complexity +sidebar_position: 2 +description: "Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle." +tags: [Space Complexity, Big O Notation, Memory, Algorithm, Complexity Analysis, Data Structure, DSA, JavaScript, Java, Python, C, C++, Space Complexity Example, Space Complexity Calculation, Space Complexity Analysis, Space Complexity Explanation, Space Complexity Conclusion, Space Complexity Importance, Space Complexity Formula, Space Complexity Constant Space, Space Complexity Auxiliary Space, Space Complexity Example, Space Complexity Program, Space Complexity Code] +--- + +Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle. + +## Why is Space Complexity important? + +Space complexity is important because the memory that is allocated to the program is limited. If the program uses more memory than the available memory, the program will crash. Therefore, it is important to know the space complexity of the algorithm. + +## How to calculate Space Complexity? + +Space complexity is calculated by counting the amount of memory space used by the algorithm. It is calculated by counting the amount of memory space used by the algorithm as a function of the size of the input to the problem. + +## Example + +```js title="Space Complexity" +function sumOfN(n) { + let sum = 0; + for (let i = 1; i <= n; i++) { + sum += i; + } + return sum; +} +``` + +In the above example, the space complexity of the algorithm is O(1) because the algorithm uses a constant amount of memory space. + +## Example of Space Complexity + +1. Write a program to fine maximum and minimum element in an array. + + + + + ```js {6,9,12} + function findMaxMin(arr) { + let max = arr[0]; + let min = arr[0]; + for (let i = 1; i < arr.length; i++) { + if (arr[i] > max) { + max = arr[i]; + } + if (arr[i] < min) { + min = arr[i]; + } + } + return { max, min }; + } + + const arr = [2, 5, 1, 20, 10]; + console.log(findMaxMin(arr)); // { max: 20, min: 1 } + ``` + + + + + ```java + public class Main { + public static void main(String[] args) { + int[] arr = {2, 5, 1, 20, 10}; + System.out.println(findMaxMin(arr)); // { max: 20, min: 1 } + } + + public static Map findMaxMin(int[] arr) { + int max = arr[0]; + int min = arr[0]; + for (int i = 1; i < arr.length; i++) { + if (arr[i] > max) { + max = arr[i]; + } + if (arr[i] < min) { + min = arr[i]; + } + } + Map result = new HashMap<>(); + result.put("max", max); + result.put("min", min); + return result; + } + } + ``` + + + + + ```python + def find_max_min(arr): + max = arr[0] + min = arr[0] + for i in range(1, len(arr)): + if arr[i] > max: + max = arr[i] + if arr[i] < min: + min = arr[i] + return {"max": max, "min": min} + + arr = [2, 5, 1, 20, 10] + print(find_max_min(arr)) # { max: 20, min: 1 } + ``` + + + + + ```c + #include + + struct MaxMin { + int max; + int min; + }; + + struct MaxMin findMaxMin(int arr[], int n) { + struct MaxMin result; + result.max = arr[0]; + result.min = arr[0]; + for (int i = 1; i < n; i++) { + if (arr[i] > result.max) { + result.max = arr[i]; + } + if (arr[i] < result.min) { + result.min = arr[i]; + } + } + return result; + } + + int main() { + int arr[] = {2, 5, 1, 20, 10}; + struct MaxMin result = findMaxMin(arr, 5); + printf("{ max: %d, min: %d }\n", result.max, result.min); // { max: 20, min: 1 } + return 0; + } + ``` + + + + + ```cpp + #include + #include + #include + + std::map findMaxMin(std::vector arr) { + int max = arr[0]; + int min = arr[0]; + for (int i = 1; i < arr.size(); i++) { + if (arr[i] > max) { + max = arr[i]; + } + if (arr[i] < min) { + min = arr[i]; + } + } + std::map result; + result["max"] = max; + result["min"] = min; + return result; + } + + int main() { + std::vector arr = {2, 5, 1, 20, 10}; + std::map result = findMaxMin(arr); + std::cout << "{ max: " << result["max"] << ", min: " << result["min"] << " }\n"; // { max: 20, min: 1 } + return 0; + } + ``` + + + + +In the above example, the space complexity of the algorithm is O(1) because the algorithm uses a constant amount of memory space. + +**Explanation:** In the above example, we are finding the maximum and minimum element in an array. We are using two variables `max` and `min` to store the maximum and minimum element in the array. We are using a constant amount of memory space to store the maximum and minimum element in the array. Therefore, the space complexity of the algorithm is O(1). + +:::info Complexity Analysis +**Farmula to calculate Space Complexity** + +Space Complexity = Constant Space + Auxiliary Space + +**Constant Space:** The amount of space used by the algorithm that is not dependent on the size of the input to the problem. It is a constant amount of memory space used by the algorithm. + +**Auxiliary Space:** The amount of space used by the algorithm that is dependent on the size of the input to the problem. It is a variable amount of memory space used by the algorithm. + +```plaintext title="Space Complexity" +Space Complexity = O(1) + O(n) = O(n) +``` + +**For Example:** + +```js title="Space Complexity" +function sumOfN(n) { + let sum = 0; // Constant Space (O(1)) + for (let i = 1; i <= n; i++) { + sum += i; // Auxiliary Space (O(n)) + } + return sum; +} +``` + +In the above example, the space complexity of the algorithm is `O(1) + O(n) = O(n)`. + +::: + +## Conclusion + +Space complexity is a measure of the amount of working storage an algorithm needs. It is a measure of the amount of memory space an algorithm needs to solve a problem as a function of the size of the input to the problem. It is the amount of memory space required by the algorithm to execute in its life cycle. \ No newline at end of file diff --git a/docs/dsa/basic-concepts/time-complexity.md b/docs/dsa/basic-concepts/time-complexity.md new file mode 100644 index 000000000..eb10b2909 --- /dev/null +++ b/docs/dsa/basic-concepts/time-complexity.md @@ -0,0 +1,306 @@ +--- +id: time-complexity +title: Time Complexity +sidebar_label: Time Complexity +sidebar_position: 1 +description: "Time Complexity is a measure of the amount of time an algorithm takes to solve a problem as a function of the size of the input to the problem. It is commonly estimated by counting the number of elementary operations performed by the algorithm, where an elementary operation takes a fixed amount of time to perform." +tags: [time complexity, big o notation, algorithm, complexity analysis, data structure, dsa, javascript, java, python, c, c++, time complexity example, time complexity calculation, time complexity analysis, time complexity explanation, time complexity conclusion, time complexity importance, time complexity formula, time complexity constant time, time complexity linear time, time complexity logarithmic time, time complexity quadratic time, time complexity exponential time, time complexity factorial time, time complexity polynomial time, time complexity sublinear time, time complexity linearithmic time, time complexity quasilinear time, time complexity superpolynomial time, time complexity subexponential time, time complexity log factorial time, time complexity exponential factorial time, time complexity exponential exponential time, time complexity exponential factorial exponential time, time complexity exponential exponential factorial time] +--- + +Time Complexity is a measure of the amount of time an algorithm takes to solve a problem as a function of the size of the input to the problem. It is commonly estimated by counting the number of elementary operations performed by the algorithm, where an elementary operation takes a fixed amount of time to perform. + +## Why is Time Complexity Important? + +Time Complexity is important because it helps us understand the efficiency of an algorithm. It allows us to compare different algorithms and choose the most efficient one for a given problem. It also helps us analyze the performance of an algorithm as the size of the input grows. + +## Common Notations for Time Complexity + +The most common notations used to represent the time complexity of an algorithm are: + +- **Big O Notation (O):** It represents the upper bound of the time complexity of an algorithm. It gives the worst-case time complexity of an algorithm. +- **Omega Notation (Ω):** It represents the lower bound of the time complexity of an algorithm. It gives the best-case time complexity of an algorithm. +- **Theta Notation (Θ):** It represents the average-case time complexity of an algorithm. It gives the tight bound of the time complexity of an algorithm. + +### Big O Notation (O) + +Big O Notation is used to represent the upper bound of the time complexity of an algorithm. It gives the worst-case time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. + +![Big O Notation](image.png) + +The Big O Notation is written as `O(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "O of f of n" or "order of f of n". + +### Omega Notation (Ω) + +Omega Notation is used to represent the lower bound of the time complexity of an algorithm. It gives the best-case time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. + +![Omega Notation](image-1.png) + +The Omega Notation is written as `Ω(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "Omega of f of n". + +### Theta Notation (Θ) + +Theta Notation is used to represent the average-case time complexity of an algorithm. It gives the tight bound of the time complexity of an algorithm. It is commonly used to analyze the performance of an algorithm as the size of the input grows. + +The Theta Notation is written as `Θ(f(n))`, where `f(n)` is a function that represents the time complexity of the algorithm. It is read as "Theta of f of n". + + +## Examples of Time Complexity + +Here are some examples of time complexity for different algorithms: + +- **Constant Time (O(1)):** An algorithm that takes the same amount of time to run, regardless of the size of the input. +- **Linear Time (O(n)):** An algorithm that takes time proportional to the size of the input. +- **Logarithmic Time (O(log n)):** An algorithm that takes time proportional to the logarithm of the size of the input. +- **Quadratic Time (O(n^2)):** An algorithm that takes time proportional to the square of the size of the input. +- **Exponential Time (O(2^n)):** An algorithm that takes time proportional to an exponential function of the size of the input. +- **Factorial Time (O(n!)):** An algorithm that takes time proportional to the factorial of the size of the input. +- **Polynomial Time (O(n^k)):** An algorithm that takes time proportional to a polynomial function of the size of the input. +- **Sublinear Time (O(log log n)):** An algorithm that takes time proportional to the logarithm of the logarithm of the size of the input. +- **Linearithmic Time (O(n log n)):** An algorithm that takes time proportional to the product of the size of the input and the logarithm of the size of the input. +- **Quasilinear Time (O(n log^k n)):** An algorithm that takes time proportional to the product of the size of the input and the logarithm of the size of the input raised to the power of k. +- **Superpolynomial Time (O(n^k)):** An algorithm that takes time proportional to a function that grows faster than any polynomial function of the size of the input. +- **Subexponential Time (O(2^poly(n))):** An algorithm that takes time proportional to a function that grows slower than any exponential function of the size of the input. +- **Log Factorial Time (O(log n!)):** An algorithm that takes time proportional to the logarithm of the factorial of the size of the input. +- **Exponential Factorial Time (O(2^n!)):** An algorithm that takes time proportional to an exponential function of the factorial of the size of the input. +- **Exponential Exponential Time (O(2^2^n)):** An algorithm that takes time proportional to an exponential function of an exponential function of the size of the input. +- **Exponential Factorial Exponential Time (O(2^n!^2^n)):** An algorithm that takes time proportional to an exponential function of the factorial of an exponential function of the size of the input. +- **Exponential Exponential Factorial Time (O(2^2^n!)):** An algorithm that takes time proportional to an exponential function of an exponential function of the factorial of the size of the input. + +## Analyzing Time Complexity + +To analyze the time complexity of an algorithm, we can follow these steps: + +1. **Count the Operations:** Count the number of elementary operations performed by the algorithm. +2. **Identify the Dominant Term:** Identify the term that grows the fastest as the size of the input grows. +3. **Express the Time Complexity:** Express the time complexity using the Big O notation. +4. **Compare with Other Algorithms:** Compare the time complexity with other algorithms to choose the most efficient one. +5. **Analyze the Best, Worst, and Average Cases:** Analyze the best-case, worst-case, and average-case time complexity of the algorithm. +6. **Optimize the Algorithm:** Optimize the algorithm to improve its time complexity if possible. +7. **Test the Algorithm:** Test the algorithm with different input sizes to verify its time complexity. +8. **Benchmark the Algorithm:** Benchmark the algorithm to measure its actual performance. +9. **Profile the Algorithm:** Profile the algorithm to identify performance bottlenecks and optimize them. +10. **Analyze the Real-World Performance:** Analyze the real-world performance of the algorithm in different environments and scenarios. +11. **Contribute:** If you have any tips to share, feel free to contribute to this section. + +## For Example + +1. Calculating sum of array elements using loop. + + + + + ```js + function sum(arr) { + let result = 0; + for (let i = 0; i < arr.length; i++) { + result += arr[i]; + } + return result; + } + const arr = [1, 2, 3, 4, 5]; + console.log(sum(arr)); // Output: 15 + ``` + + + ```py + def sum(arr): + result = 0 + for i in arr: + result += i + return result + arr = [1, 2, 3, 4, 5] + print(sum(arr)) # Output: 15 + ``` + + + ```java + class Sum { + public static void main(String args[]) { + int arr[] = {1, 2, 3, 4, 5}; + int result = 0; + for (int i = 0; i < arr.length; i++) { + result += arr[i]; + } + System.out.println(result); // Output: 15 + } + } + ``` + + + ```c + #include + int main() { + int arr[] = {1, 2, 3, 4, 5}; + int result = 0; + for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { + result += arr[i]; + } + printf("%d\n", result); // Output: 15 + return 0; + } + ``` + + + ```go + package main + import "fmt" + func main() { + arr := []int{1, 2, 3, 4, 5} + result := 0 + for i := 0; i < len(arr); i++ { + result += arr[i] + } + fmt.Println(result) // Output: 15 + } + ``` + + + ```cpp + #include + using namespace std; + int main() { + int arr[] = {1, 2, 3, 4, 5}; + int result = 0; + for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) { + result += arr[i]; + } + cout << result << endl; // Output: 15 + return 0; + } + ``` + + + ```swift + import Foundation + let arr = [1, 2, 3, 4, 5] + var result = 0 + for i in arr { + result += i + } + print(result) // Output: 15 + ``` + + + ```kotlin + fun main() { + val arr = intArrayOf(1, 2, 3, 4, 5) + var result = 0 + for (i in arr) { + result += i + } + println(result) // Output: 15 + } + ``` + + + ```rs + fn main() { + let arr = [1, 2, 3, 4, 5]; + let mut result = 0; + for i in arr.iter() { + result += i; + } + println!("{}", result); // Output: 15 + } + ``` + + + ```php + + ``` + + + ```cs + using System; + class Sum { + static void Main() { + int[] arr = {1, 2, 3, 4, 5}; + int result = 0; + foreach (int i in arr) { + result += i; + } + Console.WriteLine(result); // Output: 15 + } + } + ``` + + + ```ts + let arr: number[] = [1, 2, 3, 4, 5]; + let result: number = 0; + for (let i of arr) { + result += i; + } + console.log(result); // Output: 15 + ``` + + + ```scala + object Sum { + def main(args: Array[String]): Unit = { + val arr = Array(1, 2, 3, 4, 5) + var result = 0 + for (i <- arr) { + result += i + } + println(result) // Output: 15 + } + } + ``` + + + ```haskell + main = do + let arr = [1, 2, 3, 4, 5] + let result = sum arr + print result -- Output: 15 + ``` + + + ```r + arr <- c(1, 2, 3, 4, 5) + result <- sum(arr) + print(result) # Output: 15 + ``` + + + ```perl + my @arr = (1, 2, 3, 4, 5); + my $result = 0; + foreach my $i (@arr) { + $result += $i; + } + print $result; # Output: 15 + ``` + + + ```lua + arr = {1, 2, 3, 4, 5} + result = 0 + for i = 1, #arr do + result = result + arr[i] + end + print(result) -- Output: 15 + ``` + + + +Each of the above code snippets has a time complexity of `O(n)` because the number of iterations in the loop is directly proportional to the size of the input array. + +**Exlpanation:** The time complexity of the given code is `O(n)` because the loop iterates through the array elements one by one, and the number of iterations is directly proportional to the size of the input array. Therefore, the time complexity is linear, i.e., `O(n)`. + + +:::info +**Note:** The time complexity of an algorithm can be different for different programming languages, but the underlying logic and analysis remain the same. +::: + +## Conclusion + +Time Complexity is an important concept in computer science and programming. It helps us understand the efficiency of algorithms and make informed decisions about choosing the most efficient algorithm for a given problem. By analyzing the time complexity of algorithms, we can optimize them for better performance and improve the overall efficiency of our programs. \ No newline at end of file diff --git a/docs/dsa/binary_search/Iterative_binary_search.md b/docs/dsa/binary_search/Iterative_binary_search.md new file mode 100644 index 000000000..7fab7b613 --- /dev/null +++ b/docs/dsa/binary_search/Iterative_binary_search.md @@ -0,0 +1,134 @@ +--- +id: iterative-binary-search-DSA +title: Iterative Binary Search +sidebar_label: Iterative Binary Search +sidebar_position: 7 +description: "In this blog post, we'll explore the iterative binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array. You'll learn what iterative binary search is, how it works, and its time complexity. We'll also cover practical applications and common problems you can solve using this algorithm. By the end, you'll have a thorough understanding of iterative binary search and how to implement it in your programming projects." +tags: [dsa, algorithms, binary search, iterative] +--- + +Iterative Binary Search is powerful algorithm that is essential for efficiently finding elements in sorted arrays, making it a staple in the toolkit of any adept programmer. Whether you're optimizing search operations or solving complex algorithmic challenges, understanding iterative binary search is crucial. Let's delve into its mechanics, applications, and implementation. + +## What is Iterative Binary Search? + +Iterative binary search is a highly efficient algorithm used to find an element in a sorted array. It works by repeatedly dividing the search interval in half, using an iterative approach. If the value of the search key is less than the item in the middle of the interval, the algorithm narrows the interval to the lower half. Otherwise, it narrows it to the upper half. The process continues until the search key is found or the interval is empty. + +In pseudo-code, iterative binary search is defined as follows: + +```cpp +FUNCTION iterativeBinarySearch(array, key): +low = 0 +high = array.length - 1 +WHILE low <= high: +mid = (low + high) / 2 +IF array[mid] == key: +RETURN mid +ELSE IF array[mid] < key: +low = mid + 1 +ELSE: +high = mid - 1 +RETURN -1 +``` + +```cpp +int iterativeBinarySearch(int array[], int size, int key) { + int low = 0; + int high = size - 1; + while (low <= high) { + int mid = low + (high - low) / 2; + if (array[mid] == key) { + return mid; + } else if (array[mid] < key) { + low = mid + 1; + } else { + high = mid - 1; + } + } + return -1; +} +``` + +## How Iterative Binary Search Works + +### Step-by-Step Explanation + +1. Initialize: Set two pointers, low at the beginning and high at the end of the array. +2. Middle Element: Calculate the middle element's index. +Comparison: +3. If the middle element is the target, return its index. +4. If the middle element is less than the target, discard the left half by setting low to mid + 1. +5. If the middle element is greater than the target, discard the right half by setting high to mid - 1. +6. Repeat: Repeat steps 2 and 3 until the target is found or the low pointer exceeds the high pointer. + +### Time Complexity + +The time complexity of iterative binary search is $O(logn)$, +where $𝑛$ is the number of elements in the array. This logarithmic time complexity makes iterative binary search significantly faster than linear search for large datasets. + +## Practical Applications + +Iterative binary search is widely used in various real-world applications and algorithmic problems: + +1. Searching in a Sorted Array + The primary use of iterative binary search is to find elements in a sorted array efficiently. It is the foundation for more complex search algorithms. + +2. Dictionary Lookups + Iterative binary search is used in dictionaries (like the one you're reading now) to quickly find words and their definitions. + +3. Binary Search Trees + Iterative binary search is the basis for searching in binary search trees (BSTs), a fundamental data structure in computer science. + +4. Finding Boundaries + Iterative binary search can be adapted to find the first or last occurrence of a target element, making it useful in problems requiring boundary searches. + +Common Problems Solved Using Iterative Binary Search +Iterative binary search can be adapted in various ways to solve different types of problems. Here are a couple of common problems: + +1. Lower Bound and Upper Bound + These variations of iterative binary search are used to find the first and last occurrence of a target element in a sorted array. + +Lower Bound Pseudo-Code: + +```cpp +FUNCTION lowerBound(array, key): + low = 0 + high = array.length + WHILE low < high: + mid = (low + high) / 2 + IF array[mid] < key: + low = mid + 1 + ELSE: + high = mid + RETURN low + +``` + +Upper Bound Pseudo-Code: + +```cpp +FUNCTION upperBound(array, key): + low = 0 + high = array.length + WHILE low < high: + mid = (low + high) / 2 + IF array[mid] <= key: + low = mid + 1 + ELSE: + high = mid + RETURN low + + +``` + +2. Rotated Sorted Array + Iterative binary search can be modified to handle rotated sorted arrays, where the array is sorted but then rotated at some pivot point. + +:::tip +Handle Edge Cases: Ensure your implementation correctly handles cases where the target element is not present or when the array is empty. +Prevent Overflow: When calculating the middle index, use $\text{mid} = \text{low} + \frac{\text{high} - \text{low}}{2}$ instead of $\text{mid} = \frac{\text{low} + \text{high}}{2}$ to prevent potential overflow. +Efficiency: The iterative approach often uses less memory than the recursive approach because it doesn't involve the overhead of multiple recursive function calls. +::: + +## Conclusion + +Iterative binary search is a fundamental algorithm that every programmer should master. Its efficiency and versatility make it a powerful tool for solving a wide range of problems. By understanding how iterative binary search works and how to implement its variations, you'll be well-equipped to tackle numerous challenges in your programming journey. diff --git a/docs/dsa/binary_search/_category_.json b/docs/dsa/binary_search/_category_.json new file mode 100644 index 000000000..34c97b96a --- /dev/null +++ b/docs/dsa/binary_search/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Binary Search", + "position": 7, + "link": { + "type": "generated-index", + "description": "Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). " + } +} diff --git a/docs/dsa/binary_search/binary-search.md b/docs/dsa/binary_search/binary-search.md new file mode 100644 index 000000000..fbc27804e --- /dev/null +++ b/docs/dsa/binary_search/binary-search.md @@ -0,0 +1,62 @@ +--- +id: binary-search-dsa +title: Binary Search +sidebar_label: Binary Search +description: "In this blog post, we'll dive into the binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array." +tags: [dsa, algorithms, binary search] +--- + + +## Introduction +Binary search is a searching algorithm, used to search for an element in an array. It follows a unique approach which reduces the time complexity as compared to linear search. However, to use binary search, the array must be sorted. + +## Implementation + +Let us see how to implement binary search in Java: + +```java + //let element to be found=target + int low=0; + int high=n-1; //where n is the length of the sorted array + int mid; //represents the mid index of the array + + int flag=0; //element not yet found + + while(low<=high) { + + mid=(low + high)/2; + if(arr[mid]==target) { + flag=1; //element found + System.out.println("Target found!"); + break; + } + else if(arr[mid] +Binary search : O(log n) + +## Points to Remember: + +- Binary search requires a sorted array. +- Works for 1 dimensional arrays. +- Faster and complex than sequential search. +- Uses the divide and conquer approach. +- Best if arrays are too long (large datasets). diff --git a/docs/dsa/binary_search/recursive_binary_search.md b/docs/dsa/binary_search/recursive_binary_search.md new file mode 100644 index 000000000..4d3c50f27 --- /dev/null +++ b/docs/dsa/binary_search/recursive_binary_search.md @@ -0,0 +1,126 @@ +--- +id: recursive-binary-search-DSA +title: Recursive Binary Search +sidebar_label: Recursive Binary Search +sidebar_position: 8 +description: "In this blog post, we'll explore the recursive binary search algorithm, a fundamental technique in computer science for efficiently finding an element in a sorted array. You'll learn what recursive binary search is, how it works, and its time complexity. We'll also cover practical applications and common problems you can solve using this algorithm. By the end, you'll have a thorough understanding of recursive binary search and how to implement it in your programming projects." +tags: [dsa, algorithms, binary search, recursive] +--- + +Recursive Binary Search algorithm is essential for efficiently finding elements in sorted arrays, making it a staple in the toolkit of any adept programmer. Whether you're optimizing search operations or solving complex algorithmic challenges, understanding recursive binary search is crucial. Let's delve into its mechanics, applications, and implementation. + +## What is Recursive Binary Search? + +Recursive binary search is a highly efficient algorithm used to find an element in a sorted array. It works by repeatedly dividing the search interval in half, using a recursive approach. If the value of the search key is less than the item in the middle of the interval, the algorithm narrows the interval to the lower half. Otherwise, it narrows it to the upper half. The process continues until the search key is found or the interval is empty. + +In pseudo-code, recursive binary search is defined as follows: + +```cpp +FUNCTION recursiveBinarySearch(array, low, high, key): +IF low > high: +RETURN -1 +mid = (low + high) / 2 +IF array[mid] == key: +RETURN mid +ELSE IF array[mid] < key: +RETURN recursiveBinarySearch(array, mid + 1, high, key) +ELSE: +RETURN recursiveBinarySearch(array, low, mid - 1, key) +``` + +```cpp +int recursiveBinarySearch(int array[], int low, int high, int key) { + if (low > high) { + return -1; + } + int mid = low + (high - low) / 2; + if (array[mid] == key) { + return mid; + } else if (array[mid] < key) { + return recursiveBinarySearch(array, mid + 1, high, key); + } else { + return recursiveBinarySearch(array, low, mid - 1, key); + } +} +``` + +## How Recursive Binary Search Works + +### Step-by-Step Explanation + +1. Initialize: Set two pointers, low at the beginning and high at the end of the array. +2. Middle Element: Calculate the middle element's index. +Comparison: +3. If the middle element is the target, return its index. +4. If the middle element is less than the target, discard the left half by setting low to mid + 1. +5. If the middle element is greater than the target, discard the right half by setting high to mid - 1. +6. Repeat: Repeat steps 2 and 3 until the target is found or the low pointer exceeds the high pointer. + +### Time Complexity + +The time complexity of iterative binary search is $𝑂(log𝑛)$. + +where $n$ is the number of elements in the array. This logarithmic time complexity makes iterative binary search significantly faster than linear search for large datasets. + +## Practical Applications + +Iterative binary search is widely used in various real-world applications and algorithmic problems: + +1. Searching in a Sorted Array + The primary use of iterative binary search is to find elements in a sorted array efficiently. It is the foundation for more complex search algorithms. + +2. Dictionary Lookups + Iterative binary search is used in dictionaries (like the one you're reading now) to quickly find words and their definitions. + +3. Binary Search Trees + Iterative binary search is the basis for searching in binary search trees (BSTs), a fundamental data structure in computer science. + +4. Finding Boundaries + Iterative binary search can be adapted to find the first or last occurrence of a target element, making it useful in problems requiring boundary searches. + +Common Problems Solved Using Iterative Binary Search +Iterative binary search can be adapted in various ways to solve different types of problems. Here are a couple of common problems: + +1. Lower Bound and Upper Bound + These variations of iterative binary search are used to find the first and last occurrence of a target element in a sorted array. + +Lower Bound Pseudo-Code: + +```cpp +FUNCTION lowerBound(array, low, high, key): + IF low == high: + RETURN low + mid = (low + high) / 2 + IF array[mid] < key: + RETURN lowerBound(array, mid + 1, high, key) + ELSE: + RETURN lowerBound(array, low, mid, key) + + +``` + +Upper Bound Pseudo-Code: + +```cpp +FUNCTION upperBound(array, low, high, key): + if low == high: + return low + mid = (low + high) / 2 + if array[mid] <= key: + return upperBound(array, mid + 1, high, key) + else: + return upperBound(array, low, mid, key) + +``` + +2. Rotated Sorted Array + Recursive binary search can be modified to handle rotated sorted arrays, where the array is sorted but then rotated at some pivot point. + +:::tip +Handle Edge Cases: Ensure your implementation correctly handles cases where the target element is not present or when the array is empty. +Prevent Stack Overflow: Be mindful of the recursion depth, especially for large arrays, as deep recursion can lead to stack overflow. +Efficiency: The recursive approach can be more intuitive and elegant, but consider the iterative approach for environments with limited stack size. +::: + +## Conclusion +Recursive binary search is a fundamental algorithm that every programmer should master. Its efficiency and versatility make it a powerful tool for solving a wide range of problems. By understanding how recursive binary search works and how to implement its variations, you'll be well-equipped to tackle numerous challenges in your programming journey. diff --git a/docs/dsa/data-structure-types.md b/docs/dsa/data-structure-types.md new file mode 100644 index 000000000..350d26e72 --- /dev/null +++ b/docs/dsa/data-structure-types.md @@ -0,0 +1,367 @@ +--- +id: data-structure-types +title: Data Structure Types +sidebar_label: Data Structure Types +sidebar_position: 2 +description: "Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. This section covers the different types of data structures and their applications." +tags: + [ + dsa, + data-structures, + types, + data structure types, + primitive data types, + abstract data types, + linear data structures, + non-linear data structures, + homogeneous data structures, + heterogeneous data structures, + static data structures, + dynamic data structures, + mutable data structures, + immutable data structures, + persistent data structures, + transient data structures, + stack, + queue, + linked list, + tree, + graph, + hash table, + set, + map, + dictionary, + priority queue, + heap, + trie, + bloom filter, + bit array, + bitset, + bitboard, + ] +--- + +A data structure is a way of organizing and storing data so that it can be accessed and modified efficiently. It is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. + +Data structures can be classified into different types based on various criteria. Here are some common types of data structures: + +```mermaid +graph TD + A[Data Structures] --> B[Primitive Data Structures] + A[Data Structures] --> C[Non-Primitive Data Structures] + + B[Primitive Data Structures] --> D(Integer) + B[Primitive Data Structures] --> E(Float) + B[Primitive Data Structures] --> F(Character) + B[Primitive Data Structures] --> G(Boolean) + + C[Non-Primitive Data Structures] --> H[Linear Data Structures] + C[Non-Primitive Data Structures] --> I[Non-Linear Data Structures] + + H[Linear Data Structures] --> J[Static Data Structures] + H[Linear Data Structures] --> K[Dynamic Data Structures] + + J[Static Data Structures] --> L(Array) + + K[Dynamic Data Structures] --> M(Linked List) + K[Dynamic Data Structures] --> N(Stack) + K[Dynamic Data Structures] --> O(Queue) + + I[Non-Linear Data Structures] --> P[Trees] + I[Non-Linear Data Structures] --> Q[Graphs] +``` + +### Primitive Data Structures + +Primitive data structures are the basic data structures that are directly operated upon by the machine instructions. They include: + +1. **Integer**: A data type that represents whole numbers. + + for example: `1`, `2`, `3`, `4`, `5`, ... + + ```javascript title="Integer" + let num = 10; + ``` + +2. **Float**: A data type that represents real numbers with decimal points. + + for example: `1.0`, `2.5`, `3.14`, `4.2`, `5.75`, ... + + ```javascript title="Float" + let num = 3.14; + ``` + +3. **Character**: A data type that represents a single character. + + for example: `a`, `b`, `c`, `d`, `e`, ... + + ```javascript title="Character" + let ch = "A"; + ``` + +4. **Boolean**: A data type that represents true or false values. + + for example: `true`, `false` + + ```javascript title="Boolean" + let isTrue = true; + ``` + +### Non-Primitive Data Structures + +Non-primitive data structures are the advanced data structures that are derived from primitive data structures. They include: + +1. **Linear Data Structures**: Data structures in which elements are arranged in a sequential manner. They include: + + - **Static Data Structures**: Data structures in which the size is fixed at compile time. They include: + + - **Array**: A collection of elements of the same data type stored in contiguous memory locations. + + ```javascript title="Array" + let arr = [1, 2, 3, 4, 5]; + ``` + + - **Dynamic Data Structures**: Data structures in which the size can be changed at runtime. They include: + + - **Linked List**: A collection of elements called nodes, where each node contains a data field and a reference (link) to the next node in the sequence. + + ```javascript title="Linked List" + class Node { + constructor(data) { + this.data = data; + this.next = null; + } + } + + class LinkedList { + constructor() { + this.head = null; + } + + add(data) { + const newNode = new Node(data); + + if (!this.head) { + this.head = newNode; + } else { + let current = this.head; + + while (current.next) { + current = current.next; + } + + current.next = newNode; + } + } + } + + const list = new LinkedList(); + list.add(1); + list.add(2); + list.add(3); + ``` + + - **Stack**: A collection of elements with two main operations: push (insert) and pop (delete). + + ```javascript title="Stack" + class Stack { + constructor() { + this.items = []; + } + + push(element) { + this.items.push(element); + } + + pop() { + if (this.items.length === 0) { + return "Underflow"; + } + return this.items.pop(); + } + } + + const stack = new Stack(); + stack.push(1); + stack.push(2); + stack.push(3); + stack.pop(); + ``` + + - **Queue**: A collection of elements with two main operations: enqueue (insert) and dequeue (delete). + + ```javascript title="Queue" + class Queue { + constructor() { + this.items = []; + } + + enqueue(element) { + this.items.push(element); + } + + dequeue() { + if (this.items.length === 0) { + return "Underflow"; + } + return this.items.shift(); + } + } + + const queue = new Queue(); + queue.enqueue(1); + queue.enqueue(2); + queue.enqueue(3); + queue.dequeue(); + ``` + +2. **Non-Linear Data Structures**: Data structures in which elements are not arranged in a sequential manner. They include: + + - **Trees**: A hierarchical data structure with a root node and subtrees of children nodes. + + ```javascript title="Tree" + class Node { + constructor(data) { + this.data = data; + this.children = []; + } + + addChild(data) { + const child = new Node(data); + this.children.push(child); + } + } + + const tree = new Node(1); + tree.addChild(2); + tree.addChild(3); + ``` + + - **Graphs**: A non-linear data structure consisting of nodes (vertices) and edges (connections between nodes). + + ```javascript title="Graph" + class Graph { + constructor() { + this.nodes = []; + this.edges = []; + } + + addNode(node) { + this.nodes.push(node); + } + + addEdge(node1, node2) { + this.edges.push([node1, node2]); + } + } + + const graph = new Graph(); + graph.addNode(1); + graph.addNode(2); + graph.addEdge(1, 2); + ``` + + - **Hash Table**: A data structure that stores key-value pairs and provides fast lookup of values based on keys. + + ```javascript title="Hash Table" + class HashTable { + constructor() { + this.table = {}; + } + + put(key, value) { + this.table[key] = value; + } + + get(key) { + return this.table[key]; + } + } + + const hashTable = new HashTable(); + hashTable.put("name", "John"); + hashTable.get("name"); + ``` + + - **Heap**: A specialized tree-based data structure that satisfies the heap property. + + ```javascript title="Heap" + class MinHeap { + constructor() { + this.heap = []; + } + + insert(value) { + this.heap.push(value); + this.heapifyUp(); + } + + heapifyUp() { + let index = this.heap.length - 1; + + while (index > 0) { + let parentIndex = Math.floor((index - 1) / 2); + + if (this.heap[parentIndex] <= this.heap[index]) { + break; + } + + [this.heap[parentIndex], this.heap[index]] = [ + this.heap[index], + this.heap[parentIndex], + ]; + index = parentIndex; + } + } + } + + const minHeap = new MinHeap(); + minHeap.insert(3); + minHeap.insert(2); + minHeap.insert(1); + ``` + +## Different Between Primitive and Non-Primitive Data Structures + +|No. |Primitive Data Structures|Non-Primitive Data Structures| +|----|--------------------------|-----------------------------| +|1. |Basic data structures that are directly operated upon by the machine instructions.|Advanced data structures that are derived from primitive data structures.| +|2. |Examples: Integer, Float, Character, Boolean.|Examples: Array, Linked List, Stack, Queue, Tree, Graph, Hash Table, Heap.| +|3. |Stored in contiguous memory locations.|Stored in non-contiguous memory locations.| +|4. |Fixed size at compile time.|Size can be changed at runtime.| +|5. |Efficient for simple data storage and retrieval.|Efficient for complex data storage and retrieval.| +|6. |Low-level data structures.|High-level data structures.| + +## Different Between Linear and Non-Linear Data Structures + +|No. |Linear Data Structures|Non-Linear Data Structures| +|----|-----------------------|-------------------------| +|1. |Data structures in which elements are arranged in a sequential manner.|Data structures in which elements are not arranged in a sequential manner.| +|2. |Examples: Array, Linked List, Stack, Queue.|Examples: Tree, Graph.| +|3. |Elements are stored in a linear sequence.|Elements are stored in a non-linear sequence.| +|4. |Efficient for simple data storage and retrieval.|Efficient for complex data storage and retrieval.| +|5. |Low-level data structures.|High-level data structures.| + +## Different Between Static and Dynamic Data Structures + +|No. |Static Data Structures|Dynamic Data Structures| +|----|----------------------|----------------------| +|1. |Data structures in which the size is fixed at compile time.|Data structures in which the size can be changed at runtime.| +|2. |Examples: Array.|Examples: Linked List, Stack, Queue.| +|3. |Size is determined at compile time.|Size can be changed at runtime.| +|4. |Efficient for fixed-size data storage and retrieval.|Efficient for variable-size data storage and retrieval.| +|5. |Low-level data structures.|High-level data structures.| + +## Different Between Mutable and Immutable Data Structures + +|No. |Mutable Data Structures|Immutable Data Structures| +|----|-----------------------|------------------------| +|1. |Data structures in which the data can be modified after creation.|Data structures in which the data cannot be modified after creation.| +|2. |Examples: Array, Linked List, Stack, Queue.|Examples: String, Tuple, Set, Map.| +|3. |Data can be changed after creation.|Data cannot be changed after creation.| +|4. |Efficient for data that needs to be modified frequently.|Efficient for data that needs to be shared and reused.| +|5. |Low-level data structures.|High-level data structures.| + +## Conclusion + +Data structures are the building blocks of computer science. They are the tools you'll use to build software systems. Understanding the different types of data structures and their applications is essential for designing efficient algorithms and solving complex problems. By learning data structures, you'll be able to represent data in a meaningful way, store and organize data in memory, and build software systems that are scalable, efficient, and reliable. \ No newline at end of file diff --git a/docs/dsa/dsa.md b/docs/dsa/dsa.md new file mode 100644 index 000000000..4f0fdce3e --- /dev/null +++ b/docs/dsa/dsa.md @@ -0,0 +1,127 @@ +--- +id: dsa +title: Data Structures and Algorithms +sidebar_label: Data Structures and Algorithms +sidebar_position: 1 +description: "Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms." +tags: [dsa, data-structures, algorithms, programming, computer-science, software-engineering, competitive-programming, interview-preparation, open-source, learning, teaching, problem-solving, performance, career-growth, understanding, competitive-programming, coding-competitions, open-source, building-systems, learning-new-technologies, programming-languages, tools, concepts, problem-solving, data-structures, algorithms, resources, books, websites, courses, youtube-channels, practice, interview-preparation, competitive-programming, community, contribute] +--- + +> Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms. + +## Introduction + +Data Structures and Algorithms are the fundamental concepts that every programmer must know. They are the tools you'll use to build software systems. Data Structures are a way of organizing and storing data so that it can be accessed and modified efficiently. Algorithms are a set of instructions to solve a problem or perform a task. + +## What is Algorithm? + +An algorithm is a set of instructions to solve a problem or perform a task. It is a step-by-step procedure that defines a set of actions to be executed in a certain order to get the desired output. + +### Quility of Good Algorithm + +- **Correctness**: An algorithm is correct if it produces the correct result for all instances of the problem it is designed to solve. +- **Efficiency**: An algorithm is efficient if it solves the problem within the resources (like time and space) available to it. +- **Simplicity**: An algorithm is simple if it is easy to understand and implement. +- **Optimality**: An algorithm is optimal if it produces the best result among all possible solutions for the given problem. +- **Scalability**: An algorithm is scalable if it can handle the input size efficiently. +- **Adaptability**: An algorithm is adaptable if it can be easily modified to solve a different problem. +- **Robustness**: An algorithm is robust if it can handle invalid input without crashing. +- **Maintainability**: An algorithm is maintainable if it can be easily modified and maintained. +- **Reusability**: An algorithm is reusable if it can be used in different programs. + +### Algorithm Examples + +- **Sorting Algorithms**: Bubble Sort, Selection Sort, Insertion Sort, Merge Sort, Quick Sort, Heap Sort, Radix Sort, Counting Sort, Bucket Sort, etc. +- **Searching Algorithms**: Linear Search, Binary Search, Jump Search, Interpolation Search, Exponential Search, etc. +- **Graph Algorithms**: Breadth-First Search (BFS), Depth-First Search (DFS), Dijkstra's Algorithm, Bellman-Ford Algorithm, Floyd-Warshall Algorithm, Prim's Algorithm, Kruskal's Algorithm, etc. +- **Dynamic Programming Algorithms**: Fibonacci Series, Longest Common Subsequence, Longest Increasing Subsequence, Knapsack Problem, Matrix Chain Multiplication, etc. +- **Greedy Algorithms**: Fractional Knapsack Problem, Job Sequencing Problem, Huffman Coding, Prim's Algorithm, Kruskal's Algorithm, etc. +- **Divide and Conquer Algorithms**: Binary Search, Merge Sort, Quick Sort, Strassen's Algorithm, etc. +- **Backtracking Algorithms**: N-Queens Problem, Sudoku Solver, Knight's Tour, Rat in a Maze, etc. +- **Branch and Bound Algorithms**: Traveling Salesman Problem, 0/1 Knapsack Problem, Job Assignment Problem, etc. +- **Randomized Algorithms**: Randomized Quick Sort, Randomized Selection, Las Vegas Algorithm, Monte Carlo Algorithm, etc. +- **Approximation Algorithms**: Traveling Salesman Problem, Knapsack Problem, Set Cover Problem, etc. + +## What is Data Structure? + +A data structure is a way of organizing and storing data so that it can be accessed and modified efficiently. It is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. + +![Data Structure](image.png) + +:::note +Data structures are the building blocks of computer science. They are the tools you'll use to build software systems. Data structures are used to represent data in a meaningful way. They provide a way to store and organize data in memory. +::: + +### Types of Data Structures + +Data structures can be classified into two categories: + +```mermaid +graph TD + A[Data Structures] --> B[Primative Data Structures] + A[Data Structures] --> C[Non-Primative Data Structures] + + B[Primative Data Structures] --> D(Integer) + B[Primative Data Structures] --> EFloat + B[Primative Data Structures] --> F(Character) + B[Primative Data Structures] --> G(Boolean) + + C[Non-Primative Data Structures] --> H[Linear Data Structures] + C[Non-Primative Data Structures] --> I[Non-Linear Data Structures] + + H[Linear Data Structures] --> J[Static Data Structures] + H[Linear Data Structures] --> K[Dynamic Data Structures] + + J[Static Data Structures] --> L(Array) + + K[Dynamic Data Structures] --> M(Linked List) + K[Dynamic Data Structures] --> N(Stack) + K[Dynamic Data Structures] --> O(Queue) + + I[Non-Linear Data Structures] --> Q(Trees) + I[Non-Linear Data Structures] --> R(Graphs) + +``` + +1. **Primitive Data Structures**: These are the basic data structures that are directly operated upon by the machine instructions. They include Integer, Float, Character, Boolean, etc. +2. **Non-Primitive Data Structures**: These are the advanced data structures that are derived from primitive data structures. They include Linear Data Structures (Array, Linked List, Stack, Queue), Non-Linear Data Structures (Trees, Graphs), etc. + +### Data Structure Examples + +- **Array**: A collection of elements of the same data type stored in contiguous memory locations. +- **Linked List**: A collection of elements called nodes, where each node contains a data field and a reference (link) to the next node in the sequence. +- **Stack**: A collection of elements with two main operations: push (insert) and pop (delete). +- **Queue**: A collection of elements with two main operations: enqueue (insert) and dequeue (delete). +- **Tree**: A hierarchical data structure with a root node and subtrees of children nodes. +- **Graph**: A non-linear data structure consisting of nodes (vertices) and edges (connections between nodes). +- **Hash Table**: A data structure that stores key-value pairs and provides fast lookup of values based on keys. +- **Heap**: A specialized tree-based data structure that satisfies the heap property. + +## Why Learn Data Structures and Algorithms? + +Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. Here are some reasons why you should learn Data Structures and Algorithms: + +1. **Problem Solving**: Data Structures and Algorithms help you solve complex problems efficiently. +2. **Performance**: Data Structures and Algorithms help you write efficient code that runs faster and uses less memory. +3. **Understanding**: Data Structures and Algorithms help you understand how software systems work under the hood. +4. **Career Growth**: Data Structures and Algorithms are essential skills for software engineers, data scientists, machine learning engineers, and other tech professionals. +5. **Interview Preparation**: Data Structures and Algorithms are commonly asked in technical interviews for software engineering roles. +6. **Competitive Programming**: Data Structures and Algorithms are essential for competitive programming and coding competitions. +7. **Open Source**: Data Structures and Algorithms are used in open-source projects and libraries. +8. **Learning New Technologies**: Data Structures and Algorithms help you learn new programming languages, tools, and concepts. +9. **Building Systems**: Data Structures and Algorithms are the foundation of building software systems. +10. **Community**: Data Structures and Algorithms have a vibrant community of learners, educators, and practitioners. + +## Resources + +Here are some resources to help you learn and master Data Structures and Algorithms: + +1. **Books**: Introduction to Algorithms, Data Structures and Algorithms in Python, Algorithms, The Algorithm Design Manual, etc. +2. **Websites**: GeeksforGeeks, LeetCode, HackerRank, CodeSignal, CodeChef, TopCoder, etc. +3. **Courses**: Coursera, edX, Udemy, Khan Academy, MIT OpenCourseWare, Stanford Online, etc. +4. **YouTube Channels**: freeCodeCamp, HackerRank, GeeksforGeeks, mycodeschool, Abdul Bari, etc. +5. **Practice**: LeetCode, HackerRank, GeeksforGeeks, CodeChef, TopCoder, etc. + +## Conclusion + +Data Structures and Algorithms are the building blocks of computer science. They are the tools you'll use to build software systems. This section is a collection of resources to help you understand and master Data Structures and Algorithms. Happy learning! \ No newline at end of file diff --git a/docs/dsa/graphs/_category_.json b/docs/dsa/graphs/_category_.json new file mode 100644 index 000000000..440450f74 --- /dev/null +++ b/docs/dsa/graphs/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Graphs", + "position": 14, + "link": { + "type": "generated-index", + "description": "Graphs are a data structure that represents a collection of interconnected nodes or vertices. They are commonly used in Data Structures and Algorithms (DSA) to model relationships between objects or entities." + } +} diff --git a/docs/dsa/graphs/graphs.md b/docs/dsa/graphs/graphs.md new file mode 100644 index 000000000..a914f12e6 --- /dev/null +++ b/docs/dsa/graphs/graphs.md @@ -0,0 +1,301 @@ + + +# Graphs in Data Structures and Algorithms (DSA) + +Graphs in Data Structures and Algorithms (DSA) are a non-linear data structure that consists of a set of vertices (nodes) connected by edges. They are widely used to represent relationships between objects or entities. + +![alt text](image.png) + +## Implementing a Graph using an Adjacency Matrix + +To implement a graph, you can use various data structures such as an adjacency matrix or an adjacency list. + +An adjacency matrix is a 2D array where each cell represents the presence or absence of an edge between two vertices. It requires O(V^2) space, where V is the number of vertices. + +Here's an example of implementing a graph using an adjacency matrix in Python: + +```python +class Graph: + def __init__(self, num_vertices): + self.num_vertices = num_vertices + self.adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] + + def add_edge(self, src, dest): + self.adj_matrix[src][dest] = 1 + self.adj_matrix[dest][src] = 1 + + def remove_edge(self, src, dest): + self.adj_matrix[src][dest] = 0 + self.adj_matrix[dest][src] = 0 + + def print_graph(self): + for row in self.adj_matrix: + print(row) + +# Example usage: +g = Graph(4) +g.add_edge(0, 1) +g.add_edge(1, 2) +g.add_edge(2, 3) +g.print_graph() +``` + +Output: +```plaintext +[0, 1, 0, 0] +[1, 0, 1, 0] +[0, 1, 0, 1] +[0, 0, 1, 0] +``` + +## Implementing a Graph using an Adjacency List + +Another way to implement a graph is using an adjacency list. It is a collection of linked lists, where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. + +Here's an example of implementing a graph using an adjacency list in Python: + +```python +class Graph: + def __init__(self, num_vertices): + self.num_vertices = num_vertices + self.adj_list = [[] for _ in range(num_vertices)] + + def add_edge(self, src, dest): + self.adj_list[src].append(dest) + self.adj_list[dest].append(src) + + def remove_edge(self, src, dest): + self.adj_list[src].remove(dest) + self.adj_list[dest].remove(src) + + def print_graph(self): + for vertex, adj_vertices in enumerate(self.adj_list): + print(f"Vertex {vertex}: {adj_vertices}") + +# Example usage: +g = Graph(4) +g.add_edge(0, 1) +g.add_edge(1, 2) +g.add_edge(2, 3) +g.print_graph() +``` + +Output: +```plaintext +Vertex 0: [1] +Vertex 1: [0, 2] +Vertex 2: [1, 3] +Vertex 3: [2] +``` + +## Additional Operations on Graphs + +These are just basic operations on graphs. Depending on your requirements, you can perform various other operations like finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). + + +Graphs in Data Structures and Algorithms (DSA) are a non-linear data structure that consists of a set of vertices (nodes) connected by edges. They are widely used to represent relationships between objects or entities. + +To implement a graph, you can use various data structures such as an adjacency matrix or an adjacency list. + +An adjacency matrix is a 2D array where each cell represents the presence or absence of an edge between two vertices. It requires O(V^2) space, where V is the number of vertices. + +Here's an example of implementing a graph using an adjacency matrix in Python: + +```python +class Graph: + def __init__(self, num_vertices): + self.num_vertices = num_vertices + self.adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] + + def add_edge(self, src, dest): + self.adj_matrix[src][dest] = 1 + self.adj_matrix[dest][src] = 1 + + def remove_edge(self, src, dest): + self.adj_matrix[src][dest] = 0 + self.adj_matrix[dest][src] = 0 + + def print_graph(self): + for row in self.adj_matrix: + print(row) + +# Example usage: +g = Graph(4) +g.add_edge(0, 1) +g.add_edge(1, 2) +g.add_edge(2, 3) +g.print_graph() +``` + +Output: +``` +[0, 1, 0, 0] +[1, 0, 1, 0] +[0, 1, 0, 1] +[0, 0, 1, 0] +``` + +Another way to implement a graph is using an adjacency list. It is a collection of linked lists, where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. + +Here's an example of implementing a graph using an adjacency list in Python: + +```python +class Graph: + def __init__(self, num_vertices): + self.num_vertices = num_vertices + self.adj_list = [[] for _ in range(num_vertices)] + + def add_edge(self, src, dest): + self.adj_list[src].append(dest) + self.adj_list[dest].append(src) + + def remove_edge(self, src, dest): + self.adj_list[src].remove(dest) + self.adj_list[dest].remove(src) + + def print_graph(self): + for vertex, adj_vertices in enumerate(self.adj_list): + print(f"Vertex {vertex}: {adj_vertices}") + +# Example usage: +g = Graph(4) +g.add_edge(0, 1) +g.add_edge(1, 2) +g.add_edge(2, 3) +g.print_graph() +``` + +Output: +``` +Vertex 0: [1] +Vertex 1: [0, 2] +Vertex 2: [1, 3] +Vertex 3: [2] +``` + +These are just basic operations on graphs. Depending on your requirements, you can perform various other operations like finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). + +## Implementing a Graph in Java + +To implement a graph in Java, you can use similar approaches as in Python. Here's an example of implementing a graph using an adjacency matrix in Java: + +```java +public class Graph { + private int numVertices; + private int[][] adjMatrix; + + public Graph(int numVertices) { + this.numVertices = numVertices; + this.adjMatrix = new int[numVertices][numVertices]; + } + + public void addEdge(int src, int dest) { + adjMatrix[src][dest] = 1; + adjMatrix[dest][src] = 1; + } + + public void removeEdge(int src, int dest) { + adjMatrix[src][dest] = 0; + adjMatrix[dest][src] = 0; + } + + public void printGraph() { + for (int i = 0; i < numVertices; i++) { + for (int j = 0; j < numVertices; j++) { + System.out.print(adjMatrix[i][j] + " "); + } + System.out.println(); + } + } + + public static void main(String[] args) { + Graph g = new Graph(4); + g.addEdge(0, 1); + g.addEdge(1, 2); + g.addEdge(2, 3); + g.printGraph(); + } +} +``` + +Output: +``` +0 1 0 0 +1 0 1 0 +0 1 0 1 +0 0 1 0 +``` + +## Implementing a Graph in C++ + +Similarly, you can implement a graph in C++ using an adjacency matrix. Here's an example: + +```cpp +#include +#include + +using namespace std; + +class Graph { +private: + int numVertices; + vector> adjMatrix; + +public: + Graph(int numVertices) { + this->numVertices = numVertices; + this->adjMatrix.resize(numVertices, vector(numVertices, 0)); + } + + void addEdge(int src, int dest) { + adjMatrix[src][dest] = 1; + adjMatrix[dest][src] = 1; + } + + void removeEdge(int src, int dest) { + adjMatrix[src][dest] = 0; + adjMatrix[dest][src] = 0; + } + + void printGraph() { + for (int i = 0; i < numVertices; i++) { + for (int j = 0; j < numVertices; j++) { + cout << adjMatrix[i][j] << " "; + } + cout << endl; + } + } +}; + +int main() { + Graph g(4); + g.addEdge(0, 1); + g.addEdge(1, 2); + g.addEdge(2, 3); + g.printGraph(); + + return 0; +} +``` + +Output: +``` +0 1 0 0 +1 0 1 0 +0 1 0 1 +0 0 1 0 +``` + +Remember to adjust the number of vertices and edges according to your requirements. + +In conclusion, graphs are a fundamental data structure in Data Structures and Algorithms (DSA) that are used to represent relationships between objects or entities. They can be implemented using various data structures such as an adjacency matrix or an adjacency list. + +An adjacency matrix is a 2D array that represents the presence or absence of edges between vertices. It requires O(V^2) space, where V is the number of vertices. On the other hand, an adjacency list is a collection of linked lists where each vertex has a list of its adjacent vertices. It requires O(V + E) space, where V is the number of vertices and E is the number of edges. + +Both implementations have their own advantages and disadvantages. The choice of implementation depends on the specific requirements of the problem at hand. + +Additionally, there are various other operations that can be performed on graphs, such as finding a path between two vertices, checking for cycles, or finding the shortest path using algorithms like Depth-First Search (DFS) or Breadth-First Search (BFS). + +Graphs can also be implemented in other programming languages like Java and C++. The implementation follows similar approaches using either an adjacency matrix or an adjacency list. + +Overall, understanding graphs and their implementations is crucial for solving problems that involve relationships and connectivity between entities. diff --git a/docs/dsa/graphs/image.png b/docs/dsa/graphs/image.png new file mode 100644 index 0000000000000000000000000000000000000000..6398c1d9867bf2cd8ad8ce16ec798d1d8d8b61d6 GIT binary patch literal 64486 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Μ39KGcVxF+1;wI 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

    3*leh&sX5j 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 z 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 X|Njrft9bH(4?rHPK2^aenTP!!2Bs*Q literal 0 HcmV?d00001 diff --git a/docs/dsa/image.png b/docs/dsa/image.png new file mode 100644 index 0000000000000000000000000000000000000000..6fec022374f45ac3d99c73deef1db4896380e8ad GIT binary patch literal 8465 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 + + + ```js + // Node class in JavaScript + class Node { + constructor(data) { + this.data = data; + this.next = null; + } + } + + // LinkedList class in JavaScript + class LinkedList { + constructor() { + this.head = null; + } + + // Add a node at the end + append(data) { + let newNode = new Node(data); + if (this.head === null) { + this.head = newNode; + return; + } + let current = this.head; + while (current.next) { + current = current.next; + } + current.next = newNode; + } + } + ``` + + + + ```java + // Node class in Java + class Node { + int data; + Node next; + Node(int d) { data = d; next = null; } + } + + // LinkedList class in Java + public class LinkedList { + Node head; + + // Add a node at the end + public void append(int data) { + Node newNode = new Node(data); + if (head == null) { + head = newNode; + return; + } + Node current = head; + while (current.next != null) { + current = current.next; + } + current.next = newNode; + } + } + ``` + + + + ```python + # Node class in Python + class Node: + def __init__(self, data): + self.data = data + self.next = None + + # LinkedList class in Python + class LinkedList: + def __init__(self): + self.head = None + + # Add a node at the end + def append(self, data): + new_node = Node(data) + if self.head is None: + self.head = new_node + return + last = self.head + while last.next: + last = last.next + last.next = new_node + ``` + + + + ```c + // Node structure in C + struct Node { + int data; + struct Node* next; + }; + + // LinkedList structure in C + struct LinkedList { + struct Node* head; + }; + + // Function to create a new node + struct Node* createNode(int data) { + struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); + newNode->data = data; + newNode->next = NULL; + return newNode; + } + + // Function to add a node at the end + void append(struct LinkedList* list, int data) { + struct Node* newNode = createNode(data); + if (list->head == NULL) { + list->head = newNode; + return; + } + struct Node* temp = list->head; + while (temp->next != NULL) { + temp = temp->next; + } + temp->next = newNode; + } + ``` + + + + ```cpp + // Node class in C++ + class Node { + public: + int data; + Node* next; + Node(int d) { data = d; next = nullptr; } + }; + + // LinkedList class in C++ + class LinkedList { + public: + Node* head; + LinkedList() { head = nullptr; } + + // Add a node at the end + void append(int data) { + Node* newNode = new Node(data); + if (head == nullptr) { + head = newNode; + return; + } + Node* current = head; + while (current->next != nullptr) { + current = current->next; + } + current->next = newNode; + } + }; + ``` + + + + ```ts + // Node class in TypeScript + class Node { + data: number; + next: Node | null; + + constructor(data: number) { + this.data = data; + this.next = null; + } + } + + // LinkedList class in TypeScript + class LinkedList { + head: Node | null; + + constructor() { + this.head = null; + } + + // Add a node at the end + append(data: number): void { + let newNode = new Node(data); + if (this.head === null) { + this.head = newNode; + return; + } + let current = this.head; + while (current.next !== null) { + current = current.next; + } + current.next = newNode; + } + } + ``` + + + +## How to access a Linked List? + +A linked list can be accessed by traversing the nodes starting from the head. + + + + + ```js + // Access elements in a LinkedList in JavaScript + let list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + let current = list.head; + while (current !== null) { + console.log(current.data); + current = current.next; + } + ``` + + + + ```java + // Access elements in a LinkedList in Java + LinkedList list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + Node current = list.head; + while (current != null) { + System.out.println(current.data); + current = current.next; + } + ``` + + + + ```python + # Access elements in a LinkedList in Python + list = LinkedList() + list.append(10) + list.append(20) + list.append(30) + + current = list.head + while current: + print(current.data) + current = current.next + ``` + + + + ```c + // Access elements in a LinkedList in C + struct LinkedList list; + list.head = NULL; + append(&list, 10); + append(&list, 20); + append(&list, 30); + + struct Node* current = list.head; + while (current != NULL) { + printf("%d\n", current->data); + current = current->next; + } + ``` + + + + ```cpp + // Access elements in a LinkedList in C++ + LinkedList list; + list.append(10); + list.append(20); + list.append(30); + + Node* current = list.head; + while (current != nullptr) { + std::cout << current->data << std::endl; + current = current->next; + } + ``` + + + + ```ts + // Access elements in a LinkedList in TypeScript + let list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + let current = list.head; + while (current !== null) { + console.log(current.data); + current = current.next; + } + ``` + + + +## How to update a Linked List? + +A linked list can be updated by changing the data of a node directly. + + + + + ```js + // Update elements in a LinkedList in JavaScript + let list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + let current = list.head; + while (current !== null) { + if (current.data === 20) { + current.data = 25; + } + current = current.next; + } + ``` + + + + ```java + // Update elements in a LinkedList in Java + LinkedList list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + Node current = list.head; + while (current != null) { + if (current.data == 20) { + current.data = 25; + } + current = current.next; + } + ``` + + + + ```python + # Update elements in a LinkedList in Python + list = LinkedList() + list.append(10) + list.append(20) + list.append(30) + + current = list.head + while current: + if current.data == 20: + current.data = 25 + current = current.next + ``` + + + + ```c + // Update elements in a LinkedList in C + struct LinkedList list; + list.head = NULL; + append(&list, 10); + append(&list, 20); + append(&list, 30); + + struct Node* current = list.head; + while (current != NULL) { + if (current->data == 20) { + current->data = 25; + } + current = current->next; + } + ``` + + + + ```cpp + // Update elements in a LinkedList in C++ + LinkedList list; + list.append(10); + list.append(20); + list.append(30); + + Node* current = list.head; + while (current != nullptr) { + if (current->data == 20) { + current->data = 25; + } + current = current->next; + } + ``` + + + + ```ts + // Update elements in a LinkedList in TypeScript + let list = new LinkedList(); + list.append(10); + list.append(20); + list.append(30); + + let current = list.head; + while (current !== null) { + if (current.data === 20) { + current.data = 25; + } + current = current.next; + } + ``` + + + +## How to delete a node from a Linked List? + +A node can be deleted from a linked list by adjusting the links of the adjacent nodes. + + + + + ```js + // Delete a node from a LinkedList in JavaScript + class LinkedList { + // ... + delete(data) { + if (this.head === null) return; + if (this.head.data === data) { + this.head = this.head.next; + return; + } + let current = this.head; + while (current.next !== null) { + if (current.next.data === data) { + current.next = current.next.next; + return; + } + current = current.next; + } + } + } + ``` + + + + ```java + // Delete a node from a LinkedList in Java + public class LinkedList { + // ... + public void delete(int data) { + if (head == null) return; + if (head.data == data) { + head = head.next; + return; + } + Node current = head; + while (current.next != null) { + if (current.next.data == data) { + current.next = current.next.next; + return; + } + current = current.next; + } + } + } + ``` + + + + ```python + # Delete a node from a LinkedList in Python + class LinkedList: + # ... + def delete(self, data): + if self.head is None: + return + if self.head.data == data: + self.head = self.head.next + return + current = self.head + while current.next: + if current.next.data == data: + current.next = current.next.next + return + current = current.next + ``` + + + + ```c + // Delete a node from a LinkedList in C + void deleteNode(struct LinkedList* list, int data) { + if (list->head == NULL) return; + struct Node* temp = list->head; + if (temp->data == data) { + list->head = temp->next; + free(temp); + return; + } + struct Node* prev = NULL; + while (temp != NULL && temp->data != data) { + prev = temp; + temp = temp->next; + } + if (temp == NULL) return; + prev->next = temp->next; + free(temp); + } + ``` + + + + ```cpp + // Delete a node from a LinkedList in C++ + class LinkedList { + // ... + void deleteNode(int data) { + if (head == nullptr) return; + Node* temp = head; + if (temp->data == data) { + head = temp->next; + delete temp; + return; + } + Node* prev = nullptr; + while (temp != nullptr && temp->data != data) { + prev = temp; + temp = temp->next; + } + if (temp == nullptr) return; + prev->next = temp->next; + delete temp; + } + }; + ``` + + + + ```ts + // Delete a node from a LinkedList in TypeScript + class LinkedList { + // ... + delete(data: number) { + if (this.head === null) return; + if (this.head.data === data) { + this.head = this.head.next; + return; + } + let current = this.head; + while (current.next !== null) { + if (current.next.data === data) { + current.next = current.next.next; + return; + } + current = current.next; + } + } + } + ``` + + + +## Applications of Linked Lists + +- **Dynamic memory allocation**: Linked lists can efficiently manage memory allocation and deallocation. +- **Implementation of stacks and queues**: Linked lists provide the foundation for stack and queue data structures. +- **Graph representation**: Adjacency lists use linked lists to represent graphs. +- **Handling sparse matrices**: Linked lists efficiently store and manipulate sparse matrices. + +## Common Linked List Problems + +- **Reverse a Linked List**: Reversing the nodes of a linked list. +- **Detect a cycle in a Linked List**: Checking if a linked list contains a cycle. +- **Merge two sorted Linked Lists**: Combining two sorted linked lists into one sorted linked list. +- **Find the middle of a Linked List**: Finding the middle node in a linked list. + +## Advanced Linked List Variants + +- **Doubly Linked List**: A linked list where each node has references to both the next and previous nodes. +- **Circular Linked List**: A linked list where the last node points back to the first node. +- **Skip List**: A linked list with additional pointers for faster search. + +## Resources and References + +- **Books**: + - "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein + - "Data Structures and Algorithm Analysis in C" by Mark Allen Weiss +- **Online Courses**: + - Coursera: Data Structures and Algorithms Specialization + - edX: Data Structures Fundamentals +- **Websites**: + - [GeeksforGeeks](https://www.geeksforgeeks.org) + - [LeetCode](https://leetcode.com) + - [HackerRank](https://www.hackerrank.com) + +--- + +By understanding and mastering these linked list concepts and algorithms, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. + +## Conclusion + +Linked lists are a fundamental data structure in computer science and play a crucial role in various applications and algorithms. This guide covers the essential concepts and operations associated with linked lists, providing a comprehensive understanding of how they work and how to implement them in different programming languages. + +Understanding linked lists is crucial for solving numerous problems in computer science, from basic data manipulation to complex algorithms in dynamic memory allocation, graph representation, and more. The examples provided demonstrate how to work with linked lists efficiently, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of linked lists enhances your ability to handle data structures and perform operations crucial in both everyday programming and competitive coding. + +Problems for Practice +To further practice and test your understanding of linked lists, consider solving the following problems from LeetCode: + +1. Reverse Linked List +2. Linked List Cycle +3. Merge Two Sorted Lists +4. Remove Nth Node From End of List +5. Add Two Numbers + +Engaging with these problems will help reinforce the concepts learned and provide practical experience in using linked lists effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of linked list manipulation in various contexts. diff --git a/docs/dsa/linkedlist/LinkedListProblems.md b/docs/dsa/linkedlist/LinkedListProblems.md new file mode 100644 index 000000000..5c727033b --- /dev/null +++ b/docs/dsa/linkedlist/LinkedListProblems.md @@ -0,0 +1,146 @@ +--- +id: leetcode-linkedlist-problems +title: LeetCode LinkedList Problems +sidebar_label: LinkedList Problems +sidebar_position: 1 +description: "A collection of easy, medium, and hard LinkedList problems from LeetCode to help you practice and master LinkedList concepts in Data Structures and Algorithms." +tags: + [ + dsa, + data-structures, + linkedlist, + leetcode, + linkedlist-problems, + linkedlist-in-dsa, + linkedlist-in-data-structure, + linkedlist-in-algorithm, + linkedlist-in-dsa-example, + linkedlist-in-dsa-explanation, + linkedlist-in-dsa-conclusion, + linkedlist-in-dsa-importance, + linkedlist-in-dsa-syntax, + linkedlist-in-dsa-declaration, + linkedlist-in-dsa-access, + linkedlist-in-dsa-update, + linkedlist-in-dsa-delete, + linkedlist-in-dsa-iterate, + linkedlist-in-dsa-max-min, + linkedlist-in-dsa-program, + linkedlist-in-dsa-code, + linkedlist-in-dsa-js, + linkedlist-in-dsa-java, + linkedlist-in-dsa-python, + linkedlist-in-dsa-c, + linkedlist-in-dsa-cpp, + linkedlist-in-dsa-ts, + ] +--- + +# LeetCode LinkedList Problems + +## Easy Problems + +1. [Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/) + + - Problem: Reverse a singly linked list. + - LeetCode ID: 206 + +2. [Remove Linked List Elements](https://leetcode.com/problems/remove-linked-list-elements/) + + - Problem: Remove all elements from a linked list of integers that have value val. + - LeetCode ID: 203 + +3. [Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list/) + + - Problem: Check if a linked list is a palindrome. + - LeetCode ID: 234 + +4. [Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/) + + - Problem: Merge two sorted linked lists and return it as a new sorted list. + - LeetCode ID: 21 + +5. [Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/) + + - Problem: Determine if a linked list has a cycle. + - LeetCode ID: 141 + +6. [Remove Duplicates from Sorted List](https://leetcode.com/problems/remove-duplicates-from-sorted-list/) + + - Problem: Delete all duplicates such that each element appears only once. + - LeetCode ID: 83 + +7. [Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/) + - Problem: Find the node at which the intersection of two singly linked lists begins. + - LeetCode ID: 160 + +## Medium Problems + +1. [Add Two Numbers](https://leetcode.com/problems/add-two-numbers/) + + - Problem: Add two numbers represented by linked lists. + - LeetCode ID: 2 + +2. [Odd Even Linked List](https://leetcode.com/problems/odd-even-linked-list/) + + - Problem: Group all odd nodes together followed by the even nodes. + - LeetCode ID: 328 + +3. [Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) + + - Problem: Remove the nth node from the end of the list. + - LeetCode ID: 19 + +4. [Reorder List](https://leetcode.com/problems/reorder-list/) + + - Problem: Reorder the list to follow a specific order. + - LeetCode ID: 143 + +5. [Rotate List](https://leetcode.com/problems/rotate-list/) + + - Problem: Rotate the list to the right by k places. + - LeetCode ID: 61 + +6. [Swap Nodes in Pairs](https://leetcode.com/problems/swap-nodes-in-pairs/) + + - Problem: Swap every two adjacent nodes. + - LeetCode ID: 24 + +7. [Partition List](https://leetcode.com/problems/partition-list/) + - Problem: Partition the list so that nodes less than x come before nodes greater than or equal to x. + - LeetCode ID: 86 + +## Hard Problems + +1. [Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/) + + - Problem: Merge k sorted linked lists and return it as one sorted list. + - LeetCode ID: 23 + +2. [Reverse Nodes in k-Group](https://leetcode.com/problems/reverse-nodes-in-k-group/) + + - Problem: Reverse the nodes of a linked list k at a time. + - LeetCode ID: 25 + +3. [Copy List with Random Pointer](https://leetcode.com/problems/copy-list-with-random-pointer/) + + - Problem: A linked list with a random pointer, deep copy the list. + - LeetCode ID: 138 + +4. [LRU Cache](https://leetcode.com/problems/lru-cache/) + + - Problem: Design and implement a data structure for Least Recently Used (LRU) cache. + - LeetCode ID: 146 + +5. [Flatten a Multilevel Doubly Linked List](https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/) + + - Problem: Flatten a multilevel doubly linked list. + - LeetCode ID: 430 + +6. [Linked List Random Node](https://leetcode.com/problems/linked-list-random-node/) + - Problem: Return a random node's value from the linked list. + - LeetCode ID: 382 + +## Conclusion + +Practicing these problems will help reinforce the concepts learned and provide practical experience in using linked lists effectively. By solving these problems, you will enhance your problem-solving skills and deepen your understanding of linked list manipulation in various contexts. diff --git a/docs/dsa/linkedlist/_category_.json b/docs/dsa/linkedlist/_category_.json new file mode 100644 index 000000000..471f3ca54 --- /dev/null +++ b/docs/dsa/linkedlist/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "LinkedList", + "position": 9, + "link": { + "type": "generated-index", + "description": "In data structures, Linked List is basically chains of nodes where each node contains information such as data and a pointer to the next node in the chain. It is a popular data structure with a wide range of real-world applications. In this article, we will provide a complete introduction of Linked List, which will help you tackle any problem based on Linked List." + } +} diff --git a/docs/dsa/master-theorem.md b/docs/dsa/master-theorem.md new file mode 100644 index 000000000..7b0bbcb89 --- /dev/null +++ b/docs/dsa/master-theorem.md @@ -0,0 +1,209 @@ +--- +id: master-theorem +title: Master Theorem for Divide and Conquer Recurrences +sidebar_label: Master Theorem +sidebar_position: 3 +description: "Master Theorem for solving divide and conquer recurrences. Explained with examples." +tags: + [ + dsa, + data-structures, + algorithms, + divide-and-conquer, + master-theorem, + recurrences, + ] +--- + +Master Theorem is a popular technique to solve recurrence relations of divide and conquer algorithms. It provides a way to determine the time complexity of recursive algorithms. The theorem is used to solve recurrences of the form: + +$$ + \boldsymbol{{T(n)} = aT \frac{n}{b} + f(n)} +$$ + +where: + +- $T(n)$ is the time complexity of the algorithm. +- $a$ is the number of subproblems in the recursion. +- $\frac{n}{b}$ is the size of each subproblem. +- $f(n)$ is the time complexity of the work done outside the recursive calls. +- $n$ is the size of the input. +- $a \geq 1$ and $b > 1$ are constants. +- $f(n)$ is a function that is asymptotically positive. +- $T(n)$ is defined on non-negative integers. +- The recurrence relation is defined for $n \geq n_0$ for some constant $n_0$. + +The Master Theorem provides a way to determine the time complexity of the algorithm based on the values of `a`, `b`, and `f(n)`. + +## Master Theorem Cases {#master-theorem-cases} + +The Master Theorem has three cases based on the comparison of `f(n)` with `n^log_b(a)`: + +1. **Case 1**: If `f(n) = O(n^log_b(a - ε))` for some constant `ε > 0`, then `T(n) = Θ(n^log_b(a))`. +2. **Case 2**: If `f(n) = Θ(n^log_b(a))`, then `T(n) = Θ(n^log_b(a) * log(n))`. +3. **Case 3**: If `f(n) = Ω(n^log_b(a + ε))` for some constant `ε > 0`, if `a * f(n/b) <= c * f(n)` for some constant `c < 1` and sufficiently large `n`, then `T(n) = Θ(f(n))`. + +## Example {#example} + +Let's consider the recurrence relation for the Merge Sort algorithm: + +$ + \boldsymbol{{T(n)} = aT \frac{n}{b} + f(n)} +$ + +Here: + +- `a = 2` (number of subproblems). +- `b = 2` (size of each subproblem). +- `f(n) = Θ(n)` (time complexity of work done outside the recursive calls). +- `n` is the size of the input. +- `n0 = 1`. +- `f(n)` is asymptotically positive. +- `a >= 1` and `b > 1`. +- The recurrence relation is defined for `n >= n0`. +- The relation is of the form `T(n) = aT(n/b) + f(n)`. + +Now, let's compare `f(n)` with `n^log_b(a)`: + +- `n^log_b(a) = n^log_2(2) = n`. +- `f(n) = Θ(n)`. +- `f(n) = Θ(n) = n^log_b(a)`. + +Since `f(n) = Θ(n) = n^log_b(a)`, the recurrence relation falls under **Case 2** of the Master Theorem. Therefore, the time complexity of the Merge Sort algorithm is `T(n) = Θ(n * log(n))`. + +## Conclusion {#conclusion} + +The Master Theorem provides a way to determine the time complexity of divide and conquer algorithms. It simplifies the process of solving recurrence relations and helps in analyzing the time complexity of recursive algorithms. By comparing the function `f(n)` with `n^log_b(a)`, the Master Theorem classifies the recurrence relation into one of the three cases and provides the time complexity of the algorithm. + +Master Theorem is a powerful tool to analyze the time complexity of divide and conquer algorithms. It is widely used in the analysis of recursive algorithms to determine their time complexity. + +## Implementations + + + + ```js + function masterTheorem(a, b, f, n) { + if (a < 1 || b < 1) { + return "Invalid input"; + } + + const logBaseB = Math.log(a) / Math.log(b); + + if (f === n ** logBaseB) { + return `T(n) = Θ(n^${logBaseB} * log(n))`; + } else if (f < n ** logBaseB) { + return `T(n) = Θ(n^${logBaseB})`; + } else { + return "Case 3: Not covered by Master Theorem"; + } + } + ``` + + + ```java + public class MasterTheorem { + public static String masterTheorem(int a, int b, int f, int n) { + if (a < 1 || b < 1) { + return "Invalid input"; + } + + double logBaseB = Math.log(a) / Math.log(b); + + if (f == Math.pow(n, logBaseB)) { + return String.format("T(n) = Θ(n^%.2f * log(n))", logBaseB); + } else if (f < Math.pow(n, logBaseB)) { + return String.format("T(n) = Θ(n^%.2f)", logBaseB); + } else { + return "Case 3: Not covered by Master Theorem"; + } + } + + public static void main(String[] args) { + System.out.println(masterTheorem(2, 2, 2, 2)); + } + } + ``` + + + + ```python + def master_theorem(a, b, f, n): + if a < 1 or b < 1: + return "Invalid input" + + log_base_b = a / b + + if f == n ** log_base_b: + return f"T(n) = Θ(n^{log_base_b} * log(n))" + elif f < n ** log_base_b: + return f"T(n) = Θ(n^{log_base_b})" + else: + return "Case 3: Not covered by Master Theorem" + ``` + + + + ```cpp + #include + #include + #include + + std::string masterTheorem(int a, int b, int f, int n) { + if (a < 1 || b < 1) { + return "Invalid input"; + } + + double logBaseB = log(a) / log(b); + + if (f == pow(n, logBaseB)) { + return "T(n) = Θ(n^" + std::to_string(logBaseB) + " * log(n))"; + } else if (f < pow(n, logBaseB)) { + return "T(n) = Θ(n^" + std::to_string(logBaseB) + ")"; + } else { + return "Case 3: Not covered by Master Theorem"; + } + } + + int main() { + std::cout << masterTheorem(2, 2, 2, 2) << std::endl; + return 0; + } + ``` + + + + +## Live Coding Implementation + +```jsx live +function MasterTheoremExample() { + const a = 2, + b = 2, + f = 2, + n = 4; + + function MasterTheorem(a, b, f, n) { + if (a < 1 || b < 1) { + return `Invalid input`; + } + + const logBaseB = Math.log(a) / Math.log(b); + + if (f === n ** logBaseB) { + return `T(n) = Θ(n^${logBaseB} * log(n))`; + } else if (f < n ** logBaseB) { + return `T(n) = Θ(n^${logBaseB})`; + } else { + return `Case 3: Not covered by Master Theorem`; + } + } + + return ( +

    +

    + Output: {MasterTheorem(a, b, f, n)} +

    +
    + ); +} +``` diff --git a/docs/dsa/recursion/_category_.json b/docs/dsa/recursion/_category_.json new file mode 100644 index 000000000..1af68bcf8 --- /dev/null +++ b/docs/dsa/recursion/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Recursion", + "position": 10, + "link": { + "type": "generated-index", + "description": "In data structures, The process in which a function calls itself directly or indirectly is called recursion and the corresponding function is called a recursive function. Using a recursive algorithm, certain problems can be solved quite easily. " + } +} diff --git a/docs/dsa/recursion/recursion.md b/docs/dsa/recursion/recursion.md new file mode 100644 index 000000000..ff8563344 --- /dev/null +++ b/docs/dsa/recursion/recursion.md @@ -0,0 +1,249 @@ +--- +id: recursion-in-dsa +title: Recursion in Data Structures and Algorithms +sidebar_label: Recursion +sidebar_position: 3 +description: "Recursion is a programming technique where a function calls itself directly or indirectly to solve a problem. It is used in various applications such as solving mathematical problems, implementing data structures, and more." +tags: + [ + dsa, + algorithms, + recursion, + recursive-functions, + recursion-in-dsa, + recursion-in-algorithm, + recursion-in-dsa-example, + recursion-in-dsa-explanation, + recursion-in-dsa-conclusion, + recursion-in-dsa-importance, + recursion-in-dsa-syntax, + recursion-in-dsa-implementation, + recursion-in-dsa-applications, + recursion-in-dsa-problems, + recursion-in-dsa-solutions, + recursion-in-dsa-code, + recursion-in-dsa-js, + recursion-in-dsa-java, + recursion-in-dsa-python, + recursion-in-dsa-c, + recursion-in-dsa-cpp, + recursion-in-dsa-ts, + ] +--- + +Recursion is a programming technique where a function calls itself directly or indirectly to solve a problem. It is used in various applications such as solving mathematical problems, implementing data structures, and more. + +## Why is Recursion important? + +Recursion is important because it provides a simple and elegant way to solve complex problems. It allows problems to be broken down into smaller, more manageable subproblems, making it easier to understand and implement solutions. + +## How to implement Recursion? + +Recursion can be implemented in various programming languages using the following syntax: + +## Recursive Function Structure + +```python +def recursive_function(parameters): + if base_condition(parameters): + return base_case_value + else: + return recursive_function(modified_parameters) +``` + +## Examples of Recursive Functions + +### Factorial + + + + + ```js + function factorial(n) { + if (n === 0) { + return 1; + } + return n * factorial(n - 1); + } + ``` + + + + ```java + public class RecursionExample { + public static int factorial(int n) { + if (n == 0) { + return 1; + } + return n * factorial(n - 1); + } + } + ``` + + + + ```python + def factorial(n): + if n == 0: + return 1 + return n * factorial(n - 1) + ``` + + + + ```c + int factorial(int n) { + if (n == 0) { + return 1; + } + return n * factorial(n - 1); + } + ``` + + + + ```cpp + int factorial(int n) { + if (n == 0) { + return 1; + } + return n * factorial(n - 1); + } + ``` + + + + ```ts + function factorial(n: number): number { + if (n === 0) { + return 1; + } + return n * factorial(n - 1); + } + ``` + + +Fibonacci + + + + ```js + function fibonacci(n) { + if (n <= 1) { + return n; + } + return fibonacci(n - 1) + fibonacci(n - 2); + } + ``` + + + + ```java + public class RecursionExample { + public static int fibonacci(int n) { + if (n <= 1) { + return n; + } + return fibonacci(n - 1) + fibonacci(n - 2); + } + } + ``` + + + + ```python + def fibonacci(n): + if n <= 1: + return n + return fibonacci(n - 1) + fibonacci(n - 2) + ``` + + + + ```c + int fibonacci(int n) { + if (n <= 1) { + return n; + } + return fibonacci(n - 1) + fibonacci(n - 2); + } + ``` + + + + ```cpp + int fibonacci(int n) { + if (n <= 1) { + return n; + } + return fibonacci(n - 1) + fibonacci(n - 2); + } + ``` + + + + ```ts + function fibonacci(n: number): number { + if (n <= 1) { + return n; + } + return fibonacci(n - 1) + fibonacci(n - 2); + } + ``` + + + +## Applications of Recursion + +1. Mathematical computations: Factorial, Fibonacci series, power functions, etc. +2. Data structures: Tree and graph traversals. +3. Algorithm design: Divide and conquer algorithms like merge sort and quicksort. +4. Dynamic programming: Recursive definitions with memoization. +5. Common Recursive Problems +6. Tower of Hanoi: Moving disks between rods following specific rules. +7. Permutations and combinations: Generating all possible arrangements or selections. +8. Backtracking: Solving puzzles and constraint satisfaction problems. + +## Advanced Recursive Techniques + +1. Tail Recursion: A special form of recursion where the recursive call is the last statement in the function. Optimized by compilers to prevent stack overflow. +2. Memoization: Caching the results of expensive function calls to improve performance. + +## Resources and References + +### Books: + +1. "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein +2. "The Art of Computer Programming" by Donald Knuth + +### Online Courses: + +1. Coursera: Data Structures and Algorithms Specialization +2. edX: Algorithms and Data Structures + +### Websites: + +1. GeeksforGeeks +2. LeetCode +3. HackerRank + +By understanding and mastering these recursion concepts and techniques, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. + +## Conclusion + +Recursion is a powerful technique in computer science that enables elegant and efficient solutions to complex problems. This guide covers the essential concepts and applications of recursion, providing a comprehensive understanding of how to implement and utilize recursive functions in different programming languages. + +Understanding recursion is crucial for solving numerous problems in computer science, from basic mathematical computations to complex algorithm design. The examples provided demonstrate how to work with recursion effectively, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of recursion enhances your ability to handle algorithmic challenges and perform operations crucial in both everyday programming and competitive coding. + +## Problems for Practice + +To further practice and test your understanding of recursion, consider solving the following problems from LeetCode: + +1. Fibonacci Number +2. Climbing Stairs +3. Permutations +4. Subsets +5. Combination Sum + + + Engaging with these problems will help reinforce the concepts learned and provide practical experience in using recursion effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of recursive algorithms in various contexts. diff --git a/docs/dsa/recursion/recursionVsIteration.md b/docs/dsa/recursion/recursionVsIteration.md new file mode 100644 index 000000000..84d0b0067 --- /dev/null +++ b/docs/dsa/recursion/recursionVsIteration.md @@ -0,0 +1,157 @@ +--- +id: recursion-vs-iteration-in-dsa +title: Difference between Recursion and Iteration in Data Structures and Algorithms +sidebar_label: Recursion vs Iteration +sidebar_position: 3 +description: "Understanding the differences between recursion and iteration is crucial for selecting the appropriate approach for solving various problems in data structures and algorithms. This guide highlights the key differences, advantages, and use cases of both recursion and iteration." +tags: + [ + dsa, + data-structures, + algorithms, + recursion, + iteration, + recursion-vs-iteration, + recursion-in-dsa, + iteration-in-dsa, + recursion-vs-iteration-in-dsa, + recursion-vs-iteration-examples, + recursion-vs-iteration-differences, + recursion-vs-iteration-advantages, + recursion-vs-iteration-disadvantages, + recursion-vs-iteration-usage, + ] +--- + +Understanding the differences between recursion and iteration is crucial for selecting the appropriate approach for solving various problems in data structures and algorithms. This guide highlights the key differences, advantages, and use cases of both recursion and iteration. + +## Introduction + +### Recursion + +Recursion is a technique where a function calls itself in order to solve a smaller instance of the same problem until a base case is reached. Recursive solutions can be elegant and easy to understand but may come with performance overheads due to repeated function calls. + +### Iteration + +Iteration involves using loops (such as for, while, or do-while) to repeat a block of code until a certain condition is met. Iterative solutions are often more efficient in terms of memory usage and execution time compared to recursion, but they can be less intuitive for problems that have a naturally recursive structure. + +## Key Differences + +| Feature | Recursion | Iteration | +| ------------ | ------------------------------------------------------ | ------------------------------------------- | +| Definition | Function calls itself | Loop repeatedly executes block of code | +| Termination | Base case | Loop condition | +| Memory Usage | Uses call stack, can lead to stack overflow | Uses constant or linear memory | +| Readability | Often more readable for problems with recursive nature | Can be less readable for complex conditions | +| Performance | Higher overhead due to function calls | Generally more efficient | +| Use Cases | Divide and conquer, tree and graph traversal | Simple loops, repetitive tasks | + +## Examples + +### Factorial Calculation + +#### Recursion + +```python +def factorial(n): + if n == 0: + return 1 + else: + return n * factorial(n - 1) +``` + +#### Iteration + +```python +def factorial(n): + result = 1 + for i in range(1, n + 1): + result *= i + return result +``` + +### Fibonacci Series + +#### Recursion + +```python +def fibonacci(n): + if n <= 1: + return n + else: + return fibonacci(n - 1) + fibonacci(n - 2) +``` + +#### Iteration + +```python +def fibonacci(n): + a, b = 0, 1 + for _ in range(n): + a, b = b, a + b + return a +``` + +## Advantages and Disadvantages + +### Recursion + +#### Advantages: + + 1. Simplifies the code for problems that have a natural recursive structure. + 2. Makes the code easier to write and understand for problems like tree traversals. + +#### Disadvantages: + + 1. Can lead to stack overflow if the recursion depth is too large. + 2. Generally less efficient in terms of time and space due to function call overhead. + +### Iteration + +#### Advantages: + + 1. More efficient in terms of memory and execution time. + 2. Avoids the risk of stack overflow. + +#### Disadvantages: + + 1. Can result in more complex and less readable code for problems with recursive nature. + 2. Requires explicit management of loop conditions and state. + +## When to Use Recursion vs Iteration + +### Use Recursion When: + +The problem has a naturally recursive structure (e.g., tree and graph traversal). +Code readability and simplicity are more important than performance. +You are dealing with divide-and-conquer algorithms (e.g., quicksort, mergesort). + +### Use Iteration When: + +Performance and memory efficiency are critical. +The problem involves simple repetitive tasks or loops. +You want to avoid the risk of stack overflow for deep recursion. + +## Conclusion + +Both recursion and iteration are fundamental techniques in data structures and algorithms, each with its own strengths and weaknesses. The choice between recursion and iteration depends on the specific problem at hand, the importance of performance and memory usage, and the need for code readability and simplicity. By understanding the differences and appropriate use cases for each approach, you can make informed decisions in your algorithmic implementations. + +## Resources and References + +#### Books: + + 1. "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein + 2. "Data Structures and Algorithm Analysis in C" by Mark Allen Weiss + +#### Online Courses: + + 1. Coursera: Data Structures and Algorithms Specialization + 2. edX: Algorithms and Data Structures + +#### Websites: + + 1. GeeksforGeeks + 2. LeetCode + 3. HackerRank + + Understanding and mastering both recursion and iteration will significantly enhance your ability to solve a wide range of problems in data structures and algorithms. This guide provides a comprehensive overview of the differences, advantages, and use cases for each approach, enabling you to make the best choice for your specific needs. diff --git a/docs/dsa/recursion/recursion_leetcode_questions.md b/docs/dsa/recursion/recursion_leetcode_questions.md new file mode 100644 index 000000000..3010abf3c --- /dev/null +++ b/docs/dsa/recursion/recursion_leetcode_questions.md @@ -0,0 +1,75 @@ +--- +id: recursion-leetcode-questions +title: Recursion Leetcode Questions +sidebar_label: Recursion Leetcode Questions +sidebar_position: 4 +description: "A collection of 20 Leetcode questions focused on recursion, categorized into easy, medium, and hard levels." +tags: + [ + dsa, + data-structures, + algorithms, + recursion, + leetcode, + recursion-leetcode, + recursion-leetcode-easy, + recursion-leetcode-medium, + recursion-leetcode-hard, + recursion-leetcode-questions, + ] +--- + +A collection of 20 Leetcode questions focused on recursion, categorized into easy, medium, and hard levels. + +## Easy + +1. **[Factorial](https://leetcode.com/problems/factorial)** + - Description: Calculate the factorial of a given number using recursion. +2. **[Fibonacci Number](https://leetcode.com/problems/fibonacci-number)** + - Description: Compute the n-th Fibonacci number using recursion. +3. **[Reverse String](https://leetcode.com/problems/reverse-string)** + - Description: Reverse a string using recursion. +4. **[Sum of Digits of a Number](https://leetcode.com/problems/sum-of-digits-of-a-number)** + - Description: Find the sum of digits of a given number using recursion. +5. **[Power of Three](https://leetcode.com/problems/power-of-three)** + - Description: Determine if a number is a power of three using recursion. +6. **[Climbing Stairs](https://leetcode.com/problems/climbing-stairs)** + - Description: Find the number of ways to climb a staircase using recursion. +7. **[Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list)** + - Description: Check if a linked list is a palindrome using recursion. +8. **[Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree)** + - Description: Find the maximum depth of a binary tree using recursion. + +## Medium + +1. **[Subsets](https://leetcode.com/problems/subsets)** + - Description: Generate all possible subsets of a set using recursion. +2. **[Permutations](https://leetcode.com/problems/permutations)** + - Description: Generate all possible permutations of a sequence using recursion. +3. **[Unique Binary Search Trees II](https://leetcode.com/problems/unique-binary-search-trees-ii)** + - Description: Generate all unique BSTs that store values 1 to n using recursion. +4. **[Word Search](https://leetcode.com/problems/word-search)** + - Description: Search for a word in a 2D grid using recursion. +5. **[Combination Sum](https://leetcode.com/problems/combination-sum)** + - Description: Find all unique combinations of numbers that sum to a target using recursion. +6. **[Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number)** + - Description: Generate all possible letter combinations that a phone number could represent using recursion. +7. **[Generate Parentheses](https://leetcode.com/problems/generate-parentheses)** + - Description: Generate all combinations of well-formed parentheses using recursion. + +## Hard + +1. **[N-Queens](https://leetcode.com/problems/n-queens)** + - Description: Solve the N-Queens problem using recursion. +2. **[Sudoku Solver](https://leetcode.com/problems/sudoku-solver)** + - Description: Solve a given Sudoku puzzle using recursion. +3. **[Regular Expression Matching](https://leetcode.com/problems/regular-expression-matching)** + - Description: Implement regular expression matching with support for '.' and '\*' using recursion. +4. **[Longest Valid Parentheses](https://leetcode.com/problems/longest-valid-parentheses)** + - Description: Find the length of the longest valid parentheses substring using recursion. +5. **[Interleaving String](https://leetcode.com/problems/interleaving-string)** + - Description: Determine if a string is an interleaving of two other strings using recursion. + +--- + +These questions provide a comprehensive overview of recursion techniques and are a great way to practice and improve your recursion skills in data structures and algorithms. diff --git a/docs/dsa/stack/_category_.json b/docs/dsa/stack/_category_.json new file mode 100644 index 000000000..9b32456bc --- /dev/null +++ b/docs/dsa/stack/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "Stack", + "position": 12, + "link": { + "type": "generated-index", + "description": "Stack is a linear data structure that follows LIFO principle" + } +} diff --git a/docs/dsa/stack/stack-using-array.md b/docs/dsa/stack/stack-using-array.md new file mode 100644 index 000000000..3dd65eb53 --- /dev/null +++ b/docs/dsa/stack/stack-using-array.md @@ -0,0 +1,244 @@ +--- +id: stack-in-dsa +title: Stack Using Array +sidebar_label: Stack Using Array +sidebar_position: 1 +description: "Stack is a linear data structure that follows LIFO principle" +tags: [dsa, data-structures, stack, LIFO] +--- + +### Introduction to Stack + +A stack is a linear data structure that follows the Last In First Out (LIFO) principle. This means that the last element added to the stack will be the first one to be removed. Stacks are used in various applications such as expression evaluation, function call management in recursion, and more. + +### Stack Operations + +1. **Push**: Add an element to the top of the stack. +2. **Pop**: Remove the top element from the stack. +3. **Peek (or Top)**: Retrieve the top element of the stack without removing it. +4. **isEmpty**: Check if the stack is empty. +5. **Size**: Get the number of elements in the stack. + +### Pseudocode + +#### Basic Operations + +1. **Push**: + + ```text + function push(stack, element): + stack.append(element) + ``` + +2. **Pop**: + + ```text + function pop(stack): + if isEmpty(stack): + return "Stack Underflow" + return stack.pop() + ``` + +3. **Peek**: + + ```text + function peek(stack): + if isEmpty(stack): + return "Stack is empty" + return stack[-1] + ``` + +4. **isEmpty**: + + ```text + function isEmpty(stack): + return len(stack) == 0 + ``` + +5. **Size**: + ```text + function size(stack): + return len(stack) + ``` + +### Implementation in Python, C++, and Java + +#### Python Implementation + +```python +class Stack: + def __init__(self): + self.elements = [] + + def push(self, element): + self.elements.append(element) + + def pop(self): + if self.is_empty(): + return "Stack Underflow" + return self.elements.pop() + + def peek(self): + if self.is_empty(): + return "Stack is empty" + return self.elements[-1] + + def is_empty(self): + return len(self.elements) == 0 + + def size(self): + return len(self.elements) + +# Example usage +stack = Stack() +stack.push(10) +stack.push(20) +print(stack.pop()) # Output: 20 +print(stack.peek()) # Output: 10 +print(stack.is_empty()) # Output: False +print(stack.size()) # Output: 1 +``` + +#### C++ Implementation + +```cpp +#include +#include + +class Stack { +private: + std::vector.elements; + +public: + void push(int element) { + .elements.push_back(element); + } + + int pop() { + if (isEmpty()) { + std::cerr << "Stack Underflow" << std::endl; + return -1; + } + int top =.elements.back(); + .elements.pop_back(); + return top; + } + + int peek() { + if (isEmpty()) { + std::cerr << "Stack is empty" << std::endl; + return -1; + } + return.elements.back(); + } + + bool isEmpty() { + return.elements.empty(); + } + + int size() { + return.elements.size(); + } +}; + +// Example usage +int main() { + Stack stack; + stack.push(10); + stack.push(20); + std::cout << stack.pop() << std::endl; // Output: 20 + std::cout << stack.peek() << std::endl; // Output: 10 + std::cout << std::boolalpha << stack.isEmpty() << std::endl; // Output: false + std::cout << stack.size() << std::endl; // Output: 1 + return 0; +} +``` + +#### Java Implementation + +```java +import java.util.ArrayList; + +public class Stack { + private ArrayList.elements; + + public Stack() { + .elements = new ArrayList<>(); + } + + public void push(int element) { + .elements.add(element); + } + + public int pop() { + if (isEmpty()) { + System.out.println("Stack Underflow"); + return -1; + } + return.elements.remove.elements.size() - 1); + } + + public int peek() { + if (isEmpty()) { + System.out.println("Stack is empty"); + return -1; + } + return.elements.get.elements.size() - 1); + } + + public boolean isEmpty() { + return.elements.isEmpty(); + } + + public int size() { + return.elements.size(); + } + + // Example usage + public static void main(String[] args) { + Stack stack = new Stack(); + stack.push(10); + stack.push(20); + System.out.println(stack.pop()); // Output: 20 + System.out.println(stack.peek()); // Output: 10 + System.out.println(stack.isEmpty()); // Output: false + System.out.println(stack.size()); // Output: 1 + } +} +``` + +### Complexity + +- **Time Complexity**: + + - Push: $O(1)$ + - Pop: $O(1)$ + - Peek: $O(1)$ + - isEmpty: $O(1)$ + - Size: $O(1)$ + +- **Space Complexity**: $O(n)$, where $n$ is the number of elements in the stack. + +### Example + +Consider a stack with the following operations: + +1. Push 10 +2. Push 20 +3. Pop +4. Peek +5. Check if empty +6. Get size + +**Operations**: + +- Push 10: Stack becomes [10] +- Push 20: Stack becomes [10, 20] +- Pop: Removes 20, Stack becomes [10] +- Peek: Returns 10, Stack remains [10] +- isEmpty: Returns false +- Size: Returns 1 + +### Conclusion + +A stack is a fundamental data structure used in computer science for various applications where the LIFO (Last In First Out) principle is required. It is simple to implement and provides efficient operations for adding and removing elements. Understanding and using stacks effectively can help solve many algorithmic problems. diff --git a/docs/dsa/strings/_category_.json b/docs/dsa/strings/_category_.json new file mode 100644 index 000000000..5e94df7ac --- /dev/null +++ b/docs/dsa/strings/_category_.json @@ -0,0 +1,8 @@ +{ + "label": "String", + "position": 8, + "link": { + "type": "generated-index", + "description": "In data structures, a string is a sequence of characters used to represent text. Strings are commonly used for storing and manipulating textual data in computer programs. They can be manipulated using various operations like concatenation, substring extraction, and comparison." + } +} diff --git a/docs/dsa/strings/leetcode_practice_problems_strings.md b/docs/dsa/strings/leetcode_practice_problems_strings.md new file mode 100644 index 000000000..a9ea2bd93 --- /dev/null +++ b/docs/dsa/strings/leetcode_practice_problems_strings.md @@ -0,0 +1,31 @@ +# Practice Problems for Strings + +To further practice and test your understanding of strings, consider solving the following problems from LeetCode: + +## Easy + +1. [Valid Palindrome](https://leetcode.com/problems/valid-palindrome/) +2. [Longest Common Prefix](https://leetcode.com/problems/longest-common-prefix/) +3. [Implement strStr()](https://leetcode.com/problems/implement-strstr/) +4. [Count and Say](https://leetcode.com/problems/count-and-say/) +5. [Reverse String](https://leetcode.com/problems/reverse-string/) +6. [First Unique Character in a String](https://leetcode.com/problems/first-unique-character-in-a-string/) +7. [Valid Anagram](https://leetcode.com/problems/valid-anagram/) +8. [Reverse Vowels of a String](https://leetcode.com/problems/reverse-vowels-of-a-string/) +9. [Detect Capital](https://leetcode.com/problems/detect-capital/) +10. [Repeated Substring Pattern](https://leetcode.com/problems/repeated-substring-pattern/) + +## Medium + +11. [Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/) +12. [Longest Palindromic Substring](https://leetcode.com/problems/longest-palindromic-substring/) +13. [Group Anagrams](https://leetcode.com/problems/group-anagrams/) +14. [Decode String](https://leetcode.com/problems/decode-string/) +15. [String to Integer (atoi)](https://leetcode.com/problems/string-to-integer-atoi/) +16. [Letter Combinations of a Phone Number](https://leetcode.com/problems/letter-combinations-of-a-phone-number/) +17. [Simplify Path](https://leetcode.com/problems/simplify-path/) +18. [Add Bold Tag in String](https://leetcode.com/problems/add-bold-tag-in-string/) +19. [Find All Anagrams in a String](https://leetcode.com/problems/find-all-anagrams-in-a-string/) +20. [Longest Palindromic Subsequence](https://leetcode.com/problems/longest-palindromic-subsequence/) + +Engaging with these problems will help reinforce the concepts learned and provide practical experience in using strings effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of string manipulation in various contexts. diff --git a/docs/dsa/strings/strings-dsa.md b/docs/dsa/strings/strings-dsa.md new file mode 100644 index 000000000..a37e5923a --- /dev/null +++ b/docs/dsa/strings/strings-dsa.md @@ -0,0 +1,352 @@ +--- +id: strings-in-dsa +title: Strings in Data Structures and Algorithms +sidebar_label: Strings +sidebar_position: 1 +description: "A string is a sequence of characters. It is a data structure that represents a sequence of characters, either as a literal constant or as some kind of variable. In data structures and algorithms, strings are used in a wide range of applications such as text processing, pattern matching, and data serialization." +tags: + [ + dsa, + data-structures, + strings, + string, + string-data-structure, + string-in-dsa, + string-in-data-structure, + string-in-algorithm, + string-in-dsa-example, + string-in-dsa-explanation, + string-in-dsa-conclusion, + string-in-dsa-importance, + string-in-dsa-syntax, + string-in-dsa-declaration, + string-in-dsa-access, + string-in-dsa-update, + string-in-dsa-length, + string-in-dsa-iterate, + string-in-dsa-max-min, + string-in-dsa-program, + string-in-dsa-code, + string-in-dsa-js, + string-in-dsa-java, + string-in-dsa-python, + string-in-dsa-c, + string-in-dsa-cpp, + string-in-dsa-ts, + ] +--- + +A string is a sequence of characters. It is a data structure that represents a sequence of characters, either as a literal constant or as some kind of variable. In data structures and algorithms, strings are used in a wide range of applications such as text processing, pattern matching, and data serialization. + +## Why are Strings important? + +Strings are important because they are used to store and manipulate text. They are used in many applications such as text processing, pattern matching, and data serialization. + +## How to declare a String? + +A string can be declared in various programming languages using the following syntax: + +# Strings in Data Structures and Algorithms (DSA) + +## Table of Contents + +1. [Introduction](#introduction) +2. [Basic String Operations](#basic-string-operations) +3. [Pattern Matching Algorithms](#pattern-matching-algorithms) +4. [String Manipulation](#string-manipulation) +5. [String Data Structures](#string-data-structures) +6. [Common String Problems](#common-string-problems) +7. [Advanced String Algorithms](#advanced-string-algorithms) +8. [Resources and References](#resources-and-references) + +## Introduction + +Strings are sequences of characters and are a fundamental data type in computer science. They are used extensively in algorithms and data structures. + +## Basic String Operations + +- **Length**: Determine the length of a string. +- **Concatenation**: Combine two or more strings. +- **Substring**: Extract a portion of a string. +- **Comparison**: Compare two strings lexicographically. +- **Search**: Find the occurrence of a substring. + +## Why are Strings important? + +Strings are important because they are used to store and manipulate text. They are used in many applications such as text processing, pattern matching, and data serialization. + +## How to declare a String? + +A string can be declared in various programming languages using the following syntax: + + + + + ```js + // Declare a string in JavaScript + let str = "Hello, world!"; + ``` + + + + ```java + // Declare a string in Java + String str = "Hello, world!"; + ``` + + + + ```python + # Declare a string in Python + str = "Hello, world!" + ``` + + + + ```c + // Declare a string in C + char str[] = "Hello, world!"; + ``` + + + + ```cpp + // Declare a string in C++ + std::string str = "Hello, world!"; + ``` + + + + ```ts + // Declare a string in TypeScript + let str: string = "Hello, world!"; + ``` + + + +## How to access a String? + +A string can be accessed using the index of the character. The index of the first character is 0, the index of the second character is 1, and so on. + + + + + ```js + // Access a string in JavaScript + let str = "Hello, world!"; + console.log(str[0]); // H + console.log(str[1]); // e + console.log(str[2]); // l + ``` + + + + ```java + // Access a string in Java + String str = "Hello, world!"; + System.out.println(str.charAt(0)); // H + System.out.println(str.charAt(1)); // e + System.out.println(str.charAt(2)); // l + ``` + + + + ```python + # Access a string in Python + str = "Hello, world!" + print(str[0]) # H + print(str[1]) # e + print(str[2]) # l + ``` + + + + ```c + // Access a string in C + char str[] = "Hello, world!"; + printf("%c\n", str[0]); // H + printf("%c\n", str[1]); // e + printf("%c\n", str[2]); // l + ``` + + + + ```cpp + // Access a string in C++ + std::string str = "Hello, world!"; + std::cout << str[0] << std::endl; // H + std::cout << str[1] << std::endl; // e + std::cout << str[2] << std::endl; // l + ``` + + + + ```ts + // Access a string in TypeScript + let str: string = "Hello, world!"; + console.log(str[0]); // H + console.log(str[1]); // e + console.log(str[2]); // l + ``` + + + +## How to update a String? + +A string can be updated by creating a new string with the desired changes, as strings are immutable in many programming languages. + + + + + ```js + // Update a string in JavaScript + let str = "Hello, world!"; + str = "Hello, JavaScript!"; + console.log(str); // Hello, JavaScript! + ``` + + + + ```java + // Update a string in Java + String str = "Hello, world!"; + str = "Hello, Java!"; + System.out.println(str); // Hello, Java! + ``` + + + + ```python + # Update a string in Python + str = "Hello, world!" + str = "Hello, Python!" + print(str) # Hello, Python! + ``` + + + + ```c + // Update a string in C + char str[] = "Hello, world!"; + strcpy(str, "Hello, C!"); + printf("%s\n", str); // Hello, C! + ``` + + + + ```cpp + // Update a string in C++ + std::string str = "Hello, world!"; + str = "Hello, C++!"; + std::cout << str << std::endl; // Hello, C++! + ``` + + + + ```ts + // Update a string in TypeScript + let str: string = "Hello, world!"; + str = "Hello, TypeScript!"; + console.log(str); // Hello, TypeScript! + ``` + + + +## How to find the length of a String? + +The length of a string can be found using the `length` property or method. + + + + + ```js + // Find the length of a string in JavaScript + let str = "Hello, world!"; + console.log(str.length); // 13 + ``` + + + + ```java + // Find the length of a string in Java + String str = "Hello, world!"; + System.out.println(str.length()); // 13 + ``` + + + + ```python + # Find the length of a string in Python + str = "Hello, world!" + print(len(str)) # 13 + ``` + + + +## Pattern Matching Algorithms + +- **Naive Pattern Matching**: A straightforward approach with a time complexity of O(m\*n). +- **Knuth-Morris-Pratt (KMP)**: An efficient pattern matching algorithm with a time complexity of O(m+n). +- **Rabin-Karp Algorithm**: Uses hashing for pattern matching with a time complexity of O(m+n) on average. +- **Boyer-Moore Algorithm**: A powerful algorithm with a worst-case time complexity of O(m\*n) but performs well in practice. + +## String Manipulation + +- **Reversal**: Reversing a string. +- **Palindromes**: Checking if a string reads the same forwards and backwards. +- **Anagrams**: Checking if two strings are permutations of each other. +- **Rotation**: Rotating a string by a given number of characters. + +## String Data Structures + +- **Trie (Prefix Tree)**: A tree-like data structure that stores a dynamic set of strings, typically used for search operations. +- **Suffix Tree**: A compressed trie of all suffixes of a given string, useful for pattern matching. +- **Suffix Array**: An array of all suffixes of a string, sorted in lexicographical order. +- **Aho-Corasick Algorithm**: A trie-based data structure for multiple pattern matching. + +## Common String Problems + +- **Longest Common Substring**: Finding the longest substring that appears in two or more strings. +- **Longest Common Subsequence**: Finding the longest sequence that can be derived from two strings without changing the order of characters. +- **Edit Distance (Levenshtein Distance)**: Measuring the minimum number of single-character edits required to change one string into another. +- **String Compression**: Reducing the size of a string using algorithms like Run-Length Encoding (RLE). + +## Advanced String Algorithms + +- **Burrows-Wheeler Transform (BWT)**: A data transformation algorithm useful for data compression. +- **Manacher’s Algorithm**: An efficient algorithm to find the longest palindromic substring in linear time. +- **Z-Algorithm**: Finds occurrences of a pattern in a string in linear time. + +## Resources and References + +- **Books**: + - "Introduction to Algorithms" by Cormen, Leiserson, Rivest, and Stein + - "Algorithms" by Robert Sedgewick and Kevin Wayne +- **Online Courses**: + - Coursera: Data Structures and Algorithm Specialization + - edX: Algorithms and Data Structures +- **Websites**: + - [GeeksforGeeks](https://www.geeksforgeeks.org) + - [LeetCode](https://leetcode.com) + - [HackerRank](https://www.hackerrank.com) + +--- + +By understanding and mastering these string concepts and algorithms, you will be well-equipped to tackle a wide range of problems in data structures and algorithms. + +## Conclusion + +Strings are a vital data structure in the study of data structures and algorithms (DSA). They are sequences of characters used to represent text and are fundamental to various programming tasks. In this tutorial, we explored the essential operations related to strings, including declaration, access, modification, length determination, iteration, and searching in different programming languages like JavaScript, Java, Python, C, C++, and TypeScript. + +Understanding strings is crucial for solving numerous problems in computer science, from simple text manipulation to complex algorithms in text processing, pattern matching, and more. The examples provided demonstrate how to work with strings efficiently, ensuring a robust foundation for tackling more advanced DSA concepts. Mastery of strings enhances your ability to handle data and perform operations crucial in both everyday programming and competitive coding. + +Problems for Practice +To further practice and test your understanding of strings, consider solving the following problems from LeetCode: + +1. Longest Substring Without Repeating Characters +2. Valid Anagram +3. Longest Palindromic Substring +4. Group Anagrams +5. Minimum Window Substring + +Engaging with these problems will help reinforce the concepts learned and provide practical experience in using strings effectively. By practicing these problems, you will enhance your problem-solving skills and deepen your understanding of string manipulation in various contexts.

    H}Jk5Jui(%PO@9{`;*DXuC2GebM&m+Z|Xit_bLy z3atTPxR9KJ$z{!cFM>=^rrXn8gMQ4EtN>UD!^{WO;)&av--U5k$2s(EXWf=L7uzga zzN%`>r8@m3LsS(YDa!sW?fN^9i@1<&S`^;zv_37zefBWDVY(%n0x+W;o zT4YQ;wc-?nwkD^4P5dIkB#lyv(ffp&DNVyd0vRbFH@jL*1B2mjR(Gp|#^rw*H&286 z$#T{RDqPa3OxY}KtsRYPR;ez(ZudOglGYUr`kp;3$o`H+HGTMNwRsXt?2+k@eH4UC zBPpMxi-CYF-`z@W`RKx4=MgsOqr!^0tSl~y4X8=sLMJ*&Mgv0N)9My5&P?UJMcv|~ z%tr+PL-vk3>+zgzxupmdtzW#2h)mz8)ZNBY$M@QUFj5YNPU>2FwKDV=q>t{M+zA)d~HsA1vL+XR_3eYK?OWCE3zF8CUkFzV30=fDqKcr4d-CJfMWDIAb=p?&Op4QIkxdFyV!s%1;eqCh)pUwD^5v|%gmf( z*McwQgEg(KTjA5Cq^*J>}{LkQ?2END^( zz@Sw(xl>ai2=#)NQT|zBT)+^q9F!8DKV5SEUDp0l@57xZ9-!T~@H@YOOxT1G(0ViD zdYc&O0f%4|(d_d&qK6bDN*4Bd5STabjFRA-PRkJR7FeQdByK0yN|pZ+e27EZ42;~NAGvx5hM8Kr}rNeBQ|H&Q-{V#gB+vWd3cMJI6 zbNYY3_rC{pcWC`z{rwkg|Id5>|7@SOp50<$I8y`v=Go(eKp<9EIbBzC6ITl{GiM9n z0pf%632?)OxOs)N_;|(OqGE6XPB>f)4(E1NZTL?O>>bUmQJ(*O14E9J`#=Mbf}E;s JxeW5%{{Us;POks} diff --git a/docs/Operating System/image-7.png b/docs/Operating System/image-7.png deleted file mode 100644 index 6aed8089a21aa17c233ee798d442725f6ee0f964..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92902 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