Double link list pada python


Doubly Linked List sama seperti Single Linked List merupakan sebuah tempat yang disediakan pada satu area memori tertentu untuk menyimpan data yang dikenal dengan sebutan node atau simpul. Akan tetapi, setiap node pada doubly linked list selain memiliki pointer yang menunjuk ke simpul berikutnya sehingga terbentuk satu untaian, juga memiliki pointer yang menunjuk ke simpul sebelumnya. Susunan berupa untaian model ini disebut Doubly Linked List.


Berikut contoh programnya:

class Node:
    def __init__(self,initdata):
        self.data = initdata
        self.next = None
        self.prev = None
    def getData(self):
        return self.data
    def getNext(self):
        return self.next
    def getPrev(self):
        return self.prev
    def setData(self,newdata):
        self.data = newdata
    def setNext(self,newnext):
        self.next = newnext
    def setPrev(self,newprev):
        self.prev = newprev

class orderedlist:

    def __init__(self):
        self.head = None

    def show(self):
        current = self.head
        print ('None <-')
        print ('Head ->', end='')
        while current != None:
            if current.getNext() == None:
                print (current.getData(), end='->')
            else:
                print (current.getData(), end='<->')
            current = current.getNext()
        print ('None')
    def isEmpty(self):
        return self.head == None
    def add(self,item):
        temp = Node(item)

        temp.setNext(self.head)
        temp.setPrev(None)
        next = temp.getNext()
        if next != None:
            next.setPrev(temp)
        self.head = temp

    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()

        return count
    def gan(self,item):
        for i in range(len(item)):
            if item[i] % 2 == 1:
                ganjil.append(item[i])
        ol.sort(ganjil)
        print(ganjil)

    def gen(self,item):
        for i in range(len(item)):
            if item[i] % 2 == 0:
                genap.append(item[i])
        ol.sort(genap)
        print(genap)

    def sort(self,item):
        for x in range(len(item)-1, 0, -1):
            for y in range(x):
                if item[y] > item[y+1]:
                    item[y], item[y+1] = item[y+1], item[y]
    def tambah(self,item):
        pil = "y"
        while pil == "y":
            tam = int(input("masukkan data : "))
            lis.append(tam)
            pil = str(input("apakah anda mau memasukkan data lagi ? (y/n)"))
        ol.gan(lis)
        ol.gen(lis)
        genap.reverse()
        merge = ganjil + genap
        for i in merge:
            ol.add(i)

    def search(self):
        current = self.head
        s = int(input("masukkan data yang akan dicari : "))
        found = False
        while current != None and not found:
            if current.getData() == s:
                found = True
                print('Data in List')
            else:
                current = current.getNext()
        if found == False:
            print('Data not in List')

        return found
    def remove(self):
        current = self.head
        s = int(input("masukkan data yang akan dihapus : "))
        previous = None
        found = False
        while current != None and not found:
            if current.getData() == s:
                found = True
                print("Data deleted")
            else:
                previous = current
                current = current.getNext()
                if current == None:
                    next = None
                else:
                    next = current.getNext()

        if previous == None:
            self.head = current.getNext()
        else:
            if current == None:
                previous.setNext(None)
            else:
                previous.setNext(current.getNext())
            if next != None:
                next.setPrev(current.getPrev)
        if current is None:
            print("Data not in list")

ol = orderedlist()    
lis = [170411100001,170411100002,170411100003,170411100004,170411100005]
genap=[]
ganjil=[]
merge = ganjil + genap
ol.tambah(ol)
ol.show()
print("panjang datanya adalah",orderedlist.size(ol))
orderedlist.search(ol)
orderedlist.remove(ol)

Single link list pada python

Single Linked List merupakan sebuah tempat yang disediakan pada satu area memori tertentu untuk menyimpan data yang dikenal dengan sebutan node atau simpul. Setiap node memiliki pointer yang menunjuk ke simpul berikutnya sehingga terbentuk satu untaian, dengan demikian hanya diperlukan sebuah variabel pointer. Susunan berupa untaian semacam ini disebut Single Linked List. Biasanya Linked List pada node terakhir akan menunjuk ke NULL, dimana  NULL memilik nilai khusus yang artinya tidak menunjuk ke mana-mana.

Pembuatan Single Linked List dapat menggunakan 2 metode:
– LIFO (Last In First Out), aplikasinya : Stack (Tumpukan)
– FIFO (First In First Out), aplikasinya : Queue (Antrean)

Berikut contoh programnya
class node:
    def __init__(self,initdata):
        self.data = initdata
        self.next = None
    def getdata (self):
        return self.data
    def getnext(self):
        return self.next
    def setdata (self,newdata):
        self.data = newdata
    def setnext (self,newnext):
        self.next = newnext
        
class orderedlist:
    def __init__(self):
        self.head = None
        
    def show (self):
        current = self.head
        print("Head -> ", end = "")
        while current != None:
            print(current.getdata(), end="-> ")
            current = current.getnext()
        print("None")


    def isempty(self):
        return self.head == None
    
    def add(self,item):
        temp = node(item) 
        temp.setnext(self.head)
        self.head = temp

    def size(self):
        current = self.head
        count = 0
        while current != None :
            count += 1
            current = current.getnext()
        return count

    def search(self):
        current = self.head
        s = int(input("masukkan data yang akan dicari : "))
        found = False
        while current != None and not found:
            if current.getdata() == s:
                found = True
            else:
                current = current.getnext()
        if found == True :
            print("Data ditemukan")
        else :
            print("Data tidak ditemukan")

    def remove (self):
        current = self.head
        s = int(input("masukkan data yang akan dihapus : "))
        previous = None
        found = False
        while not found and current != None:
            if current.getdata() == s:
                found = True
            else:
                previous = current  
                current = current.getnext()
        if found == True :
            if previous == None:
                self.head = current.getnext()
            else:
                previous.setnext(current.getnext())
            print("Data sudah dihapus")
        else :
            print("Data yang akan dihapus tidak ditemukan")
        

    def ganjil(self,item):
        for i in range(len(item)):
            if item[i] % 2 == 1:
                ganjil.append(item[i])
        ol.sort(ganjil)
        print(ganjil)

    def genap(self,item):
        for i in range(len(item)):
            if item[i] % 2 == 0:
                genap.append(item[i])
        ol.sort(genap)
        print(genap)

    def sort(self,item):
        for x in range(len(item)-1, 0, -1):
            for y in range(x):
                if item[y] > item[y+1]:
                    item[y], item[y+1] = item[y+1], item[y]
    def tambah(self,item):
        pil = "y"
        while pil == "y":
            tam = int(input("masukkan data : "))
            lis.append(tam)
            pil = str(input("apakah anda mau memasukkan data lagi ? (y/n)"))
        ol.ganjil(lis)
        ol.genap(lis)
        genap.reverse()
        merge = ganjil + genap
        for i in merge:
            ol.add(i)

ol = orderedlist()    
lis = [170411100001,170411100002,170411100003,170411100004,170411100005,170411100006]
genap=[]
ganjil=[]
merge = ganjil + genap
ol.tambah(ol)
ol.show()
print("panjang datanya adalah",orderedlist.size(ol))
orderedlist.search(ol)
orderedlist.remove(ol)
ol.show()

Infix Prefix dan Postfix pada python

Pengertian infix prefix dan postfix

Infix adalah cara penulisan atau ungkapan yang meletakan operator di tengah antara 2 operand dalam hal ini dalam kurung sangat menentukan posisi.
Contoh Infix :
A + B
( A - B ) * C

Prefix adalah cara penulisan atau ungkapan yang meletakan operator disebelah kiri 2 operand dan dalam kurung sangat menentukan posisi.
Contoh Prefix :
+ A B
* - A B C

