Median
ค่ากลางของรายการที่เรียงแล้ว หากจำนวนคู่ ให้ค่าเฉลี่ยสองค่ากลาง
ปัญหา
รับอาร์เรย์ arr และขนาดหน้าต่าง num หา median ของทุก sliding window ขนาด num
ตัวอย่าง
const arr = [5, 3, 7, 5, 3, 1, 8, 9, 2, 4, 6, 8]; const num = 3;
ผลลัพธ์: [5, 5, 5, 3, 3, 8, 8, 4, 4, 6]
โค้ดตัวอย่าง (Binary Search + Sorted Window)
const arr = [5, 3, 7, 5, 3, 1, 8, 9, 2, 4, 6, 8]; const num = 3;
const binarySearch = (arr, target, l, r) => {
while (l < r) {
const mid = Math.floor((l + r) / 2);
if (arr[mid] < target) l = mid + 1;
else if (arr[mid] > target) r = mid;
else return mid;
}
if (l === r) return arr[l] >= target ? l : l + 1;
};
const medianSlidingWindow = (arr = [], num = 1) => {
let l = 0, r = num - 1, res = [];
const window = arr.slice(l, num);
window.sort((a, b) => a - b);
while (r < arr.length) {
const median = num % 2 === 0 ? (window[Math.floor(num / 2) - 1] + window[Math.floor(num / 2)]) / 2 : window[Math.floor(num / 2)];
res.push(median);
let char = arr[l++];
let index = binarySearch(window, char, 0, window.length - 1);
window.splice(index, 1);
char = arr[++r];
index = binarySearch(window, char, 0, window.length - 1);
window.splice(index, 0, char);
}
return res;
};
console.log(medianSlidingWindow(arr, num));
คำอธิบาย
ใช้ Binary Search เพื่อ insert/remove ใน sorted window เมื่อเลื่อน sliding window
ผลลัพธ์
[5, 5, 5, 3, 3, 8, 8, 4, 4, 6 ]