Voici mon algorithme initial:
create array of size 100 [0..99].
read first 100 numbers and put into array.
sort array in ascending order.
while more numbers in file:
get next number N.
if N > array[0]:
if N > array[99]:
shift array[1..99] to array[0..98].
set array[99] to N.
else
find, using binary search, first index i where N <= array[i].
shift array[1..i-1] to array[0..i-2].
set array[i-1] to N.
endif
endif
endwhile
C'est la (très léger) avantage est qu'il n'y a pas de O(n^2) brassage pour les 100 premiers éléments, juste un O(n log n) de tri et de vous identifier très rapidement et jeter celles qui sont trop petites. Il utilise également une recherche binaire (7 comparaisons max) pour trouver le bon point d'insertion au lieu de 50 (en moyenne) pour une simple recherche linéaire (non pas que je suggère à quiconque proféré une telle solution, il suffit qu'il peut impressionner l'intervieweur).
Vous pouvez même obtenir des points de bonus pour ce qui suggère l'utilisation d'excellents shift
des opérations comme l' memcpy
dans C condition que vous pouvez être sûr que le chevauchement n'est pas un problème.
Une autre possibilité que vous pourriez envisager est de maintenir trois listes (jusqu'à 100 entiers de chaque):
read first hundred numbers into array 1 and sort them descending.
while more numbers:
read up to next hundred numbers into array 2 and sort them descending.
merge-sort lists 1 and 2 into list 3 (only first (largest) 100 numbers).
if more numbers:
read up to next hundred numbers into array 2 and sort them descending.
merge-sort lists 3 and 2 into list 1 (only first (largest) 100 numbers).
else
copy list 3 to list 1.
endif
endwhile
Je ne suis pas sûr, mais qui peut finir par être plus efficace que le brassage continuel.
La fusion de tri est une simple sélection, le long de la lignes de (pour la fusion et le tri des listes 1 et 2 en 3):
list3.clear()
while list3.size() < 100:
while list1.peek() >= list2.peek():
list3.add(list1.pop())
endwhile
while list2.peek() >= list1.peek():
list3.add(list2.pop())
endwhile
endwhile
Il suffit de mettre, en tirant le top 100 des valeurs de la liste en vertu du fait qu'ils sont déjà triés dans l'ordre décroissant. Je n'ai pas vérifié en détail si cela allait être plus efficace, je suis juste en offrant une possibilité.
Je soupçonne que les enquêteurs seraient impressionnés par le potentiel de "out of the box" la pensée et le fait que tu avais dit qu'il faut en évaluer les performances.
Comme avec la plupart des entrevues, la compétence technique est l'une des choses qu'ils regardent.