Ads

Welcome to My Blog

Semoga Artikel ini bermanfaat bagi para viewers :)

Welcome to My Blog

Semoga Artikel ini bermanfaat bagi para viewers :)

Welcome to My Blog

Semoga Artikel ini bermanfaat bagi para viewers :)

Welcome to My Blog

Semoga Artikel ini bermanfaat bagi para viewers :)

Welcome to My Blog

Semoga Artikel ini bermanfaat bagi para viewers :)

Showing posts with label Universitas. Show all posts
Showing posts with label Universitas. Show all posts

Sunday 8 November 2015

Contoh Program Java Netbeans Inheritance dengan Perulangan

Contoh Program Java Inheritance(Pewarisan) dengan perulangan


package tugas_tambahan;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TUGAS_TAMBAHAN {

    public static void main(String[] args) {
   
        String [] menumakan = {"Ayam Goreng","Ayam Bakar","Ikan Goreng","Ikan Bakar","Bebek Goreng","Bebek Bakar"};
        String [] menuminum = {"Jus Melon","Jus Semangka","Jus Alpukat","Es Teh","Es Jeruk","Air Mineral"};
        double [] hargamakan = {15000,16000,12000,14000,20000,22000};
        double [] hargaminum = {10000,12000,15000,4000,6000,3000};
        String [] pesenmakan = new String[20];
        String [] pesenminum = new String[20];
        double [] hrgmkn = new double[20];
        double [] hrgmnm = new double[20];
        double [] jml = new double[20];
        double [] jml1 = new double[20];
        double disk=0,pemb,totalmakan = 0,totalminum = 0,total= 0,bayar=0,pot1=0,pot2=0,pot=0,pot3=0;
        String inp;
        int pilihmenu,pilih,ya,i,j=0,n=0;
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        try {
            do{
                System.out.println("\t\t\tMENU MAKAN DAN MINUM DI 1RESTORAN CEPAT SAJI");
                System.out.println("==============================");
                System.out.println("1. MAKANAN");
                System.out.println("2. MINUMAN");
                System.out.println("0. KELUAR");
                System.out.println("==============================");
                System.out.print("Masukkan pilihan anda : ");
                pilihmenu = Integer.parseInt(inp=input.readLine());
                switch (pilihmenu){
                    case 1:
                        do {
                            System.out.println("MAKANAN");
                            System.out.println("================================");
                            for (i=0;i<menumakan.length;i++){
                                System.out.println(i+". "+menumakan[i]+"\tRp. "+hargamakan[i]);
                            }
                            System.out.println("================================");
                            System.out.print("Masukkan Pilihan Menu : ");
                            pilih=Integer.parseInt(inp=input.readLine());
                            System.out.print("Masukkan Jumlah Pembelian : ");
                            jml[n]=pemb=Double.parseDouble(inp=input.readLine());
                            totalmakan = totalmakan+(hargamakan[pilih]*jml[n]);
                            pot1= pot1+jml[n];
                            pesenmakan[n]=menumakan[pilih];
                            hrgmkn[n]=hargamakan[pilih];
                            System.out.print("Apakah Anda Mau Pesan Lagi 1.Ya/0.Tidak :");
                            ya=Integer.parseInt(inp=input.readLine());
                            n++;
                        } while (ya !=0);
                    break;
                    case 2:
                        do {
                            System.out.println("MINUMAN");
                            System.out.println("========");
                            for (i=0;i<menuminum.length;i++){
                                System.out.println(i+". "+menuminum[i]+"\tRp. "+hargaminum[i]);
                            }
                            System.out.println("================================");
                            System.out.print("Masukkan Pilihan Menu : ");
                            pilih=Integer.parseInt(inp=input.readLine());
                            System.out.print("Masukkan Jumlah Pembelian : ");
                            jml1[j]=pemb=Double.parseDouble(inp=input.readLine());
                            totalminum = totalminum+(hargaminum[pilih]*jml1[j]);
                            pot2 = pot2+jml1[j];
                            pesenminum[j]=menuminum[pilih];
                            hrgmnm[j]=hargaminum[pilih];
                            System.out.print("Apakah Mau Pesan Lagi 1.Ya/0.Tidak : ");
                            ya=Integer.parseInt(inp=input.readLine());
                            j++;
                        } while (ya !=0);
                    break;
                    }
            }while (pilihmenu !=0);
        } catch (Exception e) {
        }
        total = totalmakan+totalminum;
        pot = pot1+pot2;
        if(total >=200000){
            disk = (total*25)/100;
            bayar = total-disk;
        }else if ((total>=150000)&&(total<200000)){
            disk = (total*15)/100;
            bayar = total -disk;
        }else if ((total>=50000)&&(total<150000)){
            disk = (total*5)/100;
            bayar = total - disk;
        }
        if (pot >=7){
            pot3=20000;
            bayar = bayar -pot3;
        }else if ((pot>=4)&&(pot<7)){
            pot3=10000;
            bayar = bayar -pot3;
        }
        System.out.println("PEMESANAN ANDA");
        if (n>0){
            System.out.println("===========");
            for (i=0;i<n;i++){
            System.out.println((i+1)+". "+pesenmakan[i]+"\tJmlah = "+jml[i]+"\tRp. "+hrgmkn[i]);
            }
            System.out.println("===============================");
            System.out.println("TOTAL             = "+totalmakan);
        }
        System.out.println("\n");
        if (j>0){
            System.out.println("===============================");
            for (i=0;i<j;i++){
                System.out.println((i+1)+". "+pesenminum[i]+"\tJumlah = "+jml1[i]+"\tRp. "+hrgmnm[i]);
            }
            System.out.println("===============================");
            System.out.println("TOTAL            = "+totalminum);
        }
        System.out.println("====================================");
        System.out.println("JUMLAH PEMBELIAN             = "+total);
        System.out.println("DISKON                       = "+disk);
        System.out.println("POTONGAN                     = "+pot3);
        System.out.println("====================================");
        System.out.println("TOTAL YANG HARUS DI BAYAR   = "+bayar);
    }
}
 
   

Saturday 30 May 2015

Materi Sistem Informasi doc

Misi gan disini saya mau nge share materi tentang sistem pakar lengkap dengan file doc..
Materi ini sebenarnta bentuk tugas suruhan dosen gua hehe.. Siapa tau kalian juga punya tugas yang sama.. File saya telah rapi dan lengkap loh. Jadi, kalian tinggal ganti nama doang trus kumpul deh ahha


Silahkan klik link di bawah ini untuk donlot filenya :
http://bit.ly/1FfSKB9

Semoga Bermanfaat bagi yang membutuhkan :)

Aturan Trapesium Metode Numerik II doc

Halo gan disini saya pengen nge share materi aturan trapesium pada mata kuliah metode numerik punya saya haha. siapa tau ada yang punya tugas yang sama haha..
Saya juga udah atur rapi loh.. tinggal tulis nama doang hehe





Silahkan klik link di bawah ini untuk donlot file doc nya :

http://bit.ly/METNUMII
http://bit.ly/1dCYxuZ
http://bit.ly/1dCYxuZ
http://bit.ly/1dCYxuZ

Thursday 28 May 2015

Belajar dengan program C#

Ini adalah contoh Source Code untuk menampilkan tanggal,bulan,tahun,jam,menit, dan detik beserta penjelasannya dengan C#

using System;// import library ,untuk mengimport class yang sudah disediakan oleh c#

namespaceAnshar// penamaan program
{
publicclassTime// public untuk mengakses class, time adalah nama class
    {
int tahun, bulan, tanggal, jam, menit, detik;// pendeklarasian nama variabel dan int adalah tipe data integer
publicvoid Displaycurrentime()//public void adalah prosedur yang tidak bisa mengembalikan nilai
        {
Console.WriteLine("SEKARANG TANGGAL " + tanggal + " BULAN " + bulan + " TAHUN " + tahun + " jam " + gethour() + " : " + menit + " : " + detik);// console.writeline untuk mencetak hasil proses dan line itu untuk enter
        }
publicint gethour()// public int berarti fungsi integerdan gethour() itu menunjukan jika itu adalah fungsi
        {
return jam;//jam itu untuk mengembalikan nilai ke fungsi gethour()
        }
publicvoid gettime(refint h, refint m, refint s)// ref mengembalikan output ke class lain/method lain
        {
            h = gethour();
            m = menit;
            s = detik;
// pemberian nilai pada variable nilai
        }
public Time(System.DateTime dt)// parameter DateTime adalah constructor dan dt adalah variabelnya
        {
            tahun = dt.Year;
            bulan = dt.Month;
            tanggal = dt.Day;
            jam = dt.Hour;
            menit = dt.Minute;
            detik = dt.Second;// tahun,bulan,tanggal,jam,menit,dad detik itu untuk menentukan nilai yg sedang berlangsung seperti year, month dan seterusnya
        }
    }
classansharkeren// class dengan nama class “ansharkeren”
    {
staticvoid Main(string[] args)// indeks program
        {
DateTime currentime = System.DateTime.Now;// memanggil waktu yang sedang berjalan dengan nama variabel “currentime”
Time a = newTime(currentime);// objek ‘a’ bertipe class time dengan memanggil constructor dengan parameter “currentime”
            a.Displaycurrentime();//pemanggilan method displaycurrentime() dalam class time
inthour = 0;
intminute = 0;
intsecond = 0;//untuk pengondisian nilai (not null)

            a.gettime(refhour, refminute, refsecond);//pemanggilan method gettime dengan parameter hour,time,second
Console.WriteLine("current time " + hour + " : "+ minute + " : " + second);//mencetak dari method gettime
Console.ReadKey();// semua input dibaca enter agar program tidak langsung close
        }
    }
}





