Мне было интересно, есть ли имя для алгоритма, который изучает порядок набора элементов на основе отсортированных списков этих элементов, а затем может сортировать списки, состоящие из некоторых из этих элементов, используя этот порядок.

Примере:

У нас есть 5 элементов: «крошечный», «маленький», «средний», «большой», «огромный». Конечно, алгоритм не понимает значения этих слов. Мы можем формировать списки с некоторыми из этих слов, которые отсортированы по «размеру» слова (от наименьшего к наибольшему):

  • «маленький», «средний», «огромный»
  • «крошечный», «средний», «большой»
  • «крошечный», «маленький», «большой», «огромный»

Алгоритм, который я ищу, берет только эти отсортированные списки и формирует единый список со всеми правильно отсортированными словами (это будет [«крошечный», «маленький», «средний», «большой», «огромный»]).

1
kangalioo2 31 Дек 2017 в 13:27

2 ответа

Лучший ответ

Вы можете построить ориентированный граф из примеров, где слова являются вершинами, а рёбра отражают последовательность. Например. в первом примере края будут от «малого» до «среднего» и от «среднего» до «огромного».

Затем выполните топологическую сортировку графа.

3
Henry 31 Дек 2017 в 11:07

Используйте любой алгоритм сортировки, алгоритм сортировки требует ввода, чтобы при сравнении двух элементов вы знали, какой элемент идет первым.

Например:

array.sort(compareFunction)

Где compareFunction берет 2 элемента и возвращает, если первый элемент идет первым в списке, чем второй элемент.

Из списка ваших коротких списков вам нужно выяснить, что из каждых двух элементов идет первым.

Используйте свои списки ввода, создайте такую таблицу:

       tiny small medium huge large
tiny    -    T       T     T    T
small   F    -       T     T    T
medium  F    F       -     T    T
huge    F    F       F     -    T
large   F    F       F     F    -

Где table[i][j] истинно, если i < j.

Затем используйте эту таблицу для решения вашей функции compareFunction.

2
Daniel Tran 31 Дек 2017 в 11:08