Nano Hash - криптовалюты, майнинг, программирование

Большой O для конечного набора возможных значений фиксированного размера

Этот вопрос вызвал некоторую путаницу и много комментариев о том, являются ли алгоритмы, предложенные в различных ответах, O (1) или O (n).

Давайте используем простой пример, чтобы проиллюстрировать две точки зрения:

мы хотим найти длинный x такой, что a * x + b = 0, где a и b известны, ненулевые длинные.

  • Очевидным алгоритмом O(1) является x = - b / a
  • Гораздо более медленный алгоритм будет состоять в проверке всех возможных длинных значений, что в среднем будет примерно в 2^63 раза медленнее.

Является ли второй алгоритм O (1) или O (n)?

Аргументы, представленные в связанных вопросах:

Хотя я понимаю аргумент, говорящий, что это O (1), он кажется нелогичным.

PS: я добавил java, поскольку исходный вопрос находится в Java, но этот вопрос не зависит от языка.


  • Big O не обращает внимания на масштаб. O(2^63) совпадает с O(1). Если решения нет, для его определения всегда потребуется O (1) независимо от входных данных. 07.09.2012
  • Это может устранить некоторую путаницу: en.wikipedia.org/wiki/Transdichotomous_model 08.09.2012

Ответы:


1

Сложность имеет значение только в том случае, если есть переменная N. Таким образом, вопрос не имеет смысла сам по себе. Если вопрос был:

Гораздо более медленный алгоритм будет состоять в проверке каждого возможного значения в диапазоне N значений, что в среднем будет примерно в N раз медленнее.

Является ли второй алгоритм O (1) или O (N)?

Тогда ответ будет таким: этот алгоритм — O(N).

07.09.2012
  • довольно необычно брать диапазон возможных выходов как N 07.09.2012
  • Это не диапазон возможных результатов. Это диапазон возможных значений x. 07.09.2012
  • поскольку x является выходом, это одно и то же, не так ли? 07.09.2012
  • @Qnan: это и то, и другое, и нет, в этом нет ничего необычного. Для любого алгоритма поиска методом грубой силы (скажем, для решения NP-полного алгоритма) N — это количество возможных выходов. 07.09.2012
  • Однако @KeithRandall для полиномиальных алгоритмов N обычно представляет собой длину ввода. 08.09.2012

  • 2

    Большой O описывает, как производительность алгоритма будет масштабироваться по мере увеличения входного размера n. Другими словами, когда вы запускаете алгоритм с большим количеством входных данных.

    В этом случае входные данные имеют фиксированный размер, поэтому оба алгоритма имеют значение O (1), хотя и с разными постоянными коэффициентами.

    Если вы взяли «n» для обозначения количества битов в числах (т. Е. Вы сняли ограничение на 64-битную длину), то вы могли бы проанализировать для заданного битового размера n, как масштабируются алгоритмы.

    В этом сценарии первый все еще будет O(1) (см. комментарий Qnan), а второй теперь будет O(2^n).

    Я настоятельно рекомендую посмотреть первые лекции от курс Массачусетского технологического института "Введение в алгоритмы". Они прекрасно объясняют Большой О (и Большой Омега/Тета), хотя и предполагают хорошее понимание математики.

    07.09.2012
  • на самом деле деление также занимает некоторое время для переменного количества битов, поэтому первое на самом деле больше не будет O (1), вероятно, будет O (n ^ 2) 07.09.2012
  • Да, вы можете возразить, что... вот где расходится теория производительности Big-O и практичность работы на реальной машине (с ограниченными ресурсами). 07.09.2012
  • нет, это не предмет спора. Как только вы разрешите переменное количество битов, деление больше не будет O (1). Таким образом, либо алгоритмы O (n ^ 2) и O (2 ^ n), либо они оба O (1). 07.09.2012

  • 3

    Проверка каждого возможного ввода - это O (2 ^ N) по количеству битов в решении. Когда вы делаете количество битов постоянным, тогда оба алгоритма имеют значение O (1), вы знаете, сколько решений вам нужно проверить.

    07.09.2012

    4

    Факт: Каждый алгоритм, который вы на самом деле запускаете на своем компьютере, равен O(1), потому что Вселенная имеет конечную вычислительную мощность (есть конечное количество атомов и конечное количество секунд, прошедших с момента Большого взрыва).

    Это правда, но не очень полезный способ думать о вещах. Когда мы используем большой O на практике, мы обычно предполагаем, что задействованные константы малы по сравнению с асимптотическими членами, потому что в противном случае только указание асимптотического члена мало что скажет вам о том, как работает алгоритм. Это прекрасно работает на практике, потому что константы обычно представляют собой такие вещи, как «использую ли я массив или хэш-карту», ​​которые отличаются не более чем в 30 раз, а входные данные равны 10 ^ 6 или 10 ^ 9, поэтому разница между квадратичным и линейный алгоритм более важен, чем постоянные факторы. Обсуждения большого O, которые не соблюдают это соглашение (например, алгоритм № 2), бессмысленны.

    07.09.2012

    5

    Каким бы ни было значение для a или b, в худшем случае по-прежнему нужно проверять значения 2^64, 2^32 или 2^somevalue. Сложность этого алгоритма составляет время O(2^k), где k — количество битов, используемых для представления длинного значения, или время O(1), если мы рассматриваем значения a и b.

    07.09.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..