Кіріспе

Компьютерлік жол табу әдісі

сол аттас жоспарлау алгоритмі

Джонсон алгоритмі – бұл шеттері салмақталған бағытталған графтың барлық төбелері арасындағы ең қысқа жолдарды табу тәсілі. Бұл кейбір шеттік салмақтардың теріс сандар болуына мүмкіндік береді, бірақ теріс салмақты циклдар болмауы керек. Ол Bellman-Ford алгоритмін пайдаланып, кіріс графты кері өзгерту арқылы жұмыс істейді, бұл барлық теріс салмақтарды жояды және өзгертілген графқа Дикстра алгоритмін қолдануға мүмкіндік береді. Бұл техниканы алғаш 1977 жылы жариялаған Дональд Б. Джонсонның құрметіне аталған. Сурбалл алгоритмінде де ұқсас қайта салмақтау тәсілі қолданылады, ол теріс емес шеттік салмақтары бар графтың бірдей екі төбесі арасындағы ең аз жалпы ұзындығы бар екі бөлек жолды табу үшін пайдаланылады.

Мысал

Джонсон алгоритмінің алғашқы үш кезеңі төмендегі суретте көрсетілген. Суреттің сол жағындағы граф екі теріс қабырғаға ие, бірақ теріс цикл жоқ. Ортадағы граф жаңа q төбесін, Bellman-Ford алгоритмімен есептелген ең қысқа жол ағашын (q бастапқы төбе ретінде) және әрбір төбеге q-дан сол төбеге дейінгі ең қысқа жол ұзындығы ретінде есептелген h(v) мәндерін көрсетеді. Бұл мәндердің барлығы оң емес екенін ескеріңіз, себебі q-дан әрбір төбеге нөлдік ұзындықта қабырға бар, ал ең қысқа жол осы қабырғадан ұзын болмайды. Оң жақта, әр қабырға салмағын w(u,v) w(u,v) + h(u) − h(v) арқылы алмастыру арқылы құрылған қайта салмақталған граф көрсетілген. Бұл қайта салмақталған графта барлық қабырға салмақтары теріс емес, бірақ кез келген екі төбе арасындағы ең қысқа жол бастапқы графтағы сол екі төбе арасындағы ең қысқа жолмен бірдей қабырғалар тізбесін пайдаланады. Алгоритм қайта салмақталған графтағы төрт бастапқы төбеге Дикстра алгоритмін қолдану арқылы аяқталады.

Талдау

Фибоначчи үйінділерін қолдана отырып, Дикстра алгоритмін іске асырудағы осы алгоритмнің уақыт күрделілігі: алгоритм алгоритмнің Беллман-Форд кезеңіне және Дикстра алгоритмінің әрбір орындалуына уақыт жұмсайды. Осылайша, егер граф сирең болса, жалпы уақыт Флойд-Варшалл алгоритмінен тез болуы мүмкін, ол осы мәселені уақытта шешеді.