Digamos que queremos analisar o tempo de execução dos algoritmos. Às vezes dizemos que queremos encontrar o tempo de execução de um algoritmo quando o tamanho da entrada é n e, no pior caso possível, é indicado por O (n). Às vezes, embora eu veja livros / papéis dizendo que precisamos encontrar o tempo esperado de um algoritmo. Às vezes, também é usado o tempo médio de execução .
O que é "tempo esperado"? Em quais casos é útil encontrar o tempo esperado em vez do pior caso?
Edit : Eu acho que há uma diferença sutil entre o tempo de execução esperado e o tempo médio de execução, mas não tenho certeza. Através deste post, quero saber a diferença exata, se houver.
Respostas:
O tempo esperado é apenas o tempo médio, esperado , de execução do algoritmo usando a entrada pretendida .
Digamos que você tenha alguns milhões de registros de usuários e queira classificá-los, convém usar um algoritmo que seja mais adequado para sua entrada e, como tal, forneça o melhor tempo de execução esperado , em oposição a um algoritmo com melhor pior caso, mas pior esperado .
Às vezes, por exemplo, os fatores constantes para a complexidade de tempo de um algoritmo são tão altos que faz sentido usar algoritmos com pior complexidade de tempo, mas com fatores constantes menores, pois oferece um tempo de execução esperado melhor com pouca entrada, mesmo que isso ficar terrivelmente superado com maior contribuição.
Talvez um exemplo melhor seja o algoritmo quicksort clássico, que possui o pior tempo de execução de O (n²), mas o tempo médio de execução esperado de O (n log n), independentemente da entrada . Isso ocorre porque o algoritmo usa (ou melhor, pode usar , dependendo da implementação) randomização. Portanto, é o chamado algoritmo aleatório . Ele funciona de maneira um pouco diferente a cada chamada, mesmo com a mesma entrada. Como tal, não há entrada universal de pior caso para a implementação, porque a entrada de pior caso depende da maneira como o algoritmo escolhe o pivô para dividir a entrada especificada. E, como tal, não se pode apenas fornecer alguma entrada predefinida, causando o pior tempo de execução. Esse é geralmente o caso de algoritmos aleatórios, que visam um tempo de execução médio melhor esperado, independentemente da entrada.
É tudo sobre como usar o algoritmo certo para a entrada em questão.
fonte
O tempo de execução esperado de um algoritmo aleatório é um conceito bem definido, assim como o pior caso de tempo de execução. Se um algoritmo é randomizado, seu tempo de execução também é aleatório, o que significa que podemos definir o valor esperado de seu tempo de execução.
Um exemplo bem conhecido é o Quicksort: se escolhermos os pivôs aleatoriamente, podemos provar que o tempo de execução esperado se torna O (n log n), mesmo que o pior caso de execução permaneça O (n ^ 2). Um exemplo em que a randomização é muito poderosa é o menor problema de círculo fechado: existe um algoritmo simples cujo pior caso de tempo de execução é O (n ^ 3), mas na expectativa, seu tempo de execução é apenas O (n).
O tempo médio de execução é geralmente usado quando se fala sobre o comportamento de um algoritmo 'para a maioria das entradas'. Definimos alguma maneira de gerar uma entrada aleatoriamente, por exemplo, preenchemos uma matriz com números aleatórios ou permutamos aleatoriamente os números de 1 a n (para que não haja duplicatas) ou jogamos uma moeda e obtemos um conjunto decrescente ou ascendente de números. O tempo médio de execução de um algoritmo para essa distribuição aleatória de entradas é o tempo esperado de execução do algoritmo (nesse caso, o algoritmo pode não ser randomizado, mas a entrada é).
Como exemplo: existem problemas geométricos para os quais existem algoritmos que parecem funcionar bem à primeira vista, até você descobrir uma maneira muito estranha de distribuir, digamos, as linhas de entrada. Se você assumir que as linhas são distribuídas aleatoriamente, pode ser que esses cenários estranhos sejam extremamente improváveis, portanto seu algoritmo acaba sendo bom.
Contraste: o tempo de execução esperado é sobre o desempenho de um algoritmo 'a menos que você tenha má sorte' - tentar novamente o mesmo algoritmo na mesma entrada, mas com escolhas aleatórias diferentes, pode levar a uma solução muito mais rápida. O tempo médio de execução fala sobre o desempenho de um algoritmo 'para a maioria das entradas' - tentar o mesmo algoritmo novamente na mesma entrada não ajudará (exceto talvez se o algoritmo também for randomizado).
fonte