자바스크립트로 하는 자료 구조와 알고리즘 [핵심 자료 구조와 알고리즘을 이해하고 구현하기 위한 입문서]
- 원서명JavaScript Data Structures and Algorithms: An Introduction to Understanding and Implementing Core Data Structure and Algorithm Fundamentals (ISBN 9781484239872)
- 지은이배세민(Sammie Bae)
- 옮긴이김무항
- ISBN : 9791161753447
- 30,000원
- 2019년 08월 30일 펴냄
- 페이퍼백 | 412쪽 | 188*235mm
- 시리즈 : 웹 프로페셔널
책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
요약
자료 구조와 알고리즘의 개념을 이해하고 이를 자바스크립트로 구현하기 위한 책이다. 자바스크립트 프로그래머라면 제대로 된 애플리케이션을 만들기 위해 알아야 할 핵심 자료 구조와 알고리즘을 다룬다.
해시 테이블, 연결 리스트, 큐, 트리, 그래프 등의 핵심 자료 구조와 검색, 정렬, 재귀, 동적 프로그래밍, 비트 연산 등의 핵심 알고리즘을 배우고 이를 실제 자바스크립트로 구현해본다. 이러한 과정을 통해 자료 구조와 알고리즘에 대한 이해도를 높일 수 있을 뿐만 아니라 자바스크립트 구현 능력도 키울 수 있다.
한국어판 출간에 부쳐
자바스크립트는 1995년 넷스케이프(NetScape)의 브렌던 아이크(Brendan Eich)가 개발했다. 넷스케이프는 역사상 첫 번째 웹 브라우저 중 하나인 넷스케이프 브라우저를 개발하던 곳이었다. 그리고 오늘날 자바스크립트는 어디서나 가장 인기 있는 프로그래밍 언어로 널리 쓰이고 있다.
예를 들어 우버(Uber)의 차량 관리 시스템은 Node.js로 초당 2백만 개 이상의 원격 프로시저 호출(RPC)을 실행하고 있다. 페이스북(Facebook)의 리액트 네이티브(React Native)는 웹과 휴대폰에 동일한 코드를 작성할 수 있도록 한다. 나사(NASA)에서도 Node.js를 사용해서 우주복 자료 시스템(spacesuit systems data)을 관리하고 있다.
실리콘밸리에서 일하며 자바스크립트의 인기가 높아지는 것을 지켜봐왔다. 자바스크립트는 4년 동안 깃허브(Github)에서 제일 인기 많은 프로그래밍 언어 중 하나다. 그리고 이제는 자바(Java)와 마찬가지로 마이크로소프트(Microsoft)의 타입스크립트(TypeScript)로 자바스크립트를 객체지향 언어처럼 사용할 수 있다. 자바스크립트는 다양하고 강력한 프로그래밍 언어이고 응용하는 데 제한이 없어 현재 그 어떤 프로그래밍 언어보다 사용하기 적절하다.
목차
목차
- 1장. 빅오 표기법
- 빅오 표기법 기초
- 일반적인 예
- 빅오 표기법 규칙
- 계수 법칙: “상수를 제거하라”
- 합의 법칙: “빅오를 더하라”
- 곱의 법칙: “빅오를 곱하라”
- 다항 법칙: “빅오의 k승”
- 요약
- 연습 문제
- 정답
- 정답
- 빅오 표기법 기초
- 2장. 자바스크립트의 독특한 특징
- 자바스크립트 범위
- 전역 선언: 전역 범위
- var를 사용해 선언하기: 함수 범위
- let을 활용한 선언: 블록 범위
- 등가와 형
- 변수형
- 참/거짓 확인
- === 대 ==
- 객체
- 요약
- 자바스크립트 범위
- 3장. 자바스크립트 숫자
- 숫자 체계
- 자바스크립트 숫자 객체
- 정수 반올림
- NumberEPSILON
- 최대치
- 최소치
- 무한
- 크기 순서
- 숫자 알고리즘
- 소인수 분해
- 무작위 수 생성기
- 연습 문제
- 요약
- 4장. 자바스크립트 문자열
- 자바스크립트 문자열 기본
- 문자열 접근
- 문자열 비교
- 문자열 검색
- 문자열 분해
- 문자열 바꾸기
- 정규 표현식
- 기본 정규 표현식
- 자주 사용하는 정규 표현식
- 숫자를 포함하는 문자
- 숫자만 포함하는 문자
- 부동소수점 문자
- 숫자와 알파벳만을 포함하는 문자
- 질의 문자열
- 인코딩
- Base64 인코딩
- 문자열 단축
- 암호화
- RSA 암호화
- 요약
- 자바스크립트 문자열 기본
- 5장. 자바스크립트 배열
- 배열 소개
- 삽입
- 삭제
- 접근
- 반복
- for (변수; 조건; 수정)
- for ( in )
- for ( of )
- forEach( )
- 도움 함수
- slice(begin,end)
- splice(begin,size,element1,element2)
- concat( )
- length 속성
- 전개 연산자
- 연습 문제
- 자바스크립트 함수형 배열 메소드
- map
- filter
- reduce
- 다차원 배열
- 연습 문제
- 요약
- 배열 소개
- 6장. 자바스크립트 객체
- 자바스크립트 객체 속성
- 프로토타입 활용 상속
- 생성자와 변수
- 요약
- 연습 문제
- 자바스크립트 객체 속성
- 7장. 자바스크립트 메모리 관리
- 메모리 누수
- 객체에 대한 참조
- DOM 메모리 누수
- window 전역 객체
- 객체 참조 제한하기
- delete 연산자
- 요약
- 연습 문제
- 메모리 누수
- 8장. 재귀
- 재귀 소개
- 재귀의 규칙
- 기저 조건
- 분할 정복 방식
- 대표적인 예: 피보나치 수열
- 피보나치 수열: 꼬리 재귀
- 파스칼의 삼각형
- 재귀의 빅오 분석
- 점화식
- 마스터 정리
- 재귀 호출 스택 메모리
- 요약
- 연습 문제
- 9장. 집합
- 집합 소개
- 집합 연산
- 삽입
- 삭제
- 포함
- 기타 유틸리티 함수
- 교집합
- 상위 집합 여부 확인
- 합집합
- 차집합
- 요약
- 연습 문제
- 10장. 검색과 정렬
- 검색
- 선형 검색
- 이진 검색
- 정렬
- 거품 정렬
- 선택 정렬
- 삽입 정렬
- 빠른 정렬
- 빠른 선택
- 병합 정렬
- 계수 정렬
- 자바스크립트 내장 정렬
- 요약
- 연습 문제
- 검색
- 11장. 해시 테이블
- 해시 테이블 소개
- 해싱 기법
- 소수 해싱
- 탐사
- 재해싱/이중 해싱
- 해시 테이블 구현
- 선형 탐사 사용하기
- 이차 탐사 사용하기
- 선형 탐사를 활용해 이중 해싱 사용하기
- 요약
- 12장. 스택과 큐
- 스택
- 들여다보기
- 삽입
- 삭제
- 접근
- 검색
- 큐
- 들여다보기
- 삽입
- 삭제
- 접근
- 검색
- 요약
- 연습 문제
- 스택
- 13장. 연결 리스트
- 단일 연결 리스트
- 삽입
- 값에 의한 삭제
- 헤드 항목 삭제
- 검색
- 이중 연결 리스트
- 헤드에 항목 삽입하기
- 테일에 항목 삽입하기
- 헤드의 항목 삭제하기
- 테일의 항목 삭제하기
- 검색
- 요약
- 연습 문제
- 단일 연결 리스트
- 14장. 캐싱
- 캐싱 이해하기
- LFU 캐싱
- LRU 캐싱
- 요약
- 15장. 트리
- 일반적인 트리 구조
- 이진 트리
- 트리 순회
- 선순위 순회
- 중순위 순회
- 후순위 순회
- 단계순위 순회
- 트리 순회 요약
- 이진 검색 트리
- 삽입
- 삭제
- 검색
- AVL 트리
- 단일 회전
- 오른쪽 회전
- 이중 회전
- 트리 균형 잡기
- 삽입
- AVL 트리 예제 종합
- 요약
- 연습 문제
- 16장. 힙
- 힙에 대한 이해
- 최대 힙
- 최소 힙
- 이진 힙 배열 인덱스 구조
- 삼투: 위로 아래로 이동
- 삼투 구현하기
- 최대 힙 예
- 최소 힙 구현 완성
- 최대 힙 구현 완성
- 힙 정렬
- 오름차순 정렬(최소 힙)
- 내림차순 정렬(최대 힙)
- 요약
- 연습 문제
- 힙에 대한 이해
- 17장. 그래프
- 그래프 기본
- 무지향성 그래프
- 간선과 정점 추가하기
- 간선과 정점 삭제하기
- 지향성 그래프
- 그래프 순회
- 너비 우선 검색
- 깊이 우선 검색
- 가중치가 있는 그래프와 최단 경로
- 가중치가 있는 간선을 지닌 그래프
- 다익스트라의 알고리즘: 최단 경로
- 위상 정렬
- 요약
- 18장. 고급 문자열
- 트라이(접두사 트리)
- 보이어-무어 문자열 검색
- 커누스-모리스-플랫 문자열 검색
- 라빈-카프 검색
- 라빈 지문
- 실생활 적용 예
- 요약
- 19장. 동적 프로그래밍
- 동적 프로그래밍의 필요성
- 동적 프로그래밍의 규칙
- 중복 부분 문제
- 최적 부분 구조
- 예: 걸음 수를 채우는 방법
- 대표적인 동적 프로그래밍 예
- 배낭 문제 알고리즘
- 최장 공통 부분 수열 알고리즘
- 동전 교환 알고리즘
- 편집 거리 알고리즘
- 요약
- 20장. 비트 조작
- 비트 연산자
- AND
- OR
- XOR
- NOT
- 왼쪽 이동
- 오른쪽 이동
- 오른쪽 이동 후 0으로 채우기
- 숫자 연산
- 덧셈
- 뺄셈
- 곱셈
- 나눗셈
- 요약
- 비트 연산자
도서 오류 신고
정오표
정오표
[p.31 : 마지막행]
마지막으로 로그 시간 복잡도를 지닌 알고리즘의 예는 2의 2승부터 n승까지의 항목들을 출력하는 경우가 있다. 예를 들어 exampleLogarithmic(10)은 다음 결과를 출력한다.
2,4,8,16,32,64
->
마지막으로 로그 시간 복잡도를 지닌 알고리즘의 예는 2의 거듭제곱을 2부터 n-1까지 출력하는 경우가 있다. 예를 들어 exampleLogarithmic(10)은 다음 결과를 출력한다.
2,4,8
[p.36]
function (n){
->
function a(n)
[p.44]
''를 출력한다.
->
오류 ReferenceError가 발생한다.
[p.44]
콘솔에 아무것도 출력되지 않는다.
->
오류 ReferenceError가 발생해 insideIf 변수의 값이 출력되지 않는다.
[p.52]
다음 여덟개의 비트(63번째부터
->
다음 열한개의 비트(62번째부터
그림 3.1 32비트
->
그림 3.1 64비트
[p.61]
Math.randon()은
->
Math.random()은
[p.61]
1보다 큰 부동소수점을 얻기 위해서는 Math.range()에
->
1보다 큰 부동소수점을 얻기 위해서는 Math.random()에
[p.64]
시간 복잡도 : O(sqrt(n))
->
시간 복잡도 : O(nsqrt(n))
[p.70]
var str = "He's my king from this
->
"this" bold 제거
[p.88]
array1.shift();
->
"if" bold 제거
[p.96]
Math.max(array1); - > Math.max(...array1);
Math.min(array2); -> Math.min(...array2);
[p.98]
return [i,hashtable[weight-currentElement]
->
return [i,hashtable[currentElement]
[p.127_코드 17 line]
// 3
->
// 12
[p.134_코드 7, 8 line]
내용 삭제
[p.170]
4와 5가 존재하는지
->
6과 10이 존재하는지
[p.221]
큐만을 사용해 스택을 설계한 다음 스택만을 사용해 큐를 설계하라
->
스택만을 사용해 큐를 설계한 다음 큐만을 사용해 스택을 설계하라
[p.221]
큐를 사용해 스택 구현하기
->
스택을 사용해 큐 구현하기
[p.222]
스택을 사용해 큐 구현하기
->
큐를 사용해 스택 구현하기
[p.275 코드]
1 AVLTree.prototype.rotateLL = function() {
2 // 오른쪽이 너무 길다. => 오른쪽으로부터 회전한다(오른쪽으로 회전하는 것이 아님).
3 var valueBefore = this.value;
4 var rightBefore = this.right;
5 this.value = this.left.value;
6
7 this.right = this.left;
8 this.left = this.left.left;
9 this.right.left = this.right.right;
10 this.right.right = rightBefore;
11 this.right.value = valueBefore;
12
13 this.right.setDepthBasedOnChildren();
14 this.setDepthBasedOnChildren();
15 }
->
1 AVLTree.prototype.rotateRR = function() {
2 // 오른쪽이 너무 길다. => 오른쪽으로부터 회전한다(오른쪽으로 회전하는 것이 아님).
3 var valueBefore = this.value;
4 var leftBefore = this.left;
5 this.value = this.right.value;
6
7 this.left = this.right;
8 this.right = this.right.right;
9 this.left.right = this.left.left;
10 this.left.left = leftBefore;
11 this.left.value = valueBefore
12
13 this.left.setDepthBasedOnChildren();
14 this.setDepthBasedOnChildren();
15 }
[p.359]
boyerMoore('jellyjam','jelly'); // 5. 인덱스 5에서 패턴 발견 의미
->
boyerMoore('jellyjam','jam'); // 5. 인덱스 5에서 패턴 발견 의미