Senin, 24 Oktober 2016

Notasi Asimptotik

04.48 Posted by Tryan Gilang 1 comment
Ketika menghitung kompleksitas sebuah algoritma, kita dapat mengabaikan koefisien dari operasi yang tidak terlalu signifikan dan fokus kepada bagian penting dari waktu yang digunakan algoritma yaitu  pertumbuhan waktu — tanpa perlu menambah kerumitan dalam penghitungan kompleksitas algoritma tersebut. Ketika kita mengabaikan koefisien konstanta, kita dapat menggunakan notasi asimptotik. Kali ini akan dibahas tiga jenis bentuk notasi yaitu, big-
\Theta notation, big-O notation, dan big-\Omega notation.

Bubble Sort

PROSEDUR bubblesort(input a1,a2,...,an: integer)
KAMUS 
    i, j, x: integer;
ALGORITMA
    for i ← 1 to n-1 do
        for j ← n-1 downto i do
            if a[j-1] > a[j] then
                x ← a[j-1]
                a[j-1] ← a[j]
                a[j] ← x
        endfor
    endfor


Operasi DasarCn
Best CaseWorst Case
3 + n23n2
Tmin = 3 + n2
Ω(n2)
Tmax = 3n2
O(n2)
Tavg = 3n2
Θ(n2)

Selection Sort

PROSEDUR selectionsort(input a1,a2,...,an: integer)
KAMUS 
    i, j, k, x: integer
ALGORITMA
    for i ← 0 TO n-2 do
        k ← i
        x ← a[i]

        for j ← i+1 to n-1 do
        if a[j] < x then
            k ← j
            x ← a[k] 
        endfor

        a[k] ← a[i]
        a[i] ← x
    endfor



Operasi DasarCn
Best CaseWorst Case
2n + n22n + 2n2


Tmin = 2n + n2
Ω(n)
Tmax = 2n + 2n2
O(n2)
Tavg = 2n + n2
Θ(n2)

Quick Sort

PROSEDUR quicksort(input a1,a2,...,an: integer, L: integer, R: integer)
KAMUS
    i, j: integer; w, x: Item
ALGORITMA
    i ← L; 
    j ← R;
    x ← a[(L+R) / 2];

    repeat
    while a[i] < x do 
        while x < a[j]
            if i <= j then
                w ← a[i]
                a[i] ← a[j]
                a[j] ← w
                i    ← i+1
                j    ← j-1
            endif

            j ← j + 1
        endwhile

        i ← i + 1
    until i > j

    if L < j then 
        quicksort(a, L, j)
    if i < R then 
        quicksort(a, i, R)

Operasi DasarCn
Best CaseWorst Case
<=n log nn2

Tmin = n log n
Ω(n log n)
Tmax = n2
O(n2)
Tavg = n log n
Θ(n log n)

Binary Search

PROCEDURE BinarySearch(input a1,a2,...,an: integer, x : integer, output idx : integer)

KAMUS
   i, j, mid : integer
   ketemu : boolean

ALGORITMA
   i ← 1
   j ← n
   ketemu ← false

    while (not ketemu) and ( i <= j) do 
        mid ← (i+j) div 2   
        
        if amid = x then 
            ketemu ← true
        else
            if amid < x then
                i←mid + 1
            else
                j←mid - 1;
            endif
        endif
    endwhile 
   
    if ketemu then
        idx←mid
    else
        idx←0 
    endif


Operasi DasarCn
Best CaseWorst Case
1log n

Tmin = 1
Ω(1)
Tmax = log n
O(log n)
Tavg = log n
Θ(log n)

Menampilkan Bilangan Prima

PROCEDURE tampil_prima(input min, max : integer)

ALGORITMA
    for min to n do
        if (min > 1 and (min <= 3 or (min%2 != 0 and min%3 != 0)))
            print(min)
        endif
    endfor



Operasi DasarCn
Best CaseWorst Case
print0n

Tmin = 0
Ω(0)
Tmax = n
O(n)
Tavg = n
Θ(n)

Minggu, 16 Oktober 2016

Kompleksitas Algoritma II

