મુખ્ય સામગ્રી પર જાઓ
  1. સંસાધનો/
  2. અભ્યાસ સામગ્રી/
  3. ઇન્ફોર્મેશન અને કમ્યુનિકેશન ટેકનોલોજી એન્જિનિયરિંગ/
  4. આઈસીટી સેમેસ્ટર 3/
  5. ડેટા સ્ટ્રક્ચર્સ એન્ડ એલ્ગોરિધમ્સ (1333203)/

ડેટા સ્ટ્રક્ચર અને એપ્લિકેશન (1333203) - વિન્ટર 2023 સોલ્યુશન

24 મિનિટ· ·
અભ્યાસ-સામગ્રી સોલ્યુશન ડેટા-સ્ટ્રક્ચર 1333203 2023 વિન્ટર
મિલવ ડબગર
લેખક
મિલવ ડબગર
ઇલેક્ટ્રિકલ અને ઇલેક્ટ્રોનિક મેન્યુફેક્ચરિંગ ઉદ્યોગમાં અનુભવી લેક્ચરર. એમ્બેડેડ સિસ્ટમ્સ, ઈમેજ પ્રોસેસિંગ, ડેટા સાયન્સ, મેટલેબ, પાયથન, STM32માં કુશળ. એલ.ડી. કોલેજ ઓફ એન્જિનિયરિંગ - અમદાવાદથી કમ્યુનિકેશન સિસ્ટમ્સ એન્જિનિયરિંગમાં માસ્ટર્સ ડિગ્રી ધરાવતા મજબૂત શિક્ષણ વ્યાવસાયિક.
અનુક્રમણિકા

પ્રશ્ન 1(અ) [3 ગુણ]
#

લીન્કડ લીસ્ટની વ્યાખ્યા આપો. વિવિધ પ્રકારના લિન્ક્ડ લીસ્ટ ની યાદી આપો.

જવાબ:

વ્યાખ્યાલિન્ક્ડ લિસ્ટના પ્રકાર
લિન્ક્ડ લિસ્ટ એ લીનિયર ડેટા સ્ટ્રક્ચર છે જેમાં એલિમેન્ટ્સ નોડ્સમાં સ્ટોર થાય છે, અને દરેક નોડ ક્રમમાં આગળના નોડને પોઇન્ટ કરે છે1. સિંગલી લિન્ક્ડ લિસ્ટ
2. ડબલી લિન્ક્ડ લિસ્ટ
3. સર્ક્યુલર લિન્ક્ડ લિસ્ટ
4. સર્ક્યુલર ડબલી લિન્ક્ડ લિસ્ટ

ડાયાગ્રામ:

SDCioinurgbclluyyl::ar:[[[DPDaratetavaNDNeaextxtat]|]Nex[t[D]Daattaa|[|NPNerexextvt]|]Dat[a[D|DaNatetaxa|t|N]Neexxtt][]PreNvU|LDLata|Next]NULL

યાદ રાખવાની યુક્તિ: “એક, બે, ગોળ, બે-ગોળ”

પ્રશ્ન 1(બ) [4 ગુણ]
#

પાયથનમાં લીનીયર અને નોન-લીનીયર ડેટા સ્ટર્ચર ઉદાહરણ સાથે સમજાવો.

જવાબ:

ડેટા સ્ટ્રક્ચરવર્ણનપાયથન ઉદાહરણો
લીનીયરએલિમેન્ટ્સ ક્રમિક રીતે ગોઠવાયેલા હોય છે જેમાં દરેક એલિમેન્ટને એકદમ એક અગાઉનું અને એક પછીનું એલિમેન્ટ હોય છે (પ્રથમ અને છેલ્લા સિવાય)Lists: [1, 2, 3]
Tuples: (1, 2, 3)
Strings: "abc"
Queue: queue.Queue()
નોન-લીનીયરએલિમેન્ટ્સ ક્રમિક રીતે ગોઠવાયેલા નથી; એક એલિમેન્ટ અનેક એલિમેન્ટ્સ સાથે જોડાઈ શકે છેDictionary: {"a": 1, "b": 2}
Set: {1, 2, 3}
Tree: કસ્ટમ ઇમ્પ્લીમેન્ટેશન
Graph: કસ્ટમ ઇમ્પ્લીમેન્ટેશન

ડાયાગ્રામ:

graph TD
    A[ડેટા સ્ટ્રક્ચર્સ]
    A --> B[લીનીયર]
    A --> C[નોન-લીનીયર]
    B --> D[એરે]
    B --> E[લિન્ક્ડ લિસ્ટ]
    B --> F[સ્ટેક]
    B --> G[ક્યુ]
    C --> H[ટ્રી]
    C --> I[ગ્રાફ]
    C --> J[હેશ ટેબલ]

યાદ રાખવાની યુક્તિ: “લીનીયર લાઈનમાં, નોન-લીનીયર ચારે બાજુ”

પ્રશ્ન 1(ક) [7 ગુણ]
#

પાયથનમાં ક્લાસ, એટ્રીબ્યુટ, ઓબ્જેક્ટ અને ક્લાસ મેથડ યોગ્ય ઉદાહરણ સાથે સમજાવો.

જવાબ:

ડાયાગ્રામ:

classDiagram
    class Student {
        -roll_no
        -name
        +__init__()
        +display()
    }

શબ્દવર્ણન
ક્લાસઓબ્જેક્ટ્સ બનાવવા માટેનો બ્લૂપ્રિન્ટ, જેમાં શેર્ડ એટ્રિબ્યુટ્સ અને મેથડ્સ હોય છે
એટ્રિબ્યુટ્સક્લાસની અંદર ડેટા સ્ટોર કરતા વેરિએબલ્સ
ઓબ્જેક્ટક્લાસનું ઇન્સ્ટન્સ, જેમાં ચોક્કસ એટ્રિબ્યુટ વેલ્યુ હોય છે
ક્લાસ મેથડક્લાસની અંદર ડિફાઇન થયેલા ફંક્શન્સ જે ક્લાસની સ્થિતિને એક્સેસ અને મોડિફાય કરી શકે છે

