Méthode efficace pour compter les occurrences d'une clé dans un tableau trié
Cela a été demandé sur le site de Microsoft à l'entrevue.
Compter le nombre d'occurrences d'une clé donnée dans un tableau.
J'ai répondu recherche linéaire car les éléments peuvent être dispersées dans l'
tableau. Dire que la clé se trouve au début et à la fin. Nous avons donc
besoin de numériser l'ensemble du tableau.
Ensuite, il a demandé à ce que si le tableau est trié?
Pensé pendant un moment et dit que je vais utiliser la recherche linéaire de nouveau. Parce que le
les répétitions de la clé si le présent peut être n'importe où dans le tableau. Comme un
optimisation j'ai aussi dit que si le premier et le dernier éléments du tableau sont les mêmes que vous
peut prendre la longueur du tableau comme la réponse.
Mon analyse est correcte dans les deux cas?
Exemple:
Input = [0 0 1 1 1 2 2 3 3], key = 1, Answer = 3
Input = [0 0 2 2 3 3], key = 1, Answer = 0
source d'informationauteur Edward
Vous devez vous connecter pour publier un commentaire.
Pour les ménagères de tableau il n'y a pas beaucoup que nous pouvons faire d'autre que la recherche linéaire.
Pour tableau trié, vous pouvez le faire en
O(logN)
à l'aide d'un peu modifié binaires de recherche:key
appelerf
.key
appelerl
.key
existe dans le tableaul-f+1
est la réponse.
Trouver la première occurrence:
arr[i]
est la première occurrence dekey
iffarr[i] == key
et soiti == 0
( c'est le premier élément dela matrice) ou
arr[i-1] != key
(ce n'est pas la premièreélément de la matrice et de l'élément de
il est à gauche est différente)
Vous pouvez légèrement modifier le binaire de recherche pour trouver la première occurrence.
Dans une recherche binaire vous mettre fin à la recherche lorsque vous trouvez
arr[mid] == key
.Modifier la condition de sorte que vous mettre fin à la recherche lorsque vous trouvez la première occurrence au lieu de tout événement.
Algorithme:
De même, vous pouvez trouver la dernière occurrence.
Pour une fois, je vais proposer une implémentation en C++.
equal_range
utilise une recherche binaire, le résultat est équivalent à:mais la mise en œuvre devrait le rend légèrement plus rapide, même si tous sont en O(log N) (en termes de nombre de comparaisons).
Vous pouvez utiliser une version récursive de la recherche binaire
.
(high - low)
donne le nombre de touches**
Temps de la Complexité = O ( lg N ) où N est la taille du tableau
** Arguments pour binarySearchXXXXX:**
**
Comment à ce sujet pour le tri de la partie, avec O(logN) le temps de la complexité?
paquet de tableaux;
/*
* Étant donné un tableau trié, trouver le nombre de fois qu'un élément a eu lieu.
* Une recherche binaire O(lgn)
* */
public class NumberOfN {
}
Nous pouvons le résoudre à l'aide Linéaire ainsi que la Recherche Binaire.
Mais la Recherche Linéaire O(n).Binaire de Recherche donnera O(Logn).
Par conséquent, il est préférable d'utiliser la recherche Linéaire.
Le programme complet est :
Il y a une autre question qui est posée est la suivante : 1ère et la dernière occurrence d'un nombre donné dans un tableau trié.
En Python :
Si le tableau est trié, oui, la recherche linéaire à partir d'une extrémité à l'autre est aussi bon qu'il obtient.
Cependant, si le tableau est trié, vous pouvez faire mieux qu'en temps linéaire en appliquant binaire ou l'interpolation des techniques de recherche.
Traiter le problème comme le même que le "Trouver le nombre X dans une liste triée", avec le détail", puis balayez de gauche et de droite afin de déterminer combien de fois X apparaît". La première partie, la recherche, le mieux est d'en binaire ou l'interpolation de recherche dans la plupart des cas.
http://en.wikipedia.org/wiki/Interpolation_search
http://en.wikipedia.org/wiki/Binary_search
Oui, vous avez raison pour les ménagères de tableau, mais pour tableau trié, vous pouvez utiliser les binaires de recherche pour localiser une occurence de l'élément et une fois qu'une occurrence est trouvée seulement de numériser les éléments adjacents jusqu'à ce que vous trouver les inadéquations et puis s'arrêter.