23.27 Posted by Tryan Gilang No comments

Bubble Sort

Algoritma ini merupakan algoritma pencarian, dimulai dengan memindai sebuah item pada larik satu per satu, lalu membandingkannya dengan setiap item lainnya. Proses akan berhenti atau berlanjut ke item selanjutnya jika kedua nilai item tidak sesuai urutan sehingga perlu ditukarkan nilainya.
PROSEDUR bubblesort(input a1,a2,...,an: integer)
KAMUS 
    i, j, x: integer;
ALGORITMA
    for i ← 1 to n-1 do
        for j ← n-1 downto i do
            if a[j-1] > a[j] then
                x ← a[j-1]
                a[j-1] ← a[j]
                a[j] ← x
        endfor
    endfor


Operasi Dasar Cn
Best Case Worst Case
> n2 n2


Tmin = n2
Tmax = n2
Tavg = n2



Selection Sort

Metode ini membagi larik masukan ke dalam dua bagian: sublist item sudah diurutkan, yang dibangun dari kiri ke kanan di depan (kiri) dari daftar, dan sublist dari item yang tersisa akan diurutkan yang menempati sisa daftar. Awalnya, sublist diurutkan kosong dan sublist disortir adalah seluruh daftar masukan. Prosesnya adalah dengan menemukan nilai terkecil (atau terbesar, tergantung pada pemilahan order) elemen dalam sublist disortir, bertukar (swapping) dengan elemen disortir paling kiri (memasukkannya dalam rangka urutan), dan memindahkan batas sublist satu unsur ke kanan.
PROSEDUR selectionsort(input a1,a2,...,an: integer)
KAMUS 
    i, j, k, x: integer
ALGORITMA
    for i ← 0 TO n-2 do
        k ← i
        x ← a[i]

        for j ← i+1 to n-1 do
        if a[j] < x then
            k ← j
            x ← a[k] 
        endfor

        a[k] ← a[i]
        a[i] ← x
    endfor



Operasi Dasar Cn
Best Case Worst Case
< n2 n2


Tmin = n2
Tmax = n2
Tavg = n2

Quick Sort

Quicksort didasari pemikiran bahwa pertukaran nilai sebaiknya dilakukan dengan jarak yang besar agar efektif. Asumsikan bahwa item dengan jumlah n diberikan dalam urutan terbalik dari kunci mereka. Hal ini memungkinkan untuk mengurutkan item-item dengan hanya melakukan n / 2 pertukaran, pertama mengambil paling kiri dan paling kanan dan secara bertahap maju dari dua sisi. Secara normal, hal ini hanya mungkin jika urutannya terbalik. 
PROSEDUR quicksort(input a1,a2,...,an: integer, L: integer, R: integer)
KAMUS
    i, j: integer; w, x: Item
ALGORITMA
    i ← L; 
    j ← R;
    x ← a[(L+R) / 2];

    repeat
    while a[i] < x do 
        while x < a[j]
            if i <= j then
                w ← a[i]
                a[i] ← a[j]
                a[j] ← w
                i    ← i+1
                j    ← j-1
            endif

            j ← j + 1
        endwhile

        i ← i + 1
    until i > j

    if L < j then 
        quicksort(a, L, j)
    if i < R then 
        quicksort(a, i, R)
Bedasarkan algoritma diatas, kompleksitas algortima dapat dihitung sebagai berikut.

Operasi Dasar Cn
Best Case Worst Case
<= n log n n2


Tmin = n log n
Tmax = n2
Tavg = n log n

Binary Search

Pencarian biner (binary search atau half-interval search) adalah algoritma yang melakukan pencarian terhadap data yang telah diurutkan terlebih dahulu. Algoritma pencarian biner dimulai dengan membandingkan nilai yang dicari dengan nilai elemen tengah dari larik diurutkan. Jika nilai target sama dengan nilai elemen tengah, maka posisi diberikan dan pencarian selesai. Jika nilai target kurang dari nilai elemen tengah, maka pencarian terus di bagian bawah dari larik; atau jika nilai target lebih besar dari nilai elemen tengah, maka pencarian terus di bagian atas dari larik. Proses ini terus berlanjut, menghilangkan setengah dari elemen-elemen pada larik, dan membandingkan nilai target untuk nilai elemen tengah elemen yang tersisa - sampai nilai target baik ditemukan (dan posisi elemen yang terkait dikembalikan), atau sampai seluruh elemen yang dimiliki telah dipindai dan tidak ditemukan.

