Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมหาค่าเฉลี่ย (Mean) และค่ามัธยฐาน (Median) ของอาร์เรย์ไม่เรียงลำดับใน C++

ได้รับอาร์เรย์ที่ไม่ได้เรียงลำดับ งานคือคำนวณค่าเฉลี่ย (Mean) และค่ามัธยฐาน (Median)

ค่าเฉลี่ย (Mean)

ผลรวมของทุกค่า หารด้วยจำนวนค่า

Mean = (Σ arr[i]) / n

ค่ามัธยฐาน (Median)

ค่ากึ่งกลางของข้อมูลที่เรียงลำดับแล้ว

  • n คี่: ค่าตำแหน่ง (n-1)/2 (0-indexed) หรือ n/2 (integer division)
  • n คู่: ค่าเฉลี่ยของตำแหน่ง n/2 - 1 และ n/2

ตัวอย่าง

ตัวอย่างที่ 1

Input: arr[] = {3, 5, 2, 1, 7, 8}

Sorted: {1, 2, 3, 5, 7, 8}

Mean: (3+5+2+1+7+8)/6 = 26/6 = 4.33333

Median: (3+5)/2 = 4

ตัวอย่างที่ 2

Input: arr[] = {1, 3, 4, 2, 6, 5, 8, 7}

Sorted: {1, 2, 3, 4, 5, 6, 7, 8}

Mean: 36/8 = 4.5

Median: (4+5)/2 = 4.5

ตัวอย่างโค้ด (Modern C++)

#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;

double mean(const vector<int>& arr) {
    long long sum = 0;
    for (int x : arr) sum += x;
    return static_cast<double>(sum) / arr.size();
}

double median(vector<int> arr) {  // pass by value เพื่อ sort ได้
    sort(arr.begin(), arr.end());
    int n = arr.size();
    if (n % 2 == 1) {
        return arr[n / 2];
    } else {
        return (arr[n/2 - 1] + arr[n/2]) / 2.0;
    }
}

int main() {
    vector<int> arr = {3, 5, 2, 1, 7, 8};
    
    cout << fixed << setprecision(5);
    cout << "Mean: " << mean(arr) << endl;
    cout << "Median: " << median(arr) << endl;
    
    return 0;
}

ผลลัพธ์

Mean: 4.33333
Median: 4.00000

การจัดการข้อมูลขนาดใหญ่ (Large Data)

หากอาร์เรย์ใหญ่มาก (ไม่พอ RAM) หรือเป็น Stream:

  • Mean: คำนวณออนไลน์ได้ (Running average)
  • Median: ต้องใช้ Two Heaps (Max-heap + Min-heap) หรือ Order Statistics Tree (Policy-based data structure)

Median แบบ Online (Two Heaps)

class MedianFinder {
    priority_queue<int> maxHeap;  // ครึ่งล่าง
    priority_queue<int, vector<int>, greater<int>> minHeap;  // ครึ่งบน
public:
    void addNum(int num) {
        maxHeap.push(num);
        minHeap.push(maxHeap.top()); maxHeap.pop();
        if (maxHeap.size() < minHeap.size()) {
            maxHeap.push(minHeap.top()); minHeap.pop();
        }
    }
    double findMedian() {
        if (maxHeap.size() > minHeap.size()) return maxHeap.top();
        return (maxHeap.top() + minHeap.top()) / 2.0;
    }
};

สถิติอื่นๆ ที่เกี่ยวข้อง

ความซับซ้อน

  • เวลา: O(n log n) – จากการเรียงลำดับ (Median)
  • พื้นที่: O(n) – หาก copy array, O(1) หาก sort in-place
สถิติสูตร/วิธี
Modeค่าที่เกิดบ่อยที่สุด (ใช้ Hash Map นับ)
RangeMax - Min
VarianceΣ(x-μ)²/n
Standard Deviation√Variance