2012-02-24 27 views
10

Đưa ra danh sách các thành phần có thể so sánh (số hoặc chuỗi), thuật toán tối ưu để tìm phần tử thứ tự i có thời gian là O(n).Thống kê thứ tự thứ i trong Python

Python có thực hiện thống kê O(n) thống kê thứ tự thời gian cho danh sách, dấu trang, bộ, ... không?

+0

Sẽ đánh giá cao nhận xét từ trình gỡ xuống và trình đóng góp. – Randomblue

Trả lời

7

Không có cấu trúc dữ liệu được đề cập nào của Python thực hiện nguyên tắc thuật toán thống kê thứ tự thứ tự.

Thực tế, nó có thể không có ý nghĩa nhiều đối với từ điển và bộ, vì thực tế là cả hai không đưa ra giả định về thứ tự các phần tử của nó. Đối với các danh sách, sẽ không khó để triển khai selection algorithm, cung cấp thời gian chạy O (n).

4

Đây không phải là giải pháp gốc, nhưng bạn có thể sử dụng số partition của NumPy để tìm số k thứ tự thống kê của danh sách trong thời gian O (n).

import numpy as np 
x = [2, 4, 0, 3, 1] 
k = 2 
print('The k-th order statistic is:', np.partition(np.asarray(x), k)[k]) 

EDIT: điều này giả định zero-lập chỉ mục, ví dụ: các "số liệu thống kê theo thứ tự 0" ở trên là 0.

+0

Điều này không chính xác. Sau khi phân vùng, bạn cần tìm mức tối đa. Vì vậy, 'np.partition này (np.asarray (x), k) [: k] .max()' – piRSquared

+0

@piRSquared, cảm ơn. Tôi nghĩ bạn giải thích nó là 1 chỉ mục, vì vậy bây giờ tôi đã làm rõ điều đó. – Garrett

+0

Điểm của tôi là 'np.partition' không phân loại. Đó là điểm của nó và tại sao nó tốt hơn. Điều đó nói rằng, bởi vì nó không được sắp xếp, không có gì đảm bảo rằng thống kê thứ tự thứ k nằm ở vị trí thứ k. Tôi không đề cập đến số không hoặc một chỉ mục dựa trên. Tôi đề cập đến thực tế là đôi khi giải pháp của bạn sẽ tạo ra câu trả lời không chính xác. Giả sử tôi muốn thống kê thứ tự thứ 5 từ một tập hợp ngẫu nhiên các số nguyên từ 0 đến 36. Câu trả lời của bạn tạo ra '1' với ví dụ của tôi ở đây:' np.random.seed (0); np.partition (np.random.permutation (np.arange (37)), 5) [4] '. Và câu trả lời phải là '4'. – piRSquared

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