Que definição de taxa de crescimento assintótica devemos ensinar?


35

Quando seguimos os livros-padrão, ou a tradição, a maioria de nós ensina a seguinte definição de notação Oh grande nas primeiras palestras de uma classe de algoritmos: Talvez até demos a lista inteira com todos os seus quantificadores:

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
  1. f=o(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  2. f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  3. f=Θ(g) iff (c>0)(d>0)(n00)(nn0)(dg(n)f(n)cg(n))
  4. f=Ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))
  5. f=ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n)) .

No entanto, como essas definições não são tão fáceis de trabalhar quando se trata de provar coisas simples, como , a maioria de nós se move rapidamente para introduzir o "truque do limite":5nlog4n+nlogn=o(n10/9)

  1. f=o(g) se limnf(n)/g(n) existe e é 0 ,
  2. f=O(g) se limnf(n)/g(n) existe e não é + ,
  3. f=Θ(g) se limnf(n)/g(n) existe e não é 0 nem + ,
  4. f=Ω(g) se limnf(n)/g(n) existe e não é 0 ,
  5. f=ω(g) se limnf(n)/g(n) existe e é + .

Minha pergunta é:

Seria uma grande perda para o ensino de uma classe de algoritmos de graduação aceitar as condições limite como as definições de o , O , Θ , Ω e ω ? É isso que todos nós acabamos usando de qualquer maneira e me parece bastante claro que pular as definições do quantificador facilita a vida de todos.

Eu estaria interessado em saber se você encontrou algum caso natural convincente em que as padrão são realmente necessárias e, se não, se você tem um argumento convincente para manter as padrão abertas de qualquer maneira. c , n 0c,n0c,n0


11
A tag deve realmente ser "didática", mas não consegui encontrar nenhuma tag relacionada e não tenho permissão para criar novas tags.
slimton

11
Isso basicamente absorve os quantificadores na definição de limites epsilon-delta. Minha única preocupação seria que muitos estudantes de ciências da computação não fizessem análise e, portanto, sua compreensão dos limites é principalmente mecânica. Para permitir que eles calculem rapidamente, é um acéfalo.
Por Vognsen

6
Observe que suas duas definições de O () não são equivalentes (a mesma ressalva se aplica a Θ () e Ω ()). Considere o caso em que f (n) = 2n para pares e ef (n) = 1 para pares ímpares. É f (n) = O (n)? Prefiro usar limsup em vez de lim, para que eu possa dizer f (n) = Θ (n) nesse caso (embora nenhuma das suas definições permita isso). Mas essa pode ser minha preferência pessoal (e até uma prática não-padrão), e eu nunca lecionei uma aula.
Tsuyoshi Ito

2
@ Tsuyoshi: Eu pensei que o objetivo do "truque de limite" era que era uma condição suficiente, mas não necessária, para . (Para também é necessário.) O contra-exemplo da função oscilante não tem limite. o ( )O()o()
András Salamon

11
Você não deve substituir o símbolo por em cada definição e propriedade? Achei o uso de muito perturbador quando estudante. ===
Jeremy

Respostas:


13

Prefiro ensinar a definição original com quantificadores.

Na OMI, os seres humanos geralmente têm problemas para entender fórmulas e definições com mais de duas alternâncias de quantificadores diretamente. A introdução de novos quantificadores pode esclarecer o significado da definição. Aqui, os dois últimos quantificadores apenas significam "para todos os n suficientemente grandes", a introdução desse tipo de quantificação pode ajudar.

As figuras que desenhei para explicar esses conceitos combinam melhor com as versões do quantificador.

Penso que a simplificação de limites é útil para estudantes de engenharia que só estão interessados ​​em calcular a taxa de crescimento, mas não será tão útil para estudantes de ciências da computação. De fato, o uso dessa simplificação pode causar mais danos do que benefícios.

