Лучшая распределенная файловая система для товарной [закрытой] фермы устройства хранения данных Linux

ответ don.neufeld очень хорош, но я, вероятно, объяснил бы это в двух частях: во-первых, существует грубая иерархия O (), в который падает большинство алгоритмов. Затем можно посмотреть на каждого из тех для предложения эскизов того, что типичный делают алгоритмы той временной сложности.

Практически, единственные O (), которые когда-либо, кажется, имеют значение:

  • O (1) "постоянное время" - требуемое время независимо от размера входа. Как грубая категория, я включал бы алгоритмы, такие как поиски хеша и Нашел бы объединение здесь, даже при том, что ни один из тех не на самом деле O (1).
  • O (журнал (n)) "логарифмический" - это становится медленнее, как Вы получаете большие исходные данные, но после того как Ваш вход становится довольно большим, он не изменится достаточно для волнения о. Если Ваше время выполнения соглашается с обоснованно измеренными данными, можно затопить его таким количеством дополнительных данных, как Вы хотите, и это все еще будет в порядке.
  • O (n) "линейный" - чем более вход, тем дольше это берет в ровном компромиссе. Три раза входной размер возьмет примерно в три раза более длинный.
  • O (n журнал (n)) "лучше, чем квадратичный" - увеличение входного вреда размера, но это все еще управляемо. Алгоритм, вероятно, достоин, это просто, что базовая проблема является более трудной (решения менее локализуются относительно входных данных), чем те проблемы, которые могут быть решены в линейное время. Если Ваши входные размеры встают там, не предполагайте, что Вы могли обязательно обработать дважды размер, не меняя Вашу архитектуру (например, движущимися вещами к ночным пакетным вычислениям, или не делая вещей на кадр). Хорошо, если входной размер увеличивается немного, хотя; просто не упустите кратные числа.
  • O (n^2) "квадратичный" - это действительно только собирается работать до определенного размера Вашего входа, поэтому обратите внимание на то, как большой это могло добраться. Кроме того, Ваш алгоритм может высосать - думают трудно, чтобы видеть, существует ли O (n журнал (n)) алгоритм, который дал бы Вам, в чем Вы нуждаетесь. После того как Вы здесь, чувствуете себя очень благодарными за удивительные аппаратные средства, мы были одаренными. Недавно, то, что Вы пытаетесь сделать, было бы невозможно для всех практических целей.
  • O (n^3) "кубический" - не качественно все, что отличающийся от O (n^2). Те же комментарии применяются, только больше. Существует достойный шанс, что более умный алгоритм мог бриться на этот раз вниз к чему-то меньшему, например, O (n^2 журнал (n)) или O (n^2.8...), но с другой стороны, существует хороший шанс, что это не будет стоить проблемы. (Вы уже ограничены в Вашем практическом входном размере, таким образом, постоянные множители, которые могут требоваться для более умных алгоритмов, вероятно, затопят свои преимущества для практических случаев. Кроме того, взгляды являются медленными; разрешение компьютеру пережевать его может сэкономить Вам время в целом.)
  • O (2^n) "экспоненциал" - проблема или существенно в вычислительном отношении трудно, или Вы - идиот. Эти проблемы имеют распознаваемую разновидность им. Ваши входные размеры ограничиваются в довольно определенном жестком пределе. Вы будете знать быстро, вписываетесь ли Вы в тот предел.

И вот именно. Существует много других возможностей, которые соответствуют между ними (или больше, чем O (2^n)), но они не часто происходят на практике, и они качественно очень не отличаются от одного из них. Кубические алгоритмы уже являются чем-то вроде фрагмента; я только включал их, потому что я сталкивался с ними достаточно часто, чтобы стоить упомянуть (например, умножение матриц).

, Что на самом деле происходит для этих классов алгоритмов? Ну, я думаю, что у Вас было хорошее начало, хотя существует много примеров, которые не соответствовали бы этим характеристикам. Но для вышеупомянутого, я сказал бы, что оно обычно идет что-то как:

  • O (1) - Вы только смотрите самое большее на блок фиксированного размера своих входных данных и возможно ни одного из него. Пример: максимум отсортированного списка.
    • Или Ваш входной размер ограничен. Пример: добавление двух чисел. (Обратите внимание, что добавление чисел N является линейным временем.)
  • O (регистрируют n) - каждый элемент Вашего входа говорит Вам достаточно игнорировать большую часть остальной части входа. Пример: при рассмотрении элемента массива в двоичном поиске его значение говорит Вам, что можно проигнорировать "половину" массива, не смотря ни на один из него. Или точно так же элемент, на который Вы смотрите, дает Вам действительно сводку части остающегося входа, что Вы не должны будете смотреть на него.
    • нет ничего специального о половинах, хотя - если можно только проигнорировать 10% входа на каждом шаге, это все еще логарифмически.
  • O (n) - Вы делаете некоторый установленный объем работы на входной элемент. (Но посмотрите ниже.)
  • O (n журнал (n)) - существует несколько вариантов.
    • можно разделить вход на две груды (в не больше, чем линейное время), решить проблему независимо на каждой груде и затем объединить две груды для формирования конечного решения. Независимость двух груд является ключевой. Пример: классическая рекурсивная сортировка с объединением.
    • Каждая линейно-разовая передача по данным получает Вас на полпути к Вашему решению. Пример: quicksort, если Вы думаете с точки зрения максимального расстояния каждого элемента к его финалу, отсортировал положение на каждом шаге разделения (и да, я знаю, что это на самом деле O (n^2) из-за вырожденного выбора центра. Но в сущности это попадает в мой O (n журнал (n)) категория.)
  • O (n^2) - необходимо посмотреть на каждую пару входных элементов.
    • Или Вы не делаете, но Вы думаете, что делаете, и Вы используете неправильный алгоритм.
  • O (n^3) - гм... У меня нет мгновенной характеристики их. Это - вероятно, один из:
    • Вы умножаете матрицы
    • , Вы смотрите на каждую пару исходных данных, но операция, которую Вы делаете, требует рассмотрения всех исходных данных снова
    • , вся структура графика Вашего входа релевантна
  • O (2^n) - необходимо рассмотреть каждое возможное подмножество исходных данных.

Ни один из них не строг. Особенно не линейные алгоритмы времени (O (n)): Я мог придумать много примеров, где необходимо посмотреть на все исходные данные, затем половина из них, затем половина из тех, и т.д. Или наоборот - Вы сворачиваете вместе пар исходных данных, затем рекурсивно вызываете вывод. Они не соответствуют описанию выше, так как Вы не смотрите на каждый вход однажды, но это все еще выходит в линейное время. Однако, 99,2% времени, линейное время означает смотреть на каждый вход однажды.

34
задан Eric 6 November 2008 в 15:43
поделиться

1 ответ

Ceph выглядит многообещающим новым выходом на арену. Однако на сайте утверждается, что он еще не готов к производственному использованию.

0
ответ дан 27 November 2019 в 17:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: