STRUKTUR DATA - HASHING


NAMA: MOH.SABHAN
NIM: 160411100078
MAPEL: STRUKTUR DATA


  •  A. HASHING
Tabel hash adalah kumpulan item yang disimpan sedemikian rupa sehingga memudahkan untuk menemukannya nanti. Setiap posisi dari tabel hash, sering disebut slot , dapat menyimpan item dan diberi nama oleh nilai integer mulai dari 0. Sebagai contoh, kita akan memiliki slot bernama 0, sebuah slot bernama 1, sebuah slot bernama 2, dan sebagainya. di.Awalnya, tabel hash tidak berisi item sehingga setiap slot kosong. Kita bisa menerapkan tabel hash dengan menggunakan daftar dengan setiap elemen yang diinisialisasi dengan nilai Python khusus
 menunjukkan tabel hash dengan ukuran \ (m = 11 \) . Dengan kata lain, ada m slot dalam tabel, diberi nama 0 sampai 10.

Pemetaan antara item dan slot tempat item tersebut berada dalam tabel hash disebut fungsi hash. Fungsi hash akan mengambil barang apapun dalam koleksi dan mengembalikan bilangan bulat di kisaran nama slot, antara 0 dan m -1. Asumsikan bahwa kita memiliki kumpulan item integer 54, 26, 93, 17, 77, dan 31. Fungsi hash pertama kita, kadang-kadang disebut sebagai "metode sisa," hanya mengambil item dan membaginya dengan ukuran tabel, kembali Sisanya sebagai nilai hashnya ( \ (h (item) = item \% 11 \) ). Tabel 4 memberikan semua nilai hash untuk item contoh kami. Perhatikan bahwa metode sisa ini (modulo aritmatika) biasanya akan hadir dalam beberapa bentuk dalam semua fungsi hash, karena hasilnya harus berada dalam kisaran nama slot.
Barang
Nilai Hash
54
10
26
4
93
5
17
6
77
0
31
9
Setelah nilai hash dihitung, kita dapat memasukkan setiap item ke dalam tabel hash pada posisi yang ditunjuk seperti yang ditunjukkan pada Gambar 5 . Perhatikan bahwa 6 dari 11 slot sekarang ditempati. Ini disebut sebagai faktor beban , dan biasanya dilambangkan dengan \ (\ lambda = \ frac {numberofitems} {tablesize} \) . Untuk contoh ini, \ (\ lambda = \ frac {6} {11} \) .

Sekarang ketika kita ingin mencari item, kita cukup menggunakan fungsi hash untuk menghitung nama slot untuk item tersebut dan kemudian memeriksa tabel hash untuk melihat apakah ada. Operasi pencarian ini adalah \ (O (1) \) , karena jumlah waktu yang konstan diperlukan untuk menghitung nilai hash dan kemudian mengindeks tabel hash di lokasi tersebut. Jika semuanya ada dimana seharusnya, kita telah menemukan algoritma pencarian waktu yang konstan.
Anda mungkin sudah bisa melihat bahwa teknik ini akan bekerja hanya jika setiap item memetakan ke lokasi unik di tabel hash. Misalnya, jika item 44 adalah item berikutnya dalam koleksi kami, itu akan memiliki nilai hash 0 ( \ (44 \% 11 == 0 \) ). Karena 77 juga memiliki nilai hash 0, kita akan memiliki masalah. Menurut fungsi hash, dua atau lebih item perlu berada di slot yang sama. Ini disebut sebagai tabrakan (ini mungkin juga disebut "bentrokan"). Jelas, tabrakan menciptakan masalah bagi teknik hashing. Kita akan membahasnya secara rinci nanti.