Essa idéia é semelhante à sugestão de que usamos as regras para calcular derivadas (de polinômios, exponenciação, ..., regra de cadeia, ...) no lugar da definição epsilon-delta, que IMHO não é uma boa idéia.


A noção de dominação eventual também é útil: se s . Agora se houver st . \ esits m n > m f ( n ) < g ( n ) f O ( g ) c > 0 f ( x ) c g ( x )f(x)g(x)\esitsmn>mf(n)<g(n)fO(g)c>0f(x)cg(x)
Kaveh

9

Edit: Revisão principal na revisão 3.

Como nunca lecionei uma aula, não creio que possa reivindicar algo convincente sobre o que devemos ensinar. No entanto, aqui está o que eu pensei sobre isso.

Existem exemplos naturais em que o "truque de limite", como está escrito, não pode ser aplicado. Por exemplo, suponha que você implemente um "vetor de comprimento variável" (como o vetor <T> em C ++) usando uma matriz de comprimento fixo com duplicação de tamanho (ou seja, toda vez que estiver prestes a exceder o tamanho da matriz, você realoque a matriz duas vezes maior que agora e copie todos os elementos). O tamanho S ( n ) da matriz quando armazenamos n elementos no vetor é a menor potência de 2 maior ou igual a n . Queremos dizer que S ( n ) = O ( n ), mas o uso do “truque de limite”, como está escrito como definição, não nos permitiria fazer isso porque S ( n) / n oscila densamente no intervalo [1,2). O mesmo se aplica a Ω () e Θ ().

Como uma questão um pouco separada, quando usamos essas notações para descrever a complexidade de um algoritmo, acho que sua definição de Ω () às vezes é inconveniente (embora eu ache que essa definição seja comum). É mais conveniente definir que f ( n ) = Ω ( g ( n )) se e somente se limsup f ( n ) / g ( n )> 0. Isso ocorre porque alguns problemas são triviais para infinitos valores de n ( como o problema de usinagem perfeito em um gráfico com um número ímpar n de vértices). O mesmo se aplica a Θ () e ω ().

Portanto, eu pessoalmente acho que as seguintes definições são as mais convenientes a serem usadas para descrever a complexidade de um algoritmo: para funções f , g : ℕ → ℝ > 0 ,

  • f ( n ) = o ( g ( n )) se e somente se limsup f ( n ) / g ( n ) = 0. (Isso é equivalente a lim f ( n ) / g ( n ) = 0.)
  • f ( n ) = O ( g ( n )) se e somente se limsup f ( n ) / g ( n ) <∞.
  • f ( n ) = Θ ( g ( n )) se e somente se 0 <limsup f ( n ) / g ( n ) <∞.
  • f ( n ) = Ω ( g ( n )) se e somente se limsup f ( n ) / g ( n )> 0. (Isso é equivalente a que f ( n ) não é o ( g ( n )).)
  • f ( n ) = ω ( g ( n )) se e somente se limsup f ( n ) / g ( n ) = ∞. (Isso é equivalente a que f ( n ) não é O ( g ( n )).)

ou equivalente,

  • f ( n ) = o ( g ( n )) se e somente se para cada c > 0, para n suficientemente grande , f ( n ) ≤ cg ( n ).
  • f ( n ) = O ( g ( n )) se e somente se para alguns c > 0, para n suficientemente grande , f ( n ) ≤ cg ( n ).
  • f ( n ) = Θ ( g ( n )) se e somente se f ( n ) = O ( g ( n )) ef ( n ) = Ω ( g ( n )).
  • f ( n ) = Ω ( g ( n )) se e somente se para alguns d > 0, para infinitamente muitos n , f ( n ) ≥ dg ( n ).
  • f ( n ) = ω ( g ( n )) se e somente se para cada d > 0, para infinitamente muitos n , f ( n ) ≥ dg ( n ).

