2018년 12월 18일 화요일

미래를 바꾼 9가지 알고리즘


프로그래머는 항상 문제 해결을 해야하는 직종이다
어떻게 하면 더 효율적으로 일을 처리할까?
어떻게 하면 더 안정적으로 일을 처리할까?

이런 것을 고민해서 만들어진 것이 알고리즘이다.
이 책에서는 9가지 대표적인 알고리즘을 설명하는데 
코드는 한 줄도 없다.
몇몇은 몰랐던 알고리즘도 있었다.
작동 원리가 궁금했던 알고리즘도 있었다.
9가지 알고리즘을 소개한다.

1. 검색 엔진 인덱싱
우리는 인터넷에서 수없이 많은 검색을 한다.
검색어를 치면 그에 해당하는 웹페이지들이 쭉 나열이 된다
네이버, 다음 검색은 거의 하지 않는 편인데 
구글을 주로 쓰기 때문이다. 구글은 내가 원하는 문서를 잘 찾아준다.
이 차이점은 어디서 오는 것일까??
이게 바로 인덱싱 알고리즘에서 오는 것이다.
각 단어를 숫자화 시켜놓고, 각 단어의 근접성을 찾아서 매칭을 시킨다.
그래서 높은 확률의 문서부터 쭉 나열해서 보여주는 것이다.
물론 이렇게 단순한 알고리즘은 예전 라이코스에서 쓰였다고 한다.
라이코스가 망하고 구글이 뜬 이유는 다음 알고리즘 때문이었다.

2. 페이지 랭크

1번 알고리즘 + 페이지랭크을 도입함으로 구글은 좀 더 사용자가 원하는 문서를 찾게 해주었다.
페이지 랭크 알고리즘은 비교적 간단한다.
얼마나 많은 이들이 그 문서에 관해 링크를 걸었는지,
추천을 했는지, 댓글을 달았는지, 전문가가 했는지를 카우팅 해서
랭크를 올린다.
즉, 많은 이들이 보고, 연결하고, 추천한 문서가 양질의 문서일 가능성이 높다는 것이다.
물론 이 알고리즘에는 치명적인 약점이 있으니....
바로 웹스팸이다. 웹 스팸은 순위를 인위적으로 부풀리고자 하이퍼 링크를 남발하는 것이다.
이것을 걸러내고, 제거하는 것이 새로운 과제로 떠오르고 있다.

3. 공개 키 암호화

이 알고리즘이 없었으면 지금 인터넷 뱅킹은 꿈도 꾸질 못했을 것이다.
수시로 내 계좌가 털렸을 것이다 ㅡㅡ;;
내가 친구에게 돈을 부쳐야 하는데 중간 과정(인터넷)은 절대 신뢰할 수가 없다.
수많은 라우터와 서버를 거쳐서 전송되는데 그 과정에서 변조되고, 위장되고, 변경될 수 있다.
이것을 막고자 여러 방식이 나왔는데
그 중 하나가 공개키다.
나와 친구만 알 수 있는 개인 키를 가지고 있고, 거기에 공개키를 합쳐서 전송하는 것이다.
이 공개키를 중간에 훔쳐가도 각자의 개인키를 모르기 때문에 아무런 쓸모가 없다. 
그리고 이 공개키 마저도 암호화가 되어 있어서 이게 공개키인지, 동영상 파일인지 해석할 수가 없다.어차피 인터넷 세상에서는 0,1로만 이루어져 있기 때문이다....
그럼 이게 제대로 된 공개키인지 어찌 알 수 있을까?
5번째 알고리즘으로 알 수 있다.

5. 오류 정정 코드
인터넷은 열린 공간이고 지금 이순간에도 엄청난 양의 데이터들이 돌아다니고 있다.
내가 만약 미국에 있는 친구에게 공개키를 암호화해서 보낸다고 해보자.
엄청난 수의 라우터와 서버를 거쳐서 다른 데이터들과 뒤섞여 전송 될 것이다.
그중에 데이터 손실도 있을 것이고, 변조도 있을 것이다.

이게 손실된 것인지 어찌 알까??
애초에 전송을 할 때 전부 숫자로 변환해서 그 숫자의 합을 맨 뒤에 붙여서 보낸다.(물론 더 자세히 하려면 내 IP주소, 맥어드레스 이런것도 붙여서 보낼 수도 있다)
수신자가 받았을 때 다른 숫자가 전송되면 잘못된 것으로 간주하고 다시 보내라고 요청한다.
이게 해밍 코드의 기본이다. 해밍코드는 오류를 검출할 수는 있지만 정정을 하진 못한다. 그리고 1개의 오류 밖에 검출하지 못한다.

