जावा में एल्गोरिदम और डेटा संरचनाएँ: सिद्धांत से अभ्यास तक
एल्गोरिदम और डेटा संरचनाओं की समझ वह नींव है जिस पर किसी भी Java-डेवलपर का करियर बनता है। इस ज्ञान के बिना कुशल, स्केलेबल और रखरखाव योग्य कोड लिखना मुश्किल है। इस लेख में, हम प्रमुख डेटा संरचनाओं और एल्गोरिदम पर चर्चा करेंगे जिनका आप प्रतिदिन उपयोग करेंगे, और व्यावहारिक उदाहरणों के साथ Java में उनका कार्यान्वयन दिखाएंगे।
1. Java Collections Framework में बुनियादी डेटा संरचनाएँ
Java एक शक्तिशाली कलेक्शन फ्रेमवर्क प्रदान करता है जिसमें बुनियादी डेटा संरचनाएँ शामिल हैं। आइए तीन सबसे लोकप्रिय पर नज़र डालें।
ArrayList — डायनामिक ऐरे
ArrayList डायनामिक ऐरे का एक कार्यान्वयन है। नए तत्व जोड़ने पर यह स्वचालित रूप से विस्तारित होता है, जो इसे अज्ञात आकार वाली सूचियों के लिए एक उत्कृष्ट विकल्प बनाता है।
import java.util.ArrayList;
public class ArrayListExample { public static void main(String[] args) { ArrayList<String> fruits = new ArrayList<>(); fruits.add("सेब"); fruits.add("केला"); fruits.add("संतरा");
System.out.println("दूसरा तत्व: " + fruits.get(1)); // केला fruits.remove(0); System.out.println("हटाने के बाद आकार: " + fruits.size()); // 2 for (String fruit : fruits) { System.out.println(fruit); } }}संचालन की जटिलता: इंडेक्स द्वारा पहुँच — O(1), बीच में सम्मिलन/हटाना — O(n)।
HashMap — हैश टेबल
HashMap «कुंजी-मान» जोड़े संग्रहीत करता है और कुंजी द्वारा डेटा तक लगभग तत्काल पहुँच प्रदान करता है।
import java.util.HashMap;
public class HashMapExample { public static void main(String[] args) { HashMap<String, Integer> ages = new HashMap<>(); ages.put("अन्ना", 25); ages.put("इवान", 30); ages.put("मारिया", 28);
System.out.println("अन्ना की आयु: " + ages.get("अन्ना")); // 25 // कुंजी की उपस्थिति की जाँच if (ages.containsKey("इवान")) { System.out.println("इवान मिल गया!"); } // सभी प्रविष्टियों को पार करना for (String name : ages.keySet()) { System.out.println(name + ": " + ages.get(name) + " वर्ष"); } }}संचालन की जटिलता: सम्मिलन, खोज, हटाना — औसतन O(1)।
LinkedList — डबली लिंक्ड लिस्ट
LinkedList नोड्स से बनी होती है, जिनमें से प्रत्येक पिछले और अगले तत्वों के संदर्भ संग्रहीत करता है। सूची की शुरुआत या अंत में बार-बार सम्मिलन और हटाने के लिए आदर्श।
import java.util.LinkedList;
public class LinkedListExample { public static void main(String[] args) { LinkedList<Integer> queue = new LinkedList<>(); // क्यू (FIFO) के रूप में उपयोग queue.addLast(1); queue.addLast(2); queue.addLast(3); System.out.println("क्यू में पहला: " + queue.getFirst()); // 1 queue.removeFirst(); System.out.println("हटाने के बाद: " + queue); // [2, 3] // स्टैक (LIFO) के रूप में उपयोग queue.push(10); // शुरुआत में जोड़ें queue.push(20); System.out.println("स्टैक का शीर्ष: " + queue.pop()); // 20 }}संचालन की जटिलता: शुरुआत/अंत में सम्मिलन/हटाना — O(1), इंडेक्स द्वारा पहुँच — O(n)।
2. जावा में सॉर्टिंग एल्गोरिदम
सॉर्टिंग सबसे सामान्य कार्यों में से एक है। आइए दो क्लासिक कार्यान्वयनों पर नज़र डालें।
बबल सॉर्ट (Bubble Sort)
सरल लेकिन धीमा एल्गोरिदम। शैक्षिक उद्देश्यों के लिए उपयोग किया जाता है।
public class BubbleSort { public static void bubbleSort(int[] arr) { int n = arr.length; boolean swapped; for (i