Memanfaatkan atribut kelas basis
karena atribut basis kelas pasti terwarisi ke subclass
Memanfaatkan atribut kelas basis
karena atribut basis kelas pasti terwarisi ke subclass
setHeight
bisa tambah method baru
super
untuk meneruskan parameter yang ada dalam kurung ke parent class nya
private int seatHeight
field tambahan yang beda dari Bicycle
elasturunan “is-a” kelas basis
Misal: mountainbike itu isa/kindof bicycle
iterator
inner class
even
genap
Instans inner class hanya exist dalam instansouter class-nya
kita ga mungkin membuat instance inner class tanpa membuat outer class nya
Inner class
jatohnya mirip atribut/method dari outer class
what about this?
ini gabisa karna shapename bukan static
can we do this?
bisa karena classname itu atribut static
Static Nested Class
Kelas ini memiliki akses ke semua metode dan atribut dari outer class, termasuk yang bersifat private. Artinya, inner class dapat menggunakan dan memodifikasi data dari outer class secara langsung.
Static Nested Class:
Secara ringkas, perbedaan utama antara inner class non-static dan static nested class terletak pada aksesibilitas terhadap anggota dari outer class. Inner class non-static memiliki akses penuh, sedangkan static nested class tidak.
static nested class diasosiasikandengan outer class-nya
Static variable/method dimiliki oleh class bukan objek
enkapsulasi
nested class yang berada dalam class hanya dapat dikenali dalam class tersebut tidak bisa dari class luar
NestedClass
kita bisa mendefinisikan kelas dari outer class
ackage-private
default, hanya bisa diakses di package tersebut.
protected
diakses class inheritance package yang sama
Member level
di atributnya
op level: public,package-private
ada satu lagi default.
Top level berarti di tipe class, interface, enum, dll
d.ac.itb.stei.graphic
kalo dari url dibalik
pengelompokkan kelas daninterface ke dalam paket
terus disini di satukan dalam satu package
Contoh Packages
ini sebelum di masukkan ke package
Packages
Ya, package di Java memang mirip dengan konsep library, tapi ada perbedaan penting:
java.util
atau library eksternal seperti Apache Commons.Perbedaan utama: - Package: Fokus pada pengorganisasian kode dalam proyek. - Library: Kumpulan package atau kode yang bisa digunakan kembali di berbagai proyek.
Contoh:
- Package: java.util
(berisi kelas seperti ArrayList
, HashMap
, dll.)
- Library: Apache POI
(digunakan untuk membaca/mengolah file Excel, yang terdiri dari banyak package).
Jadi, package adalah bagian dari library, tapi tidak semua package adalah library. 😊
Relatable
di casting biar method is larger bisa dipanggil lagi.
yg bisa di casting itu kalo implement Relatable
Relatable r = new RectanglePlus()
bisa masuk ke array realatable r[] sebenernya kalo depannya RectanglePlus pun bisa, tapi ini plusnya kalo ditengah tbtb di casting ganti, ex: r = CirclePlus() tetep works
Interface
Di Java, list, linkedlist dll itu pake Interface. Semua metode yang harus ada kaya insert delete dll pake interface di implementasikannya
isLargerThan
Disini itu bisa muncul masalah, RectanglePlus ketika dipanggil ke isLargerThen bisa runtime error kalo parameternya bukan panjang tapi point.
Ganti parameternya dari isLargerThan(Object obj1) jadi (Relatable r1) biar p1 gabisa masuk dan lgsg compile error.
Object
Object biar semua bisa masuk di parameter ini
Relatable
di casting biar method is larger bisa dipanggil lagi
Object
Object biar semua bisa masuk di parameter ini
isUnerLeft
Apa sih perbedaan IsUnerLeft dengan IsSkewLeft?
isUnerLeft
:Contoh:
A
/
B
isUnerLeft(A)
: True, karena A
hanya punya anak kiri (B
).A
/
B
/ \
C D
- isUnerLeft(A)
: Tetap True, karena hanya A
yang dicek, dan A
hanya punya anak kiri (B
), tanpa memperhatikan apa yang ada di bawah B
.
isSkewLeft
:A
/
B
/
C
isSkewLeft(A)
: True, karena semua simpul hanya memiliki anak kiri.
A
/
B
\
C
isSkewLeft(A)
: False, karena B
punya anak kanan (C
).isUnerLeft
: Hanya fokus pada simpul akar dan anak langsungnya (lokal).isSkewLeft
: Mengevaluasi keseluruhan pohon biner secara rekursif, memastikan miring ke kiri sepenuhnya.Penting
WOY BACA HIGHLIGHT IS UNER LEFT
else: delLeft(p↑.left,x)
bisa unerleft/biner, dua duanya punya subpohon kiri maka solusi dijadikan satu
isUnerRight(p): delLeft(p↑.right,x)
kalo unerright gapunya subpohon kiri
DelDaunTerkiri
Basis 1. btw untuk menentukan basis (kondisi dasar) apa yg dipake bisa dikira-kira, berhubungan daun selalu 1 btw
input/output p
input output karena p AKAN BERUBAH
1 + max(depth(p↑.left), depth(p↑.right))
dihiitung tinggi kiri dan kanan, bandingkan mana yg tertinggi, pilih tertinggi lalu tambah 1 (akar)
Tinggi/Kedalaman Pohon
Pakai basis 0
isBiner(p) : → nbLeaf1(p↑.left) + nbLeaf1(p↑.right)
sama aja kaya nb element tapi akar == 0
nbLeaf1
ini baru rekursif, basis 1 karena memang hanya memproses berdasarkan basis 1, basis 0 udh di handle
nbLeaf
ini bukan rekursif karena gaada pemanggilan diri dia sendiri, hanya analisis kasus biasa
0 (utk akar) + Jumlah_daun(pohon kiri) + Jumlah_daun(pohon kanan)
daun itu terujung
isUnerLeft(p) : → 1 + nbElmt(p↑.left)isUnerRight(p): → 1 + nbElmt(p↑.right)isBiner(p) : → 1 + nbElmt(p↑.left) + nbElmt(p↑.right)
Fungsi dibuat seperti ini untuk mencegah NbElmt dengan basis 0.Oke, mari kita sederhanakan penjelasannya.
Dengan kata lain, kita pecah bentuk pohon menjadi 3 kategori supaya fungsi bisa tahu ke mana rekursi harus berjalan (kiri saja, kanan saja, atau kiri dan kanan).
NIL
).Misalkan ada pohon seperti ini:
A
/ \
B C
/
D
D
), langsung hitung dan berhenti.B
).A
), proses keduanya.c
function NbElmt(p: BinTree) -> integer
IF isOneElmt(p) THEN
RETURN 1
ELSE IF unerleft(p) THEN
RETURN 1 + NbElmt(LEFT(p))
ELSE IF unerright(p) THEN
RETURN 1 + NbElmt(RIGHT(p))
ELSE IF isbiner(p) THEN
RETURN 1 + NbElmt(LEFT(p)) + NbElmt(RIGHT(p))
isOneElmt(p)
: Kalau pohon cuma satu simpul, berhenti di situ.unerleft(p)
: Kalau pohon cuma punya anak kiri, hitung akar + rekursi ke kiri.unerright(p)
: Kalau pohon cuma punya anak kanan, hitung akar + rekursi ke kanan.isbiner(p)
: Kalau pohon punya dua anak, hitung akar + rekursi kiri + rekursi kanan.unerleft
, unerright
, dan isbiner
membantu memecah struktur pohon supaya rekursi berjalan dengan aturan basis 1, tanpa kembali ke logika basis 0 (pohon kosong).Pohon Basis-1
Perbedaan utama antara pohon biner basis 0 dan pohon biner basis 1 terletak pada cara definisi kondisi dasar (basis) dalam proses rekursi dan bagaimana pohon tersebut direpresentasikan secara logis dalam setiap operasi. Mari kita perjelas:
Pada basis 0, pohon dianggap kosong jika tidak ada simpul sama sekali. Kondisi berhenti dalam rekursi adalah ketika pohon mencapai kondisi kosong.
IsTreeEmpty(p) == true
(artinya simpul p == NIL
).Pohon Basis 0: Pohon Kosong
-> Tidak ada simpul
Kondisi rekursi:
- Jika pohon kosong, berhenti. - Jika tidak kosong, proses akar, lalu lanjutkan ke sub-pohon kiri dan kanan.
Pada basis 1, pohon dianggap memiliki satu elemen jika hanya ada satu simpul (simpul akar) tanpa sub-pohon kiri dan kanan. Kondisi berhenti dalam rekursi adalah ketika pohon memiliki hanya satu simpul.
isOneElmt(p) == true
(artinya simpul p
adalah akar, dan LEFT(p) == NIL
serta RIGHT(p) == NIL
).** - Proses rekursi berhenti saat mencapai simpul tunggal.**
Pohon Basis 1: Pohon dengan Satu Simpul
A
/ \
NIL NIL
Kondisi rekursi: - Jika pohon hanya memiliki satu elemen, berhenti. - Jika memiliki lebih dari satu elemen, proses akar, lalu lanjutkan ke sub-pohon kiri dan kanan.
| Aspek | Basis 0 | Basis 1 |
|-----------------------|----------------------------------------|----------------------------------------|
| Kondisi Terminasi | IsTreeEmpty(p) == true
| isOneElmt(p) == true
|
| Definisi Kosong | Pohon benar-benar kosong (tidak ada) | Pohon kosong hanya setelah 1 elemen |
| Definisi Rekursif | Pohon kosong atau memiliki simpul akar dan dua sub-pohon basis 0. | Pohon satu elemen, atau akar dengan dua sub-pohon basis 1. |
| Contoh Pohon | Kosong: NIL
| Satu elemen: simpul dengan LEFT = NIL
dan RIGHT = NIL
|
| Penggunaan Rekursi| Berhenti saat pohon kosong | Berhenti saat pohon terdiri dari satu simpul. |
Fungsi menghitung jumlah elemen pohon basis 0:
c
function nbElmt(p: BinTree) -> integer
{ KAMUS LOKAL }
{ ALGORITMA }
IF IsTreeEmpty(p) THEN
RETURN 0
ELSE
RETURN 1 + nbElmt(LEFT(p)) + nbElmt(RIGHT(p))
- Basis 0: Jika pohon kosong (IsTreeEmpty(p)
), kembalikan 0.
- Rekursi berlanjut sampai semua simpul diakses.
Fungsi menghitung jumlah elemen pohon basis 1:
c
function nbElmt(p: BinTree) -> integer
{ KAMUS LOKAL }
{ ALGORITMA }
IF IsTreeEmpty(p) THEN
RETURN 0
ELSE IF isOneElmt(p) THEN
RETURN 1
ELSE
RETURN 1 + nbElmt(LEFT(p)) + nbElmt(RIGHT(p))
- Basis 1: Jika pohon hanya memiliki satu elemen (isOneElmt(p)
), kembalikan 1.
- Rekursi berlanjut jika pohon memiliki lebih dari satu simpul.
Basis 1: jika pohon satu elemen, maka jumlah elemen adalah 1
TIDAK AKAN PERNAH BERTEMU POHON KOSONG
1
akar
postOrder(p↑.left)postOrder(p↑.right)proses(p)
ini urutannya pokonya ngikutin requirement nya aja
proses(p)
proses akar ada di tengah
if isTreeEmpty(p) then { Basis-0 }{ do nothing }
ini tuh berarti kaya kondisi terminasi ya. Penjelasan, Ya, Anda benar! Dalam contoh kode PrintPreOrder
dari PDF, basis 0 bertindak sebagai kondisi terminasi dari proses rekursi. Basis 0 memastikan bahwa traversal berhenti saat mencapai sub-pohon kosong (atau simpul tanpa anak).
PrintPreOrder
Traversal pre-order dilakukan dengan urutan: 1. Proses akar. 2. Traversal sub-pohon kiri. 3. Traversal sub-pohon kanan.
Pada setiap langkah, rekursi dipanggil untuk sub-pohon kiri terlebih dahulu, lalu sub-pohon kanan.
NULL
).NULL
, fungsi atau prosedur rekursi akan berhenti untuk cabang tersebut dan kembali ke level rekursi sebelumnya.NULL
, tidak ada lagi pemanggilan rekursif, sehingga traversal "berbalik" ke simpul di atasnya.PrintPreOrder
Berikut adalah cuplikan kode dari PDF pada halaman 23:
c
procedure PrintPreOrder(p: BinTree)
/* I.S. p terdefinisi */
/* F.S. Semua node pohon dicetak secara pre-order */
{ KAMUS LOKAL }
{ ALGORITMA }
IF NOT IsTreeEmpty(p) THEN
Print(INFO(p)) /* Proses simpul akar */
PrintPreOrder(LEFT(p)) /* Proses sub-pohon kiri */
PrintPreOrder(RIGHT(p)) /* Proses sub-pohon kanan */
IsTreeEmpty(p)
memeriksa apakah simpul p
adalah NULL
. Jika ya, maka traversal untuk simpul ini berhenti (basis 0).Misalkan pohon biner seperti berikut:
A
/ \
B C
/ \
D E
Traversal pre-order: 1. Cetak A. 2. Rekursi ke sub-pohon kiri B: - Cetak B. - Rekursi ke sub-pohon kiri D: - Cetak D. - Basis 0: D tidak memiliki anak, kembali ke B. - Rekursi ke sub-pohon kanan E: - Cetak E. - Basis 0: E tidak memiliki anak, kembali ke B, lalu ke A. 3. Rekursi ke sub-pohon kanan C: - Cetak C. - Basis 0: C tidak memiliki anak.
Hasil pre-order: A, B, D, E, C.
output(p↑.info)
ini proses(p) kalau print pre order
C-D-B-F-G-E-A
mulai dari baris terbawah. C karna gaada subpohon kiri, subpohon kanan maka C doang, lalu pindah ke kanannya (D), terus pindah ke sub pohon kanan
Pohon biner tidak kosong terdiri dari sebuah simpul akar dan dua anakyang salah satunya pasti tidak kosong
pasti sub pohon salah satunya ga kosong, kalo yg basis 0 bisa kosong
Gunakan isUnerLeft, isUnerRight, isBiner untuk memastikan tidakterjadi pemrosesan pada pohon kosong
tidak akan pernah ketemu pohon kosong di basis 1
Basis: pohon biner yang hanya terdiri dari akar {menggunakan predikat isOneElmt}
Basisnya hanya akar doang, kalau IsOneElement(p) == true
deallocTreeNode (input/output p: Address)
dealokasi pohon P
x: ElType
info dari sebuah node
Konstruktor
ada 2 bentuk, fungsi dan prosedur. Perbedaan utama antara fungsi dan prosedur dalam pembuatan pohon biner terletak pada cara mereka mengembalikan hasilnya:
function
):BinTree
sebagai nilai kembalian (return value).Contoh: Pada halaman 15, fungsi Tree
mengembalikan pohon biner yang dibuat dari akar dan dua sub-pohon kiri dan kanan, tanpa memanipulasi argumen input:
c
function Tree(akar: ElType, l: BinTree, r: BinTree) → BinTree
Prosedur (procedure
):
p
atau BinTree
) untuk memberikan hasilnya.CreateTree
memanfaatkan parameter output
untuk memberikan hasil pohon biner:
c
procedure CreateTree(input akar: ElType, input l, r: BinTree, output p: BinTree)
Pendekatan ini membantu membedakan tujuan kode Anda: apakah untuk mendapatkan hasil langsung (immutable seperti fungsi) atau untuk manipulasi lanjutan (mutable seperti prosedur).
input akar: ElType,input l: BinTree, input r: BinTree,output p: BinTree
3 parameter sama, tapi sebagai outputnya kalau tadi berbentuk BinTree kalau ini berbentuk p yang bisa di passing/assign
akar: ElType, l: BinTree, r: BinTree
nanti fungsi Tree akan menyambungkan antara inputan Akar ke subpohon kiri L dan subphon kanan R
procedure
bintree yang dihasilkan di representasikan oleh sebuah parameter output P
function
akan menghasilkan bintree
Address left;Address right
bisa disebut BinTree juga pada dasarnya BinTree di definisikan juga sebagai Address
ADT Pohon Biner
Cara akses nya: Akar(P), Left(P), Right(P)
Address
pointer terhadap sbuah simple
Pohon biner condong kanan
tidak pernah punya subpohon kiri
Pohon biner condong kir
tidak pernah punya subpohon kanan
3 *
anak dari simpul makk 2 gabisa lebih
terdiri atas sebuah simpul yang disebut akar dan dua buah himpunan lainyangdisjoint yang merupakan pohon biner, yang disebut sebagai subpohon kiri dan sub pohon kanan
intinya bisa punya akar yang di dalamnya ada subpohon kiri dan subpohon kanan
Linier
jir
Postfix
dari subpohon kiri, subpohon kanan, lalu akar
Prefix
prefix simbol akar di awal, diikuti subpohon kiri, dan subpohon kanan
Lebar (breadth):maksimum jml simpulpd suatu tingkat
Misal pada level 2 maxnya 2, level 3 maxnya 4
Binaire (binary), maksimum subpohon: 2• N-aire, maksimum subpohon: N
Maksimum sub-pohon = N-aire
elemen yang dibedakan dari yang lain → AKAR
yg paling atas
SubPohon
subpohon kalau diambil sebenernya pohon juga, yang punya akar, dan subpohon juga
Penambahan Relasi Baru
ini berarti untuk MK_DOS
MK_DOS
relasi⟨Dosen, MataKuliah⟩
INI MK_DOS
Relasi sebagai list terpisah
relasi hubungan mengajar dipisah
MataKuliah
Sebuah mata kuliah bisa diajar lebih dari 1 dosen
Dosen
Mendaftarkan anak yang baru lahir
kinerja sama aja
Alternatif-2
kinerja lebih baik
Alternatif-1:
akan memberikan kinerja yg lebih baik untuk fitur ini
if father(anak)=pegawai then
ada kondisional cek apakah ortu nya sama dengan pegawai yang lagi di iterasi
FirstPeg: ListPegFirstAnak: ListAnak
first ada dua biji
father: AdrPeg
ada pointer ke ayah
FirstPeg: ListPeg
FirstPeg menunjuk ke pegawai pertama
List Pegawai
List Pegawai dengan 3 elemen
Kalo ini list anak dan pegawai dipisahkan, list anak akan menunjuk ke list pegawai yang sesuai. Jadi ada dua pointer, satu buat hubungan dan satu buat next.
Regular graphs
REgular graph dan graph lain yang ga ngestate jenis directed/undirected berarti APPLY KE KEDUA JENIS TERSEBUT.
newGraphNode
alokasi node
3
ada 3 node yang masuk ke no 5
0
tidak ada 1 busur yang masuk ke node 1
Latihan Graph
karena simpul ada 5, maka punya leader list yang elemennya ada 5. trailer list itu kotak dua kbawah yang ada 4 dan 1 di paling bawah.
trailer list akan menyatakan seluruh busur yang menghubungkan antara node tersebut ke node yang lain
Simpul dan busur disimpan sebagai objek/record yang memuat informasi tentangsimpul/busur tersebutSetiap simpul menyimpan list dari busur yang terhubung dengannya
meyimpan simpul dan list simpul yang terhubung dengannya
node
jumlah simpul ada 6, maka node ada 6
node
karna banyak node 6, maka matriks nya 6x6
list of nodes
menghasilkan list of node yang berisi daftar simpul yang bertetangga dengan v
v1, v2
parameter
[vs undirected graphs]
kebalikan dari undirected graph (ga ada arah), a->k k->a diasumsikan sama aja
char *s = "(A()())";
contoh string
(*idx)++;
setelah selesai buat phon kanan akan menunjuk kurung tutup, dan harus di advance lagi
BuildTreeFromString(&LEFT(*t),st,idx);BuildTreeFromString(&RIGHT(*t),st,idx);
kalo udh ketemu kurung buka sudah siap memanggil fungsi yang sama dengan parameter left dari T, setelah left terbentuk panggil dengan parameter right
(*idx)++;
maju ke idx slanjutnya, dalam representasi list ini setelah abjad adalah karakter kurung buka,
t = newTreeNode(st[*idx])
ciptakan node dengan abjad yang ditunjuk idx
else
abjad
(*idx)++
mirip ADV
int *idx
idx menunjuk ke index dari string st, index akan berada di awal string. seiring dipanggilnya void yg sama, idx bergerak ke kanan dan pohon dibangun secara rekursif
char *st
string yg digunakan
start
yg tadi ya jadi diluar build tree
BuildTree(&(LEFT(*t)));BuildTree(&(RIGHT(*t)))
akan memanggil prosedur yg sama dengan parameter Left dari T dan setelah selesai untuk Right dari T.
else
abjad
BuildTree
start mesin karakter akan dipanggil oleh prosedur yang memanggil build tree (di kode lain sblm fungsi ini)
Struktur data yang digunakan adalah tree biasa (tidak memerlukan pointer keBapak)
dalam typedef gaada parent: Address
*t = ptr;
currentParrent == Nil artinya ptr akan menjadi akar dari pohon kita
currParent != NIL
awal pembangunan pohon
currParent = PARENT(CurrParent);
naik
if (c1 != '(') {
sebenarnya sudah selesai dengan subpohon kanan, waktunya naik
insKi = ( c1 != ')')
kondisi insertkiri, C1 != ')' kalo kanan berarti sama dengan
default
abjad
insKi
apakah node akan disisipkan sebagai subpohon kiri atau subpohon kanan
ElType x
valuenya x
newTreeNode
alokasi
dibutuhkan informasi karakter sebelumnya → karena itu digunakan mesin couple (C1, CC)
jadi ada dua window di mesin karakter (mesin couple)
parent: Address
TAMBAHAN
(K()())))
BARIS KEDUA
(J()()))
subpohon kanan DIBARIS KEDUA
Contoh - 2IF2110/IF2111 Pohon Biner (Bagian 2) 15(A(B(C(D()())(E()()))
pokonya kalo baris pertama selalu kiri, max ada 2 baris dan di baris kedua itu sub pohon kanan
(C()())
subpohon kanan A
(B()())
subphon kiri A
()
sub phon kanan kosong
()
subpohon kiri kosong
q↑.info.count ← p↑.info.count
janlup ini juga
q↑.info.key ← p↑.info.key { salin info p ke q }
ketika dah ditemukan anak terbesar
p↑.right NIL: delNode(p↑.right)
supaya dapat anak terbesar
delNode(q↑.left)
akan mencari anak terbesar dari subpohon kiri yang dimiliki oleh q
isUnerLeft(q) : p ← q↑.left
q punya subpohon kiri, set p jadi kiri dari q (anak dari subpohon kiri dari q akan dimasukkan kedalam p)
isUnerRight(q): p ← q↑.right
q punya subpohon kanan, set p jadi right dari q (anak dari subpohon kanan dari q akan dimasukkan kedalam p)
depend on q
cek apakah q dgn kondisi dibawah
isOneElmt(q) : p ← NIL
kalo daun, set p jadi NIL
x.key < p↑.info.key : delBTree(p↑.left, x)
kiri mas
input x: ElType
node yang akan dihapus
DelBTree(p,10)
copy nilai 8 ke 10 lalu hapus node 8
DelBTree(p,5)
sama, node 3 dicopy ke posisi 5, lalu yg node 3 dihapus
DelBTree(p,15)53 813181013
lebih rumit karena 13 harus dipindah menggantikan posisi node bervalue 15, caranya 1. copy nilai node 13 ke 15 2. hapus node 13
x.key < p↑.info.key : insSearchTree(x, p↑.left)x.key > p↑.info.key : insSearchTree(x, p↑.right)
p itu akar, kiri kalo lebih kecil dari p, kanan kalo lebih gede dari p
x.key = p↑.info.key : p↑.info.count ← p↑.info.count + 1
kalo sama (muncul lebih dari sekali) count di increment
input x: ElType
value dari node
insSearchTree
melakukan insert node pada BST
Banyak kemunculan suatunilai key disimpan dalam field “count”
kalau key muncul > 1 ada field count yang akan mencatat banyaknya kemunculan nilai tersebut
Nilai simpul (key)
value
• semua simpul pada subpohon kiri < Akar p• semua simpul pada subpohon kanan >= Akar p
urutan isi elmen itu kiri < akar <= kanan
Subpohon kiri dan subpohon kanan merupakan BST
jadi definisi rekursif
p
pohon biner
p↑.left ← l; p↑.right ← r
Menyambungkan dengan elemen akar yang dibuat setelah subpohon terbuat
nR ← n – nL - 1
if (p NIL)
alokasi berhasil
nL, nR
banyak node di sisi kiri L dan sisi kanan R
if (n = 0) then { Basis-0 }
basis0
n: integer
banyak node yang akan dibuat
Zone yang dibebaskan berada di tengah list, di antara elemen KIRI dan KANAN:KIRI dan KANAN digabung → salah satu di-delete, lainnya di-updateDi tengah KIRI dan KANAN, tapi tidak bersambung → insert elemen baru di antara KIRIdan KANANTerletak sesudah elemen KIRI → update KIRITerletak sebelum elemen KANAN → update KANAN
apa ini lek
mengubah
apa
mengubah
maksud mengubah apa?
input X:
banyak blok yang di kosongkan
input IAw: integer
indeks awal yang akan dijadikan kosong
Best Fit
beda sama FF di case C yaitu yang di dealokasi yang <17,3> karena better (Sama dengan)
else Set IAw = 0
ini kalo ga nemu samsek
a. jika jumlah blok kontigu sama dengan X, hapus elemen listkosong tersebut,b. jika jumlah blok kontigu lebih besar dari X, update elemenlist kosong tersebut.
intinya bedanya FF dan BF itu kalo FF lgsg stop pas nemu yang fit kalo BF dibandingin dulu lalu dipilih yang terbaik untuk fit
Best Fit
cari sluruh elemen kosong di block apakah ada yang memenuhi syarat >= x, kalo gaada yg mendekati x aja
Alokasi
IAw dengan Aw(P)
Akses isian alamat Aw(P) (harusnya index)
lse { lebih besar: update zone kosong }Update Nb(P) dan Aw(P)
Nb(P) = Nb(P) - x * Aw(P) di set karena ketemu* *
update elemen list kosong tersebut
update ukuran tsb - x
1 NB
bentuk utama list berkait (satu kesatuan dianggap zone). ketika diawal karena semua kosong jadi <1,NB> (nb semua blok kosong) <blok ke berapa, jmlh blok kosong>
Nb
banyak blok dalam zone kosong
Aw
indeks awal
ZB
tipe block untuk sebuah zone
List zone kosong
ISINYA LIST ZONE KOSONG AJA, tiap zone akan jadi elemen list
Rep. Berkait – Blok Kosong
BEDANYA YANG DISIMPAN ITU HANYA BLOK KOSONG NYA
Traversal untuk mengelompokkan KOSONG di kiri dan ISI di kanan denganmenukarkan dua elemen
jadi kaya swap, kosong bakal dituker ke kiri, yang true otomatis ke kumpul ke kanan
Traversal untuk mencacah banyaknya blok kosong, misalnya NKosong
cari dulu berapa banyak NKosong
if blok pertama zone kosong thenHitung banyaknya blok dlm zone kosong tsb.
hitung banyak block kosong per zona kosong
semua blok diperiksa atau blok berukuran = X
beneran cari traversal ke seluruh blok sampe ada yg sama atau mendekati ke X
NKosong X
intinya kalo dah ketemu yg cukup lgsg gas
Alokasi dilakukan pada zone yang memenuhi syarat yang pertama kali ditemukan
begitu ketemu sama zone yang sesuai dengan yang diharapkan (ada aja yg kosong, misal X 5 dan zonenya tersedia), langsung pake zone tersbut untuk di alokasikan. tanpa ada pengecekan mana yg paling ok (efisien)
output IAw: integer
IAw (indeks awaL) merupakan alamat indeks awal dari memori yg berhasil di alokasikan
input X: integer
menyatakan banyaknya blok yang akan di alokasikan
NB: integer = 100
banyak blok memori
InitMem
blok kosong yg false smua (kondisi awal)
Alokasi dan dealokasi memori menyebabkan perubahan terhadap zone bebas
Alokasi: mengurangi zone bebas Dealokasi: menambah zone bebas
Memori
jadi kalo ada request 2 blok bakal cari emang exact 2 blok (kalo 4 blok diambil 2 doang gaakan mau karena bakal ga efisien dan ngerusak selanjutnya) jadi dicari yang eksak sama. (ini bestfit)
yg langsung ketemu di awal (firstfit)
best bakal iterasi sampe ujung kalo first yaudah sampe yang ada fit doang
ama dengan untuk representasi kontigu
isinya loop yg berisi pilihan dan user milih mau make operasi yang mana
populatePol
mengisi dengan 0
insertLast
buat sisip elemen
function newSuku () → Address { Alokasi sebuah suku }procedure deallocSuku (input/output pt: Address) { Dealokasi sebuah suku }
Alokasi dan dealokasi
Polinom: Address
menunjuk ke suku pertama
FIRST(p)NEXT(pt)DEGREE(pt)COEF(pt)
TANYAIN DAH KAPAN BISA PAKE MAKRO GINI KAPAN HARUS ->
pt↑.nextpt↑.degreept↑.coef
GOBLOK WKWK TERNYATA PANAH KE ATAS KHUSUS TIPE DATA ADDRESS
Tabel
kontigu/array
list P1 dibentuk dengan penyisipan elemen terakhir,
insertLast