책 소개
소스 코드 파일은 여기에서 내려 받으실 수 있습니다.
본문에 쓰인 컬러 이미지는 여기에서 내려 받으세요.
요약
데이터 구조와 알고리즘은 문제를 해결하기 위한 패턴이라 할 수 있으며, 이를 잘 활용하면 어려운 문제를 간단하면서도 세련되게 해결할 수 있다. 반면, 데이터 구조에 대한 명확한 이해가 없다면 현대 프로그래밍 언어의 특징이라 할 수 있는 다양한 데이터 타입의 장단점을 파악하기 어려우며, 어떤 상황에서 어떤 데이터 구조를 사용해야 할지 판단할 수 없고, 결국 프로그램의 성능 문제로 남게 된다.
이 책은 스위프트 표준 라이브러리에서 제공하는 코어 데이터의 구조와 알고리즘, 큐, 스택, 리스트, 해시 테이블 등 보편적으로 사용되는 데이터 구조와 알고리즘을 소개한다. 또한 다양한 정렬 알고리즘의 개요를 소개하고 각 알고리즘 성능의 장단점과 데이터 입력 크기에 따른 성능 차이를 비교 분석한다. 스위프트 언어를 통해 구현할 수 있는 다양한 트리 데이터 구조와 알고리즘, 고급 검색 기법을 설명하고, 알고리즘의 성능과 효율성을 한눈에 파악할 수 있는 그래프 구현 방법을 소개한다.
이 책의 목적은 데이터 구조와 알고리즘을 통해 모두들 해결이 어렵다고 말하는 문제에서 패턴 또는 실마리를 찾고, 이를 바탕으로 일상적인 개발 업무에서 즉각적으로 활용할 수 있는 다양한 해법 또는 응용 프로그램을 떠올리게 하는 것이다.
이 책에서 다루는 내용
■ 스위프트의 기본적인 데이터 구조에 대한 개념 정리
■ 스위프트 표준 라이브러리 컬렉션과 오브젝티브C 컬렉션의 브릿징 기법과 프로토콜 지향 프로그래밍
■ 스위프트 반복기와 시퀀스의 개념과 고급 데이터 구조에서의 활용 방법
■ 다양한 데이터 정렬 알고리즘의 구현 및 장단점 비교
■ 이진 트리, 이진 검색 트리, 스플레이 트리 구현 및 B-트리 등 고급 트리의 작동 원리 분석
■ 레드-블랙 트리, AVL, 트라이 트리 등을 활용한 고급 검색 메소드 구현
■ 깊이 우선 검색, 너비 우선 검색, 미니멈 스패닝 트리, 최단 경로 등의 그래프 알고리즘 구현
이 책의 대상 독자
스위프트 언어를 이용해 데이터 구조와 알고리즘을 구현하는 방법을 익히고자 하는 개발자를 위한 책이다. 컴퓨터 과학을 전공한 개발자는 물론, 스위프트에 대한 실무 경험 없이 스위프트에 대해 공부하고 있는 개발자도 큰 어려움 없이 최신 버전의 스위프트 언어로 고급 데이터 구조와 알고리즘 구현 방법을 익힐 수 있도록 구성했다.
이 책에 실린 대부분의 예제 코드는 모바일 환경은 물론, 서버 환경에서도 문제 없이 작동하도록 만들어졌다. 독자 여러분이 객체지향 프로그래밍에 대한 사전 지식과 경험이 있다면 전반적인 내용을 좀 더 쉽게 이해할 수 있겠지만, 객체지향 프로그래밍을 잘 모르는 독자라 하더라도 가장 기본이 되는 내용부터 설명하므로 큰 어려움 없이 기본 개념을 익히고 예제 코드를 실행해 볼 수 있으리라 생각한다.
이 책의 구성
1장, ‘플레이그라운드 살펴보기’에서는 데이터 구조와 알고리즘, 스위프트 REPL에 대한 개요를 소개하고, 커맨드라인 환경에서 스위프트 명령어를 입력하고 실행하는 방법에 대해 설명한다.
2장, ‘스위프트 기본 데이터 구조의 활용’에서는 클래스와 구조체, 배열, 딕셔너리, 세트 컬렉션 타입 구현을 위한 상세한 방법을 소개하고, 스위프트에서 오브젝티브C와 C 시스템 라이브러리를 활용하는 방법, 그리고 프로토콜 지향 프로그래밍 기법에 대해 설명한다.
3장, ‘스위프트 고급 데이터 구조의 활용’에서는 스위프트 프로토콜에의 부합 방법, 스택과 큐 구현 방법, 애플리케이션의 개발 요구 사항에 따른 올바른 타입의 선택 및 구현 방법에 대해 설명한다.
4장, ‘정렬 알고리즘 알고리즘의 개요와 정렬’에서는 알고리즘에 대해 소개하고, 배열 데이터 구조를 이용해서 정렬 알고리즘을 구현하는 방법에 대해 알아본다. 또한, 비교 정렬 기법 등 새로운 알고리즘을 소개하고, 단순 정렬 기법과 분리-정복 전략의 차이에 대해서도 설명한다.
5장, ‘나무를 통해 숲을 보기’에서는 트리 데이터 구조의 정의와 프로퍼티에 대해 소개하고, 이진 트리, 이진 검색 트리, B-트리, 그리고 스플레이 트리 등, 다양한 트리의 구현 방법에 대해 상세히 알아본다.
6장, ‘고급 검색 메소드’에서는 고급 트리 구조인 레드블랙 트리, AVL 트리, Trie 트리(Radix 트리)에 대해 소개하고, 서브스트링 검색 알고리즘 구현 방법에 대해서도 알아본다.
7장, ‘그래프 알고리즘’에서는 그래프 이론과 그래프를 위한 데이터 구조, 깊이 우선 검색, 너비 우선 검색, 스패닝 트리, 최단 경로, SwiftGraph에 대해 알아본다.
8장, ‘알고리즘의 성능과 효율성’에서는 알고리즘의 효율성의 개념을 소개하고 여러분이 만든 알고리즘의 효율성을 측정하는 방법과 Big-O 표기법, Big-O 함수의 순서, 실행 시간 복잡성의 개념에 대해 설명한다.
9장, ‘내게 꼭 맞는 알고리즘 선택하기’에서는 현실적인 복잡한 문제를 해결하기 위해 데이터 구조와 알고리즘을 설계하는 방법과 이를 스위프트 코드로 구현하는 방법에 대해 소개하고, 실제 상황에서 우리가 만든 알고리즘이 정상적으로 작동할 때 Big-O 표기법으로 복잡성을 측정하는 방법에 대해 알아본다. 마지막으로 병목 구간의 측정 및 감지, 성능 개선을 위한 코드 수정 기법에 대해서도 알아본다.
목차
목차
- 1장. 플레이그라운드 살펴보기
- 데이터 구조의 중요성
- 데이터 구조 + 알고리즘 = 프로그램
- 상호작용성 높은 플레이그라운드
- 스위프트 REPL
- 기본적인 데이터 구조
- 인접 데이터 구조
- 배열
- 배열 선언
- 배열 요소 가져오기
- 배열 요소 추가
- 배열 요소 삭제
- 연결 데이터 구조
- 단일 연결 리스트
- 인접 데이터 구조
- 데이터 구조의 종류와 장단점
- 알고리즘 개요
- 스위프트에서의 데이터 타입
- 밸류 타입과 레퍼런스 타입
- 기명 타입과 복합 타입
- 타입 알리아스
- 스위프트 표준 라이브러리의 컬렉션 타입
- 점근적 분석
- 데이터 크기 분석 방법 - 성장의 순서
- 정리
- 데이터 구조의 중요성
- 2장. 스위프트 기본 데이터 구조의 활용
- 스위프트 표준 라이브러리의 활용
- 애플이 구조체를 사용하는 이유
- 스위프트에서 배열 선언
- 배열 초기화
- 배열에 요소 추가 및 업데이트
- 배열에서 요소 가져오기 및 삭제
- 딕셔너리 가져오기 및 초기화하기
- 딕셔너리 초기화하기
- 키/값 쌍 추가, 변경, 삭제
- 딕셔너리에서 값 가져오기
- 세트 선언
- 세트 초기화
- 세트 요소 변경 및 가져오기
- 세트 연산자
- 튜플의 특징
- 무기명 튜플
- 기명 튜플
- 서브스크립팅 구현
- 서브스크립트 문법
- 서브스크립트 옵션
- 수정 가능 속성과 수정 불가 속성의 이해
- 컬렉션의 수정가능 속성
- 스위프트와 오브젝티브C의 상호관련성
- 초기화 방식
- 스위프트 타입의 호환성
- 컬렉션 클래스 브릿징
- NSArray를 Array로 브릿징
- NSSet을 set로 브릿징
- NSDictionary를 dictionary로 브릿징하기
- 스위프트 프로토콜 지향 프로그래밍
- 명령 전달을 위한 디스패치 기법
- 프로토콜 작성 문법
- 타입으로서의 프로토콜
- 프로토콜 익스텐션
- 컬렉션에서 활용하기 위한 프로토콜의 검증
- Array 리터럴 문법
- 열거형 배열 만들기
- 정리
- 스위프트 표준 라이브러리의 활용
- 3장. 스위프트 고급 데이터 구조의 활용
- 반복기, 시퀀스, 컬렉션
- 반복기
- 시퀀스
- 컬렉션
- 반복기
- 스택
- 애플리케이션 개요
- 구현 방법
- 프로토콜
- 큐
- 애플리케이션 개요
- 구현 방법
- 프로토콜
- 순환 버퍼
- 애플리케이션 개요
- 구현 방법
- 프로토콜
- 우선순위 큐
- 애플리케이션 개요
- 구현 방법
- 프로토콜
- 스택 리스트
- 애플리케이션 개요
- 구현 방법
- 프로토콜
- 정리
- 반복기, 시퀀스, 컬렉션
- 4장. 정렬 알고리즘
- 삽입 정렬 알고리즘
- 알고리즘 개요
- 삽입 정렬 알고리즘 분석
- 삽입 정렬 알고리즘 활용 사례
- 최적화
- 병합 정렬 알고리즘
- 배열 기반 병합 정렬 알고리즘
- 병합 정렬 알고리즘 분석
- 연결 목록 기반 병합 정렬 알고리즘 분석
- 알고리즘 성능 비교
- 신속 정렬 알고리즘
- 로무토의 신속 정렬 알고리즘
- 로무토의 파티션 스킴 분석
- 호어의 신속 정렬 알고리즘
- 호어의 파티션 스킴 분석
- 피봇 선택 방식
- 신속 정렬 알고리즘을 위한 개선된 피봇 선택 방식
- 최적화
- 정리
- 삽입 정렬 알고리즘
- 5장. 나무를 통해 숲을 보기
- 트리: 정의와 주요 속성
- 다양한 트리의 종류와 개요
- 이진 트리
- 이진 검색 트리
- B 트리
- 스플레이 트리
- 레드블랙 트리
- 이진 트리
- 타입과 종류
- 코드
- 이진 검색 트리
- 노드 삽입
- 트리 워크(순회 방식)
- 인오더 트리 워크
- 프리오더 트리 워크
- 포스트오더 트리 워크
- 검색
- 삭제
- B 트리
- 스플레이 트리
- 스플레이 작업
- 지그 회전
- 지그지그 또는 재그재그 회전
- 지그재그 회전
- 스플레이 작업
- 정리
- 6장. 고급 검색 메소드
- 레드블랙 트리
- 레드블랙 트리 노드의 구현
- 회전
- 우측 회전
- 좌측 회전
- 삽입
- AVL 트리
- AVL 트리 노드의 구현
- AVL 트리 회전
- 좌측 단순 회전
- 단순 우측 회전
- 우-좌 이중 회전
- 좌-우 이중 회전
- 검색
- 삽입
- Trie 트리
- Radix 트리
- 다양한 서브스트링 검색 알고리즘
- 서브스트링 검색 알고리즘 사례
- 나이브(브루트 포스) 알고리즘
- Rabin-Karp 알고리즘
- 서브스트링 검색 알고리즘 사례
- 정리
- 레드블랙 트리
- 7장. 그래프 알고리즘
- 그래프 이론
- 보편적으로 활용되는 그래프의 유형
- 무방향성 그래프
- 방향성 그래프
- 가중치 그래프
- 그래프의 표현 방식
- 객체지향 접근법: 구조체와 클래스 활용
- 이웃 목록
- 이웃 매트릭스
- 근접 매트릭스
- 보편적으로 활용되는 그래프의 유형
- 데이터 구조
- 꼭지점
- 모서리
- 이웃 목록
- 깊이 우선 검색
- 너비 우선 검색
- 스패닝 트리
- 미니멈 스패닝 트리
- Prim 알고리즘
- 최단 경로
- 다이크스트라 알고리즘
- SwiftGraph
- 정리
- 그래프 이론
- 8장. 알고리즘의 성능과 효율성
- 알고리즘의 효율성
- 최상, 최악, 그리고 평균의 경우
- 효율성 측정과 Big-O 표기법
- 점근적 분석
- 복잡성 계산 방식
- 점근적 분석
- 일반적인 함수의 복잡성 순서
- O(1)
- O(log(n))
- O(n)
- O(nlog(n))
- O(n^2)
- O(2^n)
- Big-O 그래프 비교
- 런타임 복잡성의 평가
- 정리
- 알고리즘의 효율성
- 9장. 내게 꼭 맞는 알고리즘 선택하기
- URL 단축기
- 긴 URL 문제
- URL 단축기 구현 전략
- 스위프트로 구현하는 URL 단축기
- 구현 기법 1: 올바른 튜플 찾기
- 구현 기법 2: 인덱스값으로 올바른 배열 위치에 바로 접근하기
- 대규모 데이터의 검색
- 대규모 블랙리스트 문제
- 대규모 블랙리스트 검색 문제의 해법
- 스위프트로 구현하는 대규모 블랙리스트 검색 알고리즘
- 구현 기법 1: 기본적인 대규모 블랙리스트 검색
- 구현 기법 2: 블룸 필터 기법
- URL 단축기
도서 오류 신고
정오표
정오표
[p.62 : 아래서 7행]
인스턴에
->
인스턴스에
[p.64 : 아래서 1행]
미리 예약하는 reserve 예제다.
->
미리 예약하는 예제다.
[p.68 : 1행]
5 초과인
->
5 미만인
[p.89 : 6행]
전달되 실행
->
전달되어 실행
[p.109 : 2행]
스택의 하단에 요소를 추가
->
스택의 상단에 요소를 추가
[p.110 : 아래서 1행]