Čo je polovica poľa a ako ju určiť?
sobes.tech AI
Odpoveď od AI
Polovica poľa (alebo "medián" poľa, ak je zoradené) je prvok, ktorý, ak je pole zoradené, delí ho na dve časti: prvky menšie alebo rovné mediánu a prvky väčšie alebo rovné mediánu. Ak je počet prvkov párny, medián sa často považuje za aritmetický priemer dvoch stredných prvkov. V kontexte "poloviny poľa" v úlohách na pohovore môže byť tiež myslené hľadanie majoritného prvku, ktorý sa vyskytuje viac ako N/2 krát, kde N je počet prvkov v poli.
Definícia poloviny poľa závisí od kontextu:
-
Medián (pre zoradené pole alebo pri hľadaní k-tého najmenšieho prvku):
- Zoradíme pole.
- Ak je veľkosť
Nnepárna, medián je prvok na indexeN/2. - Ak je veľkosť
Npárna, medián je aritmetický priemer prvkov na indexochN/2 - 1aN/2.
-
Majoritný prvok (prvok, ktorý sa vyskytuje > N/2 krát):
- Používame algoritmus hlasovania Boyera (Boyer–Moore majority vote algorithm).
- Vytvoríme premenné
candidateacount. - Prechádzame prvky poľa. Ak je aktuálny prvok rovný
candidate, zvýšimecount. Ak nie, acount> 0, znížimecount. Ak jecount= 0, aktuálny prvok sa stáva novýmcandidateacountsa nastaví na 1. - Po prvom prechode je
candidatepotenciálnym majoritným prvkom. Pre istotu je potrebné vykonať druhý prechod, aby sa overilo, že sa naozaj vyskytuje viac ako N/2 krát.
Príklad určenia mediánu (v Swift):
// Zoradenie pre nájdenie mediánu
func findMedian(in array: [Int]) -> Double? {
guard !array.isEmpty else { return nil }
let sortedArray = array.sorted()
let n = sortedArray.count
if n % 2 == 1 {
return Double(sortedArray[n / 2])
} else {
return Double(sortedArray[n / 2 - 1] + sortedArray[n / 2]) / 2.0
}
}
Príklad určenia majoritného prvku (v Swift):
// Algoritmus hlasovania Boyera
func findMajorityElement(in array: [Int]) -> Int? {
var candidate: Int? = nil
var count = 0
for element in array {
if count == 0 {
candidate = element
count = 1
} else if element == candidate {
count += 1
} else {
count -= 1
}
}
// Kontrola, či je kandidát naozaj majoritným prvkom
var realCount = 0
if let candidate = candidate {
for element in array {
if element == candidate {
realCount += 1
}
}
if realCount > array.count / 2 {
return candidate
}
}
return nil // Žiadny majoritný prvok
}
Je dôležité sa spýtať na zadávateľa, aký presne typ "poloviny poľa" má na mysli v kontexte úlohy.