Resolusi Tabrakan 
Kita sekarang kembali ke masalah tabrakan. Ketika dua item hash ke slot yang sama, kita harus memiliki metode sistematis untuk menempatkan item kedua pada tabel hash. Proses ini disebut collision resolution . Seperti yang telah kita nyatakan sebelumnya, jika fungsi hash itu sempurna, tabrakan tidak akan pernah terjadi. Namun, karena ini seringkali tidak memungkinkan, resolusi tabrakan menjadi bagian yang sangat penting dari hashing.
Salah satu metode untuk menyelesaikan tabrakan melihat ke dalam tabel hash dan mencoba menemukan slot terbuka lain untuk menahan barang yang menyebabkan tabrakan. Cara sederhana untuk melakukan ini adalah dengan memulai pada posisi nilai hash asli dan kemudian bergerak secara berurutan melalui slot sampai kita menemukan slot pertama yang kosong. Perhatikan bahwa kita mungkin perlu kembali ke slot pertama (sirkular) untuk menutupi seluruh tabel hash. Proses resolusi tabrakan ini disebut sebagai open addressing karena ia mencoba menemukan slot atau alamat terbuka berikutnya di tabel hash. Dengan secara sistematis mengunjungi setiap slot satu per satu, kami melakukan teknik pengalamatan terbuka yang disebut linear probing .
Gambar 8 menunjukkan serangkaian item integer yang diperluas berdasarkan fungsi hash metode sisa sederhana (54,26,93,17,77,31,44,55,20). Tabel 4 di atas menunjukkan nilai hash untuk item asli. Gambar 5 menunjukkan isi aslinya. Saat kita mencoba menempatkan 44 pada slot 0, tabrakan terjadi. Di bawah linear probing, kita melihat secara berurutan, slot dengan slot, sampai kita menemukan posisi terbuka. Dalam hal ini, kita menemukan slot 1.
Sekali lagi, 55 harus masuk slot 0 tapi harus ditempatkan di slot 2 karena ini adalah posisi terbuka berikutnya. Nilai akhir dari 20 hash ke slot 9. Karena slot 9 sudah penuh, kita mulai melakukan probing linier. Kami mengunjungi slot 10, 0, 1, dan 2, dan akhirnya menemukan slot kosong pada posisi 3.


Setelah kita membuat tabel hash dengan menggunakan pengalamatan terbuka dan penyelidikan linier, penting bagi kita untuk menggunakan metode yang sama untuk mencari barang. Asumsikan kita ingin melihat item 93. Ketika kita menghitung nilai hash, kita akan mendapatkan 5. Melihat di slot 5 menunjukkan 93, dan kita dapat mengembalikan True . Bagaimana jika kita mencari 20? Sekarang nilai hash adalah 9, dan slot 9 saat ini memegang 31. Kita tidak bisa begitu saja mengembalikan False karena kita tahu bahwa mungkin ada tabrakan. Kita sekarang terpaksa melakukan pencarian sekuensial, mulai dari posisi 10, melihat sampai kita menemukan item 20 atau kita menemukan slot kosong.
Kerugian untuk menyelidik linier adalah kecenderungan pengelompokan ; Item menjadi berkerumun di meja. Ini berarti bahwa jika banyak tabrakan terjadi pada nilai hash yang sama, sejumlah slot di sekitarnya akan diisi oleh resolusi probing linier. Ini akan berdampak pada item lain yang sedang dimasukkan, seperti yang kita lihat saat kita mencoba menambahkan item 20 di atas. Sekelompok nilai hashing ke 0 harus dilewati sampai akhirnya menemukan posisi terbuka. Cluster ini ditunjukkan pada Gambar 9 .

Salah satu cara untuk mengatasi clustering adalah dengan memperluas teknik probing linier sehingga alih-alih mencari secara berurutan untuk slot terbuka berikutnya, kita melewatkan slot, sehingga lebih merata mendistribusikan barang-barang yang menyebabkan tabrakan. Hal ini berpotensi mengurangi pengelompokan yang terjadi. Gambar 10 menunjukkan item saat resolusi tabrakan dilakukan dengan probe "plus 3". Ini berarti sekali tabrakan terjadi, kita akan melihat setiap slot ketiga sampai kita menemukan yang kosong.

Nama umum untuk proses mencari slot lain setelah tabrakan mengulangi . Dengan solusi linear sederhana, fungsi pengulangan adalah \ (newhashvalue = rehash (oldhashvalue) \) di mana \ (rehash (pos) = (pos + 1) \% sizeoftable \) . Pengulangan "plus 3" dapat didefinisikan sebagai \ (rehash (pos) = (pos + 3) \% sizeoftable \) . Secara umum, \ (rehash (pos) = (pos + skip) \% sizeoftable \) . Penting untuk dicatat bahwa ukuran "skip" harus sedemikian rupa sehingga semua slot dalam tabel pada akhirnya akan dikunjungi. Jika tidak, bagian dari tabel tidak akan terpakai. Untuk memastikan hal ini, sering disarankan agar ukuran meja menjadi bilangan prima. Inilah alasan mengapa kita menggunakan 11 dalam contoh kita.
Variasi dari ide probing linier disebut kuadratic probing . Alih-alih menggunakan nilai "lewati" konstan, kita menggunakan fungsi pengulangan yang meningkatkan nilai hash sebesar 1, 3, 5, 7, 9, dan seterusnya. Ini berarti bahwa jika nilai hash pertama adalah h , nilai berturut-turut adalah \ (h + 1 \) , \ (h + 4 \) , \ (h + 9 \) , \ (h + 16 \) , dan seterusnya . Dengan kata lain, kuadrat menyelidik menggunakan lompatan yang terdiri dari kotak sempurna yang berurutan. Gambar 11 menunjukkan nilai contoh kita setelah ditempatkan menggunakan teknik ini.