그래서 새롭게 도입된 알고리즘이 체크섬 알고리즘이다.
체크 섬은 각 단어마다 다른 숫자를 곱해서 나온 결과값을 더한 뒤에 뒤에 붙여서 전송하는 방법이다.
이것을 풀어보면 어느 부분이 오류가 났는지 알 수 있기에 그 부분만 재전송을 요청하는 방법이다.
지금 인터넷에서 주로 쓰는 방식이다.

6. 패턴 인식과 인공지능
이 부분은 내가 전혀 모르는 부분이라 좀 신선하고 어려웠다.
패턴 인식은 계속 정보가 누적되면서 확률을 높여가는 방식이다.
cctv에서 사람을 찾을 때 그 사람의 특징을 찾아서 계속 반복적으로 패턴을 찾는 것이다. 키가 얼마고, 걸음걸이가 어떻고, 어디를 주로 돌아다니며, 남자인지 여자인지 등을 정보를 찾아서 확률을 높여가는 것이다.

인공지능은 패턴 인식을 더 대규모 하고 스스로 정보를 모으고,
그 정보를 조합하고, 확률 계산하여 스스로 배워가는 것인데
이것은 아직 먼 이야기고, 이론상으로만 존재하는 알고리즘이다.
왜냐하면 컴퓨터는 논리만 있지 감정이 없기 때문에 감정에 따라 다른 행동을 보이는 인간을 이해시키기는 매우 어렵다.

7. 데이터 압축
데이터 압축에는 2가지 방법이 있다
무손실 압축, 손실 압축
무손실 압축은 약간의 꼼수다.
문서를 압축할 때 aaabbbccc 가 원본이라면 a3b3c3 이런식으로 바꾸는 것이다. 그럼 약간의 데이터 용량도 줄고, 데이터도 보존된다.

손실 압축은 이미지, 소리에서 많이 쓰인다.
특히 3d 이미지 같은 경우는 사용자 눈에 보이는 곳만 3d고 뒷면은 없는 방법을 쓴다. 
사운드는 사용자가 듣지 못하는 비가청 소리를 제거해서 용량을 줄인다.

아무래도 텍스트보다 이미지랑 사운드가 용량이 더 크기 때문에 이런 방법을 써서라도 전송에 무리가 없게 하는 것이다.

8. 데이터베이스

요즘 프로그램은 db를 빼곤 설명이 안될 정도로 필수로 쓰인다.
내가 제일 좋아하는 분야이기도 하다.
db에서 가장 중요한 것은 일관성, 원자성, 복귀, 백업이다.
대표적인 알고리즘은 트렌젝션이다.
이건 둘 중 하나다. 성공/실패 중간은 없다. 
위에도 썼듯이 인터넷은 개방된 공간이다 보니 위험성이 크다.
이 위험성을 제거하기 위해서는 1:1 통신만이 답이다.
아무도 중간에 개입하지 못하게 일이 끝날 때까지는 못나온다
물론 이 것이 심해지면 교착상태에 빠진다.
이 교착 상태를 해결하기 위해, 스케쥴링 알고리즘이 필요하다.
일정 시간 응답이 없으면 실패로 간주하고 예전 상태로 되돌리는 것이다.

9. 디지털 서명
프로그램을 설치할 때보면 가끔 보안 경고가 뜨곤한다
이게 신뢰할수 있냐고 물어본다
디지털 서명이 처음에는 내가 신용카드 긁을 때 사인하는 그런 것인줄 알았는데 그 반대였다.
이 프로그램이 어디서 만들어졌고, 누가 만들었는지 보여주는 프로필 같은 것이였다.
검증된 프로그램은 신뢰성 있는 곳에 디지털 서명을 보관하고
이것과 비교하여 안전하다는 것을 증명하는 기술이다.
하지만 이것도 문제가 좀 있다.
디지털 서명을 보관하는 기관을 어찌 신뢰하며, 
디지털 서명도 얼마든지 조작이 가능하다는 것이다.
그리고 한국은 엑티브 엑스 때문에 무조껀 YES를 누르지 않는가..;;

여기에는 진짜 간단하게 기술하고 했지만 계속해서 새로운 알고리즘이 나올 것이고, 점점 더 발전할 것이다.
지금 여기에 쓴 알고리즘이 없어질수도 있다.
하지만 이 9가지 알고리즘이 현재의 인터넷 시대를 열게 해준 것은 확실하다.
그런 의미를 느끼게 해준 책이였다.

댓글 없음:

댓글 쓰기