Распределенный алгоритм вычисления баланса круглых скобок

Это интервью вопрос: "Как построить распределенный алгоритм для вычисления баланса в скобках ?"

обычно он алгоритм баланса сканирует строковую форму слева направо и использует стек, чтобы убедиться, что количество открытых скобок всегда >= количество близких скобок и, наконец, количество открытых скобок == количество близких скобок.

Как бы вы его распределили ?

2 ответов


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

  1. минимальная глубина вложенности, достигнутая относительно начала строки.

  2. общий выигрыш или проигрыш в глубине вложенности по всей строке.

С этими значениями вы можете вычислить значения для конкатенации многих куски следующим образом:

minNest = 0
totGain = 0
for p in chunkResults
  minNest = min(minNest, totGain + p.minNest)
  totGain += p.totGain
return new ChunkResult(minNest, totGain)

скобки совпадают, если конечные значения totGain и minNest равны нулю.


Я бы применил алгоритм map-reduce, в котором функция map вычисляла бы часть строки, возвращающую либо пустую строку, если скобки сбалансированы, либо строку с последней оставшейся скобкой.

затем функция reduce объединит результат двух возвращенных строк функцией map и вычислит его снова, возвращая тот же результат, что и map. В конце всех вычислений вы либо получите пустую строку, либо строку, содержащую несбалансированную скобка.