Posfix adalah cara penulisan yang meletakan operator disebelah kanan 2 operand dan posisi operand yang berada di dalam kurung sangat menentukan.
Contoh Postfix :
A B +
A B - C *



Berikut ini algoritma dari konversi Infix ke Postfix:
  1. Buat presisi atau kekuatan operator ( Penjumlahan dan Pengurangan bernilai 2 , Perkalian dan Pembagian bernilai 3 , Kurang buka dan tutup bernilai 1 )
  2. Input data dalam bentuk infix
  3. Pisahkan data infix menggunakan split menjadi bentuk List
  4. Periksa semua data yang berada di dalam list secara urut mulai dari awal hingga akhir
  5. Jika bertemu operand, maka masukan data ke PostfixList untuk dicetak
  6. Jika bertemu kurung buka '(' maka masukan ke Stack Operator
  7. Jika bertemu kurung tutup ')' maka Stack Operator yang paling atas dan bukan kurung buka '(' diambil untuk dicetak ke PostfixList
  8. Jika bertemu operator maka jika Stack Operator tidak kosong dan kekuatan operator yang digunakan lebih kecil dari kekuatan operator yang berada di top Stack Operator maka operator yang berada di Stack Operator diambil (pop) untuk dicetak di PostfixList. lalu masukan operator yang digunakan ke dalam Stack Operator.
  9. Begitu seterusnya sampai List yang berisi data Infix habis.
  10. Jika Stack Operator masih ada isinya maka ambil dan tambahkan ke PostfixList untuk dicetak.
  11. Cetak PostfixList

Berikut ini Algoritma dari konversi Infix ke Prefix:

  1. Balikan data Infix
  2. Jika operator kurung buka '(' maka ganti dengan kurung tutup ')' begitu sebaliknya
  3. Masukan data tersebut ke konversi Infix ke Postfix 
  4. Setelah keluar hasil, Balikan lagi hasil tersebut
  5. Maka keluar bentuk Prefix




Berikut ini kode program Konversi dari Infix ke bentuk Postfix :
class Stack:
     def __init__(self):
         self.items = []
     def isEmpty(self):
         return self.items == []
     def push(self, item):
         self.items.append(item)
     def pop(self):
         return self.items.pop()
     def peek(self):
         return self.items[len(self.items)-1]
     def size(self):
         return len(self.items)
     def showList(self):
          return self.items

def infixToPostfix(infixexpr):
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    opStack = Stack()
    postfixList = []
    tokenList = infixexpr.split()
    print(tokenList)
    

    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
               (prec[opStack.peek()] >= prec[token]):
                  postfixList.append(opStack.pop())
            opStack.push(token)
        print('isi postix ',str(postfixList))

    while not opStack.isEmpty():
        postfixList.append(opStack.pop())
    print('isi postix ',str(postfixList))
    return " ".join(postfixList)