Mas não sei se isso é uma prática comum ou não. Também não sei se é adequado para o ensino. O problema é que algumas vezes queremos definir Ω () por liminf (como você fez na primeira definição). Por exemplo, quando dizemos “A probabilidade de erro desse algoritmo aleatório é 2 −Ω ( n ) ”, não queremos dizer que a probabilidade de erro seja exponencialmente pequena apenas para infinitos n !


Também uso as definições de limsup, mas para estudantes que não viram limsup (quase todas), tenho que expandir para quantificadores explícitos de qualquer maneira.
Jeffε

@ Jeff: Concordo que a maioria dos alunos não viu o limsup; portanto, se usarmos as definições do limsup, precisamos usar quantificadores na aula.
Tsuyoshi Ito

2
O problema com as versões do quantificador é que elas são difíceis de lembrar e visualizar. Eu prefiro o porque ele pode ser descrito como "ponto limite mais alto". Uma possível explicação é: "É como , exceto que só funciona quando a sequência converge. Se a sequência não converge, por exemplo, porque o algoritmo oscila entre muito rápido para alguns e lento para outros , então pegamos o ponto limite mais alto ". l i m l i m n nlimsuplimlimnn
Heinrich Apfelmus

Na verdade, existem exemplos naturais de algoritmos em que o tempo de execução oscila?
Heinrich Apfelmus

2
@ Heinrich: Eu já mencionei o tempo de execução de um algoritmo para encontrar uma correspondência perfeita de um gráfico em n vértices, mas isso conta como um exemplo natural? Adicionei outro exemplo em que o tempo de execução não oscila, mas f (n) / g (n) oscila. O exemplo fala sobre complexidade de espaço, mas a complexidade de tempo do mesmo exemplo tem a mesma propriedade.
Tsuyoshi Ito

8

Usar limites é um pouco confuso, já que (1) é uma noção mais complicada (2) que não captura f = O (g) muito bem (como podemos ver na discussão acima). Eu costumo falar sobre funções dos números naturais (estritamente positivos) aos números naturais (o que é suficiente para os tempos de execução), pulo as pequenas coisas e, em seguida, a definição é concisa e apropriada para os alunos do primeiro ano do ensino médio:

Dfn: f = O (g) se para algum C para todos n tivermos que f (n) <= C * g (n)


11
Primeiro, eu não gostei dessa definição porque afirmar “all n” obscurece o fato importante de que a notação O () se importa apenas com o comportamento das funções para n grande. No entanto, independentemente da definição que escolhermos, acho que devemos explicar esse fato juntamente com a definição. Pensando assim, declarar essa definição simples parece muito bom.
Tsuyoshi Ito

Enquanto isso captura a essência, não gosto que, se para todos , para todos até e , caso contrário, então mas essa definição falha em capturar esse relacionamento. Portanto, é preciso adicionar algumas informações sobre funções que são bem-comportadas em algum sentido. n g ( n ) = 0 n N 0 g ( n ) = f ( n ) + 1 f = O ( g )f(n)=nng(n)=0nN0g(n)=f(n)+1f=O(g)
András Salamon

2
O objetivo de falar sobre funções cujo intervalo é o número Natural (sem incluir 0) é exatamente para não cair em problemas com g (n) = 0.
Noam

11
@Warren Victor Shoup, em seu livro sobre Teoria dos Números Computacionais, usa a notação vez de na análise do tempo de execução, que eu achei interessante. registre umlen(a)loga
Srivatsan Narayanan

11
@Warren (continuação) É assim que ele explica: "Ao expressar os tempos de execução dos algoritmos em termos de uma entrada , geralmente preferimos escrever vez de . Um motivo é estético: escrever salienta o fato de que o tempo de execução é uma função do comprimento de bit Outra razão é técnico:. para BIG- estimativas envolvendo as funções de um domínio arbitrário, as desigualdades apropriadas deve manter todo o domínio, e por esta razão, é muito inconveniente usar funções, como , que desaparecem ou são indefinidas em algumas entradas. " alen(a)logalen(a)aOlog
Srivatsan Narayanan