using System; // import library ,untuk mengimport class yang sudah disediakan oleh c#

namespace Ansharkerenlagi// penamaan program
{
publicclassTime // public untuk hak akses class dan time adalah nama class
    {
int tahun, bulan, tanggal, jam, menit, detik; // pendeklarasian nama variabel
publicvoid Displaycurrentime() //public void menunjukkan prosedur yang tidak dapat mengembalikan nilai
        {
Console.WriteLine("SEKARANG TANGGAL " + tanggal + " BULAN " + bulan + " TAHUN " + tahun + " jam " + gethour() + " : " + menit + " : " + detik); // console.writeline untuk mencetak hasil proses dan line itu buat enter
        }

public Time(DateTime dt) // constructor dengan parameter datetime dan variabel dt
        {
            tahun = dt.Year;
            bulan = dt.Month;
            tanggal = dt.Day;
            jam = dt.Hour;
            menit = dt.Minute;
            detik = dt.Second; //tahun,bulan,tanggal,jam,menit,dad detik itu untuk menentukan nilai yg sedang berlangsung seperti year, month dan seterusnya
        }
    }
classSelalukeren// class dengan nama class Selalukeren
    {
staticvoid Main(string[] args)// indeks program
        {
DateTime currentime = System.DateTime.Now; // memanggil waktu yang sedang berjalan  dengan variabel currentime
Time a = newTime(currentime); // objek ‘a’ bertipe class time dengan memanggil constructor dengan parameter currentime
            a.Displaycurrentime(); //pemanggilan method displaycurrentime() dalam class time

Console.ReadKey(); // semua input dibaca enter agar program tidak langsung close
        }
    }
}





Wednesday 20 May 2015

Download Kumpulan Soal SBMPTN 2008 - 2014 Lengkap dengan pembahasannya

Misi gan gua punya soal-soal SBMPTN nih buat para lulusan SMA atau anak kuliah yang pengen daftar universitas lagi hehe..


Buat yang mau ikut lagi SBMPTN, bisa Download soal-soal SBMPTN dari tahun 2008-2014 GRATIS di sini:



Broadcast ke teman2 kamu supaya bisa sama2 belajar bareng. Nggak usah saingan sama temen sendiri, toh kalian ngambil jurusan yang berbeda2 :)
Semoga Bermanfaat yah :)

sumber referensi : jogjastudent 

Wednesday 13 May 2015

Soal Latihan Ujian dan Pembahasan CBT UII

Disini saya pengen ngeshare buat agan agan yang ingin mengetahui bentuk soal cbt uii sebagai bahan pembelajaran untuk menghadapi tes cbt uii gan:))
Soal ini juga berguna sebagai bahan pembelajaran tes kampus lain karena menurut pengalaman saya pribadi, tes UII itu jauh lebih susah dibanding kampus UGM dan semacamnya baik itu dalam bentuk SBMPTN atau Tes Mandiri. 
Nah untuk yang fokus UII, Soal Ujian Masuk CBT UII ini berguna untuk pembelajaran kalian sebelum tes CBT supaya ga ngabisin duit buat tes terus terusan hehe..
Disini juga lengkap dengan kunci jawaban dan pembahasan nya loh hehe.

Semoga bermanfaat dan kalian bisa lulus di kampus mentereng seperti uii yaa:))


@jokisuperyk
Ini adalah bentuk test CBT UII..
Silahkan klik link dibawah tapi maaf teman-teman karena soal ini sangat langka dan bisa gugel sendiri kalo nemu kayak punya saya ehe. Jadi, sebagai bentuk kausalitas (timbal-balik) nya. Ini ga gratis ya, cukup donasikan shopee pay teman-teman sekalian Rp. 50.000 udah bisa dimiliki selamanya. For more info, agan bisa hubungi saya lewat email disini yaaaa ;)

Oh iya satu lagi teman-teman...
Bagi kalian yang mager nugas, skripsi, jurnal, makalah, olah data, TOEFL, dll. Disini kami ada jasa joki yang super hebat karena di handle oleh superteam juga nih. Follow for more info yaaa.
Instagram: @jokisuperyk
https://bit.ly/jokiinskripsimu

cp: jokisuperyk@gmail.com

Penjelasan Kegunaan Pointer C++ Lengkap

Saya akan ngeshare penjelasan tentang kegunaan pointer C++ secara lengkap gan..
Silahkan di baca
semoga artikel saya bermanfaat gan hehe:))



Dalam ilmu komputer, pointer adalah tipe data bahasa pemrograman yang nilainya mengacu untuk menunjuk langsung nilai lain yang tersimpan di tempat lain dalam suatu memori komputer menggunakan alamat yang ada. Untuk bahasa pemrograman tingkat tinggi, pointer secara efektif dapat mengambil tempat pada general purpose registers di bahasa tingkat rendah seperti bahasa assembly atau kode mesin, tetapi bila memori tersedia.

Pointer adalah implementasi sederhana, lebih konkret tentang tipe data referensi yang lebih abstrak. Beberapa bahasa mendukung beberapa jenis pointer, walaupun ada yang memiliki lebih banyak pembatasan penggunaannya dari pada yang lain. Sebagai analogi, sebuah nomor halaman dalam buku dapat dianggap sebagai pointer ke halaman yang sesuai; dereferencing seperti pointer akan dilakukan dengan membalik ke halaman dengan nomor halaman yang diberikan.

Pointer dapat meningkatkan kinerja data secara signifikan agar operasi berulang seperti traversing string, tabel lookup, tabel kontrol dan struktur pohon. Secara khusus, sering jauh lebih efisien dalam waktu dan space untuk pointer dari pada menggunakan variable tipe data biasa.

Pointer juga digunakan untuk menyimpan alamat dari titik masuk untuk memanggil subrutin dalam pemrograman prosedural dan untuk run-time penghubung ke dynamic link libraries (DLL). Dalam pemrograman berorientasi objek, pointer ke fungsi yang digunakan untuk mengikat/menjilid method, ini sering disebut tabel method virtual.

Sementara "pointer" telah digunakan untuk merujuk pada referensi yang ada pada umumnya, hal ini berlaku lebih baik bagi struktur data yang secara eksplisit memungkinkan antarmuka (interface) pointer untuk dimanipulasi (secara aritmetik melalui aritmetik pointer) sebagai alamat memori. Karena pointer memungkinkan akses yang baik dilindungi maupun tidak dilindungi ke memori yang dituju.

Pointer primitif adalah pointer sering disimpan dalam format yang sama dengan integer. Namun, mencoba untuk dereference atau "mencari" pointer yang nilainya tidak pernah menjadi alamat memori yang valid akan menyebabkan program menjadi crash.

Deskripsi Formal:
Dalam ilmu komputer, pointer adalah macam referensi. Sebuah data primitive (primitive) adalah setiap datum yang dapat dibaca dari atau ditulis ke memori komputer menggunakan satu akses memori (misalnya, kedua byte dan kata (word) yang primitif).


Sebuah data agregat (aggregate) adalah sekelompok data primitif yang logis berdekatan di memori dan yang dipandang secara kolektif sebagai satu datum (misalnya, agregat bisa saja 3 byte logis berdekatan, maka nilai-nilai itu lah yang mewakili 3 koordinat titik di dalam ruang memori), ketika seluruh agregat yang terdiri dari jenis primitive yang sama, agregat dapat disebut sabagai sebuah array, dalam arti, multi-byte primitif adalah array dari byte.

Dalam konteks definisi ini, byte adalah primitif terkecil, masing-masing menentukan alamat memori byte yang berbeda. Alamat memori dari byte pertama pada sebuah datum dianggap sebagai alamat memori (atau base alamat memori) dari seluruh datum.

Sebuah pointer memori adalah primitive, nilai yang dimaksudkan untuk digunakan sebagai alamat memori itu disebut sebagai pointer petunjuk ke alamat memori. Hal ini juga disebut bahwa pointer menunjuk ke datum [dalam memori] ketika nilai pointer berupa alamat memori datum itu.

Secara lebih umumnya, pointer adalah jenis data referensi, dan agar memperoleh  pointer dereference maka datum pointer disimpan di lokasi yang berbeda di dalam memori. Fitur yang membedakan pointer dengan jenis referensi lain adalah nilai pointer yang dimaksud  agar ditafsirkan sebagai alamat memori, yang merupakan konsep 'tingkat rendah'.

Saat membuat struktur data seperti daftar, deret dan percabangan, perlu memiliki pointer untuk membantu mengelola bagaimana struktur dapat diimplementasikan dan dikendalikan. Contoh umum dari pointer adalah start pointer, end pointer, dan stack pointer. Pointer ini dapat menjadi absolute (alamat fisik yang sebenarnya atau alamat virtual di memori virtual) atau relative (sebuah offset dari alamat awal absolute ("dasar") yang biasanya menggunakan bit yang lebih sedikit dari pada alamat lengkap, tetapi biasanya juga akan membutuhkan satu tambahan operasi aritmatika untuk menyelesaikannya).

