Есть ли какие-либо O (1/n) алгоритмы?

Да, это возможно. В GCC, ориентированном на Mac OS X, по крайней мере, va_list - это просто массив C, поэтому вы сделаете один из id s, а затем скажете NSArray заполнить его:

NSArray *argsArray = [[NSProcessInfo processInfo] arguments];
va_list args = malloc(sizeof(id) * [argsArray count]);
NSAssert1(args != nil, @"Couldn't allocate array for %u arguments", [argsArray count]);

[argsArray getObjects:(id *)args];

//Example: NSLogv is the version of NSLog that takes a va_list instead of separate arguments.
NSString *formatSpecifier = @"\n%@";
NSString *format = [@"Arguments:" stringByAppendingString:[formatSpecifier stringByPaddingToLength:[argsArray count] * 3U withString:formatSpecifier startingAtIndex:0U]];
NSLogv(format, args);

free(args);

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

330
задан 6 revs, 4 users 67% 10 July 2010 в 00:57
поделиться

27 ответов

Этот вопрос не такой глупый, как может показаться. По крайней мере теоретически, что-то вроде O (1 / n ) вполне разумно, если мы возьмем математическое определение нотации Big O :

Теперь вы можете легко заменить g ( x ) для 1 / x … очевидно, что приведенное выше определение все еще выполняется для некоторого f .

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

def get_faster(list):
    how_long = (1 / len(list)) * 100000
    sleep(how_long)

Ясно, что эта функция тратит меньше времени по мере увеличения размера ввода ... по крайней мере, до некоторого предела, установленного оборудованием (точность чисел, минимум времени ожидания сна , времени обработки аргументов и т. д.): этот предел тогда был бы постоянной нижней границей, так что на самом деле вышеупомянутая функция все еще имеет время выполнения O (1).

Но там на самом деле реальные -world алгоритмы, в которых время выполнения может уменьшаться (по крайней мере частично) при увеличении размера ввода. Обратите внимание, что эти алгоритмы не будут демонстрировать поведение во время выполнения ниже O (1). Тем не менее, они интересные. Например, возьмем очень простой алгоритм текстового поиска Horspool . Здесь ожидаемое время выполнения будет уменьшаться по мере увеличения длины шаблона поиска (но увеличение длины стога сена снова увеличит время выполнения).

Но есть реально существующие алгоритмы, в которых время выполнения может уменьшаться (по крайней мере частично) при увеличении размера ввода. Обратите внимание, что эти алгоритмы не будут демонстрировать поведение во время выполнения ниже O (1). Тем не менее, они интересные. Например, возьмем очень простой алгоритм текстового поиска Horspool . Здесь ожидаемое время выполнения будет уменьшаться по мере увеличения длины шаблона поиска (но увеличение длины стога сена снова увеличит время выполнения).

Но есть реально существующие алгоритмы, в которых время выполнения может уменьшаться (по крайней мере частично) при увеличении размера ввода. Обратите внимание, что эти алгоритмы не будут демонстрировать поведение во время выполнения ниже O (1). Тем не менее, они интересные. Например, возьмем очень простой алгоритм текстового поиска Horspool . Здесь ожидаемое время выполнения будет уменьшаться по мере увеличения длины шаблона поиска (но увеличение длины стога сена снова увеличит время выполнения).

возьмем очень простой алгоритм текстового поиска Horspool . Здесь ожидаемое время выполнения будет уменьшаться по мере увеличения длины шаблона поиска (но увеличение длины стога сена снова увеличит время выполнения).

возьмем очень простой алгоритм текстового поиска Horspool . Здесь ожидаемое время выполнения будет уменьшаться по мере увеличения длины шаблона поиска (но увеличение длины стога сена снова увеличит время выполнения).

308
ответ дан 23 November 2019 в 00:46
поделиться

Нотация Big-O представляет наихудший сценарий для алгоритма, который отличается от его типичного времени выполнения. Легко доказать, что алгоритм O (1 / n) является алгоритмом O (1). По определению,
O (1 / n) -> T (n) <= 1 / n, для всех n> = C> 0
O (1 / n) -> T (n) <= 1 / C, поскольку 1 / n <= 1 / C для всех n> = C
O (1 / n) -> O (1), поскольку нотация Big-O игнорирует константы (т. Е. Значение C не имеет значения)

