요즘 중국에 Intel Atom칩이 싸게 확 풀렸나 보다. 중국에서 폰 좀 만든다는 업체들이 $100 이하의 폰과 타블렛을 하루가 멀다하고 내놓고 있다.
원래 Windows를 별로 좋아하지 않지만, 그래서 회사 PC도 리눅스를 쓰지만, 안드로이드가 좀 지겹더라.
게다가 Windows 8 이후로 소개된 메트로UI가 은근히 편하고 취향에 맞더라. 그래서 언젠가 적당한 가격의 Windows 타블렛이 나오면 지르리라 마음먹고 있었다.
Hadoop.3 Hadoop 생태계 Zoo
Apache MINA로 간단한 HTTP 서버 만들기
C에서 socket 프로그래밍을 하다가 Java로 넘어온 나로서, 오리지널 Java의 스트림 기반의 네트워크 프로그래밍은 매우 생경했다. 그런데 Java 2에서 NIO(Non-blocking I/O)가 소개되면서 그나마 좀 편해졌다.
NIO는 socket 프로그래밍을 현대적으로 계승한 것 같은 API 세트를 가지고 있기 때문이다.
Hadoop.2 HDFS와 YARN
이 글에서는 HDFS와 YARN에 대해서 한발짝 더 들어가 보기로 한다.
HDFS는 Hadoop Distributed File System의 약자로 여러 서버에 걸쳐 분산된 형태로 파일을 저장하기 때문에 확장성이 있고 이동이 용이한 파일 시스템이다. 이는 Java로 개발되었으며 Hadoop 프레임워크의 가장 아랫단에서 인프라 역할을 한다.
파일시스템은 흔히 우리가 얘기하는 NTFS, EXT4, FAT 이런 것들을 연상하면 된다. 이들 기존의 파일시스템들은 한 서버 내의 물리적 디스크를 조직하는 것이었다면...
Hadoop은 여러 서버에 걸쳐 있는 분산된 저장 리소스들을 논리적으로 하나로 엮은 상위 레벨의 파일시스템이라 볼 수 있다. 물론 각 서버 내에서는 그 서버의 OS에서 사용하는 NTFS나 EXT4 같은 물리적 파일시스템을 활용한다.
HDFS는 Hadoop Distributed File System의 약자로 여러 서버에 걸쳐 분산된 형태로 파일을 저장하기 때문에 확장성이 있고 이동이 용이한 파일 시스템이다. 이는 Java로 개발되었으며 Hadoop 프레임워크의 가장 아랫단에서 인프라 역할을 한다.
파일시스템은 흔히 우리가 얘기하는 NTFS, EXT4, FAT 이런 것들을 연상하면 된다. 이들 기존의 파일시스템들은 한 서버 내의 물리적 디스크를 조직하는 것이었다면...
Hadoop은 여러 서버에 걸쳐 있는 분산된 저장 리소스들을 논리적으로 하나로 엮은 상위 레벨의 파일시스템이라 볼 수 있다. 물론 각 서버 내에서는 그 서버의 OS에서 사용하는 NTFS나 EXT4 같은 물리적 파일시스템을 활용한다.
Kodu.1 컴퓨팅적 사고 / 코두(Kodu) 설치하기
요즘 정부에서 소프트웨어 교육을 강화한다고 설레발을 치고 있다. 그런데 사실 이런 움직임은 필요하다. 선진국이라는 곳에서는 이미 초등학교부터 프로그래밍 교육을 하고 있다.
아니 정확히 말하면 "Computational Thinking"을 교육하고 있다. 우리말로는 "컴퓨팅적 사고思考"라고 하는데 영 어색하다. 컴퓨팅적 사고는 교육의 측면에서 정의한 용어이기 때문에 그를 설명한 문서를 보더라도 영 감이 잡히지 않는다.
프로그래머로 20년 밥벌이 한 경험에 비추어 볼 때, 컴퓨팅적 사고는 아이들에게 논리적으로 생각하는 법을 가르치는 것이라 추측된다.
어떤 사람이 프로그래머로서의 자질이 있나 없나를 판단할 때는 그 사람에게 어떤 문제를 주었을 때 그 해결 방법에 대해 절차를 논리적으로 잘 설명하는지를 보면 된다. 물론 개중에는 구글링 잘하고 Ctrl-C/Ctrl-V를 잘하는 것이 자질이라고 생각하는 사람도 있을 것이다. (나도 물론 많이 그런다)
Hadoop.1 Hadoop 스택 개요
By Timo Elliott |
지금까지 빅데이터의 기술적인 면과 비지니스적인 면에 대해 기본적인 개념을 훑어 보았다. 이제부터는 기술적인 면에 집중해서 특히 Hadoop 스택이 어떻게 생겼고, 어떻게 동작하고, 이것으로 무엇을 할 수 있는지 알아볼 것이다.
먼저 Hadoop에 대해 간단히 설명하면 "안정적이고, 확장성 있고, 분산 컴퓨팅을 지원하며, 저렴한(commodity) 서버들로 클러스터를 구성하여 커다란 데이터 집합들을 배치하고 분산 프로세싱을 가능케 하는 오픈소스 소프트웨어"이다.
BigData.9 Hadoop 설치하고 둘러보기
By Cloudera |
먼저 Hadoop이 뭔지 정의를 살펴보자. Apache Hadoop 프로젝트는 안정적이고, 스케일러블하고, 분산 컴퓨팅을 지원하기 위한 오픈소스 소프트웨어를 개발하고자 하는 것으로, 일반적인(commodity) 서버들의 클러스터에 커다란 데이터 집합들을 배치하여 분산 프로세싱을 가능케 한다.
그렇다면 왜 사람들은 Hadoop에 열광하는 것일까? 그것은 적은 비용으로, 확장성이 뛰어나며, 무장애로 운영할 수 있으며, 유연하기 때문이다.
Blogger에서 소스코드를 예쁘게 - Syntax Highlighter
By Iwan Gabovltch |
개발과 관련된 블로그이다 보니, 소스코드를 자주 넣어야 하는데 그때마다 Syntax Highlighter가 아쉽곤 했다. Wordpress라면 플러그인 형태로 제공되는 다양한 선택사항이 있지만, 여기는 Google Blogger이니 직접 손으로 때워야 한다.
Google Blogger에서도 Syntax Highlighter를 사용할 수 있는 옵션들은 몇개 있다. 그 중에서 하나를 고르기 위해 다음과 같은 기준을 세웠다. 이 기준은 귀차니즈머의 취향이 99% 반영된 것이다.
BigData.8 데이터 과학자들을 분석해 보면?
By O'Reilly |
이 보고서는 데이터 과학자들이 스스로를 어떻게 생각하는지, 그리고 그들의 일에 대해 어떻게 생각하는지를 설문조사하여 정리한 것이다. 그들의 경력이나, 학위, 사용하는 도구, 직위, 연봉, 조직 같은 것들은 고려하지 않았다. 단지 그들이 가지고 있는 기술이 무엇인지를 알고 싶었던 것이다.
소셜 네트워크를 통해 온라인 설문조사를 했으며, 완료된 설문 개수는 250개 였다.
소셜 네트워크를 통해 온라인 설문조사를 했으며, 완료된 설문 개수는 250개 였다.
BigData.7 데이터 과학자가 갖추어야 할 소양
By Pixabay |
맥킨지(McKinsey Global Institute)의 "Big Data Report"에 의하면...
2018년까지 미국에서만 심층 분석 기술(deep analytical skill)을 가진 인력은 14만~19만 정도 부족하고, 빅데이터 분석을 활용하여 효율적인 의사결정을 할 수 있는 관리자와 분석가가 150만명이 부족하다고 한다.
좀 뻥이 심한 것 같기는 하지만 그런 경향이라는 건 부정할 수 없다.
빅데이터와 머신러닝에 대한 즐겨찾기 모음
BigData.6 데이터 과학자는 뭐하는 사람일까?
실제 빅데이터의 가치는 무엇일까?
고객으로부터 만들어지는 혹은 정보 시스템에서 만들어지는 대량의 데이터를 계산하여, 정확한 예측 모델을 만들고 이를 통해 데이터 기반의 의사결정을 하고자 하는 것이다.
요즘의 컴퓨터 시스템은 더 이상 결정론적인(deterministic) 기계가 아니다. 요즘 정보 시스템들은 손에 잡히는 곳에 있지 않고 멀리 클라우드(cloud)에 혹은 가상 세계에 존재한다.
데이터 과학자(data scientist)는 빅데이터로부터 원료를 공급받는다. 데이터 과학자들은 이 새로운 빅데이터로부터 도전을 받고, 자극을 받고, 영감을 얻게 된다.
고객으로부터 만들어지는 혹은 정보 시스템에서 만들어지는 대량의 데이터를 계산하여, 정확한 예측 모델을 만들고 이를 통해 데이터 기반의 의사결정을 하고자 하는 것이다.
요즘의 컴퓨터 시스템은 더 이상 결정론적인(deterministic) 기계가 아니다. 요즘 정보 시스템들은 손에 잡히는 곳에 있지 않고 멀리 클라우드(cloud)에 혹은 가상 세계에 존재한다.
데이터 과학자(data scientist)는 빅데이터로부터 원료를 공급받는다. 데이터 과학자들은 이 새로운 빅데이터로부터 도전을 받고, 자극을 받고, 영감을 얻게 된다.
BigData.5 성공적인 빅데이터 프로젝트의 조건
BigData.4 하이프 사이클로 본 빅데이터
By Jeremy Kemp, Wikipedia |
하이프 사이클은 "과대 광고 주기"라고 직역되기도 하는데, 한마디로 어떤 기술이라는 것이 세상에 나오게 되면 기술 촉발(technology trigger) - 부풀려진 기대의 정점(Peak of Inflated Expectations) - 환멸(Trough of Disillusionment) - 계몽(Slope of Enlightenment) - 생산성 안정(Plateau of Productivity)이라는 다섯 단계를 거치게 된다는 것이다.
BigData.3 Hadoop의 개요
BigData.2 급변하는 빅데이터 스택
BigData.1 빅데이터가 대체 뭐냐?
소프트웨어 엔지니어 더 정확히 말하면 프로그래머의 수명은 몇 살까지일까? 외국에는 백발의 할아버지 프로그래머들도 활동한다지만, 우리나라는 40대 중반 정도가 평균인 것 같다. 그런데 내가 벌써 40대 중반을 넘어갔다.
처음 프로그래밍에 대해 열정적으로 빠져들었을 때, 참 많은 것을 짧은 시간에 배운 것 같다. 그렇게 한번 불꽃처럼 타오른 뒤 , 그 열정은 서서히 식어가고 있었다. 20년 동안 젊을 때 익혔던 기술과 지식으로 잘 버텨왔는데, 어느새 세상이 확 바뀌어 버리고 말았다.
몇년 전부터 빅데이터, Hadoop, Map-Reduce, Machine Learning, Deep Learning 등의 듣도보도 못한 용어들이 튀어나오기 시작하더니, 예전에는 구현되기 어려울 것이라 생각했던 지능적이고 고도화된 서비스들이 튀어나오기 시작했다. 그리고 이들 서비스들을 제공하는 업체들이 세계를 지배하게 되었다.
LG G4와 루나폰 카메라 화질 비교
나는 최신 스마트폰에 둔감한 편이다. 내가 스마트폰을 고르는 기준은 1등 제품이 아닐 것(그래야 다 같이 먹고 살 것 아닌가?), 가성비가 뛰어날 것, 튼튼할 것, 되도록 작을 것, 그리고 절대적인 가격이 쌀 것. 이 정도이다.
그래서 전에는 팬텍의 VEGA 아이언을 사서 만족스럽게 잘 쓰고 있었다. 그런데 언젠가 아들놈이 가지고 놀다가 떨어뜨리는 바람에 액정이 깨지고 말았다. 액정 수리비를 알아보니 15만원 정도... 이 정도면 그냥 새거 사겠다 싶어서 깨진 상태에서 버텼다.
그러나 와이프가 폰을 바꾼다길래 따라 갔다가, 얼떨결에 나도 폰을 장만해 버렸다. 순전히 우발적인 상황이었다.
헐렁한 유로플러그(Europlug) 안전하게 사용하기
Wireshark 리눅스에서 No Interface 문제 해결하기
Wireshark는 이더넷 인터페이스 카드를 통해 드나드는 데이터들을 캡쳐할 수 있는 요긴한 프로그램이다. 나같이 프로토콜을 구현하고 테스트하고 연동하는 사람에게 이 툴은 권총처럼 옆에 항상 차고 다닌다고 보면 된다.
Wireshark이 네트워크 카드의 데이터 흐름을 캡쳐할 수 있는 이유는 드라이버 레벨에서 동작하는 모듈이 있기 때문이다. Windows 용 Wireshark는 WinPcap 모듈을 이용하고, 리눅스에서는 dumpcap 이라는 데몬을 사용한다.
그런데 리눅스의 dumpcap은 그냥 설치하는 것 만으로는 동작하지 않는다. 네트워크 카드에서 정보를 추출하는 것은 뭔가 해킹과 같은 늬앙스를 풍기기 때문에, 리눅스에서는 권한을 부여받은 어플리케이션만 네트워크를 캡쳐할 수 있도록 제한하고 있기 때문이다.
Wireshark이 네트워크 카드의 데이터 흐름을 캡쳐할 수 있는 이유는 드라이버 레벨에서 동작하는 모듈이 있기 때문이다. Windows 용 Wireshark는 WinPcap 모듈을 이용하고, 리눅스에서는 dumpcap 이라는 데몬을 사용한다.
그런데 리눅스의 dumpcap은 그냥 설치하는 것 만으로는 동작하지 않는다. 네트워크 카드에서 정보를 추출하는 것은 뭔가 해킹과 같은 늬앙스를 풍기기 때문에, 리눅스에서는 권한을 부여받은 어플리케이션만 네트워크를 캡쳐할 수 있도록 제한하고 있기 때문이다.
30장 : 오토마타(Automata)와 XML 파서
오토마타는 상태(State) 집합과 상태간의 전이(Transition)를 모델링한 것으로 이들이 하나의 시스템을 이루면 "유한상태 기계(Finite-State Machine)"라고 합니다.
실로 현실의 많은 것들이 이 오토마타로 표현될 수 있습니다만 가장 대표적으로 쓰이는 분야가 논리적으로 구성된 프로그래밍 언어를 해석하는 파서(Parser) 분야입니다. 현재 개발할 때 사용하는 C++, Java 등의 언어들은 더 낮은 레벨의 언어로 변환되어야 하는데, 고레벨 언어를 해석하는 역할을 오토마타가 맡고 있습니다.
이 장에서는 오토마타의 기본적인 개념을 살펴 보고, 오토마타를 활용한 예로서 XML 문서를 해석하는 XML 파서를 만들어 보도록 하겠습니다.
29장 : 알고리즘 개발 방법론 2 (Greedy Method, Backtracking)
28장 : 알고리즘 개발 방법론 1 (Divide and Conquer, Dynamic Programming)
지금까지 살펴 본 알고리즘들은 주어진 문제를 최적으로 해결하는 것들이었습니다. 우리의 선조들이 힘든 연구와 통찰을 통해 찾아낸 아름답고도 멋진 해법들입니다.
하지만 이들은 처음 접한 문제들에 대해 어떻게 해법을 찾을 수 있었을까요? 또 우리가 새로운 문제를 접하게 될 때, 참조할 만한 비슷한 연구 결과가 없다면 어떻게 해결해야 할까요?
"알고리즘 개발 방법론"이라는 소제목으로 소개시켜드리고자 하는 네가지 접근법은 바로 이렇게 특별한 최적화된 해법이 없는 문제에 대해 어떻게 접근하여 최적화된 혹은 쓸만한 해법을 찾을 수 있는지에 대한 "방법론"을 살펴볼 것입니다.
27장 : 회귀와 스플라인 (Regression & Spline)
이번 장에서 배우는 회귀(Regression)과 스플라인(Spline)은 다른 큰 학문 분야의 맛보기로 제시한 것입니다.
회귀는 통계학의 기본이 되는 개념으로, 실제 측정된 데이터로부터 일반화된 수식을 얻어내는 기법을 의미합니다. 측정된 데이터가 많을 수록 더 정확한 수식을 얻어낼 수 있으며, 이 수식을 바탕으로 미래에 일어날 사건을 예측할 수 있다는 점에서 "통계 학습(Statistical Learning)"의 출발점이라 볼 수 있습니다.
통계 학습은 요즘 뜨고 있는 빅데이터 분석과도 밀접한 관계를 가지고 있습니다.
스플라인(Spline)은 몇몇 제어점을 이용하여 부드러운 곡선을 만들어내는 수학적 도구입니다. 회귀와 비슷한 개념을 기하학적으로 바라보는 관점입니다.
26장 : 수치 미적분
25장 : 방정식 근 찾기
학창시절 수학 공부하면서 지겹도록 방정식을 풀어 보았을 겁니다.
그런데 아십니까? 우리가 손으로 풀던 문제들은, 딱 손으로 풀 수 있는 정도의 계산량만 요구하는 "연습용" 문제일 뿐이라는 걸요.
실제 현실에서 부닥치는 여러가지 문제들을 방정식으로 모델링하고 이를 풀려고 하면 절대로 손으로 (혹은 대수적으로) 풀 수 없는 경우가 태반입니다.
객관식 문제라면 보기 몇개를 거꾸로 대입시켜 해결할 수 있을 것입니다만... 현실은 주관식이어서 대입해야 할 수는 거의 무한대에 가깝습니다. 이럴 때 필요한 것이 초당 몇백만 번을 계산할 수 있는 컴퓨터의 계산 능력입니다.
그런데 아십니까? 우리가 손으로 풀던 문제들은, 딱 손으로 풀 수 있는 정도의 계산량만 요구하는 "연습용" 문제일 뿐이라는 걸요.
실제 현실에서 부닥치는 여러가지 문제들을 방정식으로 모델링하고 이를 풀려고 하면 절대로 손으로 (혹은 대수적으로) 풀 수 없는 경우가 태반입니다.
객관식 문제라면 보기 몇개를 거꾸로 대입시켜 해결할 수 있을 것입니다만... 현실은 주관식이어서 대입해야 할 수는 거의 무한대에 가깝습니다. 이럴 때 필요한 것이 초당 몇백만 번을 계산할 수 있는 컴퓨터의 계산 능력입니다.
24장 : 행렬 (Matrix)
행렬(Matrix)는 행(Row)과 열(Column)로 구성되는 사각형의 격자(Array)에 숫자나 심볼을 배치한 것을 의미합니다.
행렬은 기하학(특히 컴퓨터 그래픽스)이나 통계학에서 시스템을 이루는 다차원의 독립 변수들을 한꺼번에 연산하기 위한 수학적 도구라 볼 수 있습니다. 간단히 말하면 여러 수치를 동일한 방법으로 연산하는 표현이자 도구입니다.
이런 이유로 행렬 또한 컴퓨터로 하는 수치해석의 주요 이슈이며, 매우 중요한 의미를 가집니다. 행렬에 대해서는 고등학교 수학 시간에 필요한 정도는 이미 배웁니다. 만일 기억이 잘 나지 않는다면 행렬에 대한 내용을 복습해 보는 것이 진행하는데 도움이 될 것입니다.
23장 : 다항식 (Polynomial)
이번장 부터는 수치해석(Numerical Analysis)의 기본적인 주제들을 살펴볼 겁니다.
수치해석은 컴퓨터가 가진 뛰어난 연산 능력을 활용하여 복잡한 수학적 문제들을 반복적인 방법으로 풀어내는 것입니다. 현실 세계에서 부닥치는 많은 수학적 문제들은 수치해석이 아니면 풀지 못하는 것들입니다.
그래서 수치해석은 공학, 기초 과학, 통계학 그리고 요즘 뜨고 있는 머신러닝, 빅 데이터 처리 등에 적극 활용되고 있습니다. 다소 수학적인 풀이가 있어 어렵게 느껴지지만, 증명하기 보다는 이해하고 활용하는데 촛점을 맞춘다면 넘지 못할 벽이 아닙니다.
22장 : 방향 그래프 (Directed Graph)
21장 : 가중 그래프 (Weighted Graph)
이번 장에서 배우는 가중 그래프(Weighted Graph)는 정점(Vertex)를 연결하는 간선(Edge)에 가중치를 부여한 것입니다.
예를 들어 정점을 도시라고 생각하고, 간선은 도시를 연결하는 도로라고 한다면, 간선에 매겨진 가중치는 이동하는데 걸리는 비용(시간, 통행료, 연료비 등)이라고 모델링할 수 있습니다.
이런 모델링이 자연스럽기 때문에 가중 그래프의 예로는 두 정점 간의 최소 비용 경로(최단 경로)를 찾는 것이 주요 문제가 됩니다.
자동차의 최단 경로를 안내하는 내비게이션도 도로를 가중 그래프로 모델링하고 그 안에서 최소 비용 경로를 찾는 것입니다.
이번 장에서 가중 그래프를 프로그램으로 표현하는 법, 그리고 최소 비용 신장 트리를 찾기 위한 Kruskal 알고리즘과 최단 경로를 찾기 위한 Dijkstra 알고리즘에 대해 알아볼 것입니다.
20장 : 그래프의 기본 (Graph Basics)
19장 : 레드-블랙 트리 (Red-Black Tree)
어느덧 검색 알고리즘의 마지막 장입니다. 이번 장에서는 이진트리의 범주를 벗어나지 않으면서 자동으로 균형을 맞추는 알고리즘인 레드-블랙 트리(Red-Black Tree)에 대해 알아봅니다.
자료를 이진트리로 구성하여 검색 구조로 삼는 이유는 단순한 구조이면서도 자료의 검색, 삽입, 삭제가 효율적이기 때문입니다. 하지만 균형이 맞지 않는 경우 검색 성능이 선형검색과 비슷할 정도로 비효율적입니다.
이 문제를 해결하기 위해 여러가지 알고리즘들이 연구되고 제안되어 왔습니다. 그 중 대표적인 것이 이진트리의 한계에서 벗어나 더 많은 자료를 하나의 노드에 포함하면서 균형 트리를 구현한 B-트리입니다.
18장 : B-트리 (B-Tree) 검색
17장 : 기수 검색 (Radix Search)
컴퓨터의 두뇌인 CPU의 동작을 쪼개어 들어가 보면 결국 0과 1 즉 비트(bit)를 다루는 것을 기본으로 합니다. 컴퓨터에 저장된 모든 데이터는 비트의 배열로 구성됩니다. 하나의 바이트는 8개의 비트로 구성되며, 일반적인 정수형은 4개의 바이트 즉 32비트로 구성됩니다.
지금까지는 데이터를 수학적인 혹인 추상적인 개념으로서 취급했다면, 이 장에서 소개하는 기수 검색(Radix Search)은 데이터를 기본 단위인 비트의 배열로 취급합니다. 비트는 0과 1 두가지 값 밖에 없기 때문에 자연스럽게 자식을 두개 가질 수 있는 이진트리(Binary Tree)와 연결됩니다.
지금까지는 데이터를 수학적인 혹인 추상적인 개념으로서 취급했다면, 이 장에서 소개하는 기수 검색(Radix Search)은 데이터를 기본 단위인 비트의 배열로 취급합니다. 비트는 0과 1 두가지 값 밖에 없기 때문에 자연스럽게 자식을 두개 가질 수 있는 이진트리(Binary Tree)와 연결됩니다.
16장 : 해쉬 (Hash)
지금까지 배웠고 또 앞으로 배울 검색 알고리즘들은 모두 자료수 N이 커지면 검색 시간도 더 걸리는 성능을 보여줍니다. 또한 이것이 자연스럽습니다. 이들 알고리즘들은 O(N) 혹은 O(logN)의 성능을 보여 줍니다.
그런데 오늘 배울 검색 알고리즘인 해쉬(Hash)는 자료수 N과 무관하게 일정한 검색 성능을 보여줍니다. O(1)의 성능입니다. 실로 놀라운 검색 알고리즘입니다. 그런데 알고보면 그 원리는 매우 간단합니다.
입력된 자료가 수치형이든, 스트링이든, 복합 데이터 타입이든 그것을 정수로 변환하는 함수만 정의하면 됩니다. 이 함수를 해쉬 함수라 하며, 입력 자료를 해쉬 함수에 넣어 나온 결과를 해쉬값이라고 합니다.
입력자료에 대해 고른 분포의 해쉬값이 나오는 해쉬함수가 있다면 매우 효율이 높은 해쉬 검색을 구현할 수 있습니다. 하지만 이런 이상적인 경우는 현실에 존재하지 않기 때문에 다른 입력자료가 같은 해쉬값이 나오는 경우가 빈번하게 발생합니다.
그런데 오늘 배울 검색 알고리즘인 해쉬(Hash)는 자료수 N과 무관하게 일정한 검색 성능을 보여줍니다. O(1)의 성능입니다. 실로 놀라운 검색 알고리즘입니다. 그런데 알고보면 그 원리는 매우 간단합니다.
입력된 자료가 수치형이든, 스트링이든, 복합 데이터 타입이든 그것을 정수로 변환하는 함수만 정의하면 됩니다. 이 함수를 해쉬 함수라 하며, 입력 자료를 해쉬 함수에 넣어 나온 결과를 해쉬값이라고 합니다.
입력자료에 대해 고른 분포의 해쉬값이 나오는 해쉬함수가 있다면 매우 효율이 높은 해쉬 검색을 구현할 수 있습니다. 하지만 이런 이상적인 경우는 현실에 존재하지 않기 때문에 다른 입력자료가 같은 해쉬값이 나오는 경우가 빈번하게 발생합니다.
15장 : 이진트리 검색 (Binary Tree Search)
피드 구독하기:
글 (Atom)
인기글
-
언젠가부터 내 스마트폰에서 용량이 부족 하다면서 계속 알림이 떴다. 저가폰이라 내부저장소가 16GB 밖에 되지 않았지만, 추가로 마이크로SD 카드 16GB를 달았는데도 그렇다. 안드로이드가 앱을 설치하고 필요한 데이터를 저장하는 곳은 특별히 지정하...
-
나는 무려 10년이 된 Java 프로젝트를 여러개 관리하고 있는데, Netbeans와 Ant 기반의 개발/빌드 환경을 사용한다. Netbeans는 Sun이 Oracle로 넘어간 뒤에 Apache 재단으로 넘어가면서 개발 동력이 많이 떨어져 있다...
-
알톤 니모 전기자전거를 구입한지 2주일째다. 지금까지 출퇴근 용으로 잘 쓰고 있다. 굉장히 만족하고 있다. 주행기에 대해서는 한달 정도 탄 후에 올려볼까 한다. 전기자전거를 알아볼때 느낀건데, 매뉴얼이 공개되어 있지 않아 자세한 정보를 얻기 어려...