Question d'entretien classant FizzBuzz (1), implémentant malloc (10) [clôturé]

10

J'aimerais avoir votre avis sur la difficulté de la question d'entretien suivante:

Trouvez le sous-tableau contigu avec la somme maximale dans un tableau d'entiers en temps O (n).

Ce problème de sondage trivial a été rendu célèbre par Jon Bentley dans ses Programming Pearls où il l'utilise pour démontrer les techniques de conception d'algorithmes.

Sur une échelle de 1 à 10, 1 étant le test FizzBuzz (ou HoppityHop ) et 10 étant implémentant la fonction C stdlib malloc (), comment classeriez-vous le problème ci-dessus?

Je pense que les personnes qui peuvent le mieux répondre à cette question sont celles qui ont lu Programming Pearls et qui ont essayé de résoudre ce problème par elles-mêmes. Pour motiver ceux qui ne l'ont pas fait, «Programming Pearls» apparaît plusieurs fois dans la liste des «10 meilleurs livres de programmation».

Quelques commentaires pourraient aider à obtenir une meilleure note:

  • L'implémentation de malloc () n'est pas aussi formidable qu'il n'y paraît. Voir le langage de programmation C de K&R par exemple. Il est parfois demandé à Microsoft .

  • Observation du CLRS sur la résolution de problèmes: il est souvent plus difficile de résoudre un problème à partir de zéro que de vérifier une solution clairement présentée, en particulier lorsque l'on travaille sous des contraintes de temps .

blrs
la source
12
La difficulté ici étant que les nombres entiers peuvent être négatifs? (sinon le tableau entier est toujours le plus grand sous-tableau, d'où O (1) :-P)
Macke
4
Le problème devrait dire "Trouver le sous
tableau
6
Je ne ferais pas de "in O (n)" une exigence dans une interview. Vous pouvez commencer avec une solution naïve, puis l'affiner si vous le souhaitez, mais je ne m'attendrais pas à ce que quelqu'un puisse dériver une solution O (n) dans une interview d'une heure sans exposition préalable à cet algorithme.
Dean Harding
2
Droite. C'est un problème facile si vous autorisez des solutions O (n²).
dan04
@Dean, j'espère qu'ils pourraient déplacer une somme de type moyenne en cours d'exécution de l'emplacement j vers j + 1 dans O (1). Peut-être pour être juste, cela peut être fourni à titre indicatif. (Je suppose que la longueur du sous-tableau a été prédéfinie)
Omega Centauri

Réponses:

17

Cela dépend vraiment du développeur.

Si malloc avait 10 ans, j'évaluerais ce problème à 20. Mais là encore, j'ai déjà fait malloc et je pourrais probablement le faire à nouveau.

Quelqu'un qui a fait ce problème ou qui connaît l'algorithme approprié du haut de sa tête en fera un 5 et malloc () un 10.

Le problème avec ce type de question est que si vous les avez faites avant, elles sont faciles et c'est vraiment un test pour savoir si vous avez déjà vu cet algorithme auparavant. Je ne les aime donc pas pour les interviews.

Maintenant, pour les tests où vous donnez au développeur quelques jours, c'est un très bon test parce que s'ils ne connaissent pas l'algorithme, vous leur donnez la chance de faire la recherche et de se mettre à jour et c'est un test non seulement vos connaissances, mais votre capacité à acquérir de nouvelles connaissances.

Martin York
la source
météo -> que ce soit au quatrième paragraphe (et désolé pour le bruit, je n'ai pas le représentant pour faire des modifications typographiques ...)
Matthieu M.
Martin, je pense que cela dépend du type de candidature pour laquelle vous interviewez des personnes. Pour les types de systèmes, malloc est assez simple. Pour moi -Je suis bloqué, [je suppose que l'adresse et la longueur de la pile, etc. m'ont été délibérément cachées] avec malloc, mais le problème des sous-réseaux est presque trivial. La clé est d'adapter les questions aux besoins de l'emploi.
Omega Centauri
8

Je suppose que la cote devrait être bidimensionnelle, au moins. FizzBuzz- mallocdécrit la gamme sur un axe, je l'appellerais "complexité technologique". Mais cette dimension unique n'est certainement pas suffisante pour décrire le problème. Pour résoudre le problème en question, le développeur doit penser plus que du code , tandis que la mise en œuvre mallocnécessite plus de discipline de codage que de créer des algorithmes complexes.

Voici donc comment j'organiserais ces problèmes:

entrez la description de l'image ici

Pour illustrer mon propos, j'ai ajouté un tri par fusion parallèle à l'intrigue, car je suppose que c'est un bon exemple de tâche sophistiquée à la fois technologiquement et algorithmiquement.

P Shved
la source
2

Je pense que c'est beaucoup plus difficile que FizzBuzz ou HoppityHop - ces deux-là ne sont rien de plus qu'un simple if-else ou un commutateur dans une boucle.

Le sous-tableau maximum nécessitera une analyse plus approfondie du problème sous-jacent - ce n'est pas quelque chose que vous vous attendez à voir dans une classe de programmation pour débutants car il nécessite des compétences mathématiques plus élevées qu'un problème de type FizzBuzz. Ce problème a une sensation similaire au problème du chemin le plus court, qui est résolu par l'algorithme de Dijkstra - c'est peut-être une spécialisation du problème du chemin le plus long .

Sur votre échelle de 1 à 10, je l'évaluerais probablement entre 3 et 5.

* Pendant que le serveur était en panne, j'ai trouvé que le problème de sous -réseau maximum avait sa propre page sur wikipedia.

oosterwal
la source
Quelqu'un peut-il expliquer pourquoi l'algorithme décrit sur wikipedia est nécessaire, lorsque l'algorithme conceptuellement beaucoup plus simple fonctionne pour moi: En un seul passage, calculez la somme cumulée, en trouvant le minimum et le maximum de la manière habituelle. La sous-séquence de somme maximale consécutive commence après l'indice de cumsum minimum et s'étend jusqu'à et y compris l'indice de cumsum maximum.
Ben Voigt
2
@Ben Voigt: essayez la séquence {+2, -4, +1} ou {+1, +1, -1, -1, -1, -1, +1}. En fait, la méthode Kadane est très simple - elle ne scanne le tableau qu'une seule fois et maintient trois variables mises à jour dans le style de la programmation dyanmique.
rwong
@rwong: ah ok, Kadane est nécessaire dans le cas où le minimum vient après le maximum. Et je compte 5 variables, pas 3, plus l'indice de boucle.
Ben Voigt
@Ben: vous avez raison, c'est 5 variables plus l'index de boucle.
rwong
1

Je lui donne un 3. Au-delà de la plupart des programmeurs que j'ai interviewés, mais un problème facile pour ceux que j'ai recommandés pour l'embauche.

Kevin Cline
la source