Halo, kali ini saya akan sharing bagaimana menyelesaikan dan mengoptimalkan suatu persoalan sederhana dalam alogritma dan struktur data yaitu Find Max.
Disuatu sekolah terdapat 34 siswa yang telah melaksanakan ujian semester, lalu ibu x ingin mencoba mencari nilai terbanyak yang muncul dari hasil yang ujian ke 34 siswanya tersebut. Carilah jumlah nilai terbanyak yang muncul dari hasil yang ujian tersebut.
list/array yang bertipe int.list/array berada pada kisaran 0 - (n-1).list/array diberikan tidak berurutan.Lakukan Pencarian secara menyeluruh atau dengan teknik Bruteforce, cek setiap elemen dalam list dan cari berapa banyak nilai tersebut muncul dalam list. Pantau terus count dan kemudian cek jika jumlah elemen atau count nya lebih besar dari besar maxCount maka ganti nilai dari maxCount. Gunakan 2x perulangan, perulangan pertama untuk memilih elemen yang ingin di cek dan loop kedua untuk menghitung jumlah kemunculan elemen tersebut.
func FindMaxCount(data []int) int {
size := len(data)
max := data[0]
count := 1
maxCount := 1
for i := 0; i < size; i++ {
count = 1
for j := i + 1; j < size; j++ {
if data[i] == data[j] {
count++
}
}
if count > maxCount {
max = data[i]
maxCount = max
}
}
return max
}Dengan Menggunakan cara diatas maka didapatkan :
Untuk mengunakan cara 2 ini kita harus mengurutkan terlebih dahulu list/array yang diberikan. sehingga kita dapat melakukan hanya sekali perulangan untuk mendapatkan jumlah nilai terbanyak.
func FindMaxCount(data []int) int {
size := len(data)
max := data[0]
maxCount := 1
curr := data[0]
currCount := 1
sort.Ints(data) // Urutkan data
for i := 1; i < size; i++ {
if data[i] == data[i-1] {
currCount++
} else {
currCount = 1
curr = data[i]
}
if currCount > maxCount {
maxCount = max
max = curr
}
}
return max
}Dengan Menggunakan cara diatas maka didapatkan :
Cara ini hanya bisa dilakukan ketika kita mengetahui jangkuan nilai dari nilai yang diberikan. Jika telah mengetahui nilai elemen berada pada jangkuan 0 - (n-1) maka kita dapat membuat suatu list/array baru yang memiliki panjang yang sama dengan jangkuannya. Lalu kita hanya perlu melakukan sekali perulangan untuk mendapatkan nilai yang sering muncul.
Jika nilai jangkuan atau range dari suatu
list/arraytelah diketahui maka itu adalah cara tercepat mendapatkan nilai yang sering muncul dalam suatulist/array.
func FindMaxCount(data []int, rangeOfData int) int {
size := len(data)
max := data[0]
maxCount := 1
count := make([]int, r)
for i := 1; i < size; i++ {
count[data[i]]++
if count[data[i]] > maxCount {
maxCount = count[data[i]]
max = data[i]
}
}
return max
}Dengan Menggunakan cara diatas maka didapatkan :
count = Time Complexity O (1)list/array dari count = Space Complexity o(n)Sekian sharing saya kali ini, jika ada salah kata maupun penjelasannya masih kurang baik mohon dimaafkan.