Топологическая сортировка на JavaScript

Опубликовано Fal'K°: 27.05.2009 в 21:45

Доброго времени суток!

Понадобилось реализовать сабж для своего проекта, но исходников на JavaScript найти не удалось, может плохо искал, не суть, пришлось переработать имеющийся на паскале (брр…) с некоторой доработкой. Первая часть функции по сути подготовка исходных данных для второй части (самого алгоритма). И вот что вышло:

Топологическая сортировка
  1.  
  2. /**
  3.  Topological sorting algorithm
  4.  http://algolist.manual.ru/sort/top_sort.php
  5.  http://en.wikipedia.org/wiki/Topological_sorting
  6.  Sample:
  7.  
  8.  var relations = {
  9.     'a': ['b','d','c','e'],
  10.     'b': ['d'],
  11.     'c': ['d', 'e'],
  12.     'd': ['e'],
  13.     'e': []  
  14.  }
  15.  
  16.  alert(tsort(relations));
  17.  
  18.  Or cyclic:
  19.  
  20.  relations['e']=['a']
  21.  try{
  22.     tsort(relations)
  23.  }catch(e){
  24.     alert(e);
  25.  }
  26. */
  27.  
  28. function tsort(relations){
  29.  
  30.     var l=1, vert=[], edge=[], result={};
  31.     var n = 0, edgeCount = [];
  32.     var nullVert = [], nullVertName='null';
  33.  
  34.     for(var key in relations)
  35.     {
  36.   n++;
  37.   var i;
  38.   for(i=0;relations[key][i]!=undefined; i++){}
  39.   edgeCount[key]=i;    
  40.   nullVert.push(key);
  41.   while(edgeCount[nullVertName]!=undefined) nullVertName+='_';    
  42.     }
  43.  
  44.     edge[l]=1;
  45.     vert[l]=nullVertName;
  46.     relations[nullVertName] = nullVert;
  47.    
  48.     for(;(l==1 && edge[l]==n+1)!==true;)
  49.     {
  50.            if(l>n) throw "Cyclic graph detected.";
  51.  
  52.     if(edge[l]==edgeCount[vert[l]]+1)
  53.     {
  54.     result[vert[l]]=true;  
  55.     l–; edge[l]++;  
  56.     } else {  
  57.     lastvert = relations[vert[l]][edge[l]-1];
  58.     if(result[lastvert])
  59.           edge[l]++;
  60.     else {
  61.                           l++; vert[l]=lastvert; edge[l]=1;
  62.     }
  63.     }
  64.     }
  65.     var order = [];
  66.     for(var key in result)
  67.         order.push(key);
  68.  return order;
  69. }
  70.  
  71. var relations = {
  72.     'a': ['b','d','c','e'],
  73.     'b': ['d'],
  74.     'c': ['d', 'e'],
  75.     'd': ['e'],
  76.     'e': []  
  77. }
  78.  
  79. alert(tsort(relations));

P.S. Подробнее о его работе смотрите здесь, теория здесь.
Source code

Комментариев еще нет

Ваш комментарий будет первым!

Оставить комментарий

Вход по OpenID

Стандартный вход

Опции:

Размер

Цвета