Я переписываю устаревшее приложение, управляемое данными, на Python. Одна из основных таблиц называется «таблицей графа» и выглядит как направленный граф, поэтому я исследовал пакет NetworkX, чтобы понять, имеет ли смысл использовать его для манипуляций с таблицами графа, и действительно реализовать это как график, а не сложный набор массивов.
Однако я начинаю задаваться вопросом, не подходит ли способ, которым мы используем эту таблицу, для настоящей библиотеки манипулирования графиками. Большая часть функциональности NetworkX, по-видимому, ориентирована на то, чтобы каким-то образом характеризовать сам граф, определять кратчайшее расстояние между двумя узлами и тому подобное. Ничего из этого не имеет отношения к моему заявлению.
Я надеюсь, что если я смогу описать фактическое использование здесь, кто-нибудь может посоветовать мне, не упускаю ли я что-то - я никогда раньше не работал с графиками, так что это вполне возможно - или мне следует изучить что-то другое. структура данных. (И если да, то что бы вы посоветовали?)
Мы используем таблицу в первую очередь для преобразования введенной пользователем строки ключевых слов в упорядоченный список компонентов. Это составляет 95% вариантов использования; остальные 5% - это «данная неполная строка ключевого слова, укажите все возможные завершения» и «сгенерируйте все возможные допустимые строки ключевого слова». О, и проверьте график на наличие пороков развития.
Вот отредактированный фрагмент таблицы. Столбцы:
компонент ключевого слова innode outnode
acs 1 20 clear
default 1 100 clear
noota 20 30 clear
default 20 30 hst_ota
ota 20 30 hst_ota
acs 30 10000 clear
cos 30 11000 clear
sbc 10000 10199 clear
hrc 10000 10150 clear
wfc1 10000 10100 clear
default 10100 10101 clear
default 10101 10130 acs_wfc_im123
f606w 10130 10140 acs_f606w
f550m 10130 10140 acs_f550m
f555w 10130 10140 acs_f555w
default 10140 10300 clear
wfc1 10300 10310 acs_wfc_ebe_win12f
default 10310 10320 acs_wfc_ccd1
Учитывая строку ключевого слова "acs,wfc1,f555w" и эту таблицу, логика обхода такова:
Начните с узла 1; В строке есть «acs», поэтому перейдите к узлу 20.
В строке нет ни одного из представленных ключевых слов для узла 20, поэтому выберите значение по умолчанию, выберите hst_ota и перейдите к узлу 30.
В строке есть «acs», поэтому перейдите к узлу 10000.
"wfc1" находится в строке, поэтому перейдите к узлу 10100.
Только один выбор; перейти к узлу 10101.
Только один вариант, поэтому возьмите acs_wfc_im123 и перейдите к узлу 10130.
В строке есть «f555w», поэтому возьмите acs_f555w и перейдите к узлу 10140.
Только один вариант, так что идите к узлу 10300.
"wfc1" находится в строке, поэтому возьмите acs_wfc_ebe_win12f и перейдите к узлу 10310.
Только один вариант, так что возьмите acs_wfc_ccd1 и перейдите к узлу 10320 — которого не существует, так что мы закончили.
Таким образом, окончательный список компонентов
hst_ota
acs_wfc_im123
acs_f555w
acs_wfc_ebe_win12f
acs_wfc_ccd1
Я могу построить график только из внутренних и внешних узлов этой таблицы, но я не мог бы понять, как встроить информацию о ключевом слове, которая определяет, какой выбор сделать при столкновении с несколькими возможностями.
Обновлено, чтобы добавить примеры других вариантов использования:
Учитывая строку «acs», вернуть («hrc», «wfc1») в качестве возможного следующего варианта
Учитывая строку «acs, wfc1, foo», вызовите исключение из-за неиспользуемого ключевого слова
Вернуть все возможные юридические строки:
- cos
- акк, час
- ас, wfc1, f606w
- ас, wfc1, f550m
- ас, wfc1, f555w
Убедитесь, что все узлы доступны и нет петель.
Я могу настроить решение Алекса для первых двух из них, но я не понимаю, как это сделать для двух последних.