Metode alternatif untuk menangani masalah tabrakan adalah membiarkan setiap slot menahan referensi ke koleksi (atau rantai) item. Chaining memungkinkan banyak item ada di lokasi yang sama di tabel hash. Saat tabrakan terjadi, item masih ditempatkan di slot tabel hash yang tepat. Karena semakin banyak item hash ke lokasi yang sama, sulitnya mencari item dalam koleksi meningkat. Gambar 12 menunjukkan item karena ditambahkan ke tabel hash yang menggunakan chaining untuk menyelesaikan tabrakan
.

Ketika kita ingin mencari item, kita menggunakan fungsi hash untuk menghasilkan slot di tempat yang seharusnya berada. Karena setiap slot memegang koleksi, kami menggunakan teknik pencarian untuk memutuskan apakah item itu ada. Keuntungannya adalah rata-rata ada banyak item di setiap slot, jadi pencariannya mungkin lebih efisien. Kita akan melihat analisis untuk hashing pada akhir bagian ini.

Algoritma
table = [None] * 10
def hash(x):
    return x % 10
def insert(table,key,value):
    index = hash(key) 
    if table[index] == None:
        table[index] = value
    else :
        collusion=index
        found = False
        ind=(collusion+1)% 10
        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)% 10
def cari(Data, data):
    list1=[]
    found = False
    for i in range(len(Data)):
        if Data[i] == data:
            found = True
            list1.append(i)
       
    if found:
        return ("Data berada : " + str(list1))
    else:
        return("Tidak ada")
x = int(input("Data yang diinginkan : "))
while 0<x:
    y = int(input("Masukan data : "))
    insert(table,y,y)
    print(table)
    x=x-1
z = int(input("Data yang ingin dicari : "))
print(cari(table,z))

Quadratic Probing
table = [None] * 10
def hash(x):
  return x % 10
def insert(table,key,value):
  index = hash(key) 
  if table[index] == None:
    table[index] = value
  else:
    collusion=index
    found = False
    i=1
    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 = (collusion+(i*i)) % 10
      i=i+1
     
def cari(Data, data):
    list1=[]
    found = False
    for i in range(len(Data)):
        if Data[i] == data:
            found = True
            list1.append(i)
       
    if found:
        return ("Data berada : " + str(list1))
    else:
        return("Tidak ada")
x = int(input("Data yang diinginkan : "))
while 0<x:
    y = int(input("Masukan data : "))
    insert(table,y,y)
    print(table)
    x=x-1
z = int(input("Data yang ingin dicari : "))
print(cari(table,z))

Chaining
table = [ [] for _ in range(10)]
def hash(x):
  return x % 10
def insert(table,key,value):
  table[hash(key)].append(value)
def cari(Data, data):
    list1=[]
    found = False
    for i in range(len(Data)):
        if Data[i] == data:
            found = True
            list1.append(i)
       
    if found:
        return ("Data berada : " + str(list1))
    else:
        return("Tidak ada")
x = int(input("Data yang diinginkan : "))
while 0<x:
    y = int(input("Masukan data : "))
    insert(table,y,y)
    print(table)
    x=x-1
z = int(input("Data yang ingin dicari : "))
print(cari(table,z))

  •  B. LINKKED LIST

Nodes
Self-referential objects (object yang mereferensikan dirinya sendiri) yang disebut nodes, yang dihubungkan dengan links, membentuk kata “linked” list.

Linked List ( LL )
Adalah koleksi data item yang tersusun dalam sebuah barisan  secara linear, dengan penyisipan dan pemindahan dapat dilakukan dalam semua tempat di LL tersebut.


Single Linked List
Adalah sebuah LL yang menggunakan sebuah variabel pointer saja untuk menyimpan banyak data dengan metode LL, suatu daftar isi yang saling berhubungan.
Ilustrasi single LL:

Pada gambar di atas, data terletak pada sebuah lokasi dalam sebuah memory, tempat yang disediakan memory untuk menyimpan data disebut node ? simpul, setiap node memiliki pointer ( penunjuk ) yang menunjuk ke node berikutnya sehingga terbentuk suatu untaian yang disebut single LL.
Bila dalam single LL pointer hanya dapat bergerak ke satu arah saja, maju / mundur, kanan / kiri, sehingga pencarian datanya juga hanya satu arah saja.
Double Linked List
Dalam double LL ( Linked List berpointer ganda ) dapat mengatasi kelemahan-kelemahan single LL tersebut.
Ilustrasi double LL:


·         UNORDERST: menghapus sebuah list yang tidak ada data.
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 UnorderedList:

    def __init__(self):
        self.head = None

    def isEmpty(self):
        return self.head == None

    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
       
    def show(self):
        current = self.head
        print('head ->',end='')
        while current != None:
            print(current.getData(), "->",end='')
            current= current.getNext()
        print(None)
       
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()
        return count
       
    def search(self,item):
        current = self.head
        found = False
        stop = False
        while current != None and not found and not stop:
            if current.getData() == item:
                found = True
            else:
                if current.getData() > item:
                    stop = True
                else:
                    current = current.getNext()
        return(found)
    def remove(self,item):
      current = self.head
      previous = None
      found = False
      stop = False
      while not found and current != None:
          if current.getData() == item:
              found = True
              print("data yang dihapus ",item)
          else:
              previous = current
              if current != None:
                  current = current.getNext()
              elif not found:
                  Stop=True
     
      if previous == None:
          if self.head == None:
              stop= True
          else:
              self.head = current.getNext()
      else:
        if current != None:
          previous.setNext(current.getNext())
      if current is None:
        print("Data not in list")
      if current == self.head and previous == None:
          print("list null")

print("========================================")
print("Unorderlist")
print("========================================")

mylist = UnorderedList()
mylist.add(31)
mylist.add(77)
mylist.add(17)
mylist.show()
mylist.remove(31)
mylist.show()
mylist.remove(17)
mylist.show()
mylist.remove(77)
mylist.show()
mylist.remove(12)

mylist.show()

  • C. TREE DAN GRAPH

BINARY TREE
Pohon biner adalah pohon dengan syarat bahwa tiap node hanya memiliki boleh maksimal dua subtree dan kedua subtree tersebut harus terpisah. Sesuai dengan definisi tersebut, maka tiap node dalam binary tree hanya boleh memiliki paling banyak dua anak/child.
Ilustrasi

Algoritma
class Node(object):

def __init__(self, data):

self.left = None

self.right = None

self.data = data


def __repr__(self):

return "Node With Data: %d" % self.data


def insert(self, data):

if data < self.data:

if self.left is None:

self.left = Node(data)

else:

self.left.insert(data)

else:

if self.right is None:

self.right = Node(data)

else:

self.right.insert(data)


def lookup(self, data, parent=None):

if data < self.data:

if self.left is None:

return None, None

return self.left.lookup(data, self)

elif data > self.data:

if self.right is None:

return None, None

return self.right.lookup(data, self)

else:

return self, parent


def children_count(self):

count = 0

if self.left:

count += 1

if self.right:

count += 1

return count


def descendant_count(self):


count = 0

if self.left:

count += 1 + self.left.descendant_count()

if self.right:

count += 1 + self.right.descendant_count()

return count


def delete(self, data):


node, parent = self.lookup(data)

if node:

children_count = node.children_count()

if children_count == 0:

# If node has no children then remove it

if parent.left is node:

parent.left = None

else:

parent.right = None

del node

elif children_count == 1:

if node.left:

child = node.left

else:

child = node.right

if parent:

if parent.left is node:

parent.left = child

else:

parent.right = child

del node

else:

parent = node

successor = node.right

while successor.left:

parent = successor

successor = successor.left

node.data = successor.data

if parent.left == successor:

parent.left = successor.right

else:

parent.right = successor.right

def inorder_print(self):

if self.left:

self.left.print_tree()

print self.data

if self.right:

self.right.print_tree()


def print_each_level(self):

# Start off with root node

thislevel = [self]



while thislevel:

nextlevel = list()


for node in thislevel:

print node.data

if node.left: nextlevel.append(node.left)

if node.right: nextlevel.append(node.right)