Dua byte offset, berisi 16-bit unsigned integer, dapat digunakan untuk menyediakan pengalamatan relative sampai dengan 64 kilobyte struktur data. Secara umum, meskipun, skema seperti itu banyak masalah, dan untuk kemudahan bagi programmer maka ruang alamat datar biasanya lebih disukai.

Sebuah byte offset, seperti nilai ASCII karakter heksadesimal dapat digunakan untuk menunjuk nilai integer alternatif dalam array. Dengan cara ini, karakter dapat sangat efisien diterjemahkan dari 'data mentah' ke indeks sekuensial dapat digunakan dan kemudian ke alamat absolut tanpa menggunakan tabel lookup.

Digunakan dalam mengontrol tabel
Kontrol tabel digunakan untuk mengontrol aliran program (program flow), biasanya membuat ekstensif menggunakan pointer. Pointer biasanya tertanam dalam sebuah entry tabel. Misalnya, digunakan untuk menyimpan entry point bagi subrutin yang akan dijalankan, dan berdasarkan kondisi tertentu yang didefinisikan dalam entri tabel yang sama.

Namun pointer  hanya dapat berupa indeks untuk memisahkan data yang lain tetapi terikat, tabel terdiri dari suatu array dari alamat yang aktual atau alamat sendiri (tergantung pada konstruksi bahasa pemrograman yang tersedia).

Pointer juga dapat digunakan untuk titik (kembali) ke entri tabel sebelumnya (seperti dalam pengolahan loop) atau maju melewatibeberapa entri tabel (seperti pada switch atau "awal" keluar dari loop).

Abstraksi pointer yang sangat tipis di atas merupakan kemampuan pengalamatan yang dikembangkan dengan arsitektur paling modern. Dalam skema sederhana, alamat atau indeks numerik, ditugaskan bagi setiap unit memori dalam sistem, di mana unit ini biasanya baik byte atau kata (word), secara efektif dapat mengubah semua memori ke array yang sangat besar. Kemudian, jika kita memiliki suatu alamat, sistem itu menyediakan operasi untuk mengambil nilai yang tersimpan dalam unit memori pada alamat (biasanya menggunakan register tujuan umum didalam mesin yang digunakan).

Dalam kasus biasa, pointer itu cukup besar untuk menampung alamat lebih dari beberapa unit memori yang berada di dalam sistem. Ini memperkenalkan kemungkinan bahwa program mungkin berusaha untuk mengakses alamat bila tidak ada unit memori, baik karena memori tidak cukup dipasang (yaitu di luar jangkauan memori yang tersedia) atau arsitektur tidak mendukung alamat tersebut. Kasus pertama mungkin, dalam platform tertentu seperti arsitektur Intel x86, disebut kesalahan segmentasi (segfault). Kasus kedua adalah mungkin dalam implementasi pada AMD64, di mana pointer yang memiliki panjang 64 bit dan alamat hanya memperpanjang sampai 48 bit. Disini pointer harus sesuai dengan aturan-aturan tertentu (alamat kanonik), jadi jika pointer nonkanonik adalah dereferenced, akan berakibat prosesor melakukan kesalahan perlindungan umum (general protection fault).

Di sisi lain, beberapa sistem memiliki lebih banyak unit memori dari pada alamat. Dalam hal ini, skema yang lebih kompleks seperti segmentasi memori atau paging dikelola untuk menggunakan bagian yang berbeda dari memori pada waktu yang berbeda pula. Inkarnasi terakhir dari arsitektur x86 mendukung hingga 36 bit dari alamat memori fisik, yang dipetakan ke ruang alamat 32-bit linear melalui mekanisme paging PAE. Jadi, hanya 1 / 16 dari total memori yang mungkin dapat diakses pada suatu waktu. Contoh lain dalam kelompok komputer yang sama adalah 16-bit dalam keadaan terlindungi dari prosesor 80286 yang meskipun mempunyai 16 MiB memori fisik, dapat mengakses hingga 1 GB dari memori virtual, namun kombinasi dari 16-bit alamat dan segmen register dapat mengakses lebih dari 64 KiB dalam satu struktur data rumit. Beberapa pembatasan aritmetik pointer ANSI mungkin memiliki model memori tersegmentasi dari kelompok prosesor ini.

Dalam rangka untuk mengembangkan interface yang konsisten, beberapa arsitektur menyediakan I / O yang dipetakan ke dalam memori, yang memungkinkan beberapa alamat untuk menuju ke unit memori sementara yang lain mengacu pada register perangkat perangkat lain di komputer. Ada konsep analog seperti file offset, indeks array, dan referensi object remote yang melayani beberapa tujuan yang sama sebagai alamat untuk jenis object lainnya.

Pointer secara langsung didukung tanpa pembatasan dalam bahasa seperti PL / I, C, C++, Pascal, dan kebanyakan bahasa perakitan. Ketika berhadapan dengan array, operasi pencarian kritis biasanya perhitungan alamat  disebut tahap perhitungan alamat yang melibatkan pembentukan sebuah array.

Dalam struktur data lain, seperti daftar terhubung (linked list), pointer digunakan sebagai referensi secara eksplisit yang mengikat salah satu bagian dari struktur yang lain. Pointer digunakan untuk menumpangi parameter bagi referensi. Hal ini berguna jika programmer mengingin modifikasi fungsi untuk parameter, untuk dapat dilihat ke pemanggilan fungsi itu. Ini juga berguna untuk menampikan nilai hasil perkalian dari dalam fungsi yang telah dibuat.

Pointer juga dapat digunakan untuk mengalokasikan atau DEALLOCATE variabel dinamis dan array dalam memori. Karena variable akan sering menjadikan memori penuh setelah selasai ngerjakan perintah, itu bisa menjadi pemborosan memori bila kita menyimpannya, dan oleh karena itu praktik yang baik untuk DEALLOCATE itu (menggunakan referensi pointer asli) ketika tidak lagi diperlukan. Kegagalan untuk melakukannya dapat mengakibatkan kehabisan memori (di mana memori bebas yang tersedia akan secara bertahap berkurang atau dalam kasus yang parah dengan secara cepat akan penuh).

Menurut Frieyadie. 2007. Edisi Revisi Buku Pemrograman C++ dengan Borland C++ 5.02.
Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Contoh Program:
#include <stdio.h>         //Mengakses file pada library stdio.h
#include <stdlib.h>        //Mengakses file pada library stdlib.h
int main (void){             //Fungsi main yang harus ada dalam sebuah program C
   int A = 5, H;
   int *ptrA, *ptrH;         //Deklarasi pointer sebagai integer
   ptrA = &A;                //Alamat lokasi memori dari variabel A disimpan pada ptrA
   H = *ptrA;                 //Nilai data yang alamat lokasi memorinya disimpan pada ptrA,
                                        disimpan di variabel H
   ptrH = &H;                //Alamat lokasi memori dari variabel H disimpan pada ptrH
                                     // %x menampilkan nilai hexa
  printf("A=%d\n &A=%x \n ptrA=%x \n *ptrA=%d", A, &A, ptrA, *ptrA);
  printf("\n\nH=%d\n &H=%X\n ptrH=%X\n *ptrH=%d\n\n", H, &H, ptrH,*ptrH);
system ("pause");           //File yang terdapat pada stdlib.h
return (0);                     //Nilai balikan fungsi main() adalah 0
}
Arti pointer dalam bahasa sehari-hari adalah putunjuk atau dapat dikatakan sebagai penentu atau dapat diartikan sebagai tipe data yang nilainya mengarah pada nilai yang terdapat pada sebuah area memori (alamat memori).Namun dalam bahasa C, Pointer bisa berfungsi sebagai variabel array berarti pointer sebagai penunjuk elemen array ke-0 dalam variabel C.

Kegunaan Pointer Di C++ :
Kegunaan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel (data type atau object dari class), menyimpan alamat dari sebuah fungsi (function pointer) dan dapat berfungsi untuk  mengirimkan “Parameter yang berupa variabel” ke dalam fungsi, artinya nilai variabel bisa diubah di dalam fungsi serta dapat membuat variabel dinamis.

Tipe Data Pointer :
Tipe_data merupakan tipe dari data yang ditunjuk, bukan tipe dari pointer- nya. Contoh :
1. Mensubstitusikan address sebuah variabel ke pointer dengan memakai address operator &
    int x;
    int *ptr;
    ptr = &x;

2. Mensubstitusikan address awal sebuah array ke pointer
    char t[5]; char *ptr; ptr = t;

3. Mensubstitusikan address salah satu elemen array dengan address operator
    char t[5] ; char *ptr; ptr = &t[3];

4. Mensubstitusikan address awal character string ke pointer char
    char *ptr;
    ptr = "jakarta"

5. Mensubstitusikan NULL pada pointer.
NULL ada pointer kosong, menunjukkan suatu status dimana pointer itu belum diinisialisasikan dengan sebuah address tertentu.

Operator Pointer :
Ada 2 operator pointer yang dikenal secara luas, yaitu operator & dan operator *.

