YẾU TỐ INTEGER:
Nếu loại yếu tố của bạn là các số nguyên, thì cách tốt nhất là phải có một xô cho mỗi số nằm trong bất kỳ phụ dãy của bạn, trong đó mỗi thùng được sử dụng để đếm số nguyên liên quan của nó được tìm thấy trong các yếu tố đầu vào của bạn (ví dụ: bucket[100]
lưu trữ số lượng 100
s có trong chuỗi đầu vào của bạn). Về cơ bản, bạn có thể đạt được điều đó trong các bước sau:
- tạo nhóm cho mỗi số nằm trong bất kỳ phạm vi con nào của bạn.
- lặp qua tất cả các phần tử, cho mỗi số
n
, nếu chúng tôi có bucket[n]
, thì bucket[n]++
.
- tính trung vị dựa trên các giá trị tổng hợp được lưu trữ trong nhóm của bạn.
Đặt theo cách khác, giả sử bạn có một dải phụ [0, 10]
và bạn muốn tính trung bình. Cách tiếp cận xô về cơ bản tính toán có bao nhiêu 0
s có trong đầu vào của bạn và số lượng 1
có trong đầu vào của bạn, v.v. Giả sử có n
số nằm trong phạm vi [0, 10]
, sau đó trung bình là yếu tố lớn nhất thứ n/2
, có thể được xác định bằng cách tìm các i
mà bucket[0] + bucket[1] ... + bucket[i]
lớn hơn hoặc bằng n/2
nhưng bucket[0] + ... + bucket[i - 1]
là ít hơn n/2
.
Điều tốt đẹp về điều này là ngay cả các yếu tố đầu vào của bạn được lưu trữ trong nhiều máy (tức là trường hợp phân phối), mỗi máy có thể duy trì các nhóm riêng của mình và chỉ các giá trị tổng hợp được yêu cầu để đi qua mạng nội bộ.
Bạn cũng có thể sử dụng nhóm phân cấp, bao gồm nhiều lần chuyền. Trong mỗi lần vượt qua, bucket[i]
đếm số phần tử trong đầu vào của bạn nằm trong một phạm vi cụ thể (ví dụ: [i * 2^K, (i+1) * 2^K]
) và sau đó thu hẹp không gian vấn đề bằng cách xác định xem phương tiện nào sẽ nằm sau mỗi bước, sau đó giảm K
xuống 1
bước tiếp theo và lặp lại cho đến khi bạn có thể xác định chính xác phương tiện.
dấu chấm động YẾU TỐ
Toàn bộ các yếu tố có thể phù hợp với bộ nhớ:
Nếu toàn bộ các yếu tố của bạn có thể phù hợp với bộ nhớ, lần đầu tiên sắp xếp các yếu tố N và sau đó tìm trung vị cho mỗi phạm vi phụ là tùy chọn tốt nhất. The linear time heap solution cũng hoạt động tốt trong trường hợp này nếu số lượng phạm vi con của bạn nhỏ hơn logN
.
Toàn bộ các yếu tố không thể phù hợp với bộ nhớ nhưng lưu trữ trong một máy duy nhất:
Nói chung, một external sort thường đòi hỏi ba đĩa quét. Do đó, nếu số lượng các phạm vi con của bạn lớn hơn hoặc bằng 3, thì trước tiên sắp xếp các phần tử N và sau đó tìm các giá trị trung bình cho mỗi phạm vi phụ bằng cách chỉ tải các phần tử cần thiết từ đĩa là lựa chọn tốt nhất. Nếu không, chỉ cần thực hiện quét cho từng phạm vi phụ và nhận các yếu tố đó trong phạm vi phụ là tốt hơn.
Toàn bộ các yếu tố được lưu trữ trong nhiều máy tính: Kể từ khi việc tìm kiếm trung bình là một nhà điều hành toàn diện, có nghĩa là bạn không thể lấy được trung bình cuối cùng của toàn bộ đầu vào dựa trên trung vị của một số bộ phận của đầu vào, đó là một vấn đề khó khăn người ta không thể mô tả giải pháp của nó trong vài câu, nhưng có những nghiên cứu (xem this làm ví dụ) đã được tập trung vào vấn đề này.
Nếu danh sách được sắp xếp, thì chỉ cần lấy phần tử số 50, 112, 700, v.v ...? – Blorgbeard
Sử dụng thuật toán chọn (http://en.wikipedia.org/wiki/Selection_algorithm) ... có một số thuật toán để chọn. – andand
Danh sách không được sắp xếp. Và tôi chủ yếu quan tâm đến việc tránh trùng lặp công việc trong tìm kiếm trung bình trong phạm vi phụ trùng lặp. – dabei