PROCEDURE BinarySearch(input a1,a2,...,an: integer, x : integer, output idx : integer)

KAMUS
   i, j, mid : integer
   ketemu : boolean

ALGORITMA
   i ← 1
   j ← n
   ketemu ← false

    while (not ketemu) and ( i <= j) do 
        mid ← (i+j) div 2   
        
        if amid = x then 
            ketemu ← true
        else
            if amid < x then
                i←mid + 1
            else
                j←mid - 1;
            endif
        endif
    endwhile 
   
    if ketemu then
        idx←mid
    else
        idx←0 
    endif


Operasi Dasar Cn
Best Case Worst Case
1 log n


Tmin = 1
Tmax = log n
Tavg = log n  

Menampilkan Bilangan Prima

PROCEDURE tampil_prima(input min, max : integer)

ALGORITMA
    for min to n do
        if (min > 1 and (min <= 3 or (min%2 != 0 and min%3 != 0)))
            print(min)
        endif
    endfor



Operasi Dasar Cn
Best Case Worst Case
print 0n


Tmin = 0
Tmax = n
Tavg = n

Minggu, 09 Oktober 2016

Kompleksitas Algoritma

04.35 Posted by Unknown No comments

#Pencarian Nilai Faktorial

Algoritma ini berfungsi untuk mencari nilai faktorial dari sebuah bilangan.


procedure proses_faktorial(n:input, hsl:output);
 
Deklarasi:
 i:integer
Algoritma:
    input(n)
    hsl ← 1;

    for i ← 1 to n do
        hsl ← hsl * i
    endfor

    output(hsl)

Berikut system operasi dasar dalam algoritma tersebut:


operasi dasar       Cn     Cop
input                1      h
←                1+2n+1     i 
*                   n       j
output              1       k

T(n) = h + (1+2n+1)i + nj + k

Program pembuatan dalam metode Pascal



program Hitung_Faktorial;
{Program untuk menghitung faktorial suatu bilangan.
 masukan : nilai yang akan dicari faktorialnya.
 keluaran : nilai faktorial
 }

 var
  bilangan, hasil : integer;

 procedure isi_n(var n:integer);

 
 begin
  write ('Masukan Nilai Dibawah 10 : ');
  readln(n);
end;

 procedure proses_faktorial(var n, hsl: integer);
var i:integer;

 begin
  hsl := 1;
  for i := 1 to n do
  hsl := hsl * i;
  end;
procedure tampil_faktorial(n, hsl:integer);

 begin
  writeln('Hasil Faktorial dari ',n,' adalah ', hsl);
  end;
begin
  hasil :=1;

   isi_n(bilangan);

   if bilangan <= 10 then

   begin
    proses_faktorial(bilangan, hasil);
    tampil_faktorial(bilangan, hasil);

     end
    else
    writeln('Bilangan tidak bisa lebih dari 10');

     Readln;

 end.  

#Mencari Nilai Terbesar

Algoritma ini dimaksudkan untuk mencari nilai terbesar dari suatu set data yang diurutkan. Pencarian dilakukan dengan cara membandingkan setiap nilai pada data yang diinputkan dengan nilai maksimum yang didapat sebelumnya, dimana nilai maksimum diinisialisasi dengan nilai pertama dari data yang diinputkan. Berikut algoritma untuk mencari nilai terbesar: 

Procedure NilaiMaximum(data[0..n]:input)
Deklarasi:
    max:integer
    i:integer
Algoritma:
    max ← data[0]

    foreach item in data:
        if item > max then
            max ← item

    output(max)


Dari algoritma diatas, didapat operasi dasar sebagai berikut, dimana n adalah jumlah data yang diinputkan:

Operasi Dasar Cop Cn
Min Max
x x x + nx
< y ny ny
output
z z z

Maka didapatkan:


Kasus terbaik
Tmin(n) = x + ny + z
Kasus terburuk
Tmax(n) = x + nx + ny + z

#Mencari Luas Balok

Procedure luasBalok(p, l, t : real ; var hl : real)

Deklarasi:  
    p, l, t, hl : real

Algoritma:

   hl ← 2*(p+l+t)


Operasi DasarCopCn
xx
+y2y
*zz

Maka didapatkan:


T(n) = x + 2y + z



#Konversi Suhu

Dibawah ini adalah salah satu contoh algortima konversi suhu dari 3 satuan yang berbeda yaitu Fahrenheit, Celcius dan Reamur.



Procedure Fahrenheit_celcius

Deklarasi

Algoritma
 Input(f)
 c←5/9*(f-32)
 output(c)
end

Procedure Fahrenheit_reamur

Deklarasi

Algoritma
 Input(f)
 r←4/9*(f-32)
 output(r)
end

Procedure celcius_fahrenheit

Deklarasi

Algoritma
 Input(c)
 f←(9/5)*c+32
 output(f)
end

Procedure celcius_reamur

Deklarasi

Algoritma
 Input(c)
 r←(4/5)*c
 output(r)
end

Procedure reamur_fahrenheit

Deklarasi

Algoritma
 Input(r)
 f←(9/4)*r+32
 output(f)
end

Procedure reamur_celcius

Deklarasi

Algoritma
 Input(r)
 c←(5/4)*r
 output(c)
end

Program Konversi_Suhu

Deklarasi
 r, f, c  : real
 pilih, apa : char
 
algoritma
 repeat
 input(pilih)
 
  case pilih of
   '1' = fahrenheit_celcius
   '2' = fahrenheit_reamur
   '3' = celcius_fahrenheit
   '4' = celcius_reamur
   '5' = reamur_fahrenheit
   '6' = reamur_celcius
  else
   output('Nomor yang anda masukkan salah')
  endcase
 
 input ('Mau coba lagi (Y/T) : ') read(apa)
 until apa = 'Y'
 end repeat
end

Operasi Dasar
Cn
Cop
Input
2n+8
a
/
6
b
*
6
c
6
d
Output
n+7
e
+
2
f
-
2
g
Tn = Cn*Cop
Tn= (2n+8)a+6b+6c+6d+(n+7)e+2f+2g


#Deret Fibonacci

Dalam matematika, bilangan Fibonacci adalah barisan yang didefinisikan secara rekursif. Barisan ini berawal dari 0 dan 1, kemudian angka berikutnya didapat dengan cara menambahkan kedua bilangan yang berurutan sebelumnya. Berikut pseudocode dari algoritma deret bilangan fibonacci.


Procedure fibonacci(input jml : integer)

Deklarasi
    range :integer
    current :integer
    tmp :integer
    i :integer
 
Algoritma
    range ← 0
    current ← 1
    tmp ← 0

    print(range)
    print(current)

    for (i ← 2; i < jml; i++)
        tmp ← current
        current ← current + range
        range ← tmp

        print(current)
    endfor

Bedasarkan algoritma diatas, kompleksitas algortima dapat dihitung sebagai berikut. 

Operasi Dasar
Cn
Cop
3(n-2)+4 = 3n-2
A
< 
(n-2)+1 = n-1
B
+
2(n-2) = 2n-4
C
print
(n-2)+2 = n
D
Tn = Cn*Cop
Tn= A(3n-2) + B(n-1) + C(2n-4) + Dn



Referensi :
Munir, Rinaldi, 2005, Algoritma dan Pemrograman dalambahasa Pascal dan C, Penerbit Informatika Bandung


Senin, 03 Oktober 2016

Geometric Problem

03.22 Posted by Ramdhan my No comments
Algoritma geometri berurusan dengan objek-objek geometri, seperti titik, garis, dan poligon. Orang-orang yunani jaman dahulu sangat tertarik untuk menyelesaikan bermacam masalah geometri. Lalu untuk jaman kita yang sekarang, algoritma geometri biasa digunakan untuk menyelesaikan masalah-masalah seperti komputer grafik, robotik, dan tomography.