કોડ:

class Student:
    # ક્લાસ એટ્રિબ્યુટ
    school = "GTU"
    
    # કન્સ્ટ્રક્ટર
    def __init__(self, roll_no, name):
        # ઇન્સ્ટન્સ એટ્રિબ્યુટ્સ
        self.roll_no = roll_no
        self.name = name
    
    # ઇન્સ્ટન્સ મેથડ
    def display(self):
        print(f"Roll No: {self.roll_no}, Name: {self.name}")
    
    # ક્લાસ મેથડ
    @classmethod
    def change_school(cls, new_school):
        cls.school = new_school

# ઓબ્જેક્ટ બનાવવું
student1 = Student(101, "રાજ")
student1.display()  # આઉટપુટ: Roll No: 101, Name: રાજ

યાદ રાખવાની યુક્તિ: “ક્લાસ બનાવે, એટ્રિબ્યુટ સંગ્રહે, ઓબ્જેક્ટ વાપરે, મેથડ ક્રિયા કરે”

પ્રશ્ન 1(ક) OR [7 ગુણ]
#

ડેટા એન્કેપ્સુલેસન અને પોલી મોર્ફીસમની વ્યાખ્યા આપો. પોલી મોર્ફીસમ સમજાવવા માટેનો પાયથન કોડ વિકસાવો.

જવાબ:

કોન્સેપ્ટવ્યાખ્યા
ડેટા એન્કેપ્સુલેસનડેટા અને મેથડ્સને એક એકમ (ક્લાસ)માં બંધ કરવા અને કેટલાક કોમ્પોનન્ટ્સને સીધી એક્સેસથી પ્રતિબંધિત કરવા
પોલીમોર્ફિઝમવિવિધ ક્લાસને એક જ નામના મેથડનો પોતાનો અમલ પૂરો પાડવાની ક્ષમતા

ડાયાગ્રામ:

graph TD
    A[પોલીમોર્ફિઝમ]
    A --> B[મેથડ ઓવરરાઇડિંગ]
    A --> C[મેથડ ઓવરલોડિંગ]
    A --> D[ડક ટાઇપિંગ]

કોડ:

# પોલીમોર્ફિઝમ ઉદાહરણ
class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "ભૌં ભૌં!"

class Cat(Animal):
    def speak(self):
        return "મ્યાઉં!"

class Duck(Animal):
    def speak(self):
        return "ક્વેક!"

# પોલીમોર્ફિઝમ દર્શાવતું ફંક્શન
def animal_sound(animal):
    return animal.speak()

# ઓબ્જેક્ટ્સ બનાવવા
dog = Dog()
cat = Cat()
duck = Duck()

# એક જ ફંક્શન વિવિધ પ્રાણી ઓબ્જેક્ટ્સ માટે કામ કરે છે
print(animal_sound(dog))   # આઉટપુટ: ભૌં ભૌં!
print(animal_sound(cat))   # આઉટપુટ: મ્યાઉં!
print(animal_sound(duck))  # આઉટપુટ: ક્વેક!

યાદ રાખવાની યુક્તિ: “એન્કેપ્સુલેશન છુપાવે છે, પોલીમોર્ફિઝમ બદલાય છે”

પ્રશ્ન 2(અ) [3 ગુણ]
#

સ્ટેક અને ક્યુ નો તફાવત આપો.

જવાબ:

ફીચરસ્ટેકક્યુ
સિદ્ધાંતLIFO (છેલ્લું આવે પહેલું જાય)FIFO (પહેલું આવે પહેલું જાય)
ઓપરેશનપુશ, પોપએનક્યુ, ડિક્યુ
એક્સેસએલિમેન્ટ્સ ફક્ત એક છેડેથી ઉમેરાય/દૂર થાય છે (ટોપ)એલિમેન્ટ્સ છેલ્લે ઉમેરાય છે અને આગળથી દૂર થાય છે

ડાયાગ્રામ:

Stack:[[[321]]]Queue:[F1r]ont[2]R[e3a]r

યાદ રાખવાની યુક્તિ: “સ્ટેક ઉપરનું પહેલા, ક્યુ આગળનું પહેલા”

પ્રશ્ન 2(બ) [4 ગુણ]
#

પુશ અને પોપ ઓપરેશન માટેનો અલ્ગોરીધમ લખો.

જવાબ:

PUSH અલ્ગોરિધમ:

123...'top'િ,િtop1

POP અલ્ગોરિધમ:

1234....top1િ,'top'િ

કોડ:

class Stack:
    def __init__(self, size):
        self.stack = []
        self.size = size
        self.top = -1
    
    def push(self, element):
        if self.top >= self.size - 1:
            return "Stack Overflow"
        else:
            self.top += 1
            self.stack.append(element)
            return "Pushed " + str(element)
    
    def pop(self):
        if self.top < 0:
            return "Stack Underflow"
        else:
            element = self.stack.pop()
            self.top -= 1
            return element

યાદ રાખવાની યુક્તિ: “ટોપ પર પુશ, ટોપથી પોપ”

પ્રશ્ન 2(ક) [7 ગુણ]
#

નીચે. આપેલ સમીકરણ ને ઇન્ફીક્સ માંથી પોસ્ટફિક્ષ માં બદલો. A * (B + C) - D / (E + F)

જવાબ:

ડાયાગ્રામ:

IPnofsitxf:ix:AAB(CB++C)D-EDF/+(E+F)
સ્ટેપસિમ્બોલસ્ટેકઆઉટપુટ
1AA
2**A
3(* (A
4B* (A B
5+* ( +A B
6C* ( +A B C
7)*A B C +
8--A B C + *
9D-A B C + * D
10/- /A B C + * D
11(- / (A B C + * D
12E- / (A B C + * D E
13+- / ( +A B C + * D E
14F- / ( +A B C + * D E F
15)- /A B C + * D E F +
16endA B C + * D E F + / -

જવાબ: A B C + * D E F + / -

યાદ રાખવાની યુક્તિ: “ઓપરેટર સ્ટેક પર, ઓપરન્ડ સીધા પ્રિન્ટ”

પ્રશ્ન 2(અ) OR [3 ગુણ]
#

સિમ્પલ ક્યુ અને સર્ક્યુલર ક્યુ નો તફાવત આપો.

જવાબ:

ફીચરસિમ્પલ ક્યુસર્ક્યુલર ક્યુ
સ્ટ્રક્ચરલીનિયર ડેટા સ્ટ્રક્ચરજોડાયેલા છેડાવાળો લીનિયર ડેટા સ્ટ્રક્ચર
મેમરીડિક્યુ પછી ખાલી જગ્યાઓને કારણે અકાર્યક્ષમ મેમરી વપરાશખાલી જગ્યાઓનો ફરીથી ઉપયોગ કરીને કાર્યક્ષમ મેમરી વપરાશ
ઇમ્પ્લિમેન્ટેશનફ્રન્ટ હંમેશા ઇન્ડેક્સ 0 પર, રીયર વધેફ્રન્ટ અને રીયર મોડ્યુલો ઓપરેશન સાથે સર્ક્યુલર રીતે ફરે

ડાયાગ્રામ:

graph LR
    A[સિમ્પલ ક્યુ] --> B[ફ્રન્ટ]
    B --> C[...]
    C --> D[રીયર]

    E[સર્ક્યુલર ક્યુ] --> F[ફ્રન્ટ]
    F --> G[...]
    G --> H[રીયર]
    H --> F

યાદ રાખવાની યુક્તિ: “સાદી વેડફે, ગોળ ફરીથી વાપરે”

પ્રશ્ન 2(બ) OR [4 ગુણ]
#

રીકસીવ ફંક્શનનો કોન્સેપ્ટ યોગ્ય ઉદાહરણ સાથે સમજાવો.

જવાબ:

મુખ્ય પાસાઓવર્ણન
વ્યાખ્યાએવું ફંક્શન જે એક જ સમસ્યાના નાના ભાગને હલ કરવા માટે પોતાને જ કોલ કરે છે
બેઝ કેસએવી સ્થિતિ જ્યાં ફંક્શન પોતાને કોલ કરવાનું બંધ કરે છે
રિકર્સિવ કેસએવી સ્થિતિ જ્યાં ફંક્શન સમસ્યાના સરળ સ્વરૂપ સાથે પોતાને કોલ કરે છે

ડાયાગ્રામ:

graph TD
    A[factorial(3)] --> B[3 * factorial(2)]
    B --> C[3 * 2 * factorial(1)]
    C --> D[3 * 2 * 1 * factorial(0)]
    D --> E[3 * 2 * 1 * 1]
    E --> F[3 * 2 * 1]
    F --> G[3 * 2]
    G --> H[6]

કોડ:

def factorial(n):
    # બેઝ કેસ
    if n == 0:
        return 1
    # રિકર્સિવ કેસ
    else:
        return n * factorial(n-1)

# ઉદાહરણ
result = factorial(5)  # 5! = 120

યાદ રાખવાની યુક્તિ: “બેઝ તોડે, રિકર્શન પાછું આપે”

પ્રશ્ન 2(ક) OR [7 ગુણ]
#

Enqueue અને Dequeue ઓપરેશન માટેનો પાયથન કોડ વિકસાવો.

જવાબ:

ડાયાગ્રામ:

EDneq[q[u1u1e]e]u[u[e2e2:]:][[33]][4][1][[22]][[33]][[44]]

કોડ:

class Queue:
    def __init__(self, size):
        self.queue = []
        self.size = size
        self.front = 0
        self.rear = -1
        self.count = 0
    
    def enqueue(self, item):
        if self.count >= self.size:
            return "ક્યુ ભરેલી છે"
        else:
            self.rear += 1
            self.queue.append(item)
            self.count += 1
            return "Enqueued " + str(item)
    
    def dequeue(self):
        if self.count <= 0:
            return "ક્યુ ખાલી છે"
        else:
            item = self.queue.pop(0)
            self.count -= 1
            return item
    
    def display(self):
        return self.queue

# ટેસ્ટ
q = Queue(5)
q.enqueue(10)
q.enqueue(20)
q.enqueue(30)
print(q.display())  # [10, 20, 30]
print(q.dequeue())  # 10
print(q.display())  # [20, 30]

યાદ રાખવાની યુક્તિ: “છેડે ઉમેરો, શરૂઆતથી કાઢો”

પ્રશ્ન 3(અ) [3 ગુણ]
#

સીન્ગલી લિન્ક્ડ લીસ્ટ અને સર્ક્યુલર લિન્ક્ડ લીસ્ટ નો તફાવત આપો.

જવાબ:

ફીચરસિંગલી લિન્ક્ડ લિસ્ટસર્ક્યુલર લિન્ક્ડ લિસ્ટ
છેલ્લો નોડNULL તરફ પોઇન્ટ કરે છેપહેલા નોડ તરફ પાછો પોઇન્ટ કરે છે
ટ્રાવર્સલચોક્કસ અંત ધરાવે છેસતત ટ્રાવર્સ કરી શકાય છે
મેમરીદરેક નોડને એક પોઇન્ટર જોઈએદરેક નોડને એક પોઇન્ટર જોઈએ

ડાયાગ્રામ:

SCiinrgcluyl:ar:[[11]][[22]][[33]]NULL

યાદ રાખવાની યુક્તિ: “સિંગલી અટકે, સર્ક્યુલર ફરે”

પ્રશ્ન 3(બ) [4 ગુણ]
#

ડબલી લિન્ક્ડ લીસ્ટ નો કોન્સેપ્ટ સમજાવો.

જવાબ:

ડાયાગ્રામ:

NULL[Prev|1|Next][Prev|2|Next][Prev|3|Next]NULL
ફીચરવર્ણન
નોડ સ્ટ્રક્ચરદરેક નોડમાં ડેટા અને બે પોઇન્ટર્સ (previous અને next) હોય છે
નેવિગેશનઆગળ અને પાછળ એમ બંને દિશામાં ટ્રાવર્સ કરી શકાય છે
ઓપરેશન્સબંને છેડેથી ઇન્સર્શન અને ડિલીશન કરી શકાય છે
મેમરી વપરાશવધારાના પોઇન્ટરને કારણે સિંગલી લિન્ક્ડ લિસ્ટ કરતા વધુ મેમરી જોઈએ

કોડ:

class Node:
    def __init__(self, data):
        self.data = data
        self.prev = None
        self.next = None

યાદ રાખવાની યુક્તિ: “બે પોઇન્ટર, બે દિશા”

પ્રશ્ન 3(ક) [7 ગુણ]
#

નીચે આપેલ ઓપરેશન માટે અલગોરિધમ લખો: ૧. લીસ્ટ ની શરૂઆતમાં નોડ દાખલ કરવા ૨. લીસ્ટ ના અંતમાં નોડ દાખલ કરવા

જવાબ:

શરૂઆતમાં ઇન્સર્ટ:

graph LR
    A[શરૂ] --> B[નવો નોડ બનાવો]
    B --> C[નવા નોડનો ડેટા સેટ કરો]
    C --> D[નવા નોડનો next હેડ પર સેટ કરો]
    D --> E[હેડને નવા નોડ પર સેટ કરો]
    E --> F[અંત]

અંતે ઇન્સર્ટ:

graph LR
    A[શરૂ] --> B[નવો નોડ બનાવો]
    B --> C[નવા નોડનો ડેટા સેટ કરો]
    C --> D[નવા નોડનો next NULL પર સેટ કરો]
    D --> E{શું head NULL છે?}
    E -->|હા| F[head ને નવા નોડ પર સેટ કરો]
    E -->|ના| G[છેલ્લા નોડ સુધી ટ્રાવર્સ કરો]
    G --> H[છેલ્લા નોડનો next નવા નોડ પર સેટ કરો]
    F --> I[અંત]
    H --> I

કોડ:

def insert_at_beginning(head, data):
    new_node = Node(data)
    new_node.next = head
    return new_node  # નવો head

def insert_at_end(head, data):
    new_node = Node(data)
    new_node.next = None
    
    # જો લિન્ક્ડ લિસ્ટ ખાલી હોય
    if head is None:
        return new_node
    
    # છેલ્લા નોડ સુધી ટ્રાવર્સ કરો
    temp = head
    while temp.next:
        temp = temp.next
    
    # છેલ્લા નોડને નવા નોડ સાથે જોડો
    temp.next = new_node
    return head

યાદ રાખવાની યુક્તિ: “શરૂઆત: નવો જૂનાને આગળ કરે, અંત: જૂનો નવાને આગળ કરે”

પ્રશ્ન 3(અ) OR [3 ગુણ]
#

સીન્ગલી લિન્ક્ડ લીસ્ટ પરના વિવિધ ઓપરેશન ની યાદી આપો.

જવાબ:

સિંગલી લિન્ક્ડ લિસ્ટ પરના ઓપરેશન
1. ઇન્સર્શન (શરૂઆતમાં, મધ્યમાં, અંતે)
2. ડિલીશન (શરૂઆતથી, મધ્યમાંથી, અંતથી)
3. ટ્રાવર્સલ (દરેક નોડની મુલાકાત)
4. શોધ (ચોક્કસ નોડ શોધવો)
5. અપડેટિંગ (નોડ ડેટા બદલવો)

ડાયાગ્રામ:

graph TD
    A[લિન્ક્ડ લિસ્ટ ઓપરેશન]
    A --> B[ઇન્સર્શન]
    A --> C[ડિલિશન]
    A --> D[ટ્રાવર્સલ]
    A --> E[શોધ]
    A --> F[અપડેટિંગ]

યાદ રાખવાની યુક્તિ: “ઉમેરો કાઢો ફરો શોધો બદલો”

પ્રશ્ન 3(બ) OR [4 ગુણ]
#

સર્ક્યુલર લિન્ક્ડ લીસ્ટ નો કોન્સેપ્ટ સમજાવો.

જવાબ:

ડાયાગ્રામ:

[1]--[-2-]----[-3-]-[4]
ફીચરવર્ણન
સ્ટ્રક્ચરછેલ્લો નોડ NULL ને બદલે પહેલા નોડને પોઇન્ટ કરે છે
ફાયદોબધા નોડમાં સતત ટ્રાવર્સલની અનુમતિ આપે છે
એપ્લિકેશનરાઉન્ડ રોબિન શેડ્યુલિંગ, સર્ક્યુલર બફર ઇમ્પ્લિમેન્ટેશન
ઓપરેશનછેલ્લા નોડ માટે ખાસ હેન્ડલિંગ સાથે સિંગલી લિન્ક્ડ લિસ્ટ જેવા ઇન્સર્શન અને ડિલીશન

કોડ:

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

# 3 નોડવાળી સર્ક્યુલર લિન્ક્ડ લિસ્ટ બનાવવી
head = Node(1)
node2 = Node(2)
node3 = Node(3)

head.next = node2
node2.next = node3
node3.next = head  # તેને સર્ક્યુલર બનાવે છે

યાદ રાખવાની યુક્તિ: “છેલ્લો પહેલાને જોડે”

પ્રશ્ન 3(ક) OR [7 ગુણ]
#

લિન્ક્ડ લીસ્ટની એપ્લીકેશનોની યાદી આપો. સીન્ગલી લિન્ક્ડ લીસ્ટમાં કુલ નોડ ગણવા માટેનો અલગોરિધમ લખો.

જવાબ:

લિન્ક્ડ લિસ્ટની એપ્લિકેશન
1. સ્ટેક અને ક્યુનો અમલીકરણ
2. ડાયનેમિક મેમરી એલોકેશન
3. એપ્લિકેશનમાં અન્ડુ ફંક્શનાલિટી
4. હેશ ટેબલ્સ (ચેઇનિંગ)
5. ગ્રાફ્સ માટે એડજસન્સી લિસ્ટ

નોડ ગણવા માટેનો અલ્ગોરિધમ:

graph TD
    A[શરૂ] --> B[count = 0 થી શરૂ કરો]
    B --> C[temp = head સેટ કરો]
    C --> D{temp != NULL?}
    D -->|હા| E[count વધારો]
    D -->|ના| F[count પાછું આપો]
    E --> G[temp = temp.next]
    G --> D

કોડ:

def count_nodes(head):
    count = 0
    temp = head
    
    while temp:
        count += 1
        temp = temp.next
    
    return count

# ઉદાહરણ
# ધારી લો કે head લિન્ક્ડ લિસ્ટના પ્રથમ નોડને પોઇન્ટ કરે છે
total_nodes = count_nodes(head)
print(f"કુલ નોડ: {total_nodes}")

યાદ રાખવાની યુક્તિ: “ગણો ત્યારે ખસો”

પ્રશ્ન 4(અ) [3 ગુણ]
#

લીનીયર સર્ચ અને બાયનરી સર્ચની સરખામણી કરો.

જવાબ:

ફીચરલીનીયર સર્ચબાયનરી સર્ચ
ડેટા ગોઠવણસોર્ટેડ અને અનસોર્ટેડ બંને ડેટા પર કામ કરે છેફક્ત સોર્ટેડ ડેટા પર કામ કરે છે
ટાઇમ કોમ્પ્લેક્સિટીO(n)O(log n)
ઇમ્પ્લિમેન્ટેશનસરળવધુ જટિલ
શેના માટે શ્રેષ્ઠનાના ડેટાસેટ અથવા અનસોર્ટેડ ડેટામોટા સોર્ટેડ ડેટાસેટ

ડાયાગ્રામ:

LBiinneaarry::[[11]][[22]][[33]][[44]][[55]][[66]][[77]][[88]]

યાદ રાખવાની યુક્તિ: “લીનીયર બધું જુએ, બાઈનરી આધું કાપે”

પ્રશ્ન 4(બ) [4 ગુણ]
#

સિલેકશન સોર્ટ માટેનો અલગોરિધમ લખો.

જવાબ:

ડાયાગ્રામ:

IPPPPnaaaaisssstssssia1234l:::::[[[[[51111,,,,,33222,,,,,88833,,,,,15555,,,,,22388]]]]]((((mmmmiiiinnnn====1235,,,,538))))

અલ્ગોરિધમ:

graph TD
    A[શરૂ] --> B[i = 0 થી n-1 સુધી]
    B --> C[અનસોર્ટેડ ભાગમાં લઘુતમ એલિમેન્ટ શોધો]
    C --> D[લઘુતમને અનસોર્ટેડ ભાગના પ્રથમ એલિમેન્ટ સાથે સ્વેપ કરો]
    D --> E[અંત]

કોડનો ઢાંચો:

def selection_sort(arr):
    n = len(arr)
    
    for i in range(n):
        min_idx = i
        
        # અનસોર્ટેડ એરેમાં લઘુતમ એલિમેન્ટ શોધો
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        
        # શોધેલા લઘુતમ એલિમેન્ટને પ્રથમ એલિમેન્ટ સાથે સ્વેપ કરો
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

યાદ રાખવાની યુક્તિ: “લઘુતમ શોધો, પોઝિશન બદલો”

પ્રશ્ન 4(ક) [7 ગુણ]
#

નીચે આપેલા લીસ્ટ ને બબલ સોર્ટ મેથડ વડે ચઢતા ક્રમમાં ગોઠવવા માટેનો પાયથન કોડ વિકસાવો. list1=[5,4,3,2,1,0]

જવાબ:

ડાયાગ્રામ:

IPPPPPnaaaaaissssstsssssia12345l::::::[[[[[[543210,,,,,,432101,,,,,,321022,,,,,,210333,,,,,,104444,,,,,,055555]]]]]]

કોડ:

def bubble_sort(arr):
    n = len(arr)
    
    # બધા એરે એલિમેન્ટ્સ પર ટ્રાવર્સ કરો
    for i in range(n):
        # છેલ્લા i એલિમેન્ટ્સ પહેલેથી જ યોગ્ય જગ્યા પર છે
        for j in range(0, n-i-1):
            # જો વર્તમાન એલિમેન્ટ આગળના એલિમેન્ટ કરતાં મોટો હોય, તો સ્વેપ કરો
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    
    return arr

# ઇનપુટ લિસ્ટ
list1 = [5, 4, 3, 2, 1, 0]

# લિસ્ટ સોર્ટ કરવી
sorted_list = bubble_sort(list1)

# રિઝલ્ટ ડિસ્પ્લે કરવું
print("સોર્ટેડ લિસ્ટ:", sorted_list)
# આઉટપુટ: સોર્ટેડ લિસ્ટ: [0, 1, 2, 3, 4, 5]

યાદ રાખવાની યુક્તિ: “મોટા બબલ ઉપર જાય”

પ્રશ્ન 4(અ) OR [3 ગુણ]
#

સોર્ટિંગ ની વ્યાખ્યા આપો. વિવિધ પ્રકારના સોર્ટિંગ ની યાદી આપો.

જવાબ:

વ્યાખ્યાસોર્ટિંગ મેથડ્સ
સોર્ટિંગ એટલે ડેટાને ચોક્કસ ક્રમમાં (ચઢતા અથવા ઉતરતા) ગોઠવવાની પ્રક્રિયા1. બબલ સોર્ટ
2. સિલેક્શન સોર્ટ
3. ઇન્સર્શન સોર્ટ
4. મર્જ સોર્ટ
5. ક્વિક સોર્ટ
6. હીપ સોર્ટ
7. રેડિક્સ સોર્ટ

ડાયાગ્રામ:

graph TD
    A[સોર્ટિંગ અલ્ગોરિધમ]
    A --> B[કમ્પેરિઝન-બેઝ્ડ]
    A --> C[નોન-કમ્પેરિઝન]
    B --> D[બબલ સોર્ટ]
    B --> E[સિલેક્શન સોર્ટ]
    B --> F[ઇન્સર્શન સોર્ટ]
    B --> G[મર્જ સોર્ટ]
    B --> H[ક્વિક સોર્ટ]
    C --> I[કાઉન્ટિંગ સોર્ટ]
    C --> J[રેડિક્સ સોર્ટ]
    C --> K[બકેટ સોર્ટ]

યાદ રાખવાની યુક્તિ: “સારા સોર્ટથી શોધવાનું સરળ બને”

પ્રશ્ન 4(બ) OR [4 ગુણ]
#

Insertion sort method નો અલગોરિધમ લખો.

જવાબ:

ડાયાગ્રામ:

IPPPPPnaaaaaissssstsssssia12345l::::::[[[[[[522211,,,,,,254422,,,,,,445543,,,,,,666654,,,,,,111165,,,,,,333336]]]]]](((((24613552)))))

અલ્ગોરિધમ:

graph TD
    A[શરૂ] --> B[i = 1 થી n-1 સુધી]
    B --> C[key = arr[i] સેટ કરો]
    C --> D[j = i-1 સેટ કરો]
    D --> E{j >= 0 અને arr[j] > key?}
    E -->|હા| F[એલિમેન્ટ જમણી તરફ ખસેડો]
    F --> G[j ઘટાડો]
    G --> E
    E -->|ના| H[key ને યોગ્ય પોઝિશન પર મૂકો]
    H --> I[અંત]

કોડનો ઢાંચો:

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        
        # key કરતાં મોટા એલિમેન્ટ્સને એક પોઝિશન આગળ ખસેડો
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        
        arr[j + 1] = key

યાદ રાખવાની યુક્તિ: “કાર્ડ લો, યોગ્ય ક્રમમાં મૂકો”

પ્રશ્ન 4(ક) OR [7 ગુણ]
#

નીચે આપેલા લીસ્ટ ને સિલેકશન સોર્ટ મેથડ વડે ચઢતા ક્રમમાં ગોઠવવા માટેનો પાયથન કોડ વિકસાવો. list1=[6,3,25,8,-1,55,0]

જવાબ:

ડાયાગ્રામ:

IPPPPPPnaaaaaaisssssstssssssia123456l:::::::[[[[[[[6------,111111,,,,,,3,300000,,,,,,25223333,55,,,,,,88666,88,,,,,,-6888166,,,,,,,55525555555555,,,,,,,22250035555]]]]]]]((((((mmmmmmiiiiiinnnnnn======-0368215,,,,,,3286555))))))

કોડ:

def selection_sort(arr):
    n = len(arr)
    
    for i in range(n):
        # બાકીના અનસોર્ટેડ એરેમાં લઘુતમ એલિમેન્ટ શોધો
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
                
        # શોધેલા લઘુતમ એલિમેન્ટને પ્રથમ એલિમેન્ટ સાથે સ્વેપ કરો
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    
    return arr

# ઇનપુટ લિસ્ટ
list1 = [6, 3, 25, 8, -1, 55, 0]

# લિસ્ટ સોર્ટ કરવી
sorted_list = selection_sort(list1)

# રિઝલ્ટ ડિસ્પ્લે કરવું
print("સોર્ટેડ લિસ્ટ:", sorted_list)
# આઉટપુટ: સોર્ટેડ લિસ્ટ: [-1, 0, 3, 6, 8, 25, 55]

યાદ રાખવાની યુક્તિ: “નાનામાં નાનું શોધો, આગળ મૂકો”

પ્રશ્ન 5(અ) [3 ગુણ]
#

Tree data structure ને લગતા નીચે આપેલ પદોની વ્યાખ્યા આપો. 1. Forest 2. Root node 3. Leaf node

જવાબ:

પદવ્યાખ્યા
Forestઅલગ-અલગ ટ્રીઓનો સમૂહ (ટ્રીઓ વચ્ચે કોઈ જોડાણ નથી)
Root Nodeટ્રીનો સૌથી ઉપરનો નોડ જેનો કોઈ પેરેન્ટ નથી, જેનાથી બધા બીજા નોડ્સ ઉતરે છે
Leaf Nodeએવો નોડ જેને કોઈ ચિલ્ડ્રન નથી (ટ્રીના તળિયે આવેલો ટર્મિનલ નોડ)

ડાયાગ્રામ:

FRLooeroaetfs::t:[A][TRr]e[eB1][TLr]ee2[િL]Tree3

યાદ રાખવાની યુક્તિ: “ફોરેસ્ટમાં ઘણા રૂટ, રૂટથી બધું શરૂ, લીફ્સ બધું પૂરું”

પ્રશ્ન 5(બ) [4 ગુણ]
#

78,58,82,15,66,80,99 માટે Binary search tree દોરો અને તે tree માટેનું In-order traversal લખો.

જવાબ:

બાઈનરી સર્ચ ટ્રી:

15586678808299

ઇન-ઓર્ડર ટ્રાવર્સલ:

સ્ટેપવિઝિટ ક્રમ
178 ના ડાબા સબટ્રી પર જાઓ
258 ના ડાબા સબટ્રી પર જાઓ
315 ને વિઝિટ કરો
458 ને વિઝિટ કરો
566 ને વિઝિટ કરો
678 ને વિઝિટ કરો
782 ના ડાબા સબટ્રી પર જાઓ
880 ને વિઝિટ કરો
982 ને વિઝિટ કરો
1099 ને વિઝિટ કરો

ઇન-ઓર્ડર ટ્રાવર્સલ રિઝલ્ટ: 15, 58, 66, 78, 80, 82, 99

યાદ રાખવાની યુક્તિ: “ડાબું, રૂટ, જમણું”

પ્રશ્ન 5(ક) [7 ગુણ]
#

નીચે આપેલ ઓપરેશન માટે અલગોરિધમ લખો: ૧. Binary Tree માં નોડ દાખલ કરવા ૨. Binary Tree માંથી નોડ કાઢવા માટે

જવાબ:

ઇન્સર્શન અલ્ગોરિધમ:

graph TD
    A[શરૂ] --> B[આપેલ ડેટા સાથે નવો નોડ બનાવો]
    B --> C{શું root NULL છે?}
    C -->|હા| D[root ને નવા નોડ પર સેટ કરો]
    C -->|ના| E[લેવલ ઓર્ડર ટ્રાવર્સલનો ઉપયોગ કરી પોઝિશન શોધો]
    E --> F[પ્રથમ ખાલી પોઝિશન પર નોડ ઉમેરો]
    D --> G[અંત]
    F --> G

ડિલીશન અલ્ગોરિધમ:

graph TD
    A[શરૂ] --> B{શું ટ્રી ખાલી છે?}
    B -->|હા| C[રિટર્ન]
    B -->|ના| D[ડિલીટ કરવાના નોડને શોધો]
    D --> E[સૌથી ઊંડા જમણા નોડને શોધો]
    E --> F[ડિલીટ કરવાના નોડની જગ્યાએ ઊંડા જમણા નોડને મૂકો]
    F --> G[ઊંડા જમણા નોડને ડિલીટ કરો]
    C --> H[અંત]
    G --> H

કોડ:

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

# Binary Tree માં ઇન્સર્શન
def insert(root, data):
    if root is None:
        return Node(data)
    
    # લેવલ ઓર્ડર ટ્રાવર્સલથી ખાલી પોઝિશન શોધવી
    queue = []
    queue.append(root)
    
    while queue:
        temp = queue.pop(0)
        
        if temp.left is None:
            temp.left = Node(data)
            break
        else:
            queue.append(temp.left)
            
        if temp.right is None:
            temp.right = Node(data)
            break
        else:
            queue.append(temp.right)
    
    return root

# Binary Tree માંથી ડિલીશન
def delete_node(root, key):
    if root is None:
        return None
    
    if root.left is None and root.right is None:
        if root.data == key:
            return None
        else:
            return root
    
    # ડિલીટ કરવાના નોડને શોધો
    key_node = None
    # છેવટના નોડને શોધો
    last = None
    parent = None
    
    # લેવલ ઓર્ડર ટ્રાવર્સલ
    queue = []
    queue.append(root)
    
    while queue:
        temp = queue.pop(0)
        
        if temp.data == key:
            key_node = temp
            
        if temp.left:
            parent = temp
            queue.append(temp.left)
            last = temp.left
            
        if temp.right:
            parent = temp
            queue.append(temp.right)
            last = temp.right
    
    if key_node:
        # છેવટના નોડના ડેટા સાથે બદલો
        key_node.data = last.data
        
        # છેવટના નોડને ડિલીટ કરો
        if parent.right == last:
            parent.right = None
        else:
            parent.left = None
    
    return root

યાદ રાખવાની યુક્તિ: “ખાલી જગ્યાએ ઉમેરો, બદલીને કાઢો”

પ્રશ્ન 5(અ) OR [3 ગુણ]
#

Tree data structure ને લગતા નીચે આપેલ પદોની વ્યાખ્યા આપો. 1. In-degree 2. Out-degree 3. Depth

જવાબ:

પદવ્યાખ્યા
In-degreeનોડમાં આવતી એજ્જીસની સંખ્યા (ટ્રીમાં પ્રત્યેક નોડ માટે (રૂટ સિવાય) હંમેશા 1 હોય છે)
Out-degreeનોડમાંથી બહાર જતી એજ્જીસની સંખ્યા (નોડના ચિલ્ડ્રનની સંખ્યા)
Depthરૂટથી નોડ સુધીના પાથની લંબાઈ (પાથમાં એજ્જીસની સંખ્યા)

ડાયાગ્રામ:

DBEA(C(F,(1)02))
નોડIn-degreeOut-degree
A02
B12
C11
D10
E10
F10

યાદ રાખવાની યુક્તિ: “ઈન કાઉન્ટ્સ પેરેન્ટ્સ, આઉટ કાઉન્ટ્સ ચિલ્ડ્રન, ડેપ્થ કાઉન્ટ્સ એજ્જીસ ફ્રોમ રૂટ”

પ્રશ્ન 5(બ) OR [4 ગુણ]
#

નીચે દર્શાવેલા Binary tree માટે Preorder and postorder traversal લખો.

બાઈનરી ટ્રી:

102031000125000300

જવાબ:

ટ્રાવર્સલક્રમરિઝલ્ટ
Preorderરૂટ, ડાબું, જમણું100, 20, 10, 30, 200, 150, 300
Postorderડાબું, જમણું, રૂટ10, 30, 20, 150, 300, 200, 100

પ્રીઓર્ડર વિઝ્યુઅલાઈઝેશન:

graph TD
    A[100] --> B[100 વિઝિટ કરો]
    B --> C[ડાબા સબટ્રી પર જાઓ]
    C --> D[20 વિઝિટ કરો]
    D --> E[10 વિઝિટ કરો]
    E --> F[30 વિઝિટ કરો]
    F --> G[જમણા સબટ્રી પર જાઓ]
    G --> H[200 વિઝિટ કરો]
    H --> I[150 વિઝિટ કરો]
    I --> J[300 વિઝિટ કરો]

પોસ્ટઓર્ડર વિઝ્યુઅલાઈઝેશન:

graph TD
    A[100] --> B[ડાબા સબટ્રી પર જાઓ]
    B --> C[10 વિઝિટ કરો]
    C --> D[30 વિઝિટ કરો]
    D --> E[20 વિઝિટ કરો]
    E --> F[જમણા સબટ્રી પર જાઓ]
    F --> G[150 વિઝિટ કરો]
    G --> H[300 વિઝિટ કરો]
    H --> I[200 વિઝિટ કરો]
    I --> J[100 વિઝિટ કરો]

યાદ રાખવાની યુક્તિ:

  • પ્રીઓર્ડર: “રૂટ પહેલા, પછી બાળકો”
  • પોસ્ટઓર્ડર: “બાળકો પહેલા, પછી રૂટ”

પ્રશ્ન 5(ક) OR [7 ગુણ]
#

Binary Search Tree રચવા માટેનો પાયથન કોડ વિકસાવો.

જવાબ:

ડાયાગ્રામ:

graph TD
    A[રૂટ] -->|50 ઉમેરો| B[50]
    B -->|30 ઉમેરો| C[50]
    C -.-> D[30]
    C -->|70 ઉમેરો| E[50]
    E -.-> F[30]
    E --> G[70]
    G -->|20 ઉમેરો| H[50]
    H -.-> I[30]
    I -.-> J[20]
    H --> K[70]

કોડ:

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

def insert(root, key):
    # જો ટ્રી ખાલી હોય, તો નવો નોડ પાછો આપો
    if root is None:
        return Node(key)
    
    # અન્યથા, ટ્રીમાં નીચે જાઓ
    if key < root.key:
        root.left = insert(root.left, key)
    else:
        root.right = insert(root.right, key)
    
    # અબદાયેલ નોડ પોઈન્ટર પાછો આપો
    return root

def inorder(root):
    if root:
        inorder(root.left)
        print(root.key, end=" ")
        inorder(root.right)

def preorder(root):
    if root:
        print(root.key, end=" ")
        preorder(root.left)
        preorder(root.right)

def postorder(root):
    if root:
        postorder(root.left)
        postorder(root.right)
        print(root.key, end=" ")

# ટેસ્ટ માટેનો પ્રોગ્રામ
def main():
    # આ એલિમેન્ટ્સ સાથે BST બનાવો: 50, 30, 20, 40, 70, 60, 80
    root = None
    elements = [50, 30, 20, 40, 70, 60, 80]
    
    for element in elements:
        root = insert(root, element)
    
    # ટ્રાવર્સલ્સ પ્રિન્ટ કરો
    print("ઇનઓર્ડર ટ્રાવર્સલ: ", end="")
    inorder(root)
    print("\nપ્રીઓર્ડર ટ્રાવર્સલ: ", end="")
    preorder(root)
    print("\nપોસ્ટઓર્ડર ટ્રાવર્સલ: ", end="")
    postorder(root)

# પ્રોગ્રામ ચલાવો
main()

ઉદાહરણ આઉટપુટ:

ઇનઓર્ડર ટ્રાવર્સલ: 20 30 40 50 60 70 80
પ્રીઓર્ડર ટ્રાવર્સલ: 50 30 20 40 70 60 80
પોસ્ટઓર્ડર ટ્રાવર્સલ: 20 40 30 60 80 70 50

યાદ રાખવાની યુક્તિ: “નાના ડાબે, મોટા જમણે”

સંબંધિત

કોમ્યુનિકેશન એન્જિનીયરિંગ (1333201) - વિન્ટર 2023 સોલ્યુશન
24 મિનિટ
અભ્યાસ-સામગ્રી ઉકેલો કોમ્યુનિકેશન-એન્જિનીયરિંગ 1333201 2023 વિન્ટર
પાયથોન પ્રોગ્રામિંગ (1323203) - સમર 2023 સોલ્યુશન
21 મિનિટ
અભ્યાસ-સામગ્રી સોલ્યુશન પાયથોન-પ્રોગ્રામિંગ 1323203 2023 સમર
કન્ઝ્યુમર ઇલેક્ટ્રોનિક્સ એન્ડ મેઇન્ટેનન્સ (4341107) - સમર 2023 સોલ્યુશન
19 મિનિટ
અભ્યાસ-સામગ્રી સોલ્યુશન કન્ઝ્યુમર-ઇલેક્ટ્રોનિક્સ 4341107 2023 સમર
ડિજિટલ કોમ્યુનિકેશન (4341102) - સમર 2023 સોલ્યુશન
20 મિનિટ
અભ્યાસ-સામગ્રી સોલ્યુશન ડિજિટલ-કોમ્યુનિકેશન 4341102 2023 સમર
ઇલેક્ટ્રોનિક્સ ડિવાઇસિસ એન્ડ સર્કિટ્સ (1323202) - સમર 2023 સોલ્યુશન
13 મિનિટ
અભ્યાસ-સામગ્રી ઉકેલો ઇલેક્ટ્રોનિક્સ 1323202 2023 સમર
ઇલેક્ટ્રોનિક સર્કિટ્સ એન્ડ એપ્લિકેશન્સ (4321103) - ઉનાળુ 2023 સોલ્યુશન
20 મિનિટ
અભ્યાસ-સામગ્રી સોલ્યુશન ઇલેક્ટ્રોનિક-સર્કિટ્સ 4321103 2023 ઉનાળુ