-2
ответ дан 23 November 2019 в 00:46
поделиться

Я часто использую O (1 / n) для описания вероятностей, которые становятся меньше по мере увеличения входных данных - например, вероятность того, что честная монета выпадет решкой при log2 (n) бросках. равно O (1 / n).

7
ответ дан 23 November 2019 в 00:46
поделиться

Я вижу алгоритм, который, по общему признанию, соответствует верхней границе O (1 / n):

У вас есть большая серия входных данных, которые меняются из-за чего-то внешнего по отношению к процедуре (возможно, они отражают оборудование, или это может быть какое-то другое ядро ​​процессора, выполняющее это.) и вы должны выбрать случайное, но действительное.

Теперь, если бы оно не менялось, вы бы просто составили список элементов, выберите один случайным образом и получите время O (1). Однако динамический характер данных не позволяет составить список, вам просто нужно провести случайное зондирование и проверить правильность зондирования. (И обратите внимание, что по сути нет гарантии, что ответ по-прежнему действителен, когда он возвращается. Он все еще мог использовать - скажем, ИИ для юнита в игре. Он мог стрелять по цели, которая выпала из поля зрения, пока она была нажатие на курок.

0
ответ дан 23 November 2019 в 00:46
поделиться

Если ответ один и тот же независимо от входных данных, значит, у вас алгоритм O (0).

или, другими словами, ответ известен до того, как входные данные будут отправлены - функция может быть оптимизирована - так что O (0)

-2
ответ дан 23 November 2019 в 00:46
поделиться

Нет ничего меньше O (1) Обозначение Big-O подразумевает наибольший порядок сложности для алгоритма

. Если алгоритм имеет время выполнения n ^ 3 + n ^ 2 + n + 5, то это O (n ^ 3) Меньшие степени здесь вообще не имеют значения, потому что, поскольку n -> Inf, n ^ 2 не будет иметь значения по сравнению с n ^ 3

Аналогично, когда n -> Inf, O (1 / n) не будет иметь значения по сравнению с O (1 ), следовательно, 3 + O (1 / n) будет таким же, как O (1), что сделает O (1) минимально возможной вычислительной сложностью

-2
ответ дан 23 November 2019 в 00:46
поделиться

А как насчет этого:

void FindRandomInList(list l)
{
    while(1)
    {
        int rand = Random.next();
        if (l.contains(rand))
            return;
    }
}

по мере увеличения размера списка ожидаемое время выполнения программы уменьшается.

1
ответ дан 23 November 2019 в 00:46
поделиться

Хорошо, я немного подумал об этом, и, возможно, существует алгоритм, который мог бы следовать этой общей форме:

Вам нужно вычислить задачу коммивояжера для графа из 1000 узлов Однако вам также предоставляется список узлов, которые вы не можете посетить. По мере того, как список невидимых узлов становится больше, проблему становится легче решить.

0
ответ дан 23 November 2019 в 00:46
поделиться

Вы не можете опускаться ниже O (1), однако O (k), где k меньше N, возможен. Мы назвали их алгоритмами сублинейного времени . В некоторых задачах алгоритм сублинейного времени может дать только приблизительные решения конкретной проблемы. Однако иногда приблизительные решения просто хороши, вероятно, из-за слишком большого набора данных или из-за того, что вычислять все слишком дорого с точки зрения вычислений.

2
ответ дан 23 November 2019 в 00:46
поделиться

Если решение существует, его можно приготовить и получить к нему доступ за постоянное время = немедленно. Например, используя структуру данных LIFO, если вы знаете, что запрос сортировки предназначен для обратного порядка. Затем данные уже отсортированы, учитывая, что была выбрана соответствующая модель (LIFO).

2
ответ дан 23 November 2019 в 00:46
поделиться

O (1) просто означает «постоянное время».

Когда вы добавляете ранний выход в цикл [1], вы (в нотации большого O) поворачиваете O ( 1) алгоритм в O (n), но делает его быстрее.

Хитрость в том, что в целом алгоритм постоянного времени является лучшим, а линейный лучше, чем экспоненциальный, но для небольших количеств n, экспоненциальный алгоритм может быть быстрее.

1: Предполагая статическую длину списка для этого примера

6
ответ дан 23 November 2019 в 00:46
поделиться

Я считаю, что квантовые алгоритмы могут выполнять несколько вычислений «одновременно» с помощью суперпозиции ...

Я сомневаюсь, что это полезный ответ.

5
ответ дан 23 November 2019 в 00:46
поделиться

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

2
ответ дан 23 November 2019 в 00:46
поделиться

O (1 / n) не меньше O (1), это в основном означает, что чем больше у вас данных, тем быстрее работает алгоритм. Скажем, вы получаете массив и всегда заполняете его до 10 100 элементов, если в нем меньше этого, и ничего не делаете, если их больше. Это, конечно, не O (1 / n), а что-то вроде O (-n) :) Жаль, что нотация O-big не допускает отрицательных значений.

