Answer of Exercise For Midterm Exam - En.id
Answer of Exercise For Midterm Exam - En.id
Answer of Exercise For Midterm Exam - En.id
NAMA GRUP
PEMBALAS
ANGGOTA
Nama1 (NIM)
Nama2 (NIM)
Nama3 (NIM)
DEPARTEMEN INFORMATIKA
FAKULTAS TEKNOLOGI INDUSTRI
UNIVERSITAS AHMAD DAHLAN
APRIL 2021
Petunjuk:
1. Lakukan tugas sebagai kelompok. Anggota maksimal grup adalah 3 siswa.
2. Tulis jawabannya di kotak jawaban. Anda dapat mengetik jawaban secara langsung
atau menggunakan jawaban tulisan tangan - pindai / tangkap - potong - sisipkan sebagai
gambar - masukkan ke dalam kotak jawaban.
3. Serahkan sebelum tenggat waktu. Jika Anda bekerja sebagai kelompok maka
perwakilan kelompok harus menyerahkan pekerjaan tersebut.
4. Tanyakan jika Anda memiliki pertanyaan.
Studi kasus
Hari ini, jembatan akan dibuka sehingga N
kapal bisa lewat di bawahnya. Namun karena
jembatan ini sudah cukup tua sehingga
proses untuk membuka jembatan akan
memakan waktu cukup lama. Semua kapal
yang ingin melewati jembatan perlu
menginformasikan ketinggiannya kepada
petugas jaga jembatan.
Pertanyaan
Bagilah dan Taklukkan Algoritma
1. Petugas jaga jembatan punya ide untuk membiarkan kapal lewat meski jembatan masih
belum dibuka sepenuhnya. Mereka memerintahkan kapal dengan ketinggian yang lebih
rendah untuk pergi terlebih dahulu kemudian diikuti oleh kapal yang lebih tinggi dan
seterusnya. Dengan cara ini selama proses pembukaan jembatan, kapal masih bisa
melewatinya dengan lancar. Tuliskan solusi untuk masalah ini menggunakan algoritma
divide and conquer. Tulis nama algoritma, notasi algoritma untuk menyelesaikan kasus
ini, dan analisa kompleksitas waktu dan notasi big-O!
Menjawab:
Nama algoritme:
Misalnya, Anda dapat menggunakan merge sort untuk mengurutkan kapal dalam urutan
menaik.
Asumsikan kapal memiliki atribut nama dan tinggi.
Notasi algoritma:
PROSEDUR MergeSort (INPUT / OUTPUT ship_data: array [1… N] kapal, index_left,
index_right: integer)
Deskripsi
JIKA index_left <index_right MAKA
index_middle ← (indeks_left + index_right) / 2
PROSEDUR Gabungkan (INPUT / OUTPUT ship_data: array [1… N] dari kapal, index_left,
index_middle, index_right: integer)
Pernyataan
i, j, k, ndata_left, ndata_right: integer
data_left, data_right: susunan kapal
Deskripsi
ndata_left ← index_middle - index_left + 1
ndata_right ← index_right - index_middle
UNTUK i ← 0 UNTUK ndata_left LAKUKAN
data_left [i] ← data_kapal [index_left + i]
UNTUK i ← 0 UNTUK ndata_right LAKUKAN
data_right [i] ← data_kapal [index_middle + i + 1]
i ← 0, j ← 0, k ← index_left
WHILE (i <ndata_left AND j <ndata_right) DO
JIKA (data_left [i] .height <= data_right [j] .height) MAKA
data_kapal [k] ← data_left [i]
i←i+1
LAIN
data_kapal [k] ← data_right [j]
j←j+1
BERAKHIR JIKA
SELESAI
Deskripsi:
MergeSort (data_kapal, 0, N-1)
tulis (data_kapal)
Notasi Big-O:
Jadi 𝑇 (𝑛) = 𝑛𝑎 + 𝑐𝑛 log (𝑛) = 𝑂 (𝑛 log (𝑛))
Jawab:
Nama algoritme:
Misalnya Anda dapat menggunakan pencarian biner untuk menemukan kapal X dalam array
kapal yang diurutkan
Asumsikan kapal memiliki atribut nama dan tinggi.
Notasi algoritma:
FUNGSI BinarySearch (INPUT ship_data: larik [1… N] kapal, X: kapal): integer
Pernyataan:
ditemukan_id: boolean
index_low, index_high, index_mid: integer
Deskripsi:
is_found ← false
index_low ← 1
index_high ← N
WHILE (is_found = false AND index_low ≤ index_high) LAKUKAN
index_mid ← (index_low + index_high) / 2
JIKA (data_kapal [index_mid] .height = X.height) MAKA
is_found ← benar
JIKA LAINNYA (X.height <ship_data [index_mid)
index_high ← index_mid - 1
LAIN
index_low ← index_mid + 1
BERAKHIR JIKA
SELESAI
IF is_found = false MAKA KEMBALI -1
KEMBALI LAGI index_mid
BERAKHIR JIKA
Deskripsi:
MergeSort (data_kapal, 0, N-1)
index_ship ← BinarySearch (data_kapal, X)
JIKA index_ship> = 0 MAKA
tulis (ship_data [index_ship)
LAIN
tulis ("kapal tidak ditemukan")
Notasi Big-O:
Kasus terbaik, ketika T_min (n) = 1 = O (1)
Kasus terburuk, ketika T_max (n) = log (n)
Contoh:
Program Demo jika Anda ingin mencoba algoritma dengan beberapa contoh acak
#include <iostream>
#include <string>
#include <stdlib.h>
#include <time.h>
class Ship {
pribadi:
nama string;
tinggi int;
publik:
Kapal();
Kapal (nama string, tinggi int);
string getName ();
int getHeight ();
};
Kapal :: Kapal () {}
Ship :: Ship (nama string, tinggi int) {
ini-> nama = nama;
ini-> tinggi = tinggi;
}
string Ship :: getName () {return this-> name; }
int Ship :: getHeight () {return this-> height; }
int i = 0, j = 0, k = indexLeft;
while (i <numDataLeft && j <numDataRight) {
if (dataLeft [i] .getHeight () <= dataRight [j] .getHeight ()) {
listShip [k] = dataLeft [i];
i = i + 1;
}
lain {
listShip [k] = dataRight [j];
j = j + 1;
}
k = k + 1;
}
sementara (i <numDataLeft) {
listShip [k] = dataLeft [i];
i = i + 1;
k = k + 1;
}
while (j <numDataRight) {
listShip [k] = dataRight [j];
j = j + 1;
k = k + 1;
}
}
void MergeSort (Ship * listShip, int indexLeft, int indexRight) {
if (indexLeft <indexRight) {
int indexMiddle = (indexLeft + indexRight) / 2;
// membuat N objek kapal secara acak dengan nama dan tinggi acak
Ship * listShip = Kapal baru [N];
cout << "Data Pengiriman Acak: \ n";
cout << "Indeks" << "\ t" << "Nama Kapal" << "\ t" << "Tinggi Kapal" << "\ n";
untuk (int i = 0; i <N-1; i ++) {
string shipName = "Ship" + to_string (i + 1);
int shipHeight = rand ()% 20 + 5;
listShip [i] = Kapal (shipName, shipHeight);
cout << i << "\ t" << listShip [i] .getName () << "\ t \ t"
<< listShip [i] .getHeight () << "\ n";
}
listShip [N-1] = Kapal ("Ship5", 20);
cout << N-1 << "\ t" << listShip [N-1] .getName () << "\ t \ t"
<< listShip [N-1] .getHeight () << "\ n \ n";