Print

thislevel = nextlevel


def compare_trees(self, node):


if node is None:

return False

if self.data != node.data:

return False

res = True

if self.left is None:

if node.left:

return False

else:

res = self.left.compare_trees(node.left)

if self.right is None:

if node.right:

return False

else:

res = self.right.compare_trees(node.right)

return res


def tree_data(self):

stack = []

node = self

while stack or node:

if node:

stack.append(node)

node = node.left

else:

node = stack.pop()

yield node.data

node = node.right


root = Node(8)

root.insert(3)

root.insert(10)

root.insert(1)

root.insert(6)

root.insert(4)

root.insert(7)

root.insert(14)

root.insert(13)
import pdb; pdb.set_trace()


ALGORITMA BELAJAR
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 UnorderedList:
    def __init__(self):
        self.head = None
    def isEmpty(self):
        return self.head == None
    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
    def show(self):
        current = self.head
        print ('Head ->',end=' ')
        while current != None:
            print (current.getData(), "->",end=' ')
            current = current.getNext()
        print (None)
    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()
        return count
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()

        return found
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
                print('data yang di pindah adalah :',item)
            else:
                previous = current
                current = current.getNext()

        if previous == None:
            self.head = current.getNext()
        else:
            if current != None :
                previous.setNext(current.getNext())
        if current is None :
            print('Data tidak ada')

mylist = UnorderedList()
a = []
q = []
print('Menginputkan ke table Hashing')
print('======================================')
for i in range(0,3):
    c = input('Memasukkan angka ke Unorderlist : ')
    d = int(c)
    mylist.add(d)
    a.append(d)
    mylist.show()
f = 'Head -> '+str(a[0])+' -> '+str(a[1])+' -> '+str(a[2])+' -> None'
d = 'Head -> '+str(a[2])+' -> '+str(a[0])+' -> None'
print('===========================================================')
table = [ [] for _ in range(10)]
def hash(x):
  return x % 10
def insert(table,key,value):
  table[hash(key)].append(value)
insert(table,8,f)
insert(table,4,4)
insert(table,3,3)
insert(table,4,14)
insert(table,3,21)
insert(table,3,23)
insert(table,9,9)
insert(table,12,d)
print (table)

ALGORITMA ORDER LIST

# Bisa menggunakan trinket untuk melihat hasilnya

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 search(self,item):
        current = self.head
        found = False
        stop = False
        while current != None and not found and not stop:
            if current.getData() == item:
                found = True
            else:
                if current.getData() > item:
                    stop = True
                else:
                    current = current.getNext()

        return found

    def add(self,item):
        current = self.head
        previous = None
        stop = False
        while current != None and not stop:
            if current.getData() > item:
                stop = True
            else:
                previous = current
                current = current.getNext()

        temp = Node(item)
        if previous == None:
            temp.setNext(self.head)
            self.head = temp
        else:
            temp.setNext(current)
            previous.setNext(temp)

    def isEmpty(self):
        return self.head == None

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

        return count
    def remove(self,item):
      current = self.head
      previous = None
      found = False
      while not found and current != None:
          if current.getData() == item:
              found = True
          else:
              previous = current
              current = current.getNext()
  
      if previous == None:
          self.head = current.getNext()
      else:
        if current != None:
          previous.setNext(current.getNext())
      if current is None:
        print("Data Tidak Ada DIdalam List")
    def show(self):
        current = self.head
        print'Head->',
        while current != None:
            print current.getData(), "->",
            current= current.getNext()
        print None

mylist = OrderedList()

mylist.add(21)
mylist.add(77)
mylist.add(27)
mylist.add(83)
mylist.show()

mylist.remove(21)
mylist.show()
mylist.remove(20)
mylist.show()
mylist.remove(27)
mylist.show()
mylist.remove(83)
mylist.show()


ALGORITMA UNORDERLIST

# Bisa menggunakan trinket untuk melihat hasilnya

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 UnorderedList:

    def __init__(self):
        self.head = None
    
    def show(self):
        current = self.head
        print 'Head ->', 
        while current != None:
            print current.getData(), " -> ",
            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 = count + 1
            current = current.getNext()

        return count
    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
                print('Data di dalam list broooo')
            else:
                current = current.getNext()

        return found    
    def remove(self,item):
        current = self.head
        previous = None
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
                
        if previous == None:
            self.head = current.getNext()
        else:
            if current != None:
                previous.setNext(current.getNext())
        if current is None:
            print("Tidak ada data")


            
