Могу ли я оптимизировать это от O (nⁿ) до O (n), используя JavaScript? - PullRequest
0 голосов
/ 25 сентября 2019

Есть ли способ оптимизировать следующий код для запуска во время O (n)?

Из моего (очень) элементарного понимания нотации Big O следующий код ES6 будет выполняться во время O (nⁿ):

Object.values(customWords).forEach((word) => {
  Object.keys(languages).forEach((language) => spellChecker[language].add(word))
})

// we could change the above code to something like this instead
const customWords // 1d array of strings
const languages   // 1d array of strings
const spellCheckers = { language1: {}, language2: {} } // object containing spelling object instances
for (let i = 0; i < customWords.length; i++) {
  for (let y = 0; y < languages.length; y++) {
    spellCheckers[languages[y]].add(customWords[i])
  }
}

Таким образом, для каждого пользовательского слова мы добавляем это пользовательское слово ко всем языкам этого пользователя, чтобы оно проходило проверку орфографии (например, при написании на французском, английском или немецком языке,что будет O (n²).

Поскольку я могу получить длину языков во время выполнения, мне интересно, есть ли способ как-то пропустить вложенный цикл?

Object.values(customWords).forEach((word) => {
  // imagine the following three statements executed simultaneously 
  spellChecker[0].add(word))
  spellChecker[1].add(word))
  spellChecker[2].add(word))
})

Если вышеупомянутые три оператора выполняются параллельно (извините, если я здесь ошибаюсь!), Я думаю, что это по существу удалит вложенный цикл и достигнет времени O (n)?

Можно ли добиться этого, используяjavascript? Ничего страшного, если он должен работать в определенном контексте (то есть в узле), это действительно интересует меня по поводу ограничений / приложений JavaScript и оптимизации в целом.

...