2012-02-24 1 views
10

Учитывая список n сопоставимых элементов (например, чисел или строк), оптимальный алгоритм для нахождения упорядоченного элемента i занимает O(n) времени.Статистика i-го порядка в Python

Выполняет ли Python изначально O(n) Статистика времени для списков, dicts, sets, ...?

+0

Поблагодарили бы за комментарий от downvoter и closevoter. – Randomblue

ответ

7

Ни одна из упомянутых структур данных Python не реализует алгоритм статистики i-го порядка.

На самом деле, это может не иметь особого смысла для словарей и множеств, учитывая тот факт, что оба не делают никаких предположений о упорядочении его элементов. Для списков не должно быть сложно реализовать selection algorithm, что обеспечивает время работы O (n).

4

Это не является родным решением, но вы можете использовать NumPy-х partition найти -ю статистики порядка к списка в 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: это предполагает нулевую индексацию, то есть «нулевой порядок статистика» выше 0.

+0

Это неточно. После разметки вам нужно найти максимум. Итак, это 'np.partition (np.asarray (x), k) [: k] .max()' – piRSquared

+0

@piRSquared, спасибо. Я думаю, вы интерпретировали его как 1-индексированный, так что я теперь разъяснил это. – Garrett

+0

Моя точка зрения заключается в том, что 'np.partition' не сортируется. Вот в чем смысл и почему это лучше. Тем не менее, поскольку он не сортируется, нет никакой гарантии, что статистика k-го порядка находится в k-й позиции. Я не имею в виду нулевую или одну индексацию. Я имею в виду тот факт, что иногда ваше решение вызывает неправильный ответ. Предположим, мне нужна статистика 5-го порядка из случайного перетасованного набора целых чисел от 0 до 36. В ответе вы получите «1» с моим примером здесь: 'np.random.seed (0); np.partition (np.random.permutation (np.arange (37)), 5) [4] '. И ответ должен быть «4». – piRSquared