5

Quando fiz os cursos básicos, recebemos a coisa como definição e as outras coisas como teorema.c,n0

Eu acho que o primeiro é mais natural para muitas pessoas que pensam discretas do que contínuas, ou seja, a maioria dos cientistas da computação (na minha experiência). Ele também se encaixa a maneira que nós normalmente falar sobre essas coisas melhor: "Há uma função polinomial de grau 3, que é um limite superior para este até um factor constante."f

Edit : Você pode se aproximar ainda mais dessa maneira de falar se usar esta definição: (Observe que conecta essa definição com a geralmente fornecida)d = f ( N 0 )fO(g):⇔c,d>0n0:f(n)cg(n)+dd=f(n0)

O material limite é bastante útil para calcular classes de complexidade, ou seja, com caneta e papel.

De qualquer forma, acho que é muito útil que os alunos aprendam que existe uma riqueza de (espero) definições equivalentes. Eles devem ser capazes de perceber isso e identificar diferenças em caso de definições não equivalentes.


4

Tendo estudado esses conceitos há apenas alguns anos, eles não eram os mais difíceis de entender para a minha turma (em oposição a conceitos como indução ou contra-positivos). Limites e limsups são apenas mais "intuitivos" para aqueles familiarizados com cálculo na minha opinião. Porém, os alunos com essa fundamentação matemática terão uma formação teórica definida de qualquer maneira, para que possam processar qualificadores distintos.

Além disso, mais importante, lembre-se de que, em última análise, seus alunos continuarão (esperançosamente) a ler outros livros didáticos de teoria cs e talvez até trabalhos de pesquisa um dia. Como tal, é melhor que eles se sintam confortáveis ​​com a notação padrão em campo, mesmo que não tenha sido idealmente concebida inicialmente. Não há mal algum em dar-lhes definições alternativas, uma vez que elas tenham assimilado as padrão.


3

Para uma visão interessante sobre o assunto, veja a bem escrita carta de Don Knuth "Calculus via O notation" . Ele defende a visão inversa de que o cálculo deve ser ensinado através das notações 'A', 'O' e 'o'.

Nota: Ele usa a notação "A" como uma etapa preliminar na definição da notação padrão "O". Uma quantidade é de (ou seja, ), se . Em particular, faz sentido dizer que é .A y x = A ( y ) | x | y 100 A ( 200 )xAyx=A(y)|x|y100A(200)


1
  1. As definições de Tsuyoshi Ito não parecem muito certas. Para little-ômega e big-ômega, as definições devem usar liminf, não limsup. A definição de big-theta precisa de um limite inferior no liminf e um limite superior no limsup.

  2. Uma definição de f (n) = O (g (n)) é que existe outra função f '(n)> = f (n) tal que lim f' (n) / g (n) <infinito.

  3. Por que os novatos podem postar respostas, mas não fazem comentários?


11
Quanto ao item 1, quero dizer limsup em todos os casos, e o motivo é explicado no segundo parágrafo da minha resposta.
Tsuyoshi Ito

infelizmente, é um mecanismo de bloqueio de spam.
Suresh Venkat

Além disso, você pode usar o látex em suas respostas.
Suresh Venkat

1

Primeiro , tento desenvolver nos alunos alguma intuição , antes de mostrar equações.

  • "Classificação de mesclagem versus classificação de inserção" é um bom ponto de partida.

Então, mais tarde ... eu tento mostrar os dois lados. Os alunos que dependem mais da intuição preferem enquanto aqueles que confiam mais em matemática, equasões, álgebra etc., preferem definições " ".lim n

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
limn

Outro aspecto é que depende muito do programa de estudos concretos. O IMHO, dependendo dos assuntos anteriores, será uma das definições mais adequadas - enquanto o IMHO ainda é uma boa ideia mostrar os dois e aceitar os dois tipos de soluções.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.