doing this course on dsa with python, so thought of making notes and posting them basically so i dont forget :P
- mutable
- indexing can be done
- not homogenous[not same data structure possible]
- allow duplicates
- eg
hello=[10,'string',0.3]
- methods for insertion
- hello.append([10,38]) //takes an object
- hello.insert(index,value)
- hello.extend(91,22) //takes an iterable
- methods for removing
- hello.pop() //pop the last element
- hello.clear() //will clear up all elements
- hello.remove('bye') //remove the element that given
- other useful methods
- hello.sort() //will sort the string
- hello.count(10) //will return the no. of happenings of 10
- hello.index(10) //find index of 10
- immutabe(means cannot just change the data but can add more if wanted)
- can indexing
- allow duplicates
- collection of python objects
- eg
tup=(1,2,3,'string')
- methods for appending
- use + operator
tup=(10,20,30) tup=tup+(40,50,60)
- use + operator
- methods for slicing
- use colon : for slice
tup[1:3]
- the first index in
[first:second]
will come but second index will not
- use colon : for slice
- methods for deletion
- use del
del tup
- use del
- other methods
len(tup)
for lengthlst=tuple([11,22,33])
will convert it to a tupletup.count(22)
will count the no. of instances of 22 in tuple
- no duplicates allowed
- no indexing
- whole set is mutable
- order of printing will be random
- 2 ways of making sets
- eg
days={92,74,204,67}
- eg
times=set([12,34,56,77])
- eg
- for accessing elements
for element in days:
print(element)
- methods for adding
times.add(10)
will add 10
- methods for removing
times.discard(5)
will remove 5
- methods for union
- pipe | will do the union
times | timer
- pipe | will do the union
- method for intersection
- ampersand & will do the intersection
times & timer
- ampersand & will do the intersection
- method for comparing
times <= timer
will return a boolean value
- mutable
- key-value pairs
- 2 ways of making dictionary
- eg
book={1:'intro',2:'blogs',3:'content',4:'end'}
- eg
okay=dict([(0,2),(1,4)])
here output would be{0:2,1:4}
- eg
- accessing
book[2]
here 2 is the key not the index - methods for changing and adding key-value pairs
book[1]='titles'
book[5]='sign'
- methods for deleting
book.pop(2)
will pop element at 2 keybook.clear()
will remove all elements of the dictionary
- other methods
book.keys()
will give out all the keysbook.values()
will give out all the valuesbook.items()
will give the items like[(1,'intro'),(2,'blogs')]
- stores in 2 dimensions
- uses a list basically
- eg
array=[[1,3,5],[6,7,9],[8,4,7]]
- eg of inputing can be:
size=int(input()) arr=[] for x in range(size): arr.append([ int(y) for y in input().split() ]) print(arr)
- eg for traversing the 2-d array
arr = [[1,3,5],[6,9,2],[6,8,3]]
for i in arr:
for j in i:
print(j,end=" ")
print()
- eg deletion can be done by
del(arr[i][j])
- array slicing eg
arr[1:3] #index 1 to 2
- array length eg
len(arr) #no. of rows
- Object oriented programming
- because somehow procedural way isn't cool
- uses classes which have functions
- class has init method
- eg of class made
class Employee:
def __init__(self,name='harry'):
self.name = name
def display(self):
print("name of employee is", self.name)
first = Employee()
first.display()
- describes the amount of computer time to take to run an algorithm
- uses Big O notation basically
O(1)
means for any input time taken is samefastest
O(log n)
means for n input then time is log nfaster
O(n)
time increasing steadily as input size increasingnormal
O(n^2)
time increasing very rapidly for inputslow
- uses lifo [ Last in, first out ]
- push for adding data
- pop for removing the top element
- peek for getting value of top element
- for array implimentation time complexity is O(1)
- eg
# stack nowww
def create_stack():
stack=[]
return stack
def push(stack,item):
stack.append(item)
print("pushed "+item)
def check_empty():
return len(stack)==0
def pop(stack):
if(check_empty(stack)):
return "Stack is empty"
else:
return stack.pop()
stack=create_stack()
push(stack,str(6))
push(stack,str(5))
pop(stack)
print(stack)
- based on fifo [ first in, first out ]
- enqueue for entering elements
- dqueue for deletion of elements
- time complexity is O(1)
- eg
class Queue:
def __init__(self):
self.queue=[]
print("Queue is created 🎉")
def enqueue(self,item):
self.queue.append(item)
def dqueue(self):
if(len(self.queue)<1):
return None
return self.queue.pop(0)
def display(self):
print(self.queue)
tom = Queue()
tom.enqueue(5)
tom.enqueue(6)
tom.enqueue(8)
tom.enqueue(9)
tom.display()
tom.dqueue()
tom.display()
- includes a series of connected nodes
- each node stores data and address of other node
- address of first node is
HEAD
- next address of last node is
NULL
- most efficient data structure
- search for searching
- insert for insertion
- deletion for deletion
- time complexity
- searching
O(n)
- insertion
O(1)
- deletion
O(1)
- searching
- eg
class Node:
def __init__(self,data=None,next=None):
self.data=data
self.next=next
class LL():
def __init__(self):
self.head=None
print("linked list created, lol")
def printlist(self):
temp=self.head
while(temp):
print(temp.data)
temp=temp.next
def push(self, new_data):
new_node = Node(new_data)
new_node.next=self.head
self.head=new_node
def insertAfter(self,prev_node, new_data):
if prev_node is None:
print "The given previous node must be in linked list"
return
new_node = Node(new_data)
new_node.next = prev_node.next
prev_node.next = new_node
def append(self,new_data):
last=self.head
if self.head is None:
self.head=new_node
return
while(last):
last=last.next
last
new_node=Node(new_data)
last.next=new_node
def delNode(self, pos):
cur_node= self.head
prev=None
count=0
while cur_node and count != pos:
prev=cur_node
cur_node=cur_node.next
count += 1
if cur_node is None:
return
prev.next = cur_node.next
cur_node = None
cat = LL()
cat.push(4)
cat.push(5)
cat.push(6)
cat.printlist()