alexbuki
@alexbuki
программист js

Как решить задачу с минимальным использованием памяти?

Готовлюсь к собесу в яндекс, помогите плз решить задачу.
Знаю только js, поэтому пишу на node js.

Задача:
Даны k отсортированных в порядке неубывания массивов неотрицательных целых чисел, каждое из которых не превосходит 100. Требуется построить результат их слияния: отсортированный в порядке неубывания массив, содержащий все элементы исходных k массивов.

Длина каждого массива не превосходит 10 ⋅ k.

Постарайтесь, чтобы решение работало за время k ⋅ log(k) ⋅ n, если считать, что входные массивы имеют длину n.

Формат ввода
Первая строка входного файла содержит единственное число k, k ≤ 1024.

Каждая из следующих k строк описывает по одному массиву. Первое число каждой строки равняется длине соответствующего массива, оставшиеся числа этой строки описывают значения элементов этого же массива. Элементы массивов являются неотрицательными целыми числами и не превосходят 100.

Формат вывода
Выходной файл должен содержать отсортированный в порядке неубывания массив, содержащий все элементы исходных массивов.

Пример
Ввод
4
6 2 26 64 88 96 96
4 8 20 65 86
7 1 4 16 42 58 61 69
1 84

Вывод
1 2 4 8 16 20 26 42
58 61 64 65 69 84 86
88 96 96

Мое решение падает на тестах из-за ограничения по памяти.
const readline = require('readline')
const fs = require('fs')
const path = require('path')
const rl = readline.createInterface({
  input: fs.createReadStream(path.join(__dirname, '/input.txt'))
})
let arr
const array = new Array(101)
rl.once('line', () => {
  rl.on('line', (line) => {
    arr = line.split(' ')
    for (let i = 1; i < arr[0] + 1; i++) {
      if (array[arr[i]]) {
        array[arr[i]] = array[arr[i]] + ' ' + arr[i]
      } else {
        array[arr[i]] = arr[i]
      }
    }
  })
    .on('close', () => {
      for (const val of array) {
        if (val) {
          process.stdout.write(val + ' ')
        }
      }
    })
})
  • Вопрос задан
  • 372 просмотра
Пригласить эксперта
Ответы на вопрос 2
dollar
@dollar
Делай добро и бросай его в воду.
Как решить задачу? Самому.

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

Ну а если это ваше реальное тестовое задание на собеседовании, чтобы пройти его, то как бы вообще без комментариев.
Ответ написан
Комментировать
bingo347
@bingo347 Куратор тега Node.js
Crazy on performance...
Готовлюсь к собесу в яндекс
Рано Вам в Яндекс... задачка то уровня школьных олимпиад...
Постарайтесь, чтобы решение работало за время k ⋅ log(k) ⋅ n
А это точно задачка для Яндекса? Она решается за линейное время O(k ⋅ n) если чуть-чуть вникнуть в условия, а логарифмическое решение годно лишь для людей с ЕГЭ головного мозга, там как раз любят решения в стиле "слить все в 1 массив и отсортировать", при использовании qsort/merge-sort как раз будет O(k ⋅ log(k) ⋅ n)

Если читать из файла по 2 байта, то можно значительно сэкономить память, для формата 1- и 2-значные числа разделенные пробелом этого более чем достаточно.
Так же выходной массив можно не формировать, а сразу отдавать его на выход.
P.S. гуглите сортировку подсчетом, а решать задачу за Вас на тостере никто не будет
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы