Comment pouvons-nous trouver une deuxième maximale de la matrice de manière efficace?
Est-il possible de trouver le deuxième nombre maximal à partir d'un tableau d'entiers en parcourant le tableau qu'une seule fois?
Comme un exemple, j'ai un tableau de cinq entiers à partir de laquelle je veux trouver un deuxième nombre maximum. Ici est une tentative que j'ai donné dans l'interview:
#define MIN -1
int main()
{
int max=MIN,second_max=MIN;
int arr[6]={0,1,2,3,4,5};
for(int i=0;i<5;i++){
cout<<"::"<<arr[i];
}
for(int i=0;i<5;i++){
if(arr[i]>max){
second_max=max;
max=arr[i];
}
}
cout<<endl<<"Second Max:"<<second_max;
int i;
cin>>i;
return 0;
}
L'interviewer, cependant, est venu avec le cas de test int arr[6]={5,4,3,2,1,0};
, ce qui l'empêche d'aller à la if
condition la deuxième fois.
Je l'ai dit à l'enquêteur que le seul moyen serait d'analyser le tableau en deux temps (deux for
boucles). Quelqu'un at-il une meilleure solution?
- Importe-t-il, est le tableau est réorganisée dans le processus de recherche de la seconde maximum?
- utilisation
Heap
structure au lieuarray
ou de l'utilisationsorted array
structure
Vous devez vous connecter pour publier un commentaire.
Votre initialisation de
max
etsecond_max
à-1
est erronée. Que faire si la matrice a des valeurs comme{ -2,-3,-4}
?Ce que vous pouvez faire à la place est de prendre les 2 premiers éléments de la matrice (en supposant que la matrice a au moins 2 éléments), de les comparer, d'attribuer la plus petite à
second_max
et la plus grande pourmax
:Puis commencer à comparer à partir de la 3ème élément et mise à jour
max
et/ousecond_max
tant que de besoin:La solution la plus simple serait d'utiliser
std::nth_element
.O(N^2)
, dans le pire des cas. LeO(N)
-garantie de passer un algorithme, tout n'est pas extensible, c'est mieux pour ce problème spécifique.O(n)
dans le pire des cas. La page fournit à unO(n)
pire cas de l'algorithme.O(N^2)
les pires cas de comportement, sauf si vous choisissez le pivot de très près (wikipedia: "Comme quicksort, la performance de l'algorithme est sensible à l'axe qui est choisi. Si les mauvaises pivots sont constamment choisi, cela se dégrade au minimum à base de sélection décrit précédemment, et donc peut exiger jusqu'à O(n^2)"). En moyenne, dans la pratique, cependant, même potentiellement mauvais pivot algorithme de sélection est assez bon.std::nth_element
, pas pour le pire des cas. En tant que tel, la mise en œuvre peut en effet exposer super-linéaire de l'exécution.Vous avez besoin d'un deuxième test:
Votre code d'origine est bon, vous avez juste à initialiser le max et second_max variables. Utilisez les deux premiers éléments dans le tableau.
Vous êtes ici:
for
à la place. (note: même si il y avait unfor_each
déclaration,++it
serait en contradiction avec l'intention)Quickselect est le chemin pour aller avec celui-ci. Le Pseudo-code est disponible à ce lien donc je vais juste expliquer l'ensemble de l'algorithme:
Ce qui est bien évidemment basée sur la bonne vieille algorithme quicksort.
Suivant cet algorithme à travers, toujours en sélectionnant l'élément zéro comme le pivot de tous les temps:
Votre tableau dans un ordre non défini par la suite, c'est à vous si c'est un problème.
L'étape 1. Décider sur les deux premiers numéros.
Étape 2. Boucle par le biais de numéros restants.
Étape 3. Maintenir plus tard maximale et la seconde maximum.
Étape 4. Lors de la mise à jour de seconde maximum, sachez que vous ne faites pas de maximum et de la deuxième maximum égal.
Testé pour entrée triée (ascendant et descendant), aléatoire d'entrée, entrée en ayant des doublons, fonctionne très bien.
D'autre moyen de résoudre ce problème est d'utiliser des comparaisons entre les éléments. Comme par exemple,
Comparer 1,2 et dire max = 2 et s max = 1
Maintenant comparer 3 et 4 et de comparer les plus grands d'entre eux avec max.
L'avantage est, vous êtes l'élimination de deux nombres dans deux comparaisons.
Laissez-moi savoir, si vous avez un problème de compréhension de ce.
Cochez cette solution.
Ici est quelque chose qui peut fonctionner ,
La limite supérieure doit avoir n+log2n−2, mais plus grand que O(n) dans le cas de la sélection aléatoire de l'algorithme, mais dans le pire des cas, il est beaucoup plus petit. La solution pourrait être
construire un arbre comme pour trouver le MAX de l'élément n - 1 comparaisons
max(N)
/\
max(N/2) max(N/2)
retirer le MAX et de trouver le MAX de nouveau log2n - 1 comparaison
PS. Il utilise de la mémoire supplémentaire, mais il plus rapide que la sélection aléatoire de l'algorithme dans le pire cas.
Ne peut-on pas régler ce, dans l'ordre décroissant et prendre la 2ème élément du tableau trié?
Comment au sujet de la suite ci-dessous.
make_heap est O(n) donc, c'est efficace et c'est 1 passe
Nous trouvons le second max par prendre avantage qu'il doit être l'un des tas des enfants de la mère, qui avait le maximum.