Алгоритмическая сложность синтаксических анализаторов/блоков проверки допустимости XML

Python имеет две функции: zip и itertools.zip_longest. Реализация на JS / ES6 выглядит так:

Реализация Python `s zip на JS / ES6

const zip = (...arrays) => {
    const length = Math.min(...arrays.map(arr => arr.length));
    return Array.from({ length }, (value, index) => arrays.map((array => array[index])));
};

Результаты:

console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    [11, 221]
));

[[1, 667, 111, 11]]

blockquote>
console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111, 212, 323, 433, '1111']
));

[[1, 667, 111], [2, false, 212], [3, -378 , 323], ['a', '337', 433]]

blockquote>
console.log(zip(
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[]

blockquote>

Реализация Python`s zip_longest на JS / ES6

( https://docs.python.org/3.5/library/itertools.html?highlight=zip_longest#itertools.zip_longest )

const zipLongest = (placeholder = undefined, ...arrays) => {
    const length = Math.max(...arrays.map(arr => arr.length));
    return Array.from(
        { length }, (value, index) => arrays.map(
            array => array.length - 1 >= index ? array[index] : placeholder
        )
    );
};

Результаты:

console.log(zipLongest(
    undefined,
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[1, 667, 111, undefined], [2, false, undefined, undefined], [3, -378, undefined, undefined], ['a', '337', undefined, undefined]]

blockquote>
console.log(zipLongest(
    null,
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[1, 667, 111, null], [2, false, null, null], [3, -378, null, null], ['a', '337', null, null]]

blockquote>
console.log(zipLongest(
    'Is None',
    [1, 2, 3, 'a'],
    [667, false, -378, '337'],
    [111],
    []
));

[[1 , «Нет», «Нет», «Нет», «2», «Нет», «Нет», [3, -378, «Нет», «Нет»], [ 337 ',' None, 'None']]

blockquote>

14
задан Glorfindel 12 July 2019 в 22:25
поделиться

4 ответа

Если бы я сталкивался с той проблемой и не мог бы найти, что что-либо на google I, вероятно, попыталось бы сделать это мой сам.

Некоторые "back-of-an-evelope" наполняют для получения ощущения того, куда оно идет. Но это было бы, виду нужен я для имения идеи того, как сделать xml синтаксический анализатор. Для не алгоритмические сравнительные тесты смотрят здесь:

3
ответ дан 1 December 2019 в 16:39
поделиться

Я думаю, что существует слишком много переменных, включенных для предложения простой метрики сложности, если Вы не делаете много предположений.

А простой синтаксический анализатор стиля SAX должен быть линейным с точки зрения размера документа и плоским для памяти.

Что-то как XPath было бы невозможно описать с точки зрения просто входного документа, так как сложность выражения XPath играет огромную роль.

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

Как с большей частью производительности подвергает сомнению единственный способ добраться, точные ответы должен измерить его и видеть то, что происходит!

1
ответ дан 1 December 2019 в 16:39
поделиться

Rob Walker прав: проблема не определяется достаточно подробно. При рассмотрении просто синтаксических анализаторов (и игнорировании вопроса того, выполняют ли они проверку), существует две основных разновидности: дерево-based— думает, что DOM— и streaming/event-based— думают SAX (нажатие) и StAX (получение по запросу). Говоря в огромных общих местах, основанные на дереве подходы используют больше памяти и медленнее (потому что необходимо закончить анализировать целый документ), в то время как подходы streaming/event-based используют меньше памяти и быстрее. Основанные на дереве синтаксические анализаторы обычно считают легче использовать, хотя StAX был объявлен как огромное улучшение (в простоте в употреблении) по SAX.

1
ответ дан 1 December 2019 в 16:39
поделиться

Я планировал загрузить чрезвычайно большие XML-файлы в своем приложении. Я задал вопрос здесь на Переполнении стека: Самый Быстрый XML, обрабатывающий для очень больших документов .

И да, это была часть парсинга, которая была узким местом.

я закончил тем, что не использовал синтаксические анализаторы XML вообще. Вместо этого я проанализировал символы, один за другим максимально эффективно оптимизирующие для скорости. Это привело к скоростям 40 МБ в секунду в Windows PC на 3 ГГц для чтения, парсинга и загрузки внутренней структуры данных.

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

0
ответ дан 1 December 2019 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: