Classificação das perguntas da entrevista FizzBuzz (1), implementando malloc (10) [fechado]

10

Gostaria de ter sua opinião sobre a dificuldade da seguinte pergunta da entrevista:

Encontre a sub-matriz contígua com soma máxima em uma matriz de números inteiros em O (n) tempo.

Esse problema de som trivial ficou famoso por Jon Bentley em seu Programming Pearls, onde ele o usa para demonstrar técnicas de design de algoritmos.

Em uma escala de 1 a 10, sendo 1 o teste FizzBuzz (ou HoppityHop ) e 10 implementando a função C stdlib malloc (), como você classificaria o problema acima?

Acho que as pessoas que podem responder melhor a essa pergunta são aquelas que leram Programming Pearls e tentaram resolver esse problema por conta própria. Para motivar aqueles que não o fizeram, 'Programming Pearls' é apresentado muitas vezes na lista dos 10 principais livros de programação.

Alguns comentários podem ajudar a obter uma classificação melhor:

  • A implementação do malloc () não é tão formidável quanto parece. Veja a linguagem de programação C da K&R, por exemplo. Às vezes, é perguntado na Microsoft .

  • Observação do CLRS sobre a solução de problemas: geralmente é mais difícil resolver um problema do zero do que verificar uma solução claramente apresentada, especialmente quando se trabalha com restrições de tempo .

blrs
fonte
12
A dificuldade aqui é que números inteiros podem ser negativos? (caso contrário, toda a matriz é sempre a maior subarray, portanto, ó (1) -P)
Macke
4
O problema deve dizer "Encontre o subarray contíguo ..."
v64 27/02
6
Eu não faria "em O (n)" um requisito em uma entrevista. Você pode começar com uma solução ingênua e refiná-la se quiser, mas eu não esperaria que alguém pudesse derivar uma solução O (n) em uma entrevista de 1 hora sem exposição prévia a esse algoritmo.
Dean Harding
2
Direita. Esse é um problema fácil se você permitir soluções O (n²).
dan04
@ Dean, eu espero que eles sejam capazes de mover uma soma do tipo média de média do local j para j + 1 em O (1). Talvez para ser justo, isso possa ser fornecido como uma dica. (Eu estou supondo que o comprimento do subarray foi pré-especificado)
Omega Centauri

Respostas:

17

Isso realmente depende do desenvolvedor.

Se malloc tivesse 10 anos, eu classificaria esse problema como 20. Mas, novamente, eu já fiz malloc antes e provavelmente poderia fazê-lo novamente.

Alguém que cometeu esse problema ou conhece o algoritmo apropriado da parte superior da cabeça fará com que seja 5 e malloc () seja 10.

O problema com esse tipo de pergunta é que, se você as tiver feito antes que elas sejam fáceis, é um teste para saber se você já viu esse algoritmo antes. Portanto, não gosto deles para entrevistas.

Agora, para testes em que você dá ao desenvolvedor alguns dias, é um teste perfeitamente bom, porque se ele não conhece o algoritmo, você tem a chance de fazer a pesquisa e se atualizar, e é um teste não apenas seu conhecimento, mas sua capacidade de adquirir novos conhecimentos.

Martin York
fonte
Tempo -> se no quarto parágrafo (e desculpe pelo barulho, eu não tenho o representante para fazer typo edições ...)
Matthieu M.
Martin, acho que depende do tipo de aplicativo para o qual você está entrevistando pessoas. Para tipos de sistemas, o malloc é bastante simples. Para mim, estou preso [presumo que o endereço e o comprimento da pilha etc. tenham sido deliberadamente ocultos de mim] com o malloc, mas o problema do subarray é quase trivial. A chave é combinar as perguntas às necessidades do trabalho.
Omega Centauri
8

Eu acho que a classificação deve ser bidimensional, pelo menos. FizzBuzz- mallocdescreve a faixa em um eixo, eu chamaria de "complexidade tecnológica". Mas essa dimensão única certamente não é suficiente para descrever o problema. Para resolver o problema em questão, o desenvolvedor deve pensar mais do que o código , enquanto a implementação mallocexige mais disciplina de codificação do que criação de algoritmos complexos.

Então, aqui está como eu organizaria esses problemas:

insira a descrição da imagem aqui

Para ilustrar meu argumento, eu adicionei a classificação de mesclagem paralela ao gráfico, pois, eu acho, é um bom exemplo de tarefa sofisticada tecnologicamente e algoritmicamente.

P Shved
fonte
2

Eu acho que é consideravelmente mais difícil que o FizzBuzz ou o HoppityHop - esses dois nada mais são do que um simples if-else ou switch-case em um loop.

O sub-array máximo exigirá uma análise mais profunda do problema subjacente - não é algo que você esperaria ver em uma aula de programação para iniciantes, pois requer habilidades matemáticas mais altas do que um problema do tipo FizzBuzz. Esse problema tem uma aparência semelhante ao problema de caminho mais curto, resolvido pelo algoritmo de Dijkstra - talvez seja uma especialização do problema de caminho mais longo .

Na sua escala de 1 a 10, eu provavelmente classificaria entre 3 e 5.

* Enquanto o servidor estava inoperante, descobri que o problema máximo do subarray tem sua própria página na wikipedia.

oosterwal
fonte
Alguém pode explicar por que o algoritmo descrito na wikipedia é necessário, quando o seguinte algoritmo conceitualmente muito mais simples funciona para mim: Em uma única passagem, calcule a soma cumulativa, encontrando o mínimo e o máximo da maneira usual. A subsequência consecutiva da soma máxima começa após o índice mínimo de cumsum e se estende até e incluindo o índice máximo de cumsum.
Ben Voigt
2
@Ben Voigt: tente a sequência {+2, -4, +1} ou {+1, +1, -1, -1, -1, -1, +1}. Na verdade, o método Kadane é muito simples - ele apenas varre o array uma vez e mantém três variáveis ​​atualizadas no estilo de programação dinâmica.
rwong 27/02
@rwong: ah ok, Kadane é necessário no caso em que o mínimo vem depois do máximo. E conto 5 variáveis, não 3, mais o índice do loop.
Ben Voigt
@ Ben: você está certo, são 5 variáveis ​​mais o índice de loop.
rwong 28/02
1

Dou um 3. Além da maioria dos programadores que entrevistei, mas é um problema fácil para os que recomendei.

Kevin Cline
fonte