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 ) ( ∃ n0 0≥ 0 ) ( ∀ n ≥ n0 0) ( f( n ) ≤ c ⋅ g( N ) ) .
- f= o ( g) iff ( ∀ c > 0 ) ( ∃ n0 0≥ 0 ) ( ∀ n ≥ n0 0) ( f( n ) ≤ c ⋅ g( N ) )
- f= O ( g) iff ( ∃ c > 0 ) ( ∃ n0 0≥ 0 ) ( ∀ n ≥ n0 0)(f(n)≤c⋅g(n))
- f=Θ(g) iff (∃c>0)(∃d>0)(∃n0≥0)(∀n≥n0)(d⋅g(n)≤f(n)≤c⋅g(n))
- f=Ω(g) iff (∃d>0)(∃n0≥0)(∀n≥n0)(f(n)≥d⋅g( N ) )
- f= ω ( g) iff ( ∀ d> 0 ) ( ∃ n0 0≥ 0 ) ( ∀ n ≥ n0 0) ( f( n ) ≥ d⋅ g( 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":5 n log4n + n logn-----√= o ( n10 / 9)
- f= o ( g) se limn → ∞f( n ) / g( N ) existe e é 0 0 ,
- f= O ( g) se limn → ∞f( n ) / g( N ) existe e não é + ∞ ,
- f= Θ ( g) se limn → ∞f( n ) / g( N ) existe e não é 0 0 nem + ∞ ,
- f= Ω ( g) se limn → ∞f( n ) / g( N ) existe e não é 0 0 ,
- f= ω ( g) se limn → ∞f( 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 , n0 0c , n0 0
Respostas:
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.
fonte
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 ,
ou equivalente,
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 !
fonte
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)
fonte
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 )f∈O(g):⇔∃c,d>0∀n≥0:f(n)≤c⋅g(n)+d d=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.
fonte
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.
fonte
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 )x A y x=A(y) |x|≤y 100 A(200)
fonte
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.
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.
Por que os novatos podem postar respostas, mas não fazem comentários?
fonte
Primeiro , tento desenvolver nos alunos alguma intuição , antes de mostrar equações.
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 → ∞
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.
fonte