|
1장 자료 구조가 중요한 까닭
__1.1 자료 구조 __1.2 배열: 기초 자료 구조 ____1.2.1 자료 구조 연산 __1.3 속도 측정 __1.4 읽기 __1.5 검색 __1.6 삽입 __1.7 삭제 __1.8 집합: 단 하나의 규칙으로 효율성이 달라진다 __1.9 마무리 __1.10 연습 문제 2장 알고리즘이 중요한 까닭 __2.1 정렬된 배열 __2.2 정렬된 배열의 검색 __2.3 이진 검색 ____2.3.1 코드 구현: 이진 검색 __2.4 이진 검색 대 선형 검색 ____2.4.1 깜짝 퀴즈 __2.5 마무리 __2.6 연습 문제 3장 빅 오 표기법 __3.1 빅 오: 원소가 N개일 때 몇 단계가 필요할까? __3.2 빅 오의 본질 ____3.2.1 빅 오의 본질 더 파고들기 ____3.2.2 같은 알고리즘, 다른 시나리오 __3.3 세 번째 유형의 알고리즘 __3.4 로가리즘 __3.5 O(logN) 해석 __3.6 실제 예제 __3.7 마무리 __3.8 연습 문제 4장 빅 오로 코드 속도 올리기 __4.1 버블 정렬 __4.2 버블 정렬 실제로 해보기 ____4.2.1 버블 정렬 구현 __4.3 버블 정렬의 효율성 __4.4 이차 문제 __4.5 선형 해결법 __4.6 마무리 __4.7 연습 문제 5장 빅 오를 사용하거나 사용하지 않는 코드 최적화 __5.1 선택 정렬 __5.2 선택 정렬 실제로 해보기 ____5.2.1 선택 정렬 구현 __5.3 선택 정렬의 효율성 __5.4 상수 무시하기 __5.5 빅 오 카테고리 ____5.5.1 실제 예제 ____5.5.2 중요한 단계 __5.6 마무리 __5.7 연습 문제 6장 긍정적인 시나리오 최적화 __6.1 삽입 정렬 __6.2 삽입 정렬 실제로 해보기 ____6.2.1 삽입 정렬 구현 __6.3 삽입 정렬의 효율성 __6.4 평균적인 경우 __6.5 실제 예제 __6.6 마무리 __6.7 연습 문제 7장 일상적인 코드 속 빅 오 __7.1 짝수의 평균 __7.2 단어 생성기 __7.3 배열 예제 __7.4 평균 섭씨 온도 구하기 __7.5 의류 상표 __7.6 1 세기 __7.7 팰린드롬 검사기 __7.8 모든 곱 구하기 ____7.8.1 여러 데이터 세트 다루기 __7.9 암호 크래커 __7.10 마무리 __7.11 연습 문제 8장 해시 테이블로 매우 빠른 룩업 __8.1 해시 테이블 __8.2 해시 함수로 해싱 __8.3 재미와 이익, 특히 이익을 남길 유의어 사전 만들기 __8.4 해시 테이블 룩업 ____8.4.1 단방향(one-directional) 룩업 __8.5 충돌 해결 __8.6 효율적인 해시 테이블 만들기 ____8.6.1 훌륭한 충돌 조정 __8.7 해시 테이블로 데이터 조직 __8.8 해시 테이블로 속도 올리기 ____8.8.1 배열 부분 집합 __8.9 마무리 __8.10 연습 문제 9장 스택과 큐로 간결한 코드 생성 __9.1 스택 __9.2 추상 데이터 타입 __9.3 스택 다뤄보기 ____9.3.1 코드 구현: 스택 기반 코드 린터 __9.4 제약을 갖는 데이터 구조의 중요성 ____9.4.1 스택 요약 __9.5 큐 ____9.5.1 큐 구현 __9.6 큐 다뤄보기 __9.7 마무리 __9.8 연습 문제 10장 재귀를 사용한 재귀적 반복 __10.1 루프 대신 재귀 __10.2 기저 조건 __10.3 재귀 코드 읽기 __10.4 컴퓨터의 눈으로 바라본 재귀 ____10.4.1 호출 스택 ____10.4.2 스택 오버플로 __10.5 파일시스템 순회 __10.6 마무리 __10.7 연습 문제 11장 재귀적으로 작성하는 법 __11.1 재귀 카테고리: 반복 실행 ____11.1.1 재귀 트릭: 추가 인자 넘기기 __11.2 재귀 카테고리: 계산 ____11.2.1 두 가지 계산 방식 __11.3 하향식 재귀: 새로운 사고방식 ____11.3.1 하향식 사고 절차 ____11.3.2 배열 합 ____11.3.3 문자열 뒤집기 ____11.3.4 X 세기 __11.4 계단 문제 ____11.4.1 계단 문제 기저 조건 __11.5 애너그램 생성 ____11.5.1 애너그램 생성의 효율성 __11.6 마무리 __11.7 연습 문제 12장 동적 프로그래밍 __12.1 불필요한 재귀 호출 ____12.1.1 max 재귀 분석 __12.2 빅 오를 위한 작은 개선 __12.3 재귀의 효율성 __12.4 하위 문제 중첩 __12.5 메모이제이션을 통한 동적 프로그래밍 ____12.5.1 메모이제이션 구현 __12.6 상향식을 통한 동적 프로그래밍 ____12.6.1 상향식 피보나치 ____12.6.2 메모이제이션 대 상향식 __12.7 마무리 __12.8 연습 문제 25613장 속도를 높이는 재귀 알고리즘 __13.1 분할 ____13.1.1 코드 구현: 분할 __13.2 퀵 정렬 ____13.2.1 코드 구현: 퀵 정렬 __13.3 퀵 정렬의 효율성 ____13.3.1 한눈에 보는 퀵 정렬 ____13.3.2 빅 오로 나타낸 퀵 정렬 __13.4 퀵 정렬의 최악의 시나리오 ____13.4.1 퀵 정렬 대 삽입 정렬 __13.5 퀵 셀렉트 ____13.5.1 퀵 셀렉트의 효율성 ____13.5.2 코드 구현: 퀵 셀렉트 __13.6 다른 알고리즘의 핵심 역할을 하는 정렬 __13.7 마무리 __13.8 연습 문제 14장 노드 기반 자료 구조 __14.1 연결 리스트 __14.2 연결 리스트 구현 __14.3 읽기 ____14.3.1 코드 구현: 연결 리스트 읽기 __14.4 검색 ____14.4.1 코드 구현: 연결 리스트 검색 __14.5 삽입 ____14.5.1 코드 구현: 연결 리스트 삽입 __14.6 삭제 ____14.6.1 코드 구현: 연결 리스트 삭제 __14.7 연결 리스트 연산의 효율성 __14.8 연결 리스트 다루기 __14.9 이중 연결 리스트 ____14.9.1 코드 구현: 이중 연결 리스트 삽입 ____14.9.1 앞과 뒤로 이동 __14.10 이중 연결 리스트 기반 큐 ____14.10.1 코드 구현: 이중 연결 리스트 기반 큐 __14.11 마무리 __14.12 연습 문제 15장 이진 탐색 트리로 속도 향상 __15.1 트리 __15.2 이진 탐색 트리 __15.3 검색 ____15.3.1 이진 탐색 트리 검색의 효율성 ____15.3.2 log(N) 레벨 ____15.3.3 코드 구현: 이진 탐색 트리 검색 __15.4 삽입 ____15.4.1 코드 구현: 이진 탐색 트리 삽입 ____15.4.2 삽입 순서 __15.5 삭제 ____15.5.1 자식이 둘인 노드 삭제 ____15.5.2 후속자 노드 찾기 ____15.5.3 오른쪽 자식이 있는 후속자 노드 ____15.5.4 완전한 삭제 알고리즘 ____15.5.5 코드 구현: 이진 탐색 트리 삭제 ____15.5.6 이진 탐색 트리 삭제의 효율성 __15.6 이진 탐색 트리 다뤄보기 __15.7 이진 탐색 트리 순회 __15.8 마무리 __15.9 연습 문제 34516장 힙으로 우선순위 유지하기 __16.1 우선순위 큐 __16.2 힙 ____16.2.1 힙 조건 ____16.2.2 완전 트리 __16.3 힙 속성 __16.4 힙 삽입 __16.5 마지막 노드 탐색 __16.6 힙 삭제 __16.7 힙 대 정렬된 배열 __16.8 다시 살펴보는 마지막 노드 문제 __16.9 배열로 힙 구현하기 ____16.9.1 배열 기반 힙 순회 ____16.9.2 코드 구현: 힙 삽입 ____16.9.3 코드 구현: 힙 삭제 ____16.9.4 대안 구현 __16.10 우선순위 큐로 쓰이는 힙 __16.11 마무리 __16.12 연습 문제 17장 트라이(trie)해 보는 것도 나쁘지 않다 __17.1 트라이 ____17.1.1 트라이 노드 ____17.1.2 트라이 클래스 __17.2 단어 저장 ____17.2.1 별표(asterisk)의 필요성 __17.3 트라이 검색 ____17.3.1 코드 구현: 트라이 검색 __17.4 트라이 검색의 효율성 __17.5 트라이 삽입 ____17.5.1 코드 구현: 트라이 삽입 __17.6 자동 완성 개발 ____17.6.1 단어 수집 ____17.6.2 재귀 연습(walk-through) __17.7 자동 완성 마무리 __17.8 값을 포함하는 트라이: 자동 완성 업그레이드 __17.9 마무리 __17.10 연습 문제 18장 그래프로 뭐든지 연결하기 __18.1 그래프 ____18.1.1 그래프 대 트리 ____18.1.2 그래프 용어 ____18.1.3 기초 그래프 구현 __18.2 방향 그래프 __18.3 객체 지향 그래프 구현 __18.4 그래프 탐색 __18.5 깊이 우선 탐색 ____18.5.1 깊이 우선 탐색 연습 ____18.5.2 코드 구현: 깊이 우선 탐색 __18.6 너비 우선 탐색 ____18.6.1 너비 우선 탐색 연습 ____18.6.2 코드 구현: 너비 우선 탐색 ____18.6.3 깊이 우선 탐색 대 너비 우선 탐색 __18.7 그래프 탐색의 효율성 ____18.7.1 O(V + E) __18.8 가중 그래프 ____18.8.1 가중 그래프 코드 ____18.8.2 최단 경로 문제 __18.9 데이크스트라의 알고리즘 ____18.9.1 데이크스트라의 알고리즘 준비 ____18.9.2 데이크스트라의 알고리즘 단계 ____18.9.3 데이크스트라의 알고리즘 연습 ____18.9.4 최단 경로 찾기 ____18.9.5 코드 구현: 데이크스트라의 알고리즘 ____18.9.6 데이크스트라의 알고리즘의 효율성 __18.10 마무리 __18.11 연습 문제 19장 공간 제약 다루기 __19.1 공간 복잡도의 빅 오 __19.2 시간과 공간 트레이드오프 __19.3 재귀에 숨겨진 비용 __19.4 마무리 __19.5 연습 문제 20장 코드 최적화 기법 __20.1 전제 조건: 현재 빅 오 파악하기 __20.2 시작점: 상상할 수 있는 최상의 빅 오 ____20.2.1 상상의 나래 펼치기 __20.3 룩업 마법 ____20.3.1 저자 룩업 마법 ____20.3.2 자료 구조 추가하기 ____20.3.3 두 수의 합(two-sum) 문제 __20.4 패턴 인식 ____20.4.1 동전 게임 ____20.4.2 예제 생성 ____20.4.3 합 교환(sum swap) 문제 __20.5 탐욕 알고리즘 ____20.5.1 배열 최댓값 ____20.5.2 최대 부분 합 ____20.5.3 탐욕스러운 주가 예측 __20.6 자료 구조 변경 ____20.6.1 애너그램 검사기 ____20.6.2 그룹 정렬 __20.7 요약 __20.8 작별 인사 __20.9 연습 문제 |
Jay Wengrow
제이 웬그로우의 다른 상품
심지현의 다른 상품