print(infixToPostfix("A * B - C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

Kode Program konversi Infix ke Prefix :

class Stack:
     def __init__(self):
         self.items = []
     def isEmpty(self):
         return self.items == []
     def push(self, item):
         self.items.append(item)
     def pop(self):
         return self.items.pop()
     def peek(self):
         return self.items[len(self.items)-1]
     def size(self):
         return len(self.items)
     def showList(self):
          return self.items
# No 1
def infixToPrefix(infixexpr):
    
    prec = {'*':3, '/':3 , '+':2, '-':2 , '(':1}
    opStack = Stack()
    prefixList = []
    tokenList = infixexpr.split()
    tokenList.reverse()
    for i in range(len(tokenList)):
         if tokenList[i] == '(':
              tokenList[i]=')'
         elif tokenList[i] == ')':
              tokenList[i]='('
    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
            prefixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            
            while topToken != '(':
                prefixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
               (prec[opStack.peek()] >= prec[token]):
                  prefixList.append(opStack.pop())
            opStack.push(token)

    while not opStack.isEmpty():
        prefixList.append(opStack.pop())
    prefixList = prefixList[::-1]
    return " ".join(prefixList)

print('No 1')
print(infixToPrefix("A * B - C * D"))
print(infixToPrefix("( A + B ) * C - ( D - E ) * ( F + G )"))

Queue (antrian) Pada python

Queue (antrian) Pada python

Queue 

Queue (Antrian) adalah kumpulan data yang berurut dimana penambahan data baru berada di satu ujung bernama ekor atau rear. Sedangkan penghapusan data berada di ujung kepala atau front. Queue menggunakan metode pengurutan FIFO (First In, First Out) yaitu data yang masuk pertama maka data tersebut juga keluar pertama kali. Contoh implementasi dari Queue adalah Antrian sembako, permainan temukan orang dan lain sebagainya.

Berikut ini algoritma program dalam permainan temukan orang :
1. Inputkan nama yang ikut permainan dan masukan pada Queue
2. Inputkan nama yang ingin dicari.
3. Buat perulangan untuk menemukan orang yang ingin dicari di Queue. Jika nama tersebut berada di 4. kepala maka nama tersebut ditemukan. Sedangkan jika tidak maka nama yang berada di kepala di ambil dan dimasukan lagi di Queue.
5. Begitu seterusnya sampai orang yang dicari berada di Kepala Queue.


Code program
def queue():
    s = []
    return s
def enqueue(s,i):
    s.insert(0,i)
    return s
def dequeue(s):
    return s.pop()
def rear(s):
    return (s[0])
def front(s):
    return (s[len(s)-1])
def size(s):
    return len(s)
def isEmpty(s):
    return s==[]

def No2():
    s = queue()
    k=''
    while True:
        banyak = int(input('Masukan banyak orang yang ingin ada di permainan = '))
        for j in range(banyak):
            orang = input('Masukan nama orang ke %i yang masuk di antrian = '%(j+1))
            enqueue(s,orang)
        s.reverse()
        print('Orang yang berada di Antrian %s'%s)
        s.reverse()
        o = input('Masukan nama orang yang ingin ditemukan = ')
        ditemukan = 't'
        itung = 0
        while ditemukan=='t':
            if o == front(s):
                print('Congrast! Orang ditemukan')
                ditemukan = 'y'
            elif o != front(s):
                masukan = dequeue(s)
                enqueue(s,masukan)
                ditemukan = 't'
                s.reverse()
                print('Looping %i = %s'%((itung+1),s))
                s.reverse()
            itung+=1
            if itung > len(s):
                print('Maaf! Orang yang dimaksud tidak ada')
                ditemukan = 'y'
        print('Total looping yang perlukan adalah',str(itung-1))
        k = input('ingin melanjutkan permainan (y/n) ? ')
        if k != 'y':
            print('============================================================================')
            print('=================================== END ====================================')

Stack pada python (tumpukan)

Stack pada python (tumpukan)

Stack .

Stack adalah kumpulan data yang terurut sesuai bagaimana data tersebut ditambahkan atau dihapus. Proses pada stack terjadi pada satu ujung. Ujung ini disebut 'top'. Sisi yang berlawanan dengan ujung ini disebut 'base'. Stack dalam pengurutan data menggunakan metode LIFO (Last in, First in). Contoh implementasi dari stack adalah memeriksa keseimbangan tanda kurung, konversi bilangan desimal ke biner, konversi infix ke postfix/prefix dan lain sebagainya.

Berikut ini adalah algoritma salah satu implementasi Stack yaitu program memeriksa kata dengan lawan katanya. Jika kata tersebut bertemu dengan lawan katanya maka hasillnya True.
Buatlah list pasangan kata.
1. Input kata yang ingin diperiksa dan masukan ke Stack
2. Buat Variabel hasil untuk menyimpan hasil True dan False.
3. Ambil satu kata dari Stack.
4. Bandingkan kata tersebut dengan kata yang berada pada list pasangan kata.
5. Jika tidak ketemu maka kirim hasil False pada variabel hasil, Jika ketemu maka ambil satu kata
6. dari stack lagi untuk membandingkannya dengan list pasangan yang tadi sama dengan kata pertama.
7. Jika kata kedua tidak ketemu dengan pasangan pada kata pertama, maka variabel hasil berisi False
8. Begitu seterusnya, sampai data yang diinputkan habis.
9. Akumulasikan/evaluasi variabel hasil dengan operator 'And'



Code program :
class Stack:
    def __init__(self):
        self.items=[]
        
    def isEmpty(self):
        return self.items == []
    def open(self):
        return self.items
    def push(self,item):
        return self.items.append(item)
    def pop(self):
        return self.items.pop()
    def peek(self):
        return self.items[len(self.items)-1]
    def size(self):
        return len(self.items)
    
s = Stack()

stak=[]
soal =''
pasangan = [['siang','malam'],['terang','gelap'],['malam','siang'],['gelap','terang'],['terbit','tenggelam'],['tenggelam','terbit']]
masukan = int(input('Masukan berapa banyak kata yang ingin diinput = '))
for i in range(masukan):
    b = input('Masukan kata ke %i = '%(i+1))
    s.push(b)
    stak.append(b)
for i in range(len(stak)):
    soal=soal + stak[i] + ' '
#print(s.open())
hasil = 0
pembanding = False
hasil1 = False
while not s.isEmpty():
    a = Stack()
    if len(s.open()) == 1:
        hasil1=False
    cek = s.pop()
    for i in range(len(pasangan)):
        pas = pasangan[i][0]
        if cek == pas:
            ketemu = False
            if s.size() <= 0:
                ketemu = True
            else:
                ketemu = False
            while not ketemu:
                ka = s.open()
                jum = len(ka)-1
                while jum >= 0:
                    cek1 = ka[jum]
                    if pasangan[i][1] == cek1:
                        ketemu = True
                        hasil1 = True
                        ka.remove(cek1)
                        break
                    else:
                        hasil1 = False
                    jum-=1
                ketemu = True
    hasil = hasil1
    pembanding = hasil and hasil1
print(soal +'-> '+ str(pembanding))


Hashing dan Chaining pada python

Hashing 

Hashing adalah teknik atau metode memetakan data ke sebuah tempat dimana data sebenarnya dirubah dalam bentuk lain. semisal huruf a menjadi huruf e. Teknik ini biasanya digunakan untuk mengenkrispsi sebuah password didalam database seperti MySQL.
Pada python, cara metode Hashing dengan membuat sebuah List yang akan diisi oleh data masukan. Data masukan diberi 2 buah nilai yaitu value sebagai data tersebut dan juga key sebagai alat untuk memasukan value ke List.

Algoritma Hashing sebagai berikut :
1. Membuat tabel hash yang berisikan None
2. Memasukan data yang ingin dimasukan
3. Data masukan terdiri dari value dan keynya
4. Lakukan pencarian modulus dari key yang dibagi panjang tabel hash
5. Masukan value dari data tersebut ke dalam tabel hash sesuai indexnya

Permasalahan yang terjadi pada hashing adalah apabila pada index yang terjadi banyak value, inilah yang disebut Collision. Cara mengatasinya ada tiga yang sudah saya pelajari, yaitu linear hashing, aquadratic hashing dan chainning.


Berikut ini penjelasan dari penyelesaian diatas :
1. Linear Hashing
Penyelesaian dengan linear yaitu melakukan penambahan 1 tiap index yang terjadi collision, misalnya, collison terjadi pada index 3, maka data selanjutnya yang berindex 3 akan ditambahkan ke index 4, jika index 4 sudah terdapat value atau isi maka data terdebut ditaruh di index 5.


contoh programnya :
print('=============== Program Hashing Data Numerik (Linear Probbing) ================ ')
l = 'y'
while l == 'y':
    table = int(input('Masukan panjang tabel Hash = '))
    table = [None] * table
    print('Panjang Tabel Hash = %i'%(len(table)))

    def hash(x,table):
        return x % len(table)

    def insert(table,key,value):
        index = hash(key,table)
        if table[index] == None:
            table[index] = value
        else:
            collusion = index
            found = False
            ind = collusion + 1
            if ind > len(table) - 1:
                    ind = 0
            while (ind <= len(table)-1) and not found:
                if table[ind] == None:
                    found = True
                    table[ind] = value
                ind = ind+1
                
    #Jika ingin mencari data dengan hasil True dan False
    '''def searchHash(data,table):
        if data in table:
            print('Data ditemukan')
        else:
            print('Data tidak ditemukan')'''
    
    #Jika ingin mencari data dengan hasil index data yang dicari
    '''def searchHash(data,table):
        x = 0
        found = False
        while x < len(table) and not found:
            if table[x] == data:
                found = True
            if found ==False:
                x+=1
        if found == True:
            print('Data %s berada pada di index %s dari table'%(data,x))
        else:
            print('Data %s tidak ditemukan'%data)'''

    #Jika ingin mencari data dengan cara hash dengan hasil True/False beserta indeks
    def searchHash(data,table):
        index = hash(data,table)
        if table[index] == data:
            print('True')
            print('Data %s berada pada index %s'(data,index))
            return True 
        else:
            col = index
            found = False
            ind = col + 1
            if ind > len(table) - 1:
                ind = 0
            kali = 1
            while (ind <= len(table)-1) and not found:
                if table[ind] == data:
                    found = True
                    print('True')
                    print('Data %s berada pada index %s'%(data,ind))
                    return True
                ind+=1
                if ind> len(table)-1:
                    ind = 0
                if kali>len(table):
                    found = True
                    print('False')
                    print('Data %s data tidak temukan'%data)
                    return False
                kali+=1
    
    
    masuk = 'y'
    while masuk == 'y':
        nginput = int(input('Masukan berapa kali ingin memasukan data ke Tabel Hash = '))
        if nginput > len(table):
            print('Panjang data masukan lebih dari panjang Tabel Hash')
            print('Tolong masukan ulang')
        else:
            masuk = 'n'
    b = 1
    while b<=nginput:
        masukan = int(input('Masukan angka yang ingin dimasukan ke Tabel Hash = '))
        insert(table,masukan,masukan)
        b+=1

    print(table)
            
    nginput = True
    while nginput:
        q = input('Apakah ingin mencari Data ? (y/n) ')
        if q == 'y':
            dicari = int(input('Masukan angka yang ingin dicari = '))
            searchHash(dicari,table)
        elif q == 'n':
            nginput = False
        else:
            print('Masukan y atau n!')
            nginput = True

    k = 'y'
    while k =='y':
        l = input('Apakah ingin melanjutkan program ? (y/n) ')
        if l == 'y':
            k = 'n'
        elif l == 'n':
            print('Terima Kasih')
            k = 'n'
        else:
            print('Masukan y atau n!')
            k = 'y'
2. Aquadratic Hashing
Penyelesaian dengan Quadratic/Aquadratic ini sama seperti linear akan tetapi penambahan tidak satu persatu, melainkan penambahnya di kuadratkan lalu dimodulus dengan panjang tabel hash.
Misalnya yang terjadi collison pada index 3 dan panjang tabel hash 10 maka jika ditambahkan data yang berindex 3 maka data terbut ditaruh pada index ke 3 yang ditambah 1 kuadrat 2 jadi berindex 4 lalu dimodulus panjang tabel hash jadi index 4. Jika index 4 sudah terisi maka index ditambah 2 kuadrat 2 jadi 3+4 yaitu 7 dan dimodulus panjang tabel hash yaitu 10 menjadi index 7, begitu seterusnya hingga data dapat ditempakan ditempat kosong pada tabel hash.
Berikut ini contoh programnya:
print('============= Program Hashing Data Numerik (Qudratic Probbing) ================ ')
l = 'y'
while l == 'y':
    table = int(input('Masukan panjang tabel Hash = '))
    table = [None] * table
    print('Panjang Tabel Hash = %i'%(len(table)))

    def hash(x,table):
        return x % len(table)

    def insert(table,key,value):
        index = hash(key,table)
        if table[index] == None:
            table[index] = value
        else:
            collusion = index
            found = False
            i = 1
            while i > 0 and not found:
                ind = collusion + i**2
                ind = ind % len(table)
                if table[ind] == None:
                    found = True
                    table[ind] = value
                i+=1

    #Jika ingin mencari data dengan hasil True dan False
    '''def searchHash(data,table):
        if data in table:
            print('Data ditemukan')
        else:
            print('Data tidak ditemukan')'''
    
    #Jika ingin mencari data dengan hasil index data yang dicari
    def searchHash(x,table):
        posisi = 0
        found = False
        while posisi < len(table) and not found:
            if table[posisi] == x:
                found = True
            if found==False:
                posisi += 1
        print('Angka yang dicari adalah %s pada tabel %s'%(x,table))
        print('Angka %s terdapat pada index = %s'%(x,posisi))

    def searchHash(data,table):
        index = hash(data,table)
        if table[index] == data:
            print('True')
            print('Data %s berada pada index %s'(data,ind))
            return True
        else:
            collusion = index
            found = False
            i = 1
            kali = 1
            while i > 0 and not found:
                ind = collusion + i**2
                ind = ind % len(table)
                if table[ind] == data:
                    found = True
                    print('True')
                    print('Data %s berada pada index %s'(data,ind))
                i+=1
                if kali > len(table):
                    found = True
                    print('False')
                    print('Data %s tidak ditemukan'%data)
                    return False
                kali+=1

    masuk = 'y'
    while masuk == 'y':
        nginput = int(input('Masukan berapa kali ingin memasukan data ke Tabel Hash = '))
        if nginput > len(table):
            print('Panjang data masukan lebih dari panjang Tabel Hash')
            print('Tolong masukan ulang')
        else:
            masuk = 'n'
    b = 1
    while b<=nginput:
        masukan = int(input('Masukan angka yang ingin dimasukan ke Tabel Hash = '))
        insert(table,masukan,masukan)
        b+=1

    print(table)
            
    nginput = True
    while nginput:
        q = input('Apakah ingin mencari Data ? (y/n) ')
        if q == 'y':
            dicari = int(input('Masukan angka yang ingin dicari = '))
            searchHash(dicari,table)
        elif q == 'n':
            nginput = False
        else:
            print('Masukan y atau n!')
            nginput = True

    k = 'y'
    while k =='y':
        l = input('Apakah ingin melanjutkan program ? (y/n) ')
        if l == 'y':
            k = 'n'
        elif l == 'n':
            print('Terima Kasih')
            k = 'n'
        else:
            print('Masukan y atau n!')
            k = 'y'


3. Chainning
Penyelesaian dengan cara Chainning yaitu membuat list didalam tabel hash sehingga data yang berindex sama tidak terjadi collison karena data tersebut ditumpuk ke dalam sebuah list yang telah dibuat.
Berikut ini contoh programnya :

print('============= Program Hashing Data Numerik (Chaining Probbing) ================ ')
l = 'y'
while l == 'y':
    table = int(input('Masukan panjang tabel Hash = '))
    table = [ [] for _ in range(table) ]

    def hash(x,table):
        return x % len(table)

    def insert(table,key,value):
        table[hash(key,table)].append(value)

    #Jika ingin mencari data dengan hasil True dan False
    '''def searchHash(data,table):
        found = False
        i = 0
        j = 0
        while i < len(table) and not found:
            if data in table[i]:
                print('Data ditemukan')
                found = True
            i+=1
        if found == False:
            print('Data tidak ditemukan')'''
    #Jika ingin mencari data dengan hasil index data yang dicari
    '''def searchHash(data,table):
        found = False
        i = 0
        
        while i < len(table) and not found:
            j = 0
            while j < len(table[i]) and not found:
                if data == table[i][j]:
                    found = True
                if found==False:
                    j+=1
            if found==False:
                i+=1
        if found == True:
            print('Data %s berada pada list ke-%s index ke-%s'%(data,(i+1),j))
        else:
            print('Data %s tidak ditemukan'%data)'''

    def searchHash(data,table):
        index = hash(data,table)
        if data in table[index]:
            print('True')
            jml = len(table[index])
            for i in range(jml):
                if data == table[index[i]]:
                    break
            print('Data %s berada di dalam list %s index %s'%(data,index,i))
        else:
            print('Data %s tidak ditemukan'%data)

    
    nginput = int(input('Masukan berapa kali ingin memasukan data ke Tabel Hash = '))
    b = 1
    while b<=nginput:
        masukan = int(input('Masukan angka yang ingin dimasukan ke Tabel Hash = '))
        insert(table,masukan,masukan)
        b+=1

    print(table)
            
    nginput = True
    while nginput:
        q = input('Apakah ingin mencari Data ? (y/n) ')
        if q == 'y':
            dicari = int(input('Masukan angka yang ingin dicari = '))
            searchHash(dicari,table)
        elif q == 'n':
            nginput = False
        else:
            print('Masukan y atau n!')
            nginput = True

    k = 'y'
    while k =='y':
        l = input('Apakah ingin melanjutkan program ? (y/n) ')
        if l == 'y':
            k = 'n'
        elif l == 'n':
            print('Terima Kasih')
            k = 'n'
        else:
            print('Masukan y atau n!')
            k = 'y'

Sorting : Insertion short dan implementasinya dengan bahasa python

Sorting : Insertion short dan implementasinya dengan bahasa python


Insertion sort 

       Prinsip algoritma insertion sort pada dasarnya membagi data yang akan diurutkan menjadi dua bagian, satu bagian yang belum diurutkan dan yang satunya lagi sudah diurutkan. Elemen pertama diambil dari bagian list yang belum diurutkan dan kemudian diletakkan sesuai posisinya pada bagian lain dari list yang telah diurutkan. Langkah ini dilakukan secara berulang hingga tidak ada lagi elemen yang tersisa pada bagian list yang belum diurutkan.

Langkahnya seperti di bawah ini :

Bandingkan data ke-2 dengan data ke-1, jika data ke-2 lebih kecil maka tukar posisinya, jika tidak biarkan aja.

Data ke-3 dibandingkan dengan data ke-1 dan ke-2, jika data ke-3 lebih kecil kemudian tukar lagi posisinya.

Data ke-4 dibandingkan dengan data ke-3, ke-2, dan ke-1, jika data ke-4 lebih kecil dari ketiganya maka letakkan data ke-4 ke posisi paling depan. Begitu seterusnya sampai tidak ada lagi data yang bisa dipindahkan.


Contoh script dalam Python :
disini saya menggunakan list 100 angka acak
def insert(listData):
    for x in range(len(listData)):
        key = listData[x]
        aw = x
        while aw > 0 and listData[aw-1]<key:
            listData[aw] = listData[aw-1]
            aw -= 1
        listData[aw] = key
        print(listData)


import random,time
c = []
for x in range(100):
    c.append(random.randint(0,100))
start = time.time()
insert(c)
end = time.time()-start
print("Waktu proses : ",end,'detik')