Ordenar una array de strings según la frecuencia

Dada una array de strings arr[] , la tarea es ordenar la array de strings según la frecuencia de cada string, en orden ascendente. Si dos elementos tienen la misma frecuencia, se clasifican en orden lexicográfico.

Ejemplos: 

Entrada: arr[] = {“Geeks”, “for”, “Geeks”} 
Salida: {“for”, “Geeks”} 
Explicación: 
Como la string “Geeks” tiene una frecuencia de 2 en la array dada, por 
lo tanto, la posición de la string «Geeks» será 2

Entrada: arr[] = {“abc”, “pqr”, “pqr”, “abc”} 
Salida: {“abc”, “pqr”} 
Explicación: 
Como ambas strings tienen la misma frecuencia, la array se ordena en El orden lexicográfico.  

Enfoque La idea es usar un comparador personalizado para ordenar la array de strings con su frecuencia, según los siguientes pasos.
 

  • Se utiliza una estructura de datos de mapa para almacenar las strings en función de su frecuencia como pares (frecuencia, string).
  • Ordene estos pares con la ayuda de un comparador personalizado de modo que si dos strings tienen frecuencias diferentes, la string con una frecuencia más baja se almacena antes. De lo contrario, si la frecuencia es la misma, compare las strings lexicográficamente
     

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ implementation to sort the
// array of strings by its frequency
 
#include <bits/stdc++.h>
using namespace std;
 
// Custom comparator function to
// sort the string by its frequency
bool cmp(pair<int, string> x,
         pair<int, string> y)
{
 
    // Condition to check if the
    // frequency of the string is less
    if (x.first < y.first) {
        return true;
    }
 
    // Condition to check if the
    // frequency of the string is greater
    else if (x.first > y.first) {
        return false;
    }
 
    // Condition when frequency of
    // the strings is equal
    else {
 
        // Condition to check if the
        // first string is lexicographically
        // smaller than second string
        if (x.second < y.second) {
            return true;
        }
        else {
            return false;
        }
    }
}
 
// Function to sort the array of strings
// by its frequency in the array
void printArraystring(string str[], int n)
{
    unordered_map<string, int> m;
 
    // Loop to store the frequency
    // of a string in a hash-map
    for (int i = 0; i < n; i++) {
        m[str[i]]++;
    }
 
    // Iterator for the map
    vector<pair<int, string> > vec;
 
    // Loop to store the frequency and
    // string in a vector
    for (auto it = m.begin(); it != m.end();
         it++) {
        vec.push_back(
            make_pair(it->second, it->first));
    }
 
    // Sort the string
    // using custom comparator
    sort(vec.begin(), vec.end(), cmp);
 
    // Loop to print the sorted vector
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i].second << ", ";
    }
}
 
// Driver Code
int main()
{
    string arr[] = { "Geeks", "for", "Geeks",
                     "for", "arc" };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    // Function to perform sorting
    printArraystring(arr, n);
 
    return 0;
}

Python 3

# Python 3 implementation to sort the
# array of strings by its frequency
 
# Custom comparator function to
# sort the string by its frequency
def srt(x):
    for i in range(len(x)-1):
        for j in range(i+1,len(x)):
            if(x[i][0]>x[j][0]):
                temp = x[j]
                x[j] = x[i]
                x[i] = temp
            elif(x[i][0] == x[j][0]):
                if(x[i][1]<x[j][1]):
                    temp = x[j]
                    x[j] = x[i]
                    x[i] = temp
                     
 
# Function to sort the array of strings
# by its frequency in the array
def printArraystring(str,n):
    m = {str[i]:0 for i in range(n)}
 
    # Loop to store the frequency
    # of a string in a hash-map
    for i in range(n):
        m[str[i]] += 1
 
    # Iterator for the map
    vec = []
 
    # Loop to store the frequency and
    # string in a vector
    for key,value in m.items():
        vec.append([value,key])
 
    # Sort the string
    # using custom comparator
    srt(vec)
 
    # Loop to print the sorted vector
    for i in range(len(vec)):
        if i==len(vec)-1:
            print(vec[i][1])
        else:
            print(vec[i][1],end = ",")
         
 
# Driver Code
if __name__ == '__main__':
    arr = ["Geeks", "for", "Geeks","for", "arc"]
    n = len(arr)
 
    # Function to perform sorting
    printArraystring(arr, n)
 
# This code is contributed by Surendra_Gangwar

Javascript

<script>
// Javascript program
 
// Custom comparator function to
// sort the string by its frequency
function cmp(x, y)
{
   
    // Condition to check if the
    // frequency of the string is less
    if (x[0] < y[0]) {
        return -1;
    }
   
    // Condition to check if the
    // frequency of the string is greater
    else if (x[0] > y[0]) {
        return 1;
    }
   
    // Condition when frequency of
    // the strings is equal
    else if (x[0] === y[0]){
   
        // Condition to check if the
        // first string is lexicographically
        // smaller than second string
        if (x[1] < y[1]) {
            return 1;
        }
        else {
            return -1;
        }
    }
}
   
// Function to sort the array of strings
// by its frequency in the array
function printArraystring(str, n)
{
    var m = {};
    for (i = 0; i < n; i++) {
        m[str[i]] = 0;
    }
     
    // Loop to store the frequency
    // of a string in a hash-map
    for (i = 0; i < n; i++) {
        m[str[i]]++;
    }
   
    // Iterator for the map
    var vec = new Array(n);
    for (i = 0; i < n; i++) {
        vec[i] = [];
    }
   
    // Loop to store the frequency and
    // string in a vector
    var k = 0
    for (var it in m) {
        vec[k] = [m[it], it];
        k += 1;
    }
   
    // Sort the string
    // using custom comparator
    vec.sort(cmp);
   
    // Loop to print the sorted vector
    for (var i = 0; i < k; i++) {
        document.write(vec[i][1]+", ");
    }
}
 
var arr = [ "Geeks", "for", "Geeks", "for", "arc" ];
n = arr.length;
 
// Function to perform sorting
printArraystring(arr, n);
</script>
Producción: 

arc, for, Geeks,

 

Complejidad de tiempo: O (nlogn)

Complejidad espacial: O(n)

Publicación traducida automáticamente

Artículo escrito por spp____ y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *