BaeBox

Trie(트리, 트라이) with JavaScript 본문

개발 관련

Trie(트리, 트라이) with JavaScript

배모씨. 2020. 4. 20. 15:17
반응형

* node 에서는 기본적으로 class를 사용하지 못하므로 babel을 사용해야 한다. 적용법은 최하단 링크에 있다. 귀찮으면 아래 링크의 git을 clone을 하시면 된다. 

Trie ( 이미지 출처 : 나무위키 )

Trie : 트리의 응용 자료구조로, 단어를 찾는데 몹시 효과적이라고 한다. 

찾고자 하는 단어의 길이만큼의 시간복잡도를 가진다.

나무위키를 보자. 

https://namu.wiki/w/%ED%8A%B8%EB%9D%BC%EC%9D%B4

 

트라이 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다. 나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다. 나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.

namu.wiki


class Node {

    data;

    constructor(data) {
        this.data = data;
        for (let i = 0; i < 26; i++) {
            const tmp = String.fromCharCode(97 + i);
            this[tmp] = undefined;
        }
    }
}

class Trie {
    root;
    constructor(root) {
        this.root = root;
    }

    add = (word) => {
        let currentNode = this.root;
        let previousWhileChar = '';
        for (let i = 0; i < word.length; i++) {
            let currentChar = word.charAt(i);
            previousWhileChar += currentChar;
            if (currentNode[currentChar] === undefined) {
                const newNode = new Node(previousWhileChar);
                currentNode[currentChar] = newNode;
                currentNode = newNode;
            } else {
                currentNode = currentNode[currentChar];
            }
        }
    };


    lookUp = (word) => {
        let currentNode = this.root;
        for (let i = 0; i < word.length; i++) {
            let currentChar = word.charAt(i);
            currentNode = currentNode[currentChar];

            if (currentNode.data === word) return currentNode;
        }
        return 'no match';
    }

}


const trie = new Trie(new Node('Root'));
trie.add('concatenate');
trie.add('apple');
trie.add('disguise');

const foundNode = trie.lookUp('apple');
console.log(foundNode);

간단하게 Trie를 만들어보았다.

후다닥 뿌지직 하는 느낌으로 짠 코드이므로, 문제가 있을 수 있다. 발견하면 알려주세요

간략하게 설명하자면, 각 Node 는 data와 a~z 까지의 속성값들을 가진다. 

data는 해당 노드가 가지는 총 문자열을, 속성값들은 하위에 속성값들의 내용으로 연결해주는 역할을 한다.

해당하는 속성값을 타고가다보면 단어를 찾을 수 있다. 

사전을 구현하기 참 좋은 것 같다.

요렇게!!! 악필이다 ㅠㅠ


위에도 있지만, 아래의 내 깃허브에서 소스를 볼 수 있다. 

https://github.com/iamdap91/basic-data-structure

 

iamdap91/basic-data-structure

basic-data-structure. Contribute to iamdap91/basic-data-structure development by creating an account on GitHub.

github.com

http://jeonghwan-kim.github.io/2016/07/19/babel.html

 

Babel로 ES6 코드 사용하기

바벨(Babel)을 처음 들은것이 작년이다.ES6 초안이 나온 상황에서 미리 사용해 보고 싶은 이들위해 ES5용 코드로 변환해 주는 기능이다.나는 머지않아 ES6 스펙이 확정될 것이고 더불어 브라우져와 노드에서는 신속히 지원해 줄 것이라 생각했다.그래서 굳이 바벨이라는 툴을 학습할...

jeonghwan-kim.github.io

반응형

'개발 관련' 카테고리의 다른 글

Git README.md 작성법  (0) 2020.04.25
QuickSort(퀵정렬) with JavaScript  (0) 2020.04.21
HashSet(해시셋) with JavaScript  (0) 2020.04.20
HashTable(해시테이블) with JavaScript  (0) 2020.04.20
Tree(트리) with JavaScript  (0) 2020.04.19
Comments