Contoh Kasus

Closest-pair

Masalah closest-pair adalah mencari dua titik yang paling dekat dari sekumpulan n titik. Ini adalah hal paling sederhaman dari bermacam permasalahan dalam komputasi geometri. Titik dalam hal ini bisa digambarkan sebagai objek fisik seperti pesawat, pengantar surat, sampel statistik dan lainnya. Sebagai contoh untuk implementasinya, Penyedia layanan antar surat membutuhkannya untuk mencari kandidat pengantar surat terdekat.

Convex Hull


Convex Hull merupakan persoalan klasik dalam komputasi geometri. Persoalannya digambarkan secara sederhana dalam ruang dimensi dua (bidang) sebagai mencari subset dari himpunan titik pada bidang tersebut sedemikian rupa sehingga jika titik-titik tersebut dijadikan poligon maka akan membentuk poligon yang konveks. Suatu poligon dikatakan konveks jika digambarkan garis yang menghubungkan antar titik maka tidak ada garis yang memotong garis yang menjadi batas luar poligon. Definisi lain dari convex hull adalah poligon yang disusun dari subset titik sedemikian sehingga tidak ada titik dari himpunan awal yang berada di luar poligon tersebut (semua titik berada di batas luar atau di dalam area yang dilingkupi oleh poligon tersebut).

Petunjuk untuk menyelesaikan persoalan ini adalah persamaan garis pada bidang. Persamaan garis pada bidang memisahkan bidang menjadi dua bagian yaitu area di sebelah kanan bidang (relatif terhadap orientasi garis). Sebagai contoh garis berorientasi adalah sumbu koordinat. Misalkan saja sumbu vertikal (ordinat, arah orientasi ke atas), seluruh titik di sebelah kanan garis ini memiliki nilai komponen koordinat horizontal (X) yang positif sedangkan seluruh titik di sebelah kiri garis memiliki nilai komponen koordinat horizontal negatif.

Petunjuk di atas dimanfaatkan dengan membuat definisi bahwa garis yang dibentuk oleh titik-titik poligon jika diasumsikan memiliki orientasi yang sama, maka setiap titik berada di sebelah kanan seluruh garis batas tersebut. Definisi ini kemudian dimanfaatkan untuk menentukan aksi awal yaitu memilih titik yang berada paling luar pertama. Mencari titik pertama cukup mudah yaitu cukup memilih titik yang memiliki nilai komponen koordinat (horizontal atau vertikal) yang ekstrim (minimum atau maksimum). Titik-titik convex hull lainnya ditentukan berdasarkan titik pertama tadi.

Sumber:
Levithin, Anany. 2007. Introduction to The Design And Analysis of Algorithms.
https://en.wikipedia.org/wiki/Computational_geometry

Selanjutnya - Numerical Problem >

Graph Problems

03.20 Posted by Ramdhan my No comments

Definisi

Graph adalah sebuah notasi abstrak yang terdiri dari kumpulan titik-titik (vertices / nodes / points) beserta garis-garis (edges/arcs/lines) yang saling terhubung, dimana satu buah garis menghubungkan dua buah titik. Susunan sebuah graph adalah titik-titiknya, dan ukurannya adalah jumlah garisnya.

Biasanya sebuah graph digunakan untuk menggambarkan hubungan antara objek-objek.  Banyak permasalahan yang bisa digambarkan dengan graph, seperti komunikasi jaringan, pengorganisasian data, hubungan sosial dan lain sebagainya.

Permasalahan dalam Graph

Graph Traversal

Dikenal juga sebagai graph search, adalah sebuah proses pengunjungan (pengecekan/perubahan) setiap titik pada sebuah graph. Adapun beberapa algoritma untuk graph traversal :
  •         Depth-first search (DFS) - DFS dikhususkan untuk graph yang terbatas. DFS mengunjungi turunan dari sebuah titik terlebih dahulu daripada titik yang bersebelahan (ada pada level yang sama).
  •         Breadth-first search (BFS) - BFS adalah teknik lain untuk melakukan traversing pada graph yang terbatas. Berbeda dengan DFS, BFS mengunjungi semua titik yang ada pada level sama terlebih dahulu sebelum mengunjungi titik turunannya.

