Мне нужен алгоритм сортировки - PullRequest
0 голосов
/ 13 октября 2019

Я ищу алгоритм.

Учитывая N пользователей. Каждый N пользователей представляет 1 ранжированный список вариантов Q из Z (Z> Q). Опции Q каждого пользователя различны.

Это может быть применено к фруктам. N Рейтинг пользователей.

[passion fruit, apple, orange, pear, cherry, blueberry, banana]
[blueberry, pear, cherry, banana]
[passion fruit, blueberry, banana, apple, orange]

.... ETC

Я также хочу, чтобы его можно было обновлять при каждой новой записи. Какое ваше самое умное, лучшее или наиболее эффективное решение, укажите и укажите, почему? СПАСИБО В НАСТОЯЩЕЕ ВРЕМЯ.

РЕДАКТИРОВАТЬ: В ответ на комментарий я сделал пример с фруктами. Я хочу сайт рейтинга фруктов. Пользователи могут заходить на сайт, оценивать все виды фруктов, которые она или он попробовали, и это «голосование» рейтинга. Главный список отображает общий рейтинг. Так что я думаю, что любимый фруктовый вкус людей *. Хотя алгоритм может работать для чего угодно.

1 Ответ

0 голосов
/ 13 октября 2019

Что вы можете сделать, так это сохранить средний ранг для каждого фрукта, и итоговый общий список рейтинга можно отсортировать по среднему рангу фруктов. Для приведенных вами примеров passion fruit ранжируется 0 дважды, поэтому будет иметь средний ранг 0. blueberry оценивается 5, 0 и 1 в трех записях, таким образом, будет иметь средний ранг 2. Окончательный общий список рейтингабудет начинаться с passion fruit и других фруктов, отсортированных по средним разрядам.

Map<String, int[]> fruitToRank = new HashMap<String, int[]>();
//key is name of the fruit
//val[0] is sum of ranks and val[1] is vote counts for the fruit

void newEntry(String[] rank) {
    for (int i = 0; i < rank.length; i++) {
        String fruitName = rank[i];

        if (fruitToRank.containsKey(fruitName)) {
            int[] rankInfo = fruitToRank.get(fruitName);
            rankInfo[0] += i; //add rank to sum of ranks
            rankInfo[1]++; //number of vote counts
        } else {
            int[] rankInfo = new int[] {i, 1};
            fruiteToRank.put(fruitName, rankInfo);
    }
}

int[] getNFavoriteFruits(int n) {
    int[] result = new int[n];

    //fruit with lower number as average rank has higher priority
    PriorityQueue<String> pq = new PriorityQueue<String>((s1, s2) -> {
        int[] rankInfo1 = fruitToRank.get(s1);
        int[] rankInfo2 = fruitToRank.get(s2);

        double averageRank1 = (double)rankInfo1[0] / rankInfo1[1];
        double averageRank2 = (double)rankInfo2[0] / rankInfo2[1];

        return averageRank1 - averageRank2;
    });

    for (String k: fruitToRank.keySet()) {
        pq.add(k);
    }

    for (int i = 0; i < n; i++) {
        result[i] = pq.poll();
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...