配列と連想配列 ~会津オンラインALDS1_4Cを通して~

What

会津オンラインの以下の問題を解きます。 onlinejudge.u-aizu.ac.jp

Solution

配列で書く方法を真っ先に思いついたので、それで実装してみました。

function main(lines) {
    const input = lines.split('\n').slice(1)
    const n = input.length
    
    let str = []
    for(let i=0; i<n; i++){    
        const judge = input[i].split(' ')
        if(judge[0] === 'insert'){
            str.push(judge[1])
        }        
        if(judge[0] === 'find'){
            console.log(str.includes(judge[1]) ? 'yes' : 'no')
        }
     }
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'));

for文の代わりに、forEachメソッドを使うこともできます。

for(let i=0; i<n; i++){    
  const judge = input[i].split(' ')
}
input.forEach(function(element){
  const judge = element.split(' ')
}

ただ、上記の方法では処理に時間がかかるため、問題をクリアできません。 しかし連想配列で実装すると、処理速度が1.5倍速くなり、問題をクリアできます (処理時間はconsole.time, console.timeEndメソッドで簡単に調べています)。

function main(lines) {
    const input = lines.split('\n').slice(1)
    const n = input.length
    
    let obj = {}
    input.forEach(function(arr){
        const judge = arr.split(' ')

        if(judge[0] === 'insert'){
            obj[judge[1]]= true
        }
        if(judge[0] === 'find'){
            console.log(obj.hasOwnProperty(judge[1]) ? 'yes' : 'no')
        }
    })
}

main(require('fs').readFileSync('/dev/stdin', 'utf8'));

Why

なぜ、連想配列にすると処理速度が上がるのでしょうか。
連想配列と配列の違い、内部での処理について調べる必要がありそうです。
それはまた別の機会に調べて記事にします。

予想できるのは、DBにおけるインデックスと同じように、オブジェクト作成時に仕組みがあるのかもしれません。
実際、配列または連想配列に要素を追加するまでの処理時間では、配列の方が1.3倍程度速いです。