étant donné un nombre p , trouver deux éléments d'un tableau dont le produit = P
Je suis à la recherche d'une solution pour :
Given a array and a number P , find two numbers in array whose product equals P.
Cherche une solution meilleure que O(n*2) . Je suis d'accord avec l'utilisation de l'espace supplémentaire ou d'autres discbased .Toute aide est appréciée ?
cela sonne vraiment comme des devoirs.
Existe-il des restrictions sur les types de nombres (comme par exemple les nombres entiers, tout entiers positifs, etc.)?
pas de restrictions sur le nombre.
si il n'y a pas de restrictions sur le nombre (à part sans doute vrai) la probabilité qu'il existe une solution se rapproche de zéro, surtout si l'un ou plusieurs des numéros est un flottant rapprochement. Classique papier: docs.sun.com/source/806-3568/ncg_goldberg.html
Existe-il des restrictions sur les types de nombres (comme par exemple les nombres entiers, tout entiers positifs, etc.)?
pas de restrictions sur le nombre.
si il n'y a pas de restrictions sur le nombre (à part sans doute vrai) la probabilité qu'il existe une solution se rapproche de zéro, surtout si l'un ou plusieurs des numéros est un flottant rapprochement. Classique papier: docs.sun.com/source/806-3568/ncg_goldberg.html
OriginalL'auteur TopCoder | 2010-09-21
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer une fenêtre coulissante de l'approche. Tout d'abord trier tous les nombres de plus en plus, puis utilisez deux entiers
begin
etend
à l'indice actuel de la paire de nombres. Initialiserbegin
à 0 etend
à la dernière position. Puis comparer le produit dev[begin]
etv[end]
avecP
:begin
de l'avant.end
en arrière.Voici un code C++ avec cette idée en œuvre. Cette solution est O(n*log(n)) en raison de la tri, si vous pouvez supposer que les données sont triées, alors vous pouvez sauter le tri pour un O(n) solution.
Cette technique fonctionne, et il peut être prouvé. Cependant, en faisant cela, après que le tri n'est pas utile en termes de complexité. Vous pouvez simplement analyser les éléments et utiliser les binaires de recherche pour trouver le complément de l'opérande. La complexité globale est toujours en O(N Log N). L'avantage de cette technique est quand le tableau est déjà trié, de sorte que vous pouvez atteindre en temps linéaire.
Oui, vous avez raison. Je pensais à propos du déplacement des
begin
une fois trop loin, et d'avoir à le déplacer vers l'arrière afin d'essayer une paire avec une plus grandeend
. Mais dans cette image mentale, je néglige que le tableau a également été triés sur leend
côté...Cela pourrait ne pas fonctionner pour le tableau qui a des nombres négatifs? Ex: v = [-8,-2,2,8] et p = 16. d'abord v[begin]*v[fin] = -8*8 = -64 qui est de moins de 16 ans afin de procéder à l'augmentation de la commencer. Donc, dans cette façon nous nous ennuierons de la paire (-8,-2).
Oui. Si P est positif et il y a les nombres négatifs, vous devez résoudre des 2 sous-problèmes après le tri. Soit k le premier index contenant un nombre positif. Vous devez résoudre le subproblem [1..k-1] vs [1..k-1], ce qui peut être fait par (conceptuellement) l'inversion de cette gamme et "oublier" leurs signes négatifs, et également de résoudre l'subproblem [k..n] vs [k..n] (de la manière habituelle). Si P est négatif, alors une variation de l'algorithme original de travaux: début
begin
à k-1, et de le déplacer arrière lorsque le courant produit > P. de toute façon, c'est O(n), à l'exception des temps de tri.OriginalL'auteur jbernadas
Faire une passe à travers le tableau, et d'ajouter des éléments à une table de hachage. Pour chaque élément x ajouté, vérifiez si P/x existe déjà dans la table de hachage - si c'est le cas alors x et P/x est l'un de vos solutions. Ce serait à propos de les meilleures que vous allez obtenir.
Ce sera le travail . merci!
n'est-ce important? Accordé P/x pourrait ne pas être exactement de spot sur un élément dans la table de hachage - si cela pose un problème de tri le tableau binaire et de recherche pour localiser l'élément le plus proche de P/x et en multipliant cet élément par x pour vérifier les P peut être un meilleur choix.
votre réponse est, bien sûr, sur place. Toutefois, un certain niveau de quantification / binning doit être fait dans la mise en œuvre pour que cela fonctionne. Puis de nouveau, une telle quantification est également nécessaire pour l'O(n^2) l'algorithme. S'il vous plaît pardonnez commentaires publié tard dans la soirée. 🙂
OriginalL'auteur Will A
Celui-ci ne fonctionnent que pour les entiers:
Décomposer P comme produit de nombres premiers. En divisant ces deux groupes, vous pouvez obtenir les paires qui donne P comme produit. Maintenant, vous avez juste à cocher les deux d'entre eux sont présents dans le tableau, c'est là une table de hachage, serait très utile. Aussi, lors de la création de la table de hachage, vous pouvez également filtrer le tableau de répéter valeurs, des valeurs qui sont plus grand que P, ou même les valeurs qui sont les principaux facteurs qui ne sont pas contenues dans P.
Pas nécessairement, si vous avez un précalculées liste des nombres premiers, alors il est O(n).
Oui, vous avez raison. Bien que de stocker des nombres premiers nécessaire à factoriser tout entier de 64 bits, vous auriez besoin d' ~0.8 GO de mémoire. De toute façon, +1.
OriginalL'auteur ruslik
1.trier les nombres dans un tableau Un, en supprimant les zéros, en O(nlogn) temps
2.créer une matrice B telle que B[i] = P/A[I] en O(n) le temps
3.pour chaque B[k] dans B, faire une recherche binaire dans Un élément, prend O(nlogn) en temps dans le pire des cas
si l'élément B[k] existe dans le tableau A à la position m, alors A[k] * A[m] = P
sinon pas de la paire existe
le temps total d'exécution est O(nlogn)
Bien sûr, cela peut-être des difficultés sur une machine réelle due à virgule flottante erreur
OriginalL'auteur Bwmat
Voici mon coup, il compare uniquement les facteurs les uns avec les autres une fois
factors
a jamais rien mis dedans?OriginalL'auteur Randy the Dev
Ne sais pas si c'est la meilleure solution, mais il fonctionne. vous pouvez essayer de l'optimiser.
OriginalL'auteur user453695
Cet algo est de O(n)
OriginalL'auteur chase03
vide PrintPairOfProduct(int arr[],int taille,int k)
{
}}
OriginalL'auteur SANTOSH KUMAR MISHRA
Ci-dessous peut être une des solutions. Je suis juste un débutant. S'il vous plaît pardonnez-moi si il y a qqch qui cloche dans ma algorithme.
Laisser le tableau input être inputArr, et d'assumer la plage de valeurs des éléments dans
inputArr
est>= 0, <= M
.Créer un bool array, à savoir presenceOfInputValue, de taille M+1,
et tous ses éléments initialisé à false.
Une fois qu'une valeur x est présent dans l'
inputArr
,presenceOfInputValue[x] = true
.Cela signifie que, si
presenceOfInputValue[x] == true
,x
est présent dans le tableau d'entrée.Boucle pour obtenir tous les Bi et configurer le presenceOfInputValue, et si Bi est un entier, vérifier si elle est présente dans inputArr en vérifiant si
presenceOfInputValue[i] == true
.P. S. Supposons
M = 256^4(4bytes) - 1
, presenceOfInputValue occupera256^4/8/1000/1000 ~= 16.8MB
OriginalL'auteur FightForLove
OriginalL'auteur NinjaNick