trier le tableau dans l'ordre décroissant de fréquence d'apparition des éléments dans le C
Question est de trier le tableau en fonction de la fréquence
des éléments. Par exemple, si le tableau d'entrée est
{ 2, 3, 2, 4, 5, 12, 2, 3, 3, 3, 12 }
puis modifier le tableau:
{ 3, 3, 3, 3, 2, 2, 2, 12, 12, 4, 5 }
J'ai écrit le code et il fonctionne correctement, mais c'est à l'aide de beaucoup d'espace et possède une très grande complexité.
Je ne suis pas satisfait de cette solution et de la logique, j'ai postulé pour ce. Si quelqu'un aider à optimiser ce code ou de fournir une meilleure logique.
Mon Code est:
#define _CRT_SECURE_NO_WARNINGS //this line to work code in visual studio
#include <stdio.h>
int main() {
/*
* n = number of integer
* i = loop variable
* j = inner loop variable
* c = number of distinct input
* buf = temprary storage for input value
* k = possibility of frequency of any no.
*/
int n, i, j, c = 0, buf, k;
int b; //act as flag
int arr[100] = { 0 };
int stack[200] = { 0 };
int top = -1;
printf("Enter the size of array(integer between 1-100):");
scanf("%d", &n);
n *= 2;
printf("----------Enter the elements in the array----------\n\n");
for (i = 0; i < n; i += 2) {
b = 0;
printf("Enter the element:");
scanf("%d", &buf);
for (j = 0; j <= i; j += 2) {
if (arr[j] == buf) {
arr[j + 1]++;
b = 1;
}
}
if (b == 0) {
c++;
arr[c * 2 - 2] = buf;
arr[c * 2 - 1]++;
}
}
for (i = 0; i < c * 2; i++)
printf("%d ", arr[i]);
//input done in form of (element,times of occurence i.e. frequency),to print array, write this outside of comment:
//for (i = 0; i < c * 2; i++) printf("%d ", arr[i]);
for (k = 1; k < n / 2; k++) { //checking for possible frequencies
for (j = c * 2 - 1; j > 0; j -= 2) {
//locations(index) to check in array for frequency
//left to right, so with same frequency no.,which occurred first will push in last.
if (arr[j] == k)
stack[++top] = j; //pushing(index of frequency) into stack in increasing order of frequency
}
}
//to print stack, write this outside of comment:
//printf("\nstack\n");
//for (i = top; i > -1; i--) printf("%d ",stack[i]);
//printing of elements in there decreasing order of frequency(pop from stack)
//we have to print element, number of times of its frequency
printf("\n\n----------Output array in sorted order of there frequency----------\n");
for (top; top > -1; top--) {
for (j = arr[stack[top]]; j > 0; j--)
printf("%d ", arr[stack[top] - 1]);
}
}
Êtes-vous limité à
Lire: Trier les éléments en fonction de la fréquence | Set 2
oui, parce que je ne sais pas c++ à tous... mais vous pouvez sugest avec le c++ pour les autres.. bt je vais définitivement pas capable de comprendre ça..
Vous pouvez choisir une technique de cette réponse Comment organiser un tableau dans l'ordre décroissant de la fréquence de chaque numéro?
J'ai essayé d'utiliser std::map et paire et ne pouvait pas faire moins de 17 lignes 🙂
C
seulement? Si C++
est permis, où vous pouvez utiliser std::map
et qsort
, vous pouvez le faire en 15 lignes de codeLire: Trier les éléments en fonction de la fréquence | Set 2
oui, parce que je ne sais pas c++ à tous... mais vous pouvez sugest avec le c++ pour les autres.. bt je vais définitivement pas capable de comprendre ça..
Vous pouvez choisir une technique de cette réponse Comment organiser un tableau dans l'ordre décroissant de la fréquence de chaque numéro?
J'ai essayé d'utiliser std::map et paire et ne pouvait pas faire moins de 17 lignes 🙂
OriginalL'auteur Nit kt | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé un moyen élégant pour la réalisation de ce genre en place avec le pire des cas, la complexité si O(N2) et moyenne complexité de O(N. log(N)).
La méthode utilise les étapes suivantes:
qsort
avec une simple comparaison de la fonction pour cela.Voici le code:
OriginalL'auteur chqrlie
Vous pourriez commencer avec une version modifiée de seau de tri, mais arrêtez de halfways, après la création de la liste de seau.
J'ai fait cette, inspire par seau de tri. C'est le maillon le plus faible est la fonction de tri rapide, mais je il pourrait être modifié pour utiliser seau de tri. J'estime que la complexité d'un tableau à Une longueur n et de la valeur maximale m est O(m + n log n) et en cas de modification avec godet de tri au lieu de qsort elle devrait tomber à O(m+n)
OriginalL'auteur Broman
1) Créer un BINAIRES de RECHERCHE ARBRES et lors de la création d'un TBS de maintenir le comte i,e fréquence de chaque entrée de l'élément dans le même BST. Cette étape peut prendre en O(nLogn) si une auto-équilibrage de la BST est utilisé.
2) Ne Afinde de la traversée de la STB et de stocker chaque élément et le nombre de chaque élément dans un tableau auxiliaire. Nous allons l'appeler l'auxiliaire tableau en tant que ‘[]’. Notez que chaque élément de ce tableau est l'élément et de la fréquence de la paire. Cette étape prend O(n) fois.
3) Tri ‘[]’ en fonction de la fréquence des éléments. Cette étape prend O(nLohn) si O(nLogn) algorithme de tri est utilisé.
4) de Parcourir à travers le tableau trié ‘[]’. Pour chaque élément x, de l'imprimer, ‘freq’ fois où ‘freq’ est la fréquence de x. Cette étape prend O(n) fois.
Globale de la complexité temporelle de l'algorithme peut être minimum en O(nLogn) si l'on utilise un O(nLogn) algorithme de tri et d'utiliser un auto-équilibrage de la BST avec O(Logn) opération d'insertion.
source
OriginalL'auteur Ali
Trier le tableau par valeur; RLE le résultat, en tournant chaque durée d'égal à égal dans une paire de l'élément et de la durée de la longueur (vous pouvez utiliser un tableau auxiliaire à l'arrière de la deuxième composante); trier les paires dans l'ordre décroissant par le second composant; il est de votre résultat. Le tout dans O(n log n) temps et O(n) de l'espace supplémentaire.
OriginalL'auteur Will Ness
OriginalL'auteur MOHAMMED A J