2010-09-11 87 views
8

Tôi đã tự hỏi nếu nó có thể tìm thấy giá trị trung bình của một mảng? Ví dụ, giả sử tôi có một mảng có kích thước chín. Nó có thể tìm thấy khe giữa của mảng này?Tìm giá trị trung bình của một mảng?

+2

Điều đó sẽ khá tầm thường nếu bạn biết gì về xử lý mảng. Lưu ý rằng trừ khi mảng được sắp xếp, vị trí giữa không phải là trung vị. Đây có phải là bài tập về nhà không? – teukkam

+2

Java hoặc C++? Chọn một. Và "giá trị trung bình" và "khe giữa" không giống nhau, hãy chọn một. – GManNickG

Trả lời

21

Giả sử các mảng x được sắp xếp và có chiều dài n:

Nếu n là số lẻ thì trung bình là x [(n-1)/2].
Nếu n thậm chí là trung bình là (x [n/2] + x [(n/2) -1])/2.

+0

Điều này sẽ mất thời gian o (nlogn) ít nhất. – VishAmdi

1
vector<int> v; 
size_t len = v.size; 
nth_element(v.begin(), v.begin()+len/2,v.end()); 

int median = v[len/2]; 
4

Trong java:

int middleSlot = youArray.length/2; 
yourArray[middleSlot]; 

hoặc

yourArray[yourArray.length/2]; 

trong một dòng.

Điều đó có thể vì trong mảng java có kích thước cố định.

Lưu ý:3/2 == 1


Resources:

+1

Câu trả lời của bạn sai. Ví dụ: hãy xem xét một mảng có hai phần tử: 3 và 75. Câu trả lời của bạn cho số trung vị là 75. – Turtle

+3

* trung bình của {3, 75} là gì? –

+3

Điểm trung bình của 3 và 75 là 39 – Mason

0

Câu trả lời Java ở trên chỉ hoạt động nếu có một số tiền lẻ số ở đây là câu trả lời tôi nhận được cho giải pháp:

if (yourArray.length % 2 == 0){ 

    //this is for if your array has an even ammount of numbers 
    double middleNumOne = yourArray[yourArray.length/2 - 0.5] 
    double middleNumTwo = yourArray[yourArray.length/2 + 0.5] 
    double median = (middleNumOne + middleNumTwo)/2; 
    System.out.print(median); 

}else{ 

    //this is for if your array has an odd ammount of numbers 
    System.out.print(yourArray[yourArray.length/2];); 
} 

Và lưu ý rằng đây là bằng chứng về khái niệm và tắt. Nếu bạn nghĩ rằng bạn có thể làm cho nó nhỏ gọn hơn hoặc ít chuyên sâu hơn, hãy tiến lên phía trước. Xin đừng chỉ trích nó.

6

Nếu bạn muốn sử dụng bất kỳ thư viện bên ngoài nào tại đây là Apache commons math library sử dụng, bạn có thể tính toán Median.
Đối với phương pháp hơn và sử dụng take nhìn vào API documentation

import org.apache.commons.math3.*; 
..... 
...... 
........ 
//calculate median 
public double getMedian(double[] values){ 
Median median = new Median(); 
double medianValue = median.evaluate(values); 
return medianValue; 
} 
....... 

Tính trong chương trình

Nói chung, trung bình được tính bằng cách sử dụng sau đây hai công thức given here

Nếu n là số lẻ thì giá trị trung bình (M) = giá trị của ((n + 1)/2) mục thứ.
Nếu n là thậm chí sau đó trung bình (M) = giá trị của [((n)/2) hạn mục thứ + ((n)/2 + 1) hạn mục thứ]/2

Nó rất dễ dàng như bạn có 9 yếu tố (số lẻ).
Tìm phần tử trung gian của một mảng.
Trong chương trình của bạn, bạn có thể khai báo mảng

//as you mentioned in question, you have array with 9 elements 
int[] numArray = new int[9]; 

thì bạn cần phải sắp xếp mảng sử dụng Arrays#sort

