Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การหาค่ามัธยฐานสำหรับทุกหน้าต่างใน JavaScript


ค่ามัธยฐาน

ค่ามัธยฐานในวิชาคณิตศาสตร์ ค่ามัธยฐานคือค่ากลางในรายการจำนวนเต็มเรียงลำดับ (เรียงแล้ว)

หากขนาดของรายการเท่ากัน และไม่มีค่ากลาง ค่ามัธยฐานคือค่าเฉลี่ย (ค่าเฉลี่ย) ของค่ากลางทั้งสองค่า

ปัญหา

เราจำเป็นต้องเขียนฟังก์ชัน JavaScript ที่รับอาร์เรย์ของ Integers, arr เป็นอาร์กิวเมนต์แรกและตัวเลข num (num <=length of array arr) เป็นอาร์กิวเมนต์ที่สอง

ตอนนี้ สำหรับแต่ละหน้าต่างของ size num ในอาร์เรย์ arr ฟังก์ชันของเราควรคำนวณค่ามัธยฐานและผลักค่ามัธยฐานนั้นไปยังอาร์เรย์ใหม่และสุดท้ายเมื่อสิ้นสุดการวนซ้ำจะคืนค่าอาร์เรย์มัธยฐานนั้น

ตัวอย่างเช่น หากอินพุตของฟังก์ชันคือ −

const arr = [5, 3, 7, 5, 3, 1, 8, 9, 2, 4, 6, 8];
const num = 3;

จากนั้นผลลัพธ์ควรเป็น −

const output = [5, 5, 5, 3, 3, 8, 8, 4, 4, 6];

คำอธิบายผลลัพธ์:

ดัชนีเริ่มต้น หน้าต่างปัจจุบัน หน้าต่างการเรียงลำดับปัจจุบัน ค่ามัธยฐาน
0 [5, 3, 7] [3, 5, 7] 5
1 [3, 7, 5] [3, 5, 7] 5
2 [7, 5, 3] [3, 5, 7] 5
3 [5, 3, 1] [1, 3, 5] 3
4 [3, 1, 8] [1, 3, 8] 3
5 [1, 8, 9] [1, 8, 9] 8
6 [8, 9, 2] [2, 8, 9] 8
7 [9, 2, 4] [2, 4, 9] 4
8 [2, 4, 6] [2, 4, 6] 4
9 [4, 6, 8] [4, 6, 8] 6

ตัวอย่าง

รหัสสำหรับสิ่งนี้จะเป็น −

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));

คำอธิบายโค้ด:

แนวคิดเบื้องหลังโซลูชันนี้คือการใช้การค้นหาแบบไบนารีเพื่อแทรกตัวเลขที่ถูกต้องและลบตัวเลขด้านซ้ายเมื่อเลื่อนหน้าต่างบานเลื่อนไปทางขวา

ผลลัพธ์

และผลลัพธ์ในคอนโซลจะเป็น −

[5, 5, 5, 3, 3, 8, 8, 4, 4, 6 ]