mylist = UnorderedList()
mylist.add(33)
mylist.add(28)
mylist.add(17)
mylist.add(69)

mylist.remove(69)
mylist.show()
mylist.remove(10)
mylist.show()
mylist.remove(17)
mylist.show()
mylist.remove(28)
mylist.show()
mylist.remove(99)
mylist.show()

GRAPH
Grafik adalah jaringan yang terdiri dari node yang dihubungkan oleh tepi atau busur. Dalam grafik terarah, hubungan antara node memiliki arah, dan disebut busur; Dalam grafik yang tidak berarah, koneksi tidak memiliki arah dan disebut tepi. Kami terutama membahas grafik terarah. Algoritma dalam grafik termasuk menemukan jalur antara dua simpul, menemukan jalur terpendek antara dua simpul, menentukan siklus dalam grafik (sebuah siklus adalah jalur yang tidak kosong dari simpul ke simpul itu sendiri), menemukan jalur yang mencapai semua simpul (yang terkenal "Masalah salesman traveling"), dan seterusnya. Terkadang simpul atau lengkungan grafik memiliki bobot atau biaya yang terkait dengannya, dan kami tertarik untuk menemukan jalur yang paling murah.
Litelatur

Kode
graph = {'A': ['B', 'C','D'],
             'B': ['A','E', 'D'],
             'C': ['A','D','E'],
             'D': ['A','B','C','E'],
             'E': ['B','C','D']}
def find_all_shortest(data):
    path = []
    minSize=3
    for i in range(len(data)):
        if len(data[i])<minSize:
            minSize = len(data[i])
    listterpendek=[]
    for i in range(len(data)):
        if len(data[i])==minSize:
            listterpendek.append(data[i])
            print(str(data[i])+str(minSize-1)+" titik yang dikunjungi")
def find_all_longest(data):
    path = []
    minSize=3
    for i in range(len(data)):
        if len(data[i])<minSize:
            minSize = len(data[i])-1
    listterpendek=[]
    for i in range(len(data)):
        if len(data[i])-1==minSize:
            listterpendek.append(data[i])
            print(data[i],minSize," titik yang dikunjungi")
def find_all_paths(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return [path]
        paths = []
        for node in graph[start]:
            if node not in path:
                newpaths = find_all_paths(graph, node, end, path)
                for newpath in newpaths:
                    paths.append(newpath)
        return paths
       
data =find_all_paths(graph,'A','E')
print("==============terpendek=============")
print(find_all_shortest(data))
print("=========terpanjang=============")
print(find_all_longest(data))

ALGORITMA 2

graph = {'A': ['B', 'C','D'],
         'B': ['C', 'D'],
         'C': ['D','E'],
         'D': ['C'],
         'E': ['F'],
         'F': ['D']}
print('from', '\tto')
for i in graph:
  print (i, graph[i], sep='\t')

def find_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if not start in graph:
            return None
        for node in graph[start]:
            if node not in path:
                print(start, end, node, path, sep='\t')
                newpath = find_path(graph, node, end, path)
                if newpath:
                  return newpath
        return None

print(''); print ('start', 'end', 'node', 'path', sep='\t')
print('path : ', find_path(graph, 'A', 'D')); print('')

def find_all_paths(graph, start, end, path=[]):
    path = path + [start]
    if start == end:
        return [path]
    if not start in graph:
        return []
    paths = []
    for node in graph[start]:
        if node not in path:
            print(start, end, node, path, sep='\t')
            newpaths = find_all_paths(graph, node, end, path)
            if node == end:
              print(newpaths[0])
            for newpath in newpaths:
                paths.append(newpath)
    return paths
print(''); print ('start', 'end', 'node', 'path', sep='\t')
print('all path : ', find_all_paths(graph, 'A', 'D')); print('')

def find_shortest_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if not start in graph:
            return None
        shortest = None
        for node in graph[start]:
            if node not in path:
                print(start, end, node, path, shortest, sep='\t')
                newpath = find_shortest_path(graph, node, end, path)
                if node == end:
                  print(newpath)
                if newpath:
                    if not shortest or len(newpath) < len(shortest):
                        shortest = newpath
        return shortest
print(''); print ('start', 'end', 'node', 'path', '\tshortest', sep='\t')
print('shortest : ', find_shortest_path(graph, 'A', 'D'))

Komentar

Postingan populer dari blog ini