Arrays.sort(numArray); 
int middle = numArray.length/2; 
int medianValue = 0; //declare variable 
if (numArray.length%2 == 1) 
    medianValue = numArray[middle]; 
else 
    medianValue = (numArray[middle-1] + numArray[middle])/2; 
0

Có thay thế khác - nói chung, những gợi ý ở đây, hoặc đề nghị phân loại các mảng sau đó lấy trung bình từ một mảng như vậy hoặc dựa vào giải pháp thư viện (bên ngoài). Các thuật toán sắp xếp nhanh nhất hiện nay là linearithmic, nhưng có thể làm tốt hơn các thuật toán tính trung bình.

Thuật toán nhanh nhất để tính trung bình từ một mảng chưa được phân loại là QuickSelect, trong đó, trung bình, tìm số trung bình theo tỷ lệ thời gian với O (N). Thuật toán lấy mảng làm đối số, cùng với giá trị int k (thống kê đơn hàng, tức là phần tử nhỏ nhất thứ k trong mảng). Giá trị của k, trong trường hợp này, chỉ đơn giản là N/2, trong đó N là chiều dài mảng.

Thực hiện hơi khó để có được quyền nhưng đây là một ví dụ dựa trên giao diện Comparable<T>Collections.shuffle() mà không có bất kỳ phụ thuộc bên ngoài nào.

public final class QuickSelectExample { 

    public static <T extends Comparable<? super T>> T select(T[] a, int k) { 
     if (k < 1) throw new IllegalStateException("Invalid k - must be in [1, inputLength]."); 
     if (k > a.length) throw new IllegalStateException("K-th element exceeds array length."); 
     Collections.shuffle(Arrays.asList(a)); 
     return find(a, 0, a.length - 1, k - 1); 
    } 

    private static <T extends Comparable<? super T>> T find(T[] a, int lo, int hi, int k) { 
     int mid = partition(a, lo, hi); 

     if (k == mid) return a[k]; 
     else if (k < mid) return find(a, lo, mid - 1, k); // search left subarray 
     else if (k > mid) return find(a, mid + 1, hi, k); // search right subarray 
     else throw new IllegalStateException("Not found"); 
    } 

    private static <T extends Comparable<? super T>> int partition(T[] a, int lo, int hi) { 
     T pivot = a[lo]; 
     int i = lo + 1; 
     int j = hi; 

     while (true) { // phase 1 
      while (i <= hi && (less(a[i], pivot) || eq(a[i], pivot))) // is a[i] >= pivot? 
       i++; 

      while (j >= i && !less(a[j], pivot)) // is a[j] <= pivot? 
       j--; 

      if (i >= j) break; 
      exch(a, i, j); 
     } 
     exch(a, lo, j); // phase 2 
     return j; 
    } 

    private static <T extends Comparable<? super T>> boolean less(T x, T y) { 
     return x.compareTo(y) < 0; 
    } 

    private static <T extends Comparable<? super T>> boolean eq(T x, T y) { 
     return x.compareTo(y) == 0; 
    } 
} 

Mã này tạo ra số liệu thống kê theo thứ tự sau đây cho các mảng đầu vào:

  "     Input Array     |               Actual Output [format: (index k -> array element)]               ", // 
      "             |                                          ", // 
      "  [S, O, R, T, E, X, A, M, P, L, E]   |       [(1 -> A), (2 -> E), (3 -> E), (4 -> L), (5 -> M), (6 -> O), (7 -> P), (8 -> R), (9 -> S), (10 -> T), (11 -> X)]       ", // 
      " [P, A, B, X, W, P, P, V, P, D, P, C, Y, Z] |   [(1 -> A), (2 -> B), (3 -> C), (4 -> D), (5 -> P), (6 -> P), (7 -> P), (8 -> P), (9 -> P), (10 -> V), (11 -> W), (12 -> X), (13 -> Y), (14 -> Z)]   " // 
0

Do nó trong một dòng giống như một pro:

return (arr[size/2] + arr[(size-1)/2])/2; 

cast đến một double nếu bạn mong đợi một số double, v.v.

Các vấn đề liên quan