Operator &
Operator & merupakan operator alamat. Pada saat pendeklarasian variable, user tidak diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara otomatis oleh kompiler dan operating sysem pada saat run-time. Jika ingin mengetahui dimana suatu variable akan disimpan, dapat dilakukan dengan memberikan tanda ampersand (&) didepan variable , yang berarti "address of". Contoh : ted = &input;

Penulisan tersebut berarti akan memberikan variable ted alamat dari variable input. Karena variabel input diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable.

Misalkan input diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb :
input = 25;  fred = input; ted = &input;

Operator *
Operator * merupakan operator reference. Dengan menggunakan pointer,kita dapat mengakses nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada identifier pointer, yang berarti "value pointed by". Contoh :
beth = *ted;
(dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25.

Macam – macam Pointer
Pointer Bertipe Void
Pada C++ terdapat pointer yang dapat menunjuk ke tipe data apapun, pointer semacam ini dideklarasikan dengan tipe void sehingga sering dikenal dengan istilah Void Pointer. Berikut ini contoh listing program yang menggunakan void pointer.
Pointer Aritmetika
Elemen-elemen array biasanya diakses melalui indeksnya, sebenarnya ada cara lain yang lebih efisien, yaitu dengan menggunakan pointer. Pointer semacam ini disebut dengan istilah pointer aritmetika. Konsep dasar dari pointer aritmetika ini adalah melakukan operasi aritmetika terhadap variabel yang bertipe pointer.
Pointer NULL
Pada saat program dijalankan, pointer akan menunjuk ke alamat acak pada memori, sehingga diperlukan inisialisasi agar hal tersebut tidak terjadi. Dalam C++ terdapat sebuah cara untuk membuat pointer tidak menunjuk ke alamat manapun, yaitu dengan mengisikan pointer tersebut dengan nilai NULL. Karena hal inilah maka pointer tersebut sering dinamakan pointer NULL (NULL Pointer).Se¬bagai contoh kita mempunyai pointer p, dan kita ingin melakukan inisialisasi pada pointer tersebut dengan nilai NULL, maka sintaknya adalah  P=NULL;

DEKLARASI POINTER
Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih dahulu sebelum digunakan.
Bentuk Umum :
                              Tipe_data *nama_pointer;

//Contoh9_1
int *px;
char *sh;
Contoh Program :
#include “IOSTREAM.h”
#include “conio.h”
void main()
{ int x, y; /* x dan y bertipe int */
int *px; /* px pointer yang menunjuk objek */
clrscr();
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunjuk px */
cout<<“Alamat x =”<<&x <<\n”;
cout<<“Isi px = \n”, px);
cout<<“Isi x = \n”, x);
cout<<“Nilai yang ditunjuk oleh px = \n”, *px);
cout<<“Nilai y = \n”, y);
getch();
}

Operasi-operasi Pointer
Operasi Penugasan
Suatu variabel pointer seperti halnya variabel yang lain, juga bisa mengalami operasi penugasan. Nilai sari suatu variabel pointer dapat disalin ke variabel pointer yang lain.
Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan.
Operasi Logika
Operasi logika juga dapat dilakukan pada sebuah variabel pointer.

OPERASI POINTER
*  Operasi Penugasan
Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami operasi
penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer yang lain.
//Contoh9_2
#include "iostream.h"
#include "conio.h"
void main()
{ float *x1,y, *x2;
clrscr();
y = 13.45;
x1 = &y;            /* Alamat dari y disalin ke variabel x1 */
x2 = x1;            /* Isi variabel x1 disalin ke variabel x2 */
cout<<"Nilai variabel y =  "<<y<< " ada di alamat "<< x1<<"\n";
cout<<"Nilai variabel y =  "<<y<< " ada di alamat "<< x2<<"\n";
 getch();
}

*  Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer
saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan.
Operasi penambahan dengan suatu nilai menunjukkan lokasi data berikutnya (index
selanjutnya) dalam memori. Begitu juga operasi pengurangan.

//Contoh9_3
#include <iostream.h>
#include <conio.h>
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori " <<penunjuk<<"\n";
cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat memori " <<penunjuk+1<<"\n";
cout<<"Nilai "<<*(penunjuk+2) <<" ada di alamat memori " <<penunjuk+2<<"\n";
getch();
}

*  Operasi Logika
Suatu pointer juga dapat dikenai operasi logika.

//Contoh9_4
#include<iostream.h>
#include "conio.h"
void main()
{ int a = 100, b = 200, *pa, *pb;
clrscr();
pa = &a;
pb = &b;
cout<<"nilai pa= "<<pa<< " nilai pb= "<<pb<<"\n";
if(pa < pb)
cout<<"pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout<<"pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout<<"pa menunjuk ke memori lebih tinggi dari pb\n";
getch();}


















Pointer Dalam C++
Pointer adalah built-in type di C dan C++, dimana C++ mengambil konsep pointer dari C. Pointer sebenarnya sangat terkait dengan "Abstract C Machine", yaitu model mesin abstrak dimana program C bekerja. Abstract C Machine adalahmesin abstrak dimana mesin tersebut memiliki prosesor untuk menginterpretasikan stream of instruction, dan addressable memory yang terbagi kedalam 3 bagian : automatic memory, static memory dan free memory. Addressable memory adalah memory yang konten-nya dapat diambil jika diketahui alamatnya. Lebih jauh lagi, terdapat asumsi bahwa konten memori dapat di ambil dengan waktu konstan, tidak peduli berapa nilai alamat. Hal ini disebut dengan Random Access Memory. Pointer (variabel penunjuk) juga sering di defenisikan sebagai suatu variabel yang berisi alamat memori dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya variabel lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat dari variabel lain, variabel pertama dikatakan menunjuk ke variabelkedua.
Bagaimana Cara Menggunakan Pointer ?
Ada 2 operator pointer yang dikenal secara luas, yaitu operator & dan operator *.
Operator &

Operator & merupakan operator alamat. Pada saat pendeklarasian variable, user tidak diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara otomatis oleh kompiler dan operating sysem pada saat run-time. Jika ingin mengetahui dimana suatu variable akan disimpan, dapat dilakukan dengan memberikan tanda ampersand(&) didepan variable , yang berarti "address of". Contoh :

ted = &andy;

Penulisan tersebut berarti akan memberikan variable ted alamat dari variable andy. Karena variabel andy diberi awalan karakter ampersand (&), maka yang menjadi pokok disini adalah alamat dalam memory, bukan isi variable. Misalkanandy diletakkan pada alamat 1776 kemudian dituliskan instruksi sbb :
andy = 25;
fred = andy;
ted = &andy;

Maka hasilnya : Operator *
 Operator * merupakan operator reference. Dengan menggunakan pointer, kita dapat mengakses nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada identifier pointer, yang berarti "value pointed by". Contoh :
beth = *ted;

(dapat dikatakan:"beth sama dengan nilai yang ditunjuk oleh ted") beth = 25, karena ted dialamat 1776, dan nilai yang berada pada alamat 1776 adalah 25.
 Ekspresi dibawah ini semuanya benar, perhatikan :

andy = 25;
&andy = 1776;
ted = 1776;
*ted = 25;

Ekspresi pertama merupakan assignation bahwa andy = 25;. Kedua, menggunakan operator alamat (address/derefence operator (&)), sehingga akan mengembalikan alamat dari variabel andy. Ketiga bernilai benar karena assignation untukted adalah ted = &andy;. Keempat menggunakan reference operator (*) yang berarti nilai yang ada pada alamat yang ditunjuk oleh ted, yaitu 25. Maka ekspresi dibawah ini pun akan bernilai benar : *ted = andy;
Alasan Mengapa Menggunakan Pointer

Adapun alas an penggunaan pointer pada C++ adalah sebagai berikut :
Mengirimkan “Parameter yang berupa variabel” ke dalam fungsi, artinya nilai variabel bisa diubah di dalam fungsi.
int nama fungsi (int *b) {
*b = *b + 1;
}
main () {
int x=1;
nama_fungsi (&x);
printf (”%d”, x); // output :2, karena x diubah di dalam fungsi menjadi x=x+1;
}
Penggunaan pointer dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.
Contoh program yang menggunakan pointer ada di bawah (contohnya menggunakan pointer terhadap parameter yang di-pass ke aplikasi ie. argv)
Code:
/**
* pointer.c - contoh penggunaan pointer
* coded by void ;)
*/
#include
#include
int main(int argc, char **argv)
{
if (argc < style=""> /* prks prmtr yg dbrkn */
printf("aturan pakai: %s \n", argv[0]); /*jk prmtr tra pngl help */
exit(1); /* keluar */
}
printf("hello %s :)\n", argv[1]); /* tmpl psn & prmetr */
return 0; /* keluar */
}

