기본 콘텐츠로 건너뛰기

추천 가젯

위키피디아를 통한 벤포드법칙 검증

왜 이런 짓을 하는가? 학교에서 벤포드 법칙과 관련하여 활동을 해서 소감문을 제출하라고 한다. 물론 학교에서는 통계청 에서 제공하는 데이터 차트 같은 한 만개에서 십만개 정도 데이터를 조사하라고 하긴 했는데, 마침 친구가 나무위키의 약 50만개 문서 (리다이렉트, 사용자문서 제외)의 5천만개 숫자를 가지고 분석을 돌렸길래 나는 좀더 크게 영문 위키피디아 에 있는 숫자들을 대상으로 조사하기로 했다. 벤포드 법칙이란? 우선 분석 글을 시작하기 전에 벤포드 법칙이 무엇인지부터 간단히 설명을 하고 시작을 하겠다. 벤포드 법칙이란 1938년에 물리학자 프랭크 벤포드가 자기 논문에서 제시한 법칙으로, 간단히 말하면 "수치를 나타내는 수" 에서 수의 첫자리가 낮을 확률이 높다 라는 간단하지만 신기한 법칙이다. 자세한 설명은 나무위키가 해줄 것이다. 1. 위키피디아 데이터베이스 덤프 다운로드 우선 분석을 하기 위해서는 당연하지만 위키피디아의 데이터베이스가 필요하다. (위키피디아 전체 를 크롤링하기에는 아주 오래걸릴 뿐더러, 위키피디아의 서버에 부하를 주기 때문에 가능성은 낮겠지만 크롤링하는 중간에 위키피디아에서 접속을 차단할 수도 있다.) 다행히도, 위키피디아는 우리 같이 위키피디아의 데이터베이스를 활용하려는 사람들을 위해서, (물론 위키피디아 서버를 백업하려는 목적도 있지만) 위키피디아 전체의 XML 덤프 를 제공한다. 여기 에서 위키피디아의 데이터베이스를 비트토렌트를 이용하여 다운로드 할 수 있다. 토렌트 말고 직접 다운로드 링크도 주어지지만... 속도가 처참하기 때문에 토렌트로 다운로드 하는 것을 권장한다. (약 2~3 MB/s의 속도로 다운로드가 되는데, 총 파일이 20GB가량 되기 때문에 서너시간 정도 걸린다. 물론 토렌트 특성상 더 빠를수도 느릴수도 있다.) 그리고 bz2 압축을 해제한다. 윈도우라면 위대하신 반디집 을 이용하여 압축을 해제할 수 있고, 리눅스면 bzip2를 이용하면 해제할 수 있다. 뭐 리눅스 유저면 알...

순차탐색과 이분탐색

탐색이란?

탐색이란 데이터 구조 안의 저장된 정보를 찾는 것입니다.
대표적인 탐색 알고리즘에는 3가지가 있습니다.
  • 순차탐색 (Sequential Search)
    혹은 선형탐색 (Linear Search)
  • 이분탐색 (Binary Search)
  • 해시탐색 (Hash Search)
이 글에서는 순차탐색과 이분탐색만을 다룹니다. 해시탐색은 언젠가 다룰 예정...

순차탐색 (Sequential Search)

순차탐색은 탐색알고리즘 중 가장 간단한 형태의 알고리즘이며,
선형탐색 (Linear Search) 라고도 합니다.
어떠한 데이터 배열이 있으면 데이터 배열의 처음부터 끝까지 모두 비교하여 자료를 찾아냅니다.
쉽게 말해서 그냥 배열 처음부터 끝까지 노가다.

장점
  • 정렬되지 않은 배열에서 사용할 수 있다.
  • 구현이 간편하다.
단점
  • 데이터의 양이 많아지면 비효율적이다.

순차탐색의 코드는 아래와 같습니다.
위의 내용을 함수로 만든 코드 스니펫 (클릭)

이분탐색 (Binary Search)

이분탐색은 정렬된 데이터에서 쓸 수 있는 탐색 알고리즘으로,
찾고자 하는 값을 가운데 값과 비교해서 그 값이 왼쪽에 있는지 오른쪽에 있는지 파악하여 자료를 찾습니다.

장점
  • 순차탐색에 비해 탐색속도가 빠르다.
단점
  • 데이터가 미리 정렬되어 있어야 한다.
  • 데이터의 임의접근(Random Access)이 가능해야한다.
    데이터에 몇개의 요소가 있는지에 관계없이, 모든 요소에 대해 같은 시간 내에 접근 할 수 있는 접근 방식,
    C언어의 배열은 임의접근이 가능하며, 연결리스트와 같은 특정 자료구조는 불가능하다. (어렵다면 지금은 무시해도 좋다.)
이분탐색의 대략적인 의사코드는 다음과 같습니다..
  1. 배열의 중앙값과 찾으려는 값을 비교한다.
  2. 만약 찾으려는 값이 더 작다면 왼쪽 부분, 더 크다면 오른쪽 부분을 선택한다. 같다면 탐색을 종료한다.
  3. 선택한 구간의 중앙값과 찾으려는 값을 비교한다. -> B로 돌아간다.
image
이분탐색은 재귀함수와 반복문, 두 가지 방법으로 구현할 수 있습니다.

이분탐색의 반복문 구현
위의 내용을 함수로 만든 코드 스니펫 (클릭)


이분탐색의 재귀함수 구현
위의 내용을 함수로 만든 코드 스니펫 (클릭)


댓글