Recherche efficace du nombre d'éléments plus petits pour chaque élément d'un tableau


9

Je suis coincé sur ce problème:

Étant donné un tableau des premiers nombres naturels permutés de façon aléatoire, un tableau est construit, de telle sorte que est le nombre d'éléments de à qui sont plus petits que . n B B ( k ) A ( 1 ) A ( k - 1 ) A ( k )AnBB(k)A(1)A(k1)A(k)

i) Étant donné pouvez-vous trouver en temps ? ii) Étant donné pouvez-vous trouver en temps ?B O ( n ) B A O ( n )ABO(n)
BAO(n)

Ici, . Pour un exemple concret: | A 8 4 3 1 7 2 9 6 5 B 0 0 0 0 3 1 6 4 4 |B(1)=0

|A843172965B000031644|

Quelqu'un peut-il m'aider? Merci.


J'ai trouvé ceci: le calcul des codages de permutation qui donne des algorithmes pour ces problèmes. Au moins, je pense que ce sont les mêmes problèmes. O(nlogn)
Realz Slaw

@Merbs, cet indice que vous avez donné signifie-t-il que vous avez une solution?
AJed

1
@AJed, cela signifie que j'ai un algorithme, mais il faut pour l'algorithme simple sans espace et si nous avons de l'espace. Pour le moment, je penche pour que ni l'un ni l'autre ne soit possible en et les deux soient le même algorithme. O ( n log n ) O ( n )O(n2)O(nlogn)O(n)
Merbs

@Merbs. Je pense que votre indice peut conduire à la bonne voie. im ayant une solution aussi (suivant votre indice). Je suppose qu'il y a une astuce dans l'analyse qui fait passer à .. Je pense que l'astuce est la connaissance que va de 1: seulement. A nO(n)An
AJed

2
Cet article donne également un algorithme . Êtes-vous sûr qu'il existe un algorithme pour cela? O ( n )O(nlogn)O(n)
Realz Slaw

Réponses:


1

L'algorithme naïf pour déterminer partir de :ABA

Pour , déterminez la valeur de en comparant chaque à pour et en comptant ceux qui satisfont .B ( k ) A ( i ) A ( k ) i = 1 , , k A ( i ) < A ( k )k=1,,nB(k)A(i)A(k)i=1,,kA(i)<A(k)

Cet algorithme compare à tous les autres ( fois), à autres, etc. donc le nombre total de comparaisons est . Mais ce n'est pas le mieux que nous puissions faire. Par exemple, en regardant , nous n'avons pas à faire de comparaisons! car il s'agit des premiers nombres naturels, et il est garanti (quelle que soit la permutation) que les nombres naturels inférieurs seront là. Et ? Au lieu de vérifier à , nous pourrions simplement vérifier . C'est:n - 1 A ( 2 ) n - 2 ( n - 1 ) ( n - 2 )A(1)n1A(2)n2 B(n)B(n)=A(n)-1nn-1B(n-1)A(1)A(n-2)A(n)(n1)(n2)2B(n)B(n)=A(n)1 nn1B(n1)A(1)A(n2)A(n)

Pour , utilisez l'algorithme ci-dessus; pour utilisez l'algorithme inverse: déterminez en le définissant initialement sur puis en soustrayant pour chaque entrée pour inférieur à . k=nk=1,,n2B(k)A(n)-11A(i)i=k+1,,nA(k)k=n2,,nB(k)A(n)11A(i)i=k+1,,nA(k)

Cela prendrait étapes, qui est toujours . Notez également qu'en construisant partir de , si alors . O(n2)ABB(n)=A(n)-1A(n)=B(n)+12×(n21)(n22)2=(n2)(n4)4O(n2)ABB(n)=A(n)1A(n)=B(n)+1

Mais maintenant pour plus de finesse. Si nous avons droit à un espace supplémentaire ou à un tri sur place, nous pouvons trier les chiffres en les comparant. Par exemple:

|A843172965S987432165B0000316|

Au lieu de les vérifier tous (ou de les vérifier dans l'ordre), nous pourrions utiliser la recherche binaire pour déterminer chaque . Cependant, le tri prend encore du temps .B(k)O(nlogn)


Ce n'était que ma première idée; même si je me rends compte que le problème est plus intéressant que je ne l'avais initialement attribué. Et je n'ai pas encore eu l'occasion de lire les résultats de Realz Slaw, donc l'algorithme peut être désactivé.
Merbs

0

Plutôt que de déterminer chaque un à la fois, nous pouvons être tournés vers l'avenir et ne parcourir chaque numéro de qu'une seule fois ! Mais nous utiliserons espace:B(k)A n

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

Nous pourrions gagner encore plus de temps en ne mettant pas à jour ceux qui ont déjà été déterminés (c'est-à-dire qu'il est inutile de mettre à jour après la première étape), mais dans le pire des cas, nous devons encore mettre à jour fois8(n)(n+2)2


0

I et II peuvent être résolus en utilisant #next_greater_element que j'ai expliqué ici . mais c'est un peu plus difficile que le problème, mais avant la solution, vous devez apprendre le prochain élément plus important:

  1. considérons que nous avons un vecteur pour chaque élément de nommez-le pour l'élément . maintenant, exécutez une fois l'algorithme supérieur suivant, de droite à gauche, mais sauf pour définir l'élément dans son index d'élément supérieur suivant, appuyez sur les éléments dont est leur prochain élément supérieur. puis parcourez le tableau de gauche à droite, puis où est la taille du vecteur son car chacun le plus grand algorithme suivant est et aussi itération estS i i i A S i i B [ i ] = x j = 0 ( S i [ j ] + 1 ) x S i Θ ( n ) Θ ( n ) Θ ( n )ASiiiASiiB[i]=j=0x(Si[j]+1)xSiΘ(n)Θ(n)Θ(n)

la deuxième partie est également similaire en notant que nous pouvons obtenir la valeur de l'élément le plus à droite dans EDIT: ma solution est fausse il semble qu'elle n'a pas de solutiono ( n )O(1)o(n)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.