Graph Coloring

Graph

Graph Coloring adalah sebuah metode untuk menetapkan warna pada titik dari sebuah graph sehingga tidak ada dua titik yang berdekatan memiliki warna yang sama. Adapun beberapa permasalahan dalam graph coloring sebagai berikut :
  •  Vertex Coloring - Mewarnai titik pada sebuah graph agar tidak ada dua titik berdekatan (terhubung dengan garis yang sama) yang memiliki warna sama.
  •  Edge Coloring - Mewarnai garis pada sebuah graph agar tidak ada dua garis berdekatan (terhubung dengan titik yang sama) yang memiliki warna sama.
  •  Face Coloring - Mewarnai pada setiap face (wilayah pada planar graph) agar tidak ada dua face berdekatan (berbagi titik / garis yang sama) memiliki warna yang sama.



Sumber :

Combinatorial Problem

03.04 Posted by Tryan Gilang No comments
Combinatorial problems adalah jenis permasalahan yang berhubungan dengan objek-objek dengan jumlah yang terbatas. "Combinatorial" mengacu pada penyusunan item-item. Combinatorial problems, merupakan permasalahan yang paling sulit diselesaikan baik secara teori maupun dalam prakteknya. Salah satu contoh permasalahan kombinatorial yang cukup terkenal adalah Traveling Salesman Problem atau disingkat TSP dan Knapsack Problem.

Traveling Salesman Problem

Traveling Salesman Problem atau TSP adalah permasalahan yang cukup terkenal di bidang sains komputer. Skenario dari permasalahan ini adalah ketika seorang penjual keliling (salesman) yang berdagang harus menghampiri setiap lokasi yang ada sebanyak satu kali setiap lokasi dan kembali ke lokasi awal. Penjual haris menentukan rute mana yang paling efektif  untuk setiap lokasi yang didatangi dan kembali. Semakin pendek rute yang ditempuh tentu semakin baik. Untuk menemukan rute terpendek dari sejumlah lokasi merupakan permasalahan eksponensial yang rumit, menentukan rute terpendek dari 20 lokasi lebih dari 2x lipat lebih sulit dari 10 lokasi.
Rute terpendek sudah pasti dapat ditemukan dengan menggunakan metode brute-force atau exhaustive search, yaitu dengan mencoba setiap kemungkinan rute yang ada lalu mengukur total jarak dan membandingkan dengan jarak terpendek yang ditemukan sebelumnya. Metode brute-force memiliki kelemahan yaitu memerlukan waktu dan proses komputasi yang tidak efektif atau lambat bahkan untuk jumlah lokasi yang relatif sedikit karena memiliki kompleksitas O(n!). Sebagai contoh, untuk 7 titik lokasi dimana satu lokasi merupakan tempat awal, maka diperlukan 7! = 5040 proses evaluasi.


https://upload.wikimedia.org/wikipedia/commons/2/2b/Bruteforce.gif
Metode brute-force dalam mencari jarak terpendek

Knapsack Problem

Permasalahan lain yang cukup dikenal dan termasuk combinatorial  problem adalah knapsack problem atau rucksack problem. Terdapat sejumlah barang masing-masing dengan berat dan nilainya, dimasukan ke sebuah ransel yang memiliki kapasitas berat maksimum. Maka perlu dicari barang apa saja yang dapat dimasukan ke dalam ransel sehingga barang yang dibawa memiliki total nilai tertinggi tanpa melebihi kapasitas ransel.
http://www.cs.rpi.edu/academics/courses/spring12/proglang/pa3/knapsack_problem.png
Knapsack problem

Aplikasi

Berikut beberapa contoh pengaplikasian dari optimasi combinatorial optimization :
  • Menentukan rute optimal untuk mengantarkan paket ke beberapa tempat.
  • Menentukan armada taksi mana yang terdekat untuk menjemput penumpang.
  • Mengembangkan jaringan atau jalur-jalur penerbangan penerbangan.
  • Vehicle Routing.