Contoh penggunaannya
Code:
bash-4.0$ # compile source codenya
bash-4.0$ gcc -s -o pointer pointer.c
bash-4.0$ # jalankan aplikasinya tanpa parameter
bash-4.0$ ./pointer
aturan pakai: ./pointer
bash-4.0$ # jalankan aplikasinya dengan parameter
bash-4.0$ ./pointer "sandra dewi"
hello sandra dewi :)
bash-4.0$
Penjelasannya adalah kira-kira sebagai berikut :
argc adalah jumlah argumen / parameter pada command line. jumlah minimalnya adalah 1, yaitu aplikasi yang sedang dieksekusi, dan nama aplikasi yang dieksekusi tersebut disimpan pada variabel argv, tepatnya argv[0]
Seperti yang saya jelaskan di atas, variabel argv menampung parameter yang berada pada command line. kira2 seperti ini
Code:
bash-4.0$ killall enemy
argc = 2
argv[0] = killall
argv[1] = enemy
Kalau masih bingung soal argc dan argv, mungkin bisa membuka lagi buku2 pemrograman C/C++ soalnya saya juga masih newbie soal pemrograman. kalau bisa, cari buku yang judulnya "C For Scientist and Engineers", sampai sekarang saya masih belajar dari buku itu.
Nah, berikut ini sample kode serta penggunaannya untuk mengetahui nilai argc dan argv
Code:
#include
int main(int argc, char **argv)
{
static int i;
printf("nilai argc: %lu\n", argc);
for (i = 0; i <>
printf("argv[%lu] -> %s\n", i, argv[i]);
}
return 0;
}
Jika dieksekusi, maka contohnya seperti ini
Code:
bash-4.0$ ./test
nilai argc: 1
argv[0] -> ./test
bash-4.0$ ./test satu dua tiga empat capedeh
nilai argc: 6
argv[0] -> ./test
argv[1] -> satu
argv[2] -> dua
argv[3] -> tiga
argv[4] -> empat
argv[5] -> capedeh

Syarat Membuat Pointer
Variabel statis adalah variabel yang dideklarasikan dan dinamai pada saat penulisan program. Memori yang dipakai oleh variabel ini akan tetap ada (dianggap terpakai) selama program dimana variabel tersebut dideklarasikan sedang dijalankan.

Variabel dinamis adalah variabel yang dibuat (dan mungkin juga dihapus/dirusak) selama eksekusi progam. Karena variabel dinamis belum nyata ada pada
saat program dikompilasi (ia nyata-nyata ada pada saat dibuat yaitu pada saat program dieksekusi), maka variabel seperti ini tidak dapat dinamai pada saat program dibuat/ditulis.

Satu-satunya cara untuk mengakses variabel dinamis adalah dengan menggunakan pointer. Saat suatu variabel dinamis dibuat, ia belum berisi data dan harus memiliki suatu tipe tertentu seperti halnya variabel biasa.

Sebaliknya variabel statis tidak dapat dibuat ataupun dihapus pada saat eksekusi program dan variabel pointer tidak dapat digunakan untuk menunjuk kepada variabel statis. Variabel statis dapat diakses hanya dengan menggunakan namanya dan bila kita ingin menunjuk pada suatu posisi dalam array maka kita dapat melakukannya dengan menggunakan indeks/variabel yang bertipe seperti indeks dari array.
Type Data Yang Dapat Menggunakan Pointer

Pointer Bertipe Void
Pada C++ terdapat pointer yang dapat menunjuk ke tipe data apapun, pointer semacam ini dideklarasikan dengan tipevoid sehingga sering dikenal dengan istilah Void Pointer. Berikut ini contoh listing program yang menggunakan void pointer.
 Hasilnya adalah :

Dari hasil yang diberikan oleh program di atas terlihat bahwa sebuah pointer yang bertipe void dapat digunakan untuk menunjuk tipe data int, double, dan char
Melewatkan Array Menggunakan Pointer
Selain yang telah disebutkan di atas, pointer juga dapat berfungsi untuk melewatkan variabel yang bertipe array di dalam sebuah fungsi. Berikut ini
ituliskan dua buah contoh program yang dapat menjelaskan pernyataan ini.
Program yang ditulis tanpa menggunakan pointer

Hasilnya adalah :
 Program yang ditulis menggunakan pointer

 Hasilnya adalah :


Pointer Aritmetika
Elemen-elemen array biasanya diakses melalui indeksnya, sebenarnya ada cara lain yang lebih efisien, yaitu dengan menggunakan pointer. Pointer semacam ini disebut dengan istilah pointer aritmetika. Konsep dasar dari pointer aritmetika ini adalah melakukan operasi aritmetika terhadap variabel yang bertipe pointer. Misalnya kita mempunyai 5 buah data bertipe int yang disimpan dalam bentuk array dengan nama A dan digambarkan sebagai berikut :
 Jika kita mempunyai pointer p, maka kita dapat mengakses elemen-elemen array di atas dengan cara melakukan operasi terhadap p. Berikut contoh program yang akan mengilustrasikan kasus tersebut.

Hasilnya adalah :

Tipe Reference
Pada pembahasan pointer terdapat sebuah tipe data yang kerap kali digunakan, yaitu tipe reference. Tipe reference sebenarnya merupakan alias (julukan/ nama lain) dari variabel yang dideklarasikan dengan menggunakan tipe data tertentu. Misalnya kita mendeklarasikan sebuah variabel x yang bertipe int dan kita akan membuat alias (dengan naman) dari variabel tersebut, maka hal yang harus dilakukan adalah mendeklarasikan alias tersebut menggunakan tipe reference yang dituliskan dengan int&. Berikut ini sintak yang menjelaskan contoh di atas.
Int x; //mendeklarasikan variabel x dengan int
Int& n = x; //mendeklarasikan n (yang merupakan alias x) dengan tipe reference
//(int&)


Alias n dibuat dengan cara mengakses alamat yang ditempati oleh variabel x, yaitu dengan menggunakan tanda &. Oleh karena n merupakan alias dari x, maka x dan n akan mempunyai nilai yang sama atau dengan kata lain keduanya akan saling mempengaruhi.
Pointer NULL
Pada saat program dijalankan, pointer akan menunjuk ke alamat acak pada memori, sehingga diperlukan inisialisasi agar hal tersebut tidak terjadi. Dalam C++ terdapat sebuah cara untuk membuat pointer tidak menunjuk ke alamat manapun, yaitu dengan mengisikan ponter tersebut dengan nilai NULL. Karena hal inilah maka pointer tersebut sering dinamakan pointer NULL (NULL Pointer). Sebagai contoh kita mempunyai pointer p, dan kita ingin melakukan inisialisasi pada pointer tersebut dengan nilai NULL, maka sintaknya adalah sebagai berikut.

Referensi :
Devid Harya Lesmana, Azhar Ahmad, Lilik Emi Rahayu, Bian Dwi Pamungkas : Bahasa Pemograman Terstruktur.
http://www.gamedevid.org/forum/showthread.php?t=5075
http://www.khabib.staff.ugm.ac.id/index.php?option=com_content&task=view&id=85&Itemid=33
http://www.ansav.com/forum/showthread.php?t=130
http://rizqtech.net/2008/05/11/pointer-dalam-bahasa-c/
http://alextomasoa..com

Kompleksitas Algoritma Matematika Diskrit

Materi Kompleksitas Algoritma
BAB I
PENDAHULUAN

I.1 Latar Belakang
Algoritma adalah sekumpulan berhingga dari instruksi-instruksi untuk melakukan perhitungan/ komputasi atau memecahkan suatu masalah. Sebuah algoritma tidak saja harus benar, tetapi juga harus efisien. Algoritma yang bagus adalah algoritma yang efektif dan efisien. Algoritma yang efektif diukur dari berapa jumlah waktu dan ruang (space) memori yang dibutuhkan untuk menjalankannya.  Algoritma yang efisien adalah algoritma yang meminimumkan kebutuhan waktu dan ruang. Kebutuhan waktu dan ruang suatu algoritma bergantung pada ukuran masukan (n), yang menyatakan jumlah data yang diproses. Keefektifan algoritma dapat digunakan untuk menilai algoritma yang bagus.
Kita dapat mengukur waktu yang diperlukan oleh sebuah algoritma dengan menghitung banyaknya operasi/instruksi yang dieksekusi. Jika kita mengetahui besaran waktu (dalam satuan detik) untuk melaksanakan sebuah operasi tertentu, maka kita dapat menghitung berapa waktu sesungguhnya untuk melaksanakan algoritma tersebut.










BAB II
LANDASAN TEORI

II.1 Pengertian
Besaran yang dipakai untuk menerangkan model abstrak pengukuran waktu/ruang ini adalah kompleksitas algoritma. 
Ada dua macam kompleksitas algoritma, yaitu: kompleksitas waktu dan kompleksitas ruang. Sebuah algoritma tidak saja harus benar, tetapi juga harus mangkus (efisien).
Algoritma yang bagus adalah algoritma yang mangkus. Kemangkusan algoritma diukur dari berapa jumlah   waktu dan ruang (space) memori yang dibutuhkan untuk menjalankannya. Algoritma yang mangkus ialah algoritma yang meminimumkan kebutuhan waktu dan ruang.
Kebutuhan waktu dan ruang suatu algoritma bergantung pada ukuran masukan (n), yang menyatakan jumlah data yang diproses. Kemangkusan algoritma dapat digunakan untuk menilai algoritma yang terbaik. 










Mengapa Kita Memerlukan Algoritma yang Mangkus?


Model Perhitungan Kebutuhan Waktu/Ruang  

Kita dapat mengukur waktu yang diperlukan oleh sebuah algoritma dengan menghitung banyaknya operasi/instruksi yang dieksekusi. 

Jika kita mengetahui besaran waktu (dalam satuan detik) untuk melaksanakan sebuah operasi tertentu, maka kita dapat menghitung berapa waktu sesungguhnya untuk melaksanakan algoritma tersebut.








BAB III
ISI
III.1 Kompleksitas Algoritma dan Penjelasan

Model Perhitungan Kebutuhan Waktu/Ruang  
Kita dapat mengukur waktu yang diperlukan oleh sebuah algoritma dengan menghitung banyaknya operasi/instruksi yang dieksekusi. 
Jika kita mengetahui besaran waktu (dalam satuan detik) untuk melaksanakan sebuah operasi tertentu, maka kita dapat menghitung berapa waktu sesungguhnya untuk melaksanakan algoritma tersebut.

Contoh 1. Menghitung rerata 


a1 a2 a3 an  
         Larik bilangan bulat


      
procedure HitungRerata(input a1, a2, ..., an : integer, output r : real)
{ Menghitung nilai rata-rata dari sekumpulan elemen larik integer a1, a2, ..., an. 
  Nilai rata-rata akan disimpan di dalam peubah r. 
  Masukan: a1, a2, ..., an
  Keluaran: r (nilai rata-rata)
Deklarasi
   k : integer
   jumlah : real

Algoritma
   jumlah0
   k1
   while k  n do  
     jumlahjumlah + ak
     kk+1
   endwhile
   { k > n }
   r  jumlah/n   { nilai rata-rata }
 

(i) Operasi pengisian nilai (jumlah0,  k1, jumlahjumlah+ak, kk+1, dan r  jumlah/n)
         Jumlah seluruh operasi pengisian nilai adalah
t1 = 1 + 1 + n + n + 1 = 3 + 2n 
(ii)   Operasi penjumlahan (jumlah+ak, dan k+1)
        Jumlah seluruh operasi penjumlahan adalah
t2 =  n + n = 2n  
(iii)  Operasi pembagian (jumlah/n)
        Jumlah seluruh operasi pembagian adalah
t3 = 1 



Total kebutuhan waktu algoritma Hitung Rerata:

t = t1 + t2 + t3 = (3 + 2n)a + 2nb + c  detik
           
Model perhitungan kebutuhan waktu seperti di atas kurang dapat diterima:
Dalam praktek kita tidak mempunyai informasi berapa waktu sesungguhnya untuk melaksanakan suatu operasi tertentu 
Komputer dengan arsitektur yang berbeda akan berbeda pula lama waktu untuk setiap jenis operasinya. 
Selain bergantung pada komputer, kebutuhan waktu sebuah program juga ditentukan oleh compiler bahasa yang digunakan. 
Model abstrak pengukuran waktu/ruang harus independen  dari pertimbangan mesin dan compiler apapun. 
Besaran yang dipakai untuk menerangkan model abstrak pengukuran waktu/ruang ini adalah kompleksitas algoritma. 
Ada dua macam kompleksitas algoritma, yaitu kompleksitas waktu dan kompleksitas ruang. 
Kompleksitas waktu, T(n), diukur dari jumlah tahapan komputasi yang dibutuhkan untuk menjalankan algoritma sebagai fungsi dari ukuran masukan n. 
Kompleksitas ruang, S(n), diukur dari memori yang digunakan oleh struktur data yang terdapat di dalam algoritma sebagai fungsi dari ukuran masukan n. 
Dengan menggunakan besaran kompleksitas waktu/ruang algoritma, kita dapat menentukan laju peningkatan waktu (ruang) yang diperlukan algoritma dengan meningkatnya ukuran masukan n. 





Kompleksitas Waktu 

Dalam praktek, kompleksitas waktu dihitung berdasarkan jumlah operasi abstrak yang mendasari suatu algoritma, dan memisahkan analisisnya dari implementasi.

Contoh 2. 
Tinjau algoritma menghitung rerata pada Contoh 1. Operasi yang mendasar pada algoritma tersebut adalah operasi penjumlahan elemen-elemen ak (yaitu jumlahjumlah+ak), 

Kompleksitas waktu HitungRerata adalah  T(n) = n.
Contoh 3. 
Algoritma untuk mencari elemen terbesar di dalam sebuah larik (array) yang berukuran n elemen. 

      
procedure CariElemenTerbesar(input a1, a2, ..., an : integer, output maks : integer)
{ Mencari elemen terbesar dari sekumpulan elemen larik integer a1, a2, ..., an. 
  Elemen terbesar akan disimpan di dalam maks. 
  Masukan: a1, a2, ..., an
  Keluaran: maks (nilai terbesar)
Deklarasi
   k : integer

Algoritma
   maksa1
   k2
   while k  n do  
     if ak > maks then
        maksak
     endif
     ii+1
   endwhile
   { k > n }
 

Kompleksitas waktu algoritma dihitung berdasarkan jumlah operasi perbandingan elemen larik (A[i] > maks).
Kompleksitas waktu Cari ElemenTerbesar :  T(n) = n – 1
Kompleksitas waktu dibedakan atas tiga macam :
1. Tmax(n) : kompleksitas waktu untuk kasus terburuk (worst case),
      kebutuhan waktu maksimum.
2. Tmin(n) : kompleksitas waktu untuk kasus terbaik (best case),
      kebutuhan waktu minimum.
3. Tavg(n): kompleksitas waktu untuk kasus rata-rata (average case)
    kebutuhan waktu secara rata-rata 





Contoh 4. 
Algoritma sequential search.


procedure PencarianBeruntun(input a1, a2, ..., an : integer, x : integer,
                            output idx : integer)
Deklarasi
  k : integer
  ketemu : boolean   { bernilai true jika x ditemukan atau false jika x tidak ditemukan }

Algoritma:
  k1
  ketemu  false
  while (k  n) and (not ketemu) do
    if ak = x then
      ketemutrue
    else    
      k  k + 1
    endif
  endwhile
  { k > n or ketemu }

  if ketemu then   { x ditemukan }
     idxk
  else
     idx 0       { x tidak ditemukan }
  endif
 



Jumlah operasi perbandingan elemen tabel:
1. Kasus terbaik: ini terjadi bila a1 = x.
Tmin(n) = 1
2. Kasus terburuk: bila an = x atau x tidak ditemukan.
Tmax(n)  = n 
3. Kasus rata-rata: Jika x ditemukan pada posisi ke-j, maka operasi perbandingan (ak = x)akan dieksekusi sebanyak j kali.  
Tavg(n) =  

Cara lain: asumsikan bahwa P(aj = x) = 1/n. Jika aj = x maka Tj yang dibutuhkan adalah Tj = j. Jumlah perbandingan elemen larik rata-rata:          
         Tavg(n) =   
= =    
Contoh 5. 
Algoritma pencarian biner (bynary  search). 


procedure PencarianBiner(input a1, a2, ..., an : integer, x : integer,
                         output idx : integer)
Deklarasi
   i, j, mid : integer
   ketemu : boolean

Algoritma
   i1
   jn
   ketemufalse
   while (not ketemu) and ( i  j) do 
      mid  (i+j) div 2   
      if amid = x then 
 ketemu  true
      else
         if amid < x then    { cari di belahan kanan }
   imid + 1
         else             { cari di belahan kiri }
   jmid - 1;
         endif
      endif
   endwhile 
   {ketemu or i > j }
   
   if ketemu then
      idxmid
   else
      idx0 
   endif
 

1. Kasus terbaik
Tmin(n) = 1
2. Kasus terburuk: 
  Tmax (n) = 2log n

Contoh 6.
 Algoritma algoritma pengurutan pilih (selection sort).



procedure Urut(input/output a1, a2, ..., an : integer)
Deklarasi
   i, j, imaks, temp : integer

Algoritma
  for in downto 2 do   { pass sebanyak n – 1 kali }
    imaks1
    for j2 to i do
      if aj > aimaks then
         imaksj
      endif
    endfor
    { pertukarkan aimaks dengan ai }
    tempai
    aiaimaks
    aimakstemp
            
  endfor
 

 (i) Jumlah operasi perbandingan elemen
Untuk setiap pass ke-i,
i = 1  jumlah perbandingan  = n – 1 
i = 2  jumlah perbandingan = n – 2 
i = 3  jumlah perbandingan = n – 3 
 
i = k  jumlah perbandingan = n – k 
 
i = n – 1    jumlah perbandingan = 1

Jumlah seluruh operasi perbandingan elemen-elemen larik adalah
T(n) = (n – 1) + (n – 2) + … + 1 =           
Ini adalah kompleksitas waktu untuk kasus terbaik dan terburuk, karena algoritma Urut tidak bergantung pada batasan apakah data masukannya sudah terurut atau acak. 

(ii) Jumlah operasi pertukaran
Untuk setiap i dari 1 sampai n – 1, terjadi satu kali pertukaran elemen, sehingga jumlah operasi pertukaran seluruhnya adalah 
T(n) = n – 1. 
Jadi, algoritma pengurutan maksimum membutuhkan n(n – 1 )/2 buah operasi perbandingan elemen dan n – 1  buah operasi pertukaran.            
Kompleksitas Waktu Asimptotik
Tinjau   T(n) = 2n2 + 6n + 1 

Perbandingan pertumbuhan T(n) dengan n2

n T(n) = 2n2 + 6n + 1 n2   
10
100
1000
10.000 261
2061
2.006.001
1.000.060.001 100
1000
1.000.000
1.000.000.000  

Untuk n yang besar, pertumbuhan T(n) sebanding dengan n2. Pada kasus ini, T(n) tumbuh seperti n2 tumbuh. 
T(n) tumbuh seperti n2 tumbuh saat n bertambah. Kita katakan bahwa T(n) berorde n2 dan kita tuliskan
T(n) = O(n2)
Notasi “O” disebut notasi “O-Besar” (Big-O) yang merupakan notasi kompleksitas waktu asimptotik. 

DEFINISI.  T(n) = O(f(n)) (dibaca “T(n) adalah O(f(n)” yang artinya T(n) berorde paling besar f(n) ) bila terdapat konstanta C dan n0 sedemikian sehingga  
T(n)   C(f (n)) 
untuk  n  n0. 
 f(n) adalah batas atas (upper bound) dari T(n) untuk n yang besar. 
Contoh 7. 
Tunjukkan bahwa T(n) = 3n + 2 = O(n).
Penyelesaian: 
3n + 2 = O(n) 
karena 
3n + 2  3n + 2n = 5n  untuk semua n  1 (C = 5 dan n0 = 1).            


Contoh 8.
Tunjukkan bahwa T(n) = 2n2 + 6n + 1 = O(n2).
Penyelesaian: 
2n2 + 6n + 1 = O(n2)  
karena  
2n2 + 6n + 1  2n2 + 6n2 + n2 = 9n2 untuk semua n  1.
atau
karena  
2n2 + 6n + 1  n2 + n2 + n2 = 3n2 untuk semua n  6  (C =3 dan n0 = 6).

TEOREMA. Bila T(n) = am nm + am-1 nm-1 + ... + a1n+ a0 adalah polinom derajat m  maka T(n) = O(nm ).            

TEOREMA. 
Misalkan T1(n) = O(f(n)) dan T2(n) = O(g(n)), maka
(a)  T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n), g(n))
(b)  T1(n)T2(n) = O(f(n))O(g(n)) = O(f(n)g(n))
(c)  O(cf(n)) = O(f(n)), c adalah konstanta
(d)  f(n) = O(f(n))
Contoh 9.
  Misalkan T1(n) = O(n) dan T2(n) = O(n2), maka
(a) T1(n) + T2(n) = O(max(n, n2)) = O(n2)
(b) T1(n)T2(n) = O(n.n2) = O(n3)

Contoh 10. O(5n2) = O(n2)
                 n2 = O(n2)

Aturan Untuk Menentukan Kompleksitas Waktu Asimptotik 

Jika kompleksitas waktu T(n) dari algoritma diketahui, 
    Contoh: (i)  pada algoritma cari_maksimum  
T(n) = n – 1 = O(n)

           (ii) pada algoritma pencarian_beruntun
Tmin(n) = 1 = O(1)
Tmax(n) = n = O(n)
Tavg(n) = (n + 1)/2 = O(n), 
          (iii) pada algoritma pencarian_biner,
Tmin(n) = 1 = O(1)
Tmax(n) = 2log n = O(2log n)

          (iv) pada algoritma selection_sort 
   
                    (v) T(n) = (n + 2) log(n2 + 1) + 5n2 = O(n2)

Penjelasannya adalah sebagai berikut:  
T(n) = (n + 2) log(n2 + 1) + 5n2
       = f(n)g(n) + h(n),
Kita rinci satu per satu:
f(n) = (n + 2) = O(n)
g(n) = log(n2 + 1) = O(log n), karena log(n2 + 1)  log(2n2) = log 2 + log n2 
         = log 2 + 2 log n  3 log n untuk n > 2
h(n) = 5n2 = O(n2)
maka
    T(n) = (n + 2) log(n2 + 1) + 5n2 
      = O(n)O(log n) + O(n2)
                    = O(n log n) + O(n2) = O(max(n log n, n2)) = O(n2)
Menghitung O-Besar untuk setiap instruksi di dalam algoritma dengan panduan di bawah ini, kemudian menerapkan teorema O-Besar.

(a) Pengisian nilai (assignment), perbandingan, operasi  aritmetik, read,  write membutuhkan waktu O(1).

  (b) Pengaksesan elemen larik atau memilih field tertentu dari sebuah record membutuhkan waktu O(1).
         Contoh: 

read(x); O(1)
x:=x + a[k]; O(1) + O(1) + O(1) = O(1)
writeln(x); O(1)  

Kompleksitas waktu asimptotik = O(1) + O(1) + O(1) = O(1)

Penjelasan: O(1) + O(1) + O(1) = O(max(1,1)) + O(1) 
  = O(1) + O(1) = O(max(1,1)) = O(1)
 (c) if C then S1 else S2; membutuhkan waktu
               TC + max(TS1,TS2) 
         Contoh:

read(x);     O(1)
if x mod 2 = 0 then O(1)
 begin
   x:=x+1; O(1)
   writeln(x); O(1)
 end
else
 writeln(x); O(1)  
    
 Kompleksitas waktu asimptotik:
                    = O(1) + O(1) + max(O(1)+O(1), O(1))
= O(1) + max(O(1),O(1)) 
= O(1) + O(1)
= O(1)
(d) Kalang for. Kompleksitas waktu kalang for adalah jumlah  pengulangan dikali dengan kompleksitas waktu badan (body) kalang.
         Contoh

for i:=1 to n do
  jumlah:=jumlah + a[i];  O(1)  

 Kompleksitas waktu asimptotik  = n . O(1) 
                 = O(n .1)  
                 = O(n)
      Contoh: kalang bersarang

for i:=1 to n do
   for j:=1 to n do
a[i,j]:=0; O(1)  

Kompleksitas waktu asimptotik:
nO(n) = O(n.n) = O(n2)

Contoh: kalang bersarang dengan dua buah instruksi

for i:=1 to n do
   for j:=1 to i do
 begin
a:=a+1; O(1)
b:=b-2 O(1)
    end;  

  waktu untuk a:=a+1 : O(1)
waktu untuk b:=b-2 : O(1)
total waktu untuk badan kalang = O(1) + O(1) = O(1)
kalang terluar dieksekusi sebanyak n kali
kalang terdalam dieksekusi sebanyak i kali, i = 1, 2, …, n                   jumlah pengulangan seluruhnya = 1 + 2 + … + n 
       = n(n + 1)/2
kompleksitas waktu asimptotik = n(n + 1)/2 .O(1) 
                    = O(n(n + 1)/2) = O(n2)
(e) while C do S; dan repeat S until C; Untuk kedua buah kalang, kompleksitas waktunya adalah jumlah pengulangan dikali dengan kompleksitas waktu badan C dan S.


     Contoh: kalang tunggal sebanyak n-1 putaran

i:=2; O(1)
while i <= n do O(1)
 begin
   jumlah:=jumlah + a[i]; O(1)
   i:=i+1; O(1)
 end;  
     Kompleksitas waktu asimptotiknya adalah
= O(1) +  (n-1) { O(1) + O(1) + O(1) } 
= O(1) + (n-1) O(1) 
= O(1) + O(n-1) 
= O(1) + O(n) 
= O(n)
     Contoh: kalang yang tidak dapat ditentukan panjangnya:

ketemu:=false;                          
while (p <> Nil) and (not ketemu) do    
   if p^.kunci = x then
ketemu:=true
   else
p:=p^.lalu
{ p = Nil or ketemu }  

Di sini, pengulangan akan berhenti bila x yang dicari ditemukan di dalam senarai. Jika jumlah elemen senarai adalah n, maka  kompleksitas waktu terburuknya adalah O(n) -yaitu kasus x tidak ditemukan. 


Prosedur dan fungsi. Waktu yang dibutuhkan untuk memindahkan kendali ke rutin yang dipanggil adalah O(1). 

Pengelompokan Algoritma Berdasarkan Notasi O-Besar 

Kelompok  Algoritma Nama   
O(1)
O(log n)   
O(n)
O(n log n)
O(n2)
O(n3)
O(2n)
O(n!)
Konstan
logaritmik
lanjar
n log n
kuadratik
kubik
eksponensial
faktorial  
 
 Urutan spektrum kompleksitas waktu algoritma adalah :
algoritma polinomial    algoritma eksponensial

Penjelasan masing-masing kelompok algoritma adalah sebagai berikut [SED92]:

O(1) Kompleksitas O(1) berarti waktu pelaksanaan algoritma adalah tetap, tidak bergantung pada ukuran masukan. Contohnya prosedur tukar di bawah ini:


procedure tukar(var a:integer; var b:integer);
var
  temp:integer;
begin
  temp:=a;
  a:=b;
  b:=temp;
end;  

Di sini jumlah operasi penugasan (assignment) ada tiga buah dan tiap operasi dilakukan satu kali. Jadi, T(n) = 3 = O(1).

O(log n) Kompleksitas waktu logaritmik berarti laju pertumbuhan waktunya berjalan lebih lambat daripada pertumbuhan n. Algoritma yang termasuk kelompok ini adalah algoritma yang memecahkan persoalan besar dengan mentransformasikannya menjadi beberapa persoalan yang lebih kecil yang berukuran sama (misalnya algoritma pencarian_biner). Di sini basis algoritma tidak terlalu penting sebab bila n dinaikkan dua kali semula, misalnya, log n meningkat  sebesar sejumlah tetapan. 
O(n) Algoritma yang waktu pelaksanaannya lanjar umumnya terdapat pada kasus yang setiap elemen masukannya dikenai proses yang sama, misalnya algoritma pencarian_beruntun. Bila n dijadikan dua kali semula, maka waktu pelaksanaan algoritma juga dua kali semula.
O(n log n) Waktu pelaksanaan yang n log n terdapat pada algoritma yang memecahkan persoalan menjadi beberapa persoalan yang lebih kecil,  menyelesaikan tiap persoalan secara independen, dan menggabung solusi masing-masing persoalan. Algoritma yang diselesaikan dengan teknik bagi dan gabung mempunyai kompleksitas asimptotik jenis ini. Bila n = 1000, maka n log n mungkin 20.000. Bila n dijadikan dua kali semual, maka n log n menjadi dua kali semula (tetapi tidak terlalu banyak)
O(n2) Algoritma yang waktu pelaksanaannya kuadratik hanya praktis digunakan untuk persoalana yang berukuran kecil. Umumnya algoritma yang termasuk kelompok ini memproses setiap masukan dalam dua buah kalang bersarang, misalnya pada algoritma urut_maks. Bila n = 1000, maka waktu pelaksanaan algoritma adalah 1.000.000. Bila n dinaikkan menjadi dua kali semula, maka waktu pelaksanaan algoritma meningkat menjadi empat kali semula.
O(n3) Seperti halnya algoritma kuadratik, algoritma kubik memproses setiap masukan dalam tiga buah kalang bersarang, misalnya algoritma perkalian matriks. Bila n = 100, maka waktu pelaksanaan algoritma adalah 1.000.000. Bila n dinaikkan menjadi dua kali semula, waktu pelaksanan algoritma meningkat menjadi delapan kali semula.
O(2n) Algoritma yang tergolong kelompok ini mencari solusi persoalan secara "brute force", misalnya pada algoritma mencari sirkuit Hamilton (lihat Bab 9). Bila n = 20, waktu pelaksanaan algoritma adalah 1.000.000. Bila n dijadikan dua kali semula, waktu pelaksanaan menjadi kuadrat kali semula!
O(n!) Seperti halnya pada algoritma eksponensial, algoritma jenis ini memproses setiap masukan dan menghubungkannya dengan n - 1 masukan lainnya, misalnya algoritma Persoalan Pedagang Keliling (Travelling Salesperson Problem - lihat bab 9). Bila n = 5, maka waktu pelaksanaan algoritma adalah 120. Bila n dijadikan dua kali semula, maka waktu pelaksanaan algoritma menjadi faktorial dari 2n.

Nilai masing-masing fungsi untuk setiap bermacam-macam nilai n


log n n n log n n2 n3 2n n!   
0 1 0 1 1 2 1   
1 2 2 4 8 4 2   
2 4 8 16 64 16 24   
3 9 24 64 512 256 362880   
4 16 64 256 4096 65536 20922789888000   
 5 32 160 1024 32768 4294967296 (terlalu besar )  




Sebuah masalah yang mempunyai algoritma dengan kompleksitas polinomial kasus-terburuk dianggap mempunyai algoritma yang “bagus”; artinya masalah tersebut mempunyai algoritma yang mangkus, dengan catatan polinomial tersebut berderajat rendah. Jika polinomnya berderajat tinggi, waktu yang dibutuhkan untuk mengeksekusi algoritma tersebut panjang. Untunglah pada kebanyakan kasus, fungsi polinomnya mempunyai derajat yang rendah.
Suatu masalah dikatakan tractable (mudah dari segi komputasi) jika ia dapat diselesaikan dengan algoritma yang memiliki kompleksitas polinomial kasus terburuk (artinya dengan algoritma yang mangkus), karena  algoritma akan menghasilkan solusi dalam waktu yang lebih pendek [ROS99]. Sebaliknya, sebuah masalah dikatakan intractable (sukar dari segi komputasi) jika tidak ada algoritma yang mangkus untuk menyelesaikannya. 
Masalah yang sama sekali tidak memiliki algoritma untuk memecahkannya disebut masalah tak-terselesaikan (unsolved problem). Sebagai contoh, masalah penghentian (halting problem) jika diberikan program dan sejumlah masukan, apakah program tersebut berhenti pada akhirnya.
Kebanyakan masalah yang dapat dipecahkan dipercaya tidak memiliki algoritma penyelesaian dalam kompleksitas waktu polinomial untuk kasus terburuk, karena itu dianggap intractable. Tetapi, jika solusi masalah tersebut ditemukan, maka solusinya dapat diperiksa dalam waktu polinomial. Masalah yang solusinya dapat diperiksa dalam waktu polinomial dikatakan termasuk ke dalam kelas NP (non-deterministic polynomial). Masalah yang tractable termasuk ke dalam kelas P (polynomial). Jenis kelas masalah lain adalah kelas NP-lengkap (NP-complete). Kelas masalah NP-lengkap memiliki sifat bahwa jika ada sembarang masalah di dalam kelas ini dapat dipecahkan dalam waktu polinomial, berarti semua masalah di dalam kelas tersebut dapat dipecahkan dalam waktu polinomial. Atau, jika kita dapat membuktikan bahwa salah satu dari masalah di dalam kelas itu intractable, berarti kita telah membuktikan bahwa semua masalah di dalam kelas tersebut intractable. Meskipun banyak penelitian telah dilakukan, tidak ada algoritma dalam waktu polinomial yang dapat memecahkan masalah di dalam kelas NP-lengkap. Secara umum diterima, meskipun tidak terbuktikan, bahwa tidak ada masalah di dalam kelas NP-lengkap yang dapat dipecahkan dalam waktu polinomial. 

Notasi Omega-Besar dan Tetha-Besar

Definisi -Besar adalah:
T(n) = (g(n)) (dibaca “T(n) adalah Omega (f(n)” yang artinya T(n) berorde paling kecil g(n) ) bila terdapat tetapan C dan n0 sedemikian sehingga  
T(n)  C(f (n)) 
untuk  n  n0.
Definisi -Besar,
T(n) = (h(n))  (dibaca “T(n) adalah tetha h(n)” yang artinya T(n) berorde sama dengan h(n) jika T(n) = O(h(n)) dan T(n) = (g(n)).

Contoh: 
Tentukan notasi  dan  untuk T(n) = 2n2 + 6n + 1.
Jawab:
Karena 2n2 + 6n + 1  2n2 untuk n  1, 
           maka dengan C = 2 kita memperoleh
2n2 + 6n + 1 = (n2)
Karena 2n2 + 5n + 1 = O(n2) dan 2n2 + 6n + 1 = (n2), 
          maka 2n2 + 6n + 1 = (n2).
Contoh: 
Tentukan notasi notasi O,  dan  untuk T(n) = 5n3 + 6n2 log n.



Jawab:
Karena 0  6n2 log n  6n3, maka 5n3 + 6n2 log n  11n3 untuk n  1. Dengan mengambil C = 11, maka
5n3 + 6n2 log n = O(n3)

Karena 5n3 + 6n2 log n  5n3 untuk n  1, maka maka dengan mengambil C = 5 kita memperoleh
5n3 + 6n2 log n = (n3) 
Karena 5n3 + 6n2 log n = O(n3) dan 5n3 + 6n2 log n = (n3), maka 5n3 + 6n2 log n = (n3)
Contoh: 
Tentukan notasi notasi O,  dan  untuk T(n) = 1 + 2 + … + n.
Jawab:
1 + 2 + … + n = O(n2) karena 
            1 + 2 + … + n  n + n + … + n = n2 untuk n  1.
1 + 2 + … + n = (n) karena 
            1 + 2 + … + n  1 + 1 + … + 1 = n untuk n  1.
1 + 2 + … + n  n/2 + … + (n – 1) + n
             n/2 + … + n/2 + n/2
            = (n + 1)/2 n/2 
             (n/2)(n/2)
            = n2/4



Kita menyimpulkan bahwa
1 + 2 + … + n = (n2)

Oleh karena itu,
1 + 2 + … + n = (n2)

TEOREMA. Bila T(n) = am nm + am-1 nm-1 + ... + a1n+ a0 adalah polinom derajat m  maka T(n) adalah berorde nm.


BAB IV
KESIMPULAN

Sebuah algoritma tidak saja harus benar, tetapi juga harus mangkus (efisien).
Algoritma yang bagus adalah algoritma yang mangkus. 
Kemangkusan algoritma diukur dari berapa jumlah   waktu dan ruang (space) memori yang dibutuhkan untuk menjalankannya. 
Algoritma yang mangkus ialah algoritma yang meminimumkan kebutuhan waktu dan ruang. 
Kebutuhan waktu dan ruang suatu algoritma bergantung pada ukuran masukan (n), yang menyatakan jumlah data yang diproses. 
Kemangkusan algoritma dapat digunakan untuk menilai algoritma yang terbaik. 

Semoga Bermanfaat :))