1
ответ дан 23 November 2019 в 00:46
поделиться

Как насчет того, чтобы функция вообще не запускалась (NOOP)? или используя фиксированное значение. Это считается?

7
ответ дан 23 November 2019 в 00:46
поделиться

Нет, это невозможно:

Поскольку n стремится к бесконечности в 1 / n, мы в конечном итоге достигаем 1 / (inf), что фактически равно 0.

Таким образом, большой -oh класс проблемы будет O (0) с большим n, но ближе к постоянному времени с низким n. Это не имеет смысла, так как единственное, что может быть сделано быстрее, чем постоянное время:

пустота ничего () {};

И даже это спорно

Как только вы выполняете команду, у вас как минимум O (1), поэтому нет, у нас не может быть большого класса O (1 / n)!

8
ответ дан 23 November 2019 в 00:46
поделиться

Из моего предыдущего изучения нотации большого O, даже если вам нужен 1 шаг (например, как проверка переменной, выполнение присваивания), то есть O (1).

Обратите внимание, что O (1) то же самое, что и O (6), потому что «константа» не имеет значения. Вот почему мы говорим, что O (n) - это то же самое, что O (3n).

Итак, если вам нужен хотя бы 1 шаг, это O (1) ... и поскольку вашей программе нужен хотя бы 1 шаг, минимум алгоритм может идти - O (1). Если только мы этого не сделаем, то, я думаю, это O (0)? Если мы вообще что-то делаем, то это О (1), и это минимум, на который мы можем пойти.

(Если мы решим не делать этого, тогда это может стать вопросом Дзэн или Дао ... в мире программирования, O (1) по-прежнему является минимумом).

Или как насчет этого:

программист : босс, я нашел способ сделать это за O (1) раз!
босс : не надо, сегодня утром мы банкроты.
программист : о, тогда он становится O (0).

15
ответ дан 23 November 2019 в 00:46
поделиться

острый зуб правильный, O (1) - наилучшая возможная производительность. Однако это не означает быстрое решение, а только решение с фиксированным временем.

Интересный вариант и, возможно, то, что действительно предлагается, - это то, какие проблемы становятся легче по мере роста населения. Я могу придумать один, хотя и надуманный и насмешливый ответ:

У каких-то двух людей в группе один день рождения? Когда n превышает 365, вернуть true. Хотя меньше 365, это O (n ln n). Возможно, это не лучший ответ, так как проблема постепенно не становится легче, а просто становится O (1) для n> 365.

23
ответ дан 23 November 2019 в 00:46
поделиться

Это невозможно. Определение Big-O - это неравенство , не большее, чем :

A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)

Таким образом, B (n) на самом деле является максимальным значением, поэтому, если оно уменьшается с увеличением n, оценка не изменится.

24
ответ дан 23 November 2019 в 00:46
поделиться

Да.

Существует ровно один алгоритм со временем выполнения O (1 / n), «пустой» алгоритм.

