Перейти к содержанию

tsort: Выполняет топологическую сортировку входных данных

Установка

Если вы еще не подписались на репозиторий RPM, зарегистрируйтесь. Затем вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-tsort

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-tsort

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.

Этот документ описывает lua-resty-tsort v1.0, выпущенный 6 апреля 2016 года.


Выполняет топологическую сортировку входных данных.

Синопсис

local dump  = require "pl.pretty".dump
local tsort = require "resty.tsort"

local graph = tsort.new()

graph:add('a', 'b')
graph:add('b', 'c')
graph:add('0', 'a')

dump(graph:sort())

-- Вывод:
-- {
--   "0",
--   "a",
--   "b",
--   "c"
-- }

graph:add('1', '2', '3', 'a');

dump(graph:sort())

-- Вывод:
-- {
--   "0",
--   "1",
--   "2",
--   "3",
--   "a",
--   "b",
--   "c"
-- }

graph:add{'1', '1.5'};
graph:add{'1.5', 'a'};

dump(graph:sort())

-- Вывод:
-- {
--   "0",
--   "1",
--   "2",
--   "3",
--   "1.5",
--   "a",
--   "b",
--   "c"
-- }

graph:add('first', 'second');
graph:add('second', 'third', 'first');

local sorted, err = graph:sort()

-- Возвращает:
-- sorted = nil
-- err = "В графе есть циклическая зависимость. Невозможно получить топологическую сортировку."

Альтернативы

Перед разработкой этой библиотеки я спрашивал на канале #lua на Freenode, знает ли кто-нибудь библиотеку, которая выполняет топологическую сортировку. Я также пытался найти библиотеку. К сожалению, я ничего не нашел. Но уже существовала библиотека от замечательного @starius под названием toposort. toposort выглядит действительно хорошо и имеет гораздо больше функций по сравнению с lua-resty-tsort. Поэтому вы можете также взглянуть на нее, особенно если ищете более функциональную библиотеку. Я не проводил бенчмаркинг этих библиотек или сравнивал их с C-реализацией tsort или другими альтернативами. Если ваш граф не слишком большой, скажем, вы используете это для сортировки файлов Javascript / CSS или чего-то подобного, я думаю, что производительность не является проблемой.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-tsort.