Introduction to
Data Structures
किसी problem को solve करने के लिए data को computer memory में एक systematic तरीके से store और
organize करना ताकि उसे efficiently use किया जा सके data structure कहलाता है।
एक programmer के रूप में आपको कई real world problems को solve करना होता है। इन problems को solve करते समय data और उसका organization बहुत Important होता है।
एक programmer के रूप में problems को solve करने के लिए आपको निचे दिए जा रहे tasks perform करने पड़ सकते है।
Data structures create करना।
Data structures के साथ operations (searching, sorting, traversing आदि) perform करना।
Data structures की performances को analyze करना।
आगे आने वाली tutorials
में आप अलग अलग तरह के data structures create करना और उन data structures के साथ operations perform करना सीखेंगे। इसके अलावा आप data structures की performances को analyze करना भी सीखेंगे।
एक बात आपको हमेशा ध्यान रखनी चाहिए की data structures कोई language नहीं होती है। Data
structure सिर्फ data को store और organize करने का तरीका होता है जिसे किसी भी programming language जैसे की C, C++ और java आदि में implement किया जा सकता है।
क्योंकि C
एक
basic language है जिसका syntax
ज्यादातर modern
programming languages द्वारा follow किया जाता है। इसलिए Data
structures की इस
tutorial series में C language के द्वारा ही
data structures को implement करना बताया जाएगा।
Characteristics of Data Structures
किसी भी
data structure में
निचे दी
गयी characteristics होती है।
Correctness
किसी data structure की सबसे महत्वपूर्ण विशेषता यह होती
है की
वह problem को correctly solve करता
है। यदि
कोई data structure problem को partially (आधी अधूरी)
solve करता है
तो वह
उस problem के लिए correct data
structure नहीं माना जा
सकता है।
Time Complexity
कोई data structure operations
perform करने में जितना
समय लेता
है वह उस data
structure की time
complexity कहलाती है। अलग अलग
data structures की
time complexity check करने
के लिए
performance analysis और
measurement tools प्रयोग
किये जाते
है।
एक data structure के द्वारा
perform होने वाले
operations कम से कम
समय लेते
है। जिस data structure के द्वारा
perform होने वाले
operations कम
से कम
समय लेते
है वही
data structure problem को
solve करने के
लिए सही
माना जाता
है।
Space Complexity
कोई data structure data के storage और operations के
लिए जितना
computer memory space use करता
है वह
उस data structure की space complexity कहलाती है।
Space complexity को
test करने के
लिए भी
कई performance और analysis tools प्रयोग
किये जाते
है।
एक data structure के द्वारा
store किया जाने
वाला data और perform किये
जाने वाले
operations कम से कम memory space use करते
है। जिस
data structure द्वारा
कम से
कम space use किया जाता
है वही
problem को solve करने के
लिए best solution माना जाता
है।
Advantages of Data Structures
Data
structures को implement और use करने की
कुछ advantages निचे दी
जा रही
है।
Gives Ability to Store and
Process Data in Desired Way
Data
structures की सबसे बड़ी
advantages यह होती है
की आप
अपने मनचाहे
तरीके से
data को store कर सकते और और
मनचाहे तरीके
से ही
उस पर
operations peform कर
सकते है।
आप किसी
निश्चित framework को follow करने
के लिए
बाध्य नहीं
होते है।
इससे आपको
problems को solve करने के
लिए creative solutions implement करने की
आजादी मिलती
है।
Uses Less
Processor Time
Data
structure द्वारा perform किये जाने
वाले operations processor का कम
से कम
time utilize करते है। इससे
computer processor पर
कम load पड़ता है
और वह
बड़ी मात्रा
में available data को भी
कम समय
में process कर पाता है।
Uses Less Memory Space
जब आप
किसी बड़े
project पर काम
करते है तो computer की memory को ठीक से utilize करना एक
priority होती है। Data structures किसी problem के solution के
रूप में
कम से
कम memory space acquire करते है।
इससे आपके
लिए दूसरे
tasks perform करने के लिए पर्याप्त memory होती है और memory loss या shortage जैसी
समस्याएँ नहीं
आती है।
Easy to Perform Complex
Operations
Data
structures के द्वारा किसी
problem के सन्दर्भ में complex operations आसानी से
प्रयोग किये
जा सकते
है।
Introduction to Stack Push Operation
जब एक
stack data structure में
कोई नया
element insert किया
जाता है
तो वह
operation push operation कहलाता
है।
जब भी
आप stack में कोई
element insert करते
है तो
सबसे पहले
यह check करते है
की कँही
stack full तो नहीं है।
यदि stack full होता है
तो आप
उसमें कोई
element insert नहीं
कर सकते
है। यह
condition stack overflow कहलाती है।
Introduction to Stack Pop Operation
जब stack में से
किसी item को remove किया
जाता है
तो वह
operation pop operation कहलाता
है। Stack items एक ही side
(TOP) से remove किये जा
सकते है।
किसी भी
item को आप
stack के बीच
से नहीं
remove कर सकते
है।
Stack
में से
किसी item को remove करने
से पहले
आप यह
check करते है
की कँही
stack empty तो नहीं है।
क्योंकि यदि
stack empty होगा तो आप
उसमें से
item remove नहीं कर सकते
है।
जब किसी empty stack में से कोई item remove करने का प्रयास किया जाता है तो वह situation stack underflow
कहलाती है। Stack underflow की condition में आप user को message show करते है की stack empty है।
Introduction to Queue Insertion
जब queue में कोई
element add किया जाता है
तो वह
operation insertion कहलाता
है। Queue के अंदर कोई भी
element हमेशा rear side से ही insert किया जाता
है। इसलिए
जब भी
queue data structure में
कोई element add किया जाता
है तो
rear variable की value
increase हो जाती है।
जब queue में कोई
element add किया जाता है
तो सबसे
पहले यह
check किया जाता
है की
कँही queue empty तो नहीं है। ऐसा
इस प्रकार
किया जाता
है।
Introduction to Queue Deletion
जब queue में से
किसी element को remove किया
जाता है
तो वह
operation deletion कहलाता
है। Queue में किसी
भी element का deletion front से
होता है।
Queue में बीच
में deletion operation perform नहीं किया
जाता है।
ऐसा इसलिए
होता है
क्योंकि queue data structure First in First Out
structure को follow करता है।
Queue
को define करते समय
front और
rear variables भी
define किये जाते
है। जब
भी queue में से
कोई element remove किया जाता
है तो
front variable की
value change होती है।
Queue में से
element को REMOVE करते समय सबसे पहले यह check किया जाता है की कँही queue empty तो नहीं है। यदि deletion करते समय queue empty पायी जाती है तो वह condition queue overflow कहलाती है। ऐसी situation में user को appropriate message show किया जाना चाहिए।
Introduction to Tree Data Structure
Tree
एक non-linear data structure है। अब
तक आपने
जितने भी
data structures के
बारे में
पढ़ा है
वे सब
data को sequence में organize करते है।
लेकिन tree data को non-linear way में
store करता है।
Tree
data structure का
उपयोग प्राकतिक
रूप से
hierarchical data को
organize करने के लिए
किया जाता
है। यदि
दूसरे शब्दों
में कहा
जाये तो
जब data elements के बीच
hierarchical relationship हो
तो उसे
tree data structure के
द्वारा represent किया जाता
है।
Hierarchical
relationship में data elements के बीच
parent/child relationship होती है। इस तरह की
relationship में एक data element के कई
child elements हो सकते है और उन
child elements के भी कई
child elements हो सकते है।
एक linear data structure जैसे की
linked-list, stack और
queue आदि में
एक element next और previous elements को point करता है।
लेकिन tree एक non linear data structure है, tree में
एक element बहुत सारे दूसरे elements को point कर
सकता है।
आइये अब
tree data structure का
example देखते है।
मान लीजिये
आप किसी
organization में employees की position को tree के
द्वारा represent करना चाहते
है। ऐसा
आप इस
प्रकार कर
सकते है।
जैसा की आप ऊपर दिए गए diagram में देख सकते है, एक
tree में data elements को node के द्वारा represent किया जाता है। Tree की सबसे top node root कहलाती है। Tree में
nodes को links या edges द्वारा connect किया जाता है।
ऊपर दिए गए
diagram में CEO (Chief Executive Officer) के under में CTO (Chief Technical Officer) और CFO (Chief Financial Officer) को दर्शाया गया है। इसके बाद CTO और CFO के under में दो दो
software engineers और
charted accountants को दर्शाया गया है।
Tree Data Structure
Terminology
Tree data structure के उपयोग के लिए कुछ ऐसी terms है जिनके बारे में आपको पता होना चाहिए। इनके बारे में निचे बताया जा रहा है।
Node – Node द्वारा information/data को represent किया जाता है। Tree में store किये जाने वाला हर data item एक node होता है।
Root – किसी tree की origin node root कहलाती है। यह वह node होती है जँहा से tree start होता है।
Degree of Node – किसी node के जितने child होते है या फिर किसी node से जितने sub tree बनते है वे उस node की degree कहलाते है।
Parent -किसी node की origin node उसकी parent node कहलाती है।
Child – किसी node से निकलने वाली sub
node उसकी child कहलाती है।
Degree of Tree – Node के अधिकतम degree ही tree की degree कहलाती है। यदि tree में किसी node की अधिकतम degree 3 है तो tree की degree
भी 3 ही होगी।
Terminal/Leaf Node – वह node जिसकी कोई child node नहीं होती है terminal या leaf
node कहलाती है।
Non Terminal Node – जिस node की degree zero नहीं होती है वह non-terminal node कहलाती है।
Siblings – Same parent की child nodes sibling कहलाती है।
Edges/Links – किसी tree में nodes को आपस में जिन lines द्वारा connect किया जाता है वे edges या links कहलाती है।
Path – Source node से किसी node तक जिन nodes से travel किया जाता है उनका set उस node का path कहलाता है।
Levels – Tree की root node का level हमेशा 0 होता है। Root की child
nodes का level 1 होता है और उनकी child nodes का level 2 होता है। इसी प्रकार हर subtree के साथ एक level बढ़ता जाता है।
Branch – Tree के अंदर एक path जो leaf node द्वारा terminate होता है branch कहा जाता है।
Depth – Tree की जिस branch में सबसे अधिक nodes होती है वह उस tree की depth कहलाती है।
Introduction to Binary Tree Traversal
Binary
tree की सभी nodes को कोई
operation perform करने
के लिए एक साथ
visit करना traversal कहलाता है।
एक binary tree को traverse करते
समय उसकी
हर node को सिर्फ एक बार
access किया जाता
है और
उसके साथ
कुछ operation perform किया जाता
है।
उदाहरण के
लिए आप
binary tree को traverse करके उसकी
सभी nodes का data print कर
सकते है।
इसके अलावा
binary tree को traverse करके node में available data को increase या decrease किया
जा सकता
है।
Introduction to Binary Tree Insertion
Binary
tree को programmatically struct के द्वारा
represent (या create) किया जाता
है। इसे
linked list representation भी
कहा जाता
है। इसके
बारे में
पिछली tutorial (Binary Tree Introduction) में बताया
जा चूका
है।
एक बार
फिर से
binary tree (node) create करने के लिए
आप जिस
syntax का प्रयोग
करते है वह निचे बताया
जा रहा
है।
हालाँकि
binary tree को array के द्वारा भी
create किया जा सकता है लेकिन
memory के बेहतर
utilization के लिए ज्यादातर
struct द्वारा ही
binary tree को create किया जाता है।
Binary
tree के अंदर
कोई भी नयी
node create करने के लिए
ऊपर दिए
गए struct का variable create किया
जाता है। इस
struct के जितने
variables create किये
जाते है
उतनी nodes tree की create होती
है।
Binary
tree को उसकी
root node define करके ही
create किया जाता है।
Root node define करने के बाद आप दूसरी
nodes को
binary tree में insert कर सकते है।
इसलिए insertion function में आप
सबसे पहले
यह check करते है
की root की value NULL है
या नहीं।
यदि root की value NU LL होती
है root को memory assign की
जाती है
और उसके
data, left और right
variables को initialize किया जाता
है।