Распределенный алгоритм вычисления баланса круглых скобок
Это интервью вопрос: "Как построить распределенный алгоритм для вычисления баланса в скобках ?"
обычно он алгоритм баланса сканирует строковую форму слева направо и использует стек, чтобы убедиться, что количество открытых скобок всегда >= количество близких скобок и, наконец, количество открытых скобок == количество близких скобок.
Как бы вы его распределили ?
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. В конце всех вычислений вы либо получите пустую строку, либо строку, содержащую несбалансированную скобка.