Если алгоритм имеет значение O (1 / n), это означает, что он выполняется асимптотически за меньшее количество шагов, чем алгоритм, состоящий из единственная инструкция. Если он выполняется с меньшим количеством шагов, чем один шаг для всех n> n0, он не должен содержать никаких инструкций для этих n. Поскольку проверка «если n> n0» стоит как минимум 1 инструкции, она не должна состоять из инструкций для всех n.

Подведение итогов: Единственный алгоритм, который равен O (1 / n), - это пустой алгоритм, состоящий из инструкции без .

134
ответ дан 23 November 2019 в 00:46
поделиться
inline void O0Algorithm() {}
-2
ответ дан 23 November 2019 в 00:46
поделиться

Вот простой алгоритм O (1 / n). И он даже делает кое-что интересное!

function foo(list input) {
  int m;
  double output;

  m = (1/ input.size) * max_value;  
  output = 0;
  for (int i = 0; i < m; i++)
    output+= random(0,1);

  return output;
}

O (1 / n) возможно, поскольку он описывает, как выходные данные функции меняются при увеличении размера входных данных. Если мы используем функцию 1 / n для описания количества инструкций, выполняемых функцией, тогда нет требования, чтобы функция принимала нулевые инструкции для любого размера ввода. Скорее, это то, что для каждого размера ввода, n выше некоторого порога, количество требуемых инструкций ограничено сверху положительной константой, умноженной на 1 / n. Поскольку не существует фактического числа, для которого 1 / n равно 0, а константа положительна, нет причин, по которым функция должна была бы принимать 0 или меньше инструкций.

-2
ответ дан 23 November 2019 в 00:46
поделиться

В численном анализе алгоритмы аппроксимации должны иметь субконструированную асимптотическую сложность в толерантности приближения.

class Function
{
    public double[] ApproximateSolution(double tolerance)
    {
        // if this isn't sub-constant on the parameter, it's rather useless
    }
}
0
ответ дан 23 November 2019 в 00:46
поделиться

Как уже было отмечено, за возможным исключением нулевой функции, не может быть O(1/n) функций, так как затраченное время должно приближаться к 0.

Конечно, есть некоторые алгоритмы, например, определенный Конрадом, которые, кажется, должны быть меньше, чем O(1), по крайней мере, в некотором смысле.

def get_faster(list):
    how_long = 1/len(list)
    sleep(how_long)

Если вы хотите исследовать эти алгоритмы, вы должны либо определить свое собственное асимптотическое измерение, либо свое собственное понятие времени. Например, в приведенном выше алгоритме я мог бы разрешить использование некоторого количества "свободных" операций заданное количество раз. В приведенном выше алгоритме, если я определяю t', исключая время для всего, кроме сна, то t'=1/n, что составляет O(1/n). Возможно, есть примеры и получше, поскольку асимптотическое поведение тривиально. На самом деле, я уверен, что кто-то может придумать примеры, которые дают нетривиальные результаты.

1
ответ дан 23 November 2019 в 00:46
поделиться

у многих был правильный ответ (Нет) Вот другой способ доказать это: Чтобы иметь функцию, нужно вызвать функцию, и нужно вернуть ответ. Это занимает определенное постоянное количество времени. КАЖДЫЙ РАЗ, если остальная часть обработки занимает меньше времени для больших входов, распечатка ответа (который, как мы можем предположить, является одним битом) занимает, по крайней мере, постоянное время.

3
ответ дан 23 November 2019 в 00:46
поделиться

Я не разбираюсь в математике, но концепция, похоже, ищет функцию, которая занимает меньше времени, когда вы добавляете больше входных данных? В таком случае, что насчет:

def f( *args ): 
  if len(args)<1:
    args[1] = 10

Эта функция работает быстрее, если добавлен необязательный второй аргумент, потому что в противном случае он должен быть назначен. Я понимаю, что это не уравнение, но на страницах википедии говорится, что big-O также часто применяется к вычислительным системам.

-3
ответ дан 23 November 2019 в 00:46
поделиться

Существуют подлинейные алгоритмы. Фактически, поиск Algorithm - очень хороший пример одного.

-3
ответ дан 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

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