Как указывает Йонас Эльфстрём , Фишер-Йейтс - это канонический способ перетасовать набор, и это, вероятно, хорошая идея, поскольку он позволит вам получать данные для каждого элемента.Я думаю, что вы, вероятно, хотите больше, чем один проход, хотя.По сути, при сортировке коллекции элементов вы создаете ориентированный граф, в котором узлами являются элементы, а ребра представляют отношение , большее или равное .Когда можно алгоритмически определить это отношение, тогда будет достаточно одного прохода, и вы получите хорошо упорядоченный набор.
Сложность здесь в том, что очень правдоподобно смотреть на книги по две и позволятьЧеловек решит без четко определенного алгоритма, и в итоге возникнет ситуация, когда A> B, B> C и C> A. Это явно не приведет к хорошо упорядоченному набору.Хуже того, в два разных дня можно было бы дать два разных ответа для одних и тех же двух книг.
Лучший способ сделать это - сохранить матрицу n
x n
, гдеn
- количество сортируемых товаров.запись i, j
- это количество раз, когда элемент i
был выбран лучше, чем элемент j
.Здесь i
индексирует строки и j
индексирует столбцы.
Отсюда, PageRank , который, к сожалению, запатентован 1 , будет идеальным.Не так элегантно, но, возможно, достаточно хорошо, чтобы сложить разницу между a
ij
и a
ji
, а затем отсортировать книги на основе этого.Например, сортировка трех книг
A B C
_ _ _
A|0 3 2
B|2 0 3
C|1 2 0
будет означать, что A
был оценен лучше, чем B
3 раза, и лучше, чем C
2 раза.Суммирование строк дает
A: (AB - BA) + (AC - CA) = (3 - 2) + (2 - 1) = 2
B: (BA - AB) + (BC - CB) = (2 - 3) + (3 - 2) = 0
C: (CA - AC) + (CB - BC) = (1 - 2) + (2 - 3) = -2
Таким образом, они будут сортироваться как A > B > C
.
Если вы не собираетесь использовать рейтинг страницы, то вы можете исключить матрицу и получитьидентичные результаты, связывая целое число, инициализированное в 0 для каждой книги.Если для B
выбрано значение A
, увеличьте целое число, связанное с A
, и уменьшите целое число, связанное с B
.
1 Извините за разглагольствование, но я знаю, как вы запатентоваличто по сути математический результат.