바이너리의 단점

마지막 업데이트: 2022년 2월 13일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
Big O time complexity 시간 복잡도

Lossless Data Compression

데이터 압축의 가장 큰 장점은 뭐니뭐니해도, 사용하는 공간의 크기를 줄일 수 있다는 점입니다. 저장장치의 크기는 정해져 있는데, 이 곳에 데이터를 압축하여 저장한다면 같은 비용으로 더 많은 데이터를 저장할 수 있게 됩니다.

데이터 압축의 또 다른 장점으로는, Bandwidth를 높여주는 효과를 가져온다는 점입니다. 예를 들어서 통신을 할 때, 통신 속도가 충분히 빠르지 않다면 이 과정이 병목이 될 가능성이 높습니다.

이 때 데이터를 압축하고 보내고, 다시 압축해제 한다면 이러한 병목을 완화할 수 있습니다.

이러한 데이터 압축은 크게 lossless data compression과, lossy data compression으로 나눌 수 있습니다. 이름에서 알 수 있듯이 전자는 압축한 데이터를 다시 원본과 똑같이 복원해낼 수 있고, 후자는 데이터 손실이 발생합니다.

Lossy data compression은 이미지와 같은, 어느 정도 손실이 발생하여도 크게 지장을 미치지 않는 곳에 보통 사용됩니다. jpg 파일이 대표적인 lossy data compression입니다. 하지만, 대부분의 데이터는 손실이 일어나면 곤란한 경우가 많으므로 더 일반적으로 사용가능한 것은 lossless data compression입니다.

이번 글에서는 lossless data 바이너리의 단점 compression 중, data entropy를 기반으로 작동하는 압축 알고리즘들을 살펴보도록 하겠습니다. Data entropy를 기반으로 작동한다는 것은, 압축률이 데이터 내에서 각 소단위(예를 들어 byte)들이 출현하는 빈도와 관련된다는 것입니다.

Huffman Coding

Huffman coding은 가장 대표적이고, 간단하지만 좋은 성능을 가지는 데이터 압축 기법입니다.

Huffman coding의 아이디어는 출현 빈도가 높은 데이터를 짧은 binary code로 나타내서, 최종적으로 bit 수를 줄이겠다는 아이디어입니다.

예를 들어서, 아래와 같은 바이너리의 단점 데이터를 압축하는 상황을 가정해보도록 하겠습니다. 아래의 모든 예시에서, 빈도의 측정은 byte 단위로 진행된다고 가정하겠습니다.

각 문자별로 빈도수를 세어보면, 아래와 같습니다.

문자 빈도 비율
A 7 0.4375
B 2 0.125
C 1 0.0625
D 6 0.375

출현 빈도수가 높은 A, D에 더 짧은 binary code를 할당하는 것이 합리적입니다. 반면, B와 C는 출현 횟수가 많지 않으므로 긴 binary code를 할당하여도 큰 부담이 없습니다. 이제 binary code를 할당하는 법을 살펴보겠습니다.

각 문자별로 binary code를 할당하는 것은, heap을 이용한 greedy algorithm을 사용하여 가능합니다.

이 때, 모든 binary code들은 “한 binary code가 다른 binary code의 접두사가 되지 않아야 한다“는 조건을 만족해야 합니다. 하나가 다른 하나의 접두사가 되면, decode를 진행할 때 동일한 접두사를 가진 둘을 구분할 수 없게 되기 때문입니다.

이 때 만약 모든 binary code를 이진 트리로 나타내보면 어떻게 될까요? head부터 시작하여, 왼쪽 child로 이동하는 것을 0, 오른쪽 child로 이동하는 것을 1로 나타내봅시다. 트리를 따라 내려가 leaf에 도착하면 현재까지 경로가 나타내는 binary code가 해당 leaf가 가진 문자를 나타내게 됩니다.

만약 한 code가 다른 code의 접두사가 된다면, 접두사가 되는 code의 바이너리의 단점 child를 따라 내려가면 다른 code를 발견할 수 있게 됩니다. 모든 leaf는 다 하나의 문자를 나타내고 있으므로, 결국 위 조건을 만족하려면 모든 code는 leaf에서 끝나야 합니다.

마지막으로, child를 하나 가지고 있는 node가 있을 경우 해당 노드를 제거하는 것이 더 짧은 binary code를 만들어낼 수 있으므로, 만들어진 tree는 항상 완전 이진 트리가 된다고 가정할 수 있습니다.

이를 만족하는 트리의 예시는 아래 그림 1과 같습니다. 이를 Huffman tree라고 합니다.

그림 1. Huffman tree의 예시

각 문자의 binary code의 길이는, 해당 문자가 위치한 node의 depth와 간다는 사실도 금방 유추해낼 수 있습니다. 그럼 이러한 tree 중, 전체 길이가 최소가 되는 tree는 어떻게 만들 수 있을까요?

이를 만드는 방법은 매우 간단한데, 바로 출현 빈도가 가장 작은 두 문자열부터 차례로 합쳐주는 방법입니다. 한 번 합칠 때, 합쳐지는 노드의 subtree에 위치하는 문자의 출현 빈도의 합만큼 전체 길이가 길어지기 때문에, 가장 작은 두 node부터 합쳐주는 greedy한 방법이 쉽게 성립할 수 있습니다.

아래 그림 2는 Huffman tree를 만드는 과정을 나타낸 그림입니다.

그림 2. Building Huffman tree

실제 Huffman tree를 만드는 과정은, 최소 힙을 사용하여 쉽게 가능합니다. 아래는 Huffman tree를 만드는 code입니다.

Huffman tree가 만들어졌으면, encoding과 decoding은 해당 tree를 이용하여 쉽게 진행할 수 있습니다. 단, encode의 경우 문자에서 tree를 거슬러 올라가는 것은 비효율적이기 때문에 tree를 순회하며 미리 binary code를 모두 저장해놓는 것이 구현을 하는 데에 효율적입니다.

코드는 아래와 같습니다. 아래 구현에서는 편의성을 위해 0과 1로 구성된 문자열을 생성하는데, 이 경우 한 bit당 1바이트씩 차지하므로 실제로는 각각의 bit로 저장해야 합니다. 문자열을 생성하는 것은 bit를 생성하도록 바꾸는 것은 크게 어렵지 않으므로, 해당 구현은 생략하겠습니다.

bit 단위로 저장할 때 발생하는 문제점 중 하나로, padding된 문자열이 실제 encode된 것인지, 단순 padding인지 구분할 수 없다는 점이 있습니다.

예를 들어, 최종적으로 길이 9의 binary code가 생성되었다면 이를 byte단위로 저장할 경우 뒤에 7bit만큼의 공간이 남는데, decode를 진행할 때 이 부분이 실제 encode된 것인지, 단순 padding인지 구분할 수 없습니다.

이를 해결하기 위해서는 추가적으로 전체 bit의 길이를 저장하거나, EOF문자를 포함시켜 Huffman tree를 만드는 방법을 사용할 수 있습니다.

Huffman tree의 저장

데이터를 decode하기 위해서 Huffman tree가 필요하므로, huffman tree 또한 압축을 할 때 함께 저장을 해야 합니다. Huffman tree는 어떻게 저장을 해야 효율적일까요?

가장 쉬운 방법은, tree를 순회하며 leaf node가 아닐 경우 0을 적고, leaf node일 경우 1을 적고 뒤 8 bit에 leaf가 나타내는 문자를 적어주는 방법을 사용하면 간편합니다.

예를 들어, 위 그림 1에 있는 tree는 아래와 같이 저장되게 됩니다. 괄호는 구분을 위해 추가하였습니다.

모든 문자는 리프 노드에 하나씩 놓이게 되며, tree를 만드는 과정을 생각해보면 한 번의 merge가 일어날 때 노드가 하나씩 추가되므로, Huffman tree에는 총 $2t - 1$개의 노드가 놓이게 됩니다. 여기서 t는 압축하려는 데이터에 포함된 문자의 종류입니다.

Huffman tree를 표현하는 데에 하나의 노드 당 1 bit만큼 필요하고, $t$개의 데이터를 저장하는 데 $8t$ bit이 필요하므로 추가적으로 tree를 저장하는 데에 소모되는 비용은 $10t - 1$이 됨을 확인할 수 있습니다. 일반적인 256종류의 문자를 가지는 데이터라고 가정하였을 때, 약 320byte 정도가 필요합니다.

Arithmetic coding

데이터를 압축하는 또 다른 방법으로, Arithmetic coding 방법이 있습니다.

Arithmetic coding은 개념 자체를 매우 간단하지만, 구현 난이도가 높고 계산 시간이 오래 걸린다는 단점이 있습니다.

Arithmetic coding은 전체 데이터를 0과 1 사이에 있는 단 하나의 실수로 mapping해줍니다. 이 실수가 속한 범위에 따라서, 원래 데이터를 복원해낼 수 있습니다.

간단한 예시를 확인해보겠습니다. 전체 데이터에서 출현 빈도가 아래 표와 같이 측정되었다고 가정해봅시다.

문자 비율 구간
A 0.6 [0, 0.6)
B 0.2 [0.6, 0.8)
C 0.1 [0.8, 0.9)
[종료] 0.1 [0.9, 1.0)

새롭게 구간이라는 것이 추가되었는데, 이는 각 비율의 누적합이 속하는 구간을 의미합니다.

이 때, AACB라는 문자열을 어떻게 압축할까요? 앞에서부터 구간을 줄여가는 식으로 계산하게 됩니다.

AACB: [0.3096, 0.3168)

AACB[종료]: [0.31608, 0.3168)

최종적으로 AACB의 구간이 확정되었습니다. 이를 이진법으로 나타내면 아래와 같습니다.

따라서, 이진법으로 0.01010001로 데이터를 표현할 경우, 데이터 압축을 완료할 수 있습니다.

모든 구간의 크기를 균등하게 하지 않고 비율에 따라 구간의 길이를 비례해서 정해주는 이유는, 데이터 압축이 완료되었을 때 최종 구간의 길이가 최대한 크도록 만들어주기 위함입니다. 이는 압축 효율의 향상을 가져올 수 있습니다.

또, [종료]에 해당하는 문자열을 지정해주는 것이 반드시 필요한데, 만약 [종료]에 해당하는 문자열이 존재하지 않는다면 구간을 계속 세분해서 나누어갈 수 있기 때문에 데이터의 종료를 알 수 없기 때문입니다.

Data entropy

위에서 살펴본 것과 같은 압축 기법들은 모두 “어떤 데이터가 몇 번 출현하는지“에 깊게 관련되어 있습니다.

특정 데이터가 많이 출현한다면 좋은 압축 효율을 기대할 수 있고, 반대로 다양한 데이터가 비교적 균등한 횟수로 출현한다면 압축 효율이 좋을 것이라고 기대하기 힘들게 됩니다.

이를 나타낼 수 있는 척도 중 하나가 바로 Shannon Entropy입니다. Shannon Entropy는 데이터에 포함된 정보들의 크기를 나타내는 것으로, entropy가 작으면 포함된 정보가 많지 않으므로 좋은 압축 효율을 기대할 수 있고, 반대로 entropy가 크다면 많은 정보가 포함되어 있기 때문에, 어떤 방법을 사용해도 압축된 데이터의 크기를 크게 줄이기 힘들다는 것을 의미합니다.

흔히 압축된 파일을 한 번 더 압축해보면 압축 효율이 좋지 않은 것을 확인할 수 있는데, 이는 한 번 압축을 진행하면 entropy가 굉장히 커져서, 더 이상 좋은 압축 효율을 보일 수 없기 때문입니다.

Shannon entropy는 다음과 같은 식으로 계산할 수 있습니다.

수식에서 각각의 항에 대해 조금 더 자세히 살펴보도록 하겠습니다.

먼저 $P(x_i)$는 각 데이터 별 출현 빈도를 나타냅니다. 여기에 로그를 붙여, $\log$를 만들면 어떤 의미를 가질까요? 이는 해당 데이터를 나타내는 데에 필요한 정보의 양을 나타내게 됩니다.

예를 들어서, 데이터가 1/4 확률로 출현한다면, 각각의 데이터들을 표현하는 데에 2 bit가 필요할 것이라고 기대할 수 있습니다. 반면 데이터가 1/8 확률로 출현한다면, 각각의 데이터들을 표현하는 데에 3 bit가 필요할 것이라고 기대해야 할 것입니다. 이런 식으로, 데이터의 출현 빈도가 낮아질수록 해당 데이터를 표현하는 데에 더 많은 양의 bit가 필요해질 것임을 알 수 있으며, 이는 확률의 로그에 비례할 것입니다.

이렇게 구한 정보의 양에 각각의 확률을 곱해 더해주게 되면, 전체 데이터에 대한 평균을 구할 수 있습니다. 다시 말해 전체 데이터를 표현하는 데에 필요한 정보의 양을 나타내게 되는 것입니다.

Entropy를 기반으로 동작하는 많은 압축 알고리즘은 결과적으로 해당 데이터가 얼마나 많은 정보를 가지고 있었는지에 따라 그 압축 효율이 결정되게 됩니다.

바이너리의 단점

데이터 파일의 형식 - 바이너리 파일, 텍스트 파일

XML은 데이터를 기술하고 구조화하는 것과 관련한 기술이다. 따라서 XML에 대한 개념을 철저히 이해하기에 앞서 컴퓨터가 어떤 방식으로 데이터를 저장하고 접근하는지에 대한 이해가 필요하다. 컴퓨터가 이해할 수 있는 데이터 파일의 종류는 두 가지가 있다. 바로 바이너리(binary) 파일과 텍스트(text) 파일이다.

아주 단순한 의미로 바이너리 파일은 비트(1과0)의 나열이라고 할 수 있다. 전체 비트들이 무엇을 의미하는지는 그 바이너리 파일을 생성한 프로그램에 달려있다. 이것은 바이너리 파일을 이해할 수 있도록 작성된 특정 프로그램에 의해서만 그것이 생성되고 읽혀지기 때문이다.

바이너리 파일 형식은 컴퓨터가 이들 바이너리 코드를 쉽게 이해할 수 있기 때문에 코드를 더욱 빨리 처리할 수 있으며 메타 데이터를 저장하는 데 매우 효율적이라는 장점을 가지고 있다. 그러나 바이너리 파일 형태는 단점도 지니고 있다. 어떤 프로그램에서 작성된 파일을 다른 프로그램에서 열 수 없을 수도 있으며, 심지어 다른 운영 시스템에서 동작하는 프로그램에서도 열리지 않을 수 있다.

바이너리 파일과 마찬가지로 텍스트 파일 또한 비트(0또는1)들의 나열이다. 그러나 텍스트 파일에서 이러한 비트들은 일관된 방법으로 서로 그룹 지어져 일정한 숫자를 형성한다. 이러한 숫자들은 그 후 문자로 표현된다.

텍스트 파일은 이런 표준 덕에 많은 프로그램들이 쉽게 인식할 수 있고, 사람도 텍스트 편집기를 통해 쉽게 읽을 수 있다. 일단 텍스트 파일이 만들어지면 전 세계의 누구나 그들이 원하는 텍스트 편집기로 그 파일들을 읽을 수 있다는 것이다. 물론 서로 다른 운영체제에서는 서로 다른 라인-인코딩 방법을 가지고 있긴 하지만, 텍스트 파일을 이용한다면 바이너리 파일에 있는 정보보다 훨씬 쉽게 정보를 공유할 수 있다는 것은 분명하다.

텍스트 파일의 단점은 텍스트에 메타 데이터 같은 정보를 첨가하는 것이 쉽지 않을 뿐 아니라 그 파일 크기도 크게 늘어난다는 데 있다.

바이너리의 단점

네트워크마케팅 보상플랜의 특장점
1)브레이크어웨이(Breakaway) 방식

Breakaway는 그룹, 무리에서 떨어져 분리 독립됨을 뜻한다. 열심히 다운라인을 교육하고 후원하여 독립시키는 기준 매출액이 되면 독립되는 것이다. 얼마나 많은 그룹을 독립시켰는가에 따라 직급이 올라가며 수당이 많아진다. 한 그룹이 독립하는 금액을 1,000만원으로 잡으면 1,000만원 이상 그룹이 두 그룹이면 두 그룹을 독립시킨 사업가가 되는 것이다. 1,000만원이 되기 전까지는 계단식으로 진행된다. 어떤 매출액에 직급이 정해진다. 예를 들면 200만원이면 무슨 직급, 500만원이면 무슨 직급… 1,000만원이면 독립이 되는 것이다.

① 브레이크어웨이 방식의 장점
*무한한 소득 잠재성 수당 지급의 깊이가 매트릭스나 유니레벨에 비해서 더 깊은 수당을 받다보니 수당이 무한히 커질 수 있다. 브레이크어웨이에서는 깊이만 무한한 것이 아니라 폭도 무한하다. *회사입장에서 안정적이다. 독립을 많이 시키면 시킬수록 많은 수당이 주어지므로 사업가들은 깊게 그룹을 형성하려고도 하면서 많은 사람들을 가입시키려는 경향이 있다. 또한 매달 일정량의 매출액이 있어야 하므로 회사로선 상당히 안정적인 방식이다. 가장 많은 회사들이 선택하는 보상플랜 방식이다.

② 브레이크어웨이 방식의 단점
*초기엔 수당이 적다. 다른 여타의 보상플랜에 비해 초기에는 케시백수당이 적다.

2) 매트릭스(Matrix) 방식
매트릭스 방식의 가장 큰 특징은 한사람이 후원할 수 있는 회원의 수와 깊이가 한정되어 있다는 것이다. 즉 자신이 직접 후원할 수 있는 수를 2명에서 6명 정도로, 깊이는 12대 등으로 제한을 하는 것이다. 2×12, 4×7, 5×7, 3×9 등등으로 정해진다. 예를 들어 2 × 12 인 경우 이는 각자가 2명씩의 디스트리뷰터를 후원할 수 있고 12레벨의 깊이를 의미한다. 이를 해석하면 1레벨에서 둘 수 있는 디스크리뷰터의 수는 2명이고, 2레벨에서는 4명, 3레벨에서는 8명, 이러한 방식으로 12레벨에서는 4,096명의 디스크리뷰터를 둘 수 있는 구조를 말한다. 물론, 이러한 기하학적 증가는 이론적으로나 가능한 일이고 실제로는 그렇지 못한 경우가 대부분이다.

① 매트리스 방식의 장점
* 스필오버(spill-over) 매트릭스 방식에서 가장 과장되게 묘사되는 장점이 "스필오버(spill-over)"이다. 스필오버란 말은 어떤 사람이 모집한 인원 중에서 1레벨에서 허용하는 최대 수만큼 등록시키고 나면 그 나머지는 자연히 두 번째 레벨에 등록이 된다는 뜻이다. 예를 들어 2 × 12방식의 바이너리의 단점 경우 어떤 사람이 6명을 가입시키면 그 중에서 4명은 제 2레벨에 등록이 된다는 것이다. 따라서 그룹의 깊이는 빠르게 깊어질 수 있는 요소가 있다.
* 단순하며 관리가 쉽다. 매트릭스 방식의 또 다른 장점은 단순하며 관리가 쉽다는 점이다. 매트릭스 방식은 구조가 단순하여 초보자가 쉽게 이해할 수 있으며 바로 프론트라인의 디스트뷰터만 후원하고 교육하면 된다는 점에서 조직의 관리가 용이하다. 예컨대 2 × 12의 구조에서는 모든 사람이 두 사람 이상을 지원하고 교육할 필요가 없다.

② 매트릭스 방식의 단점
* 다운 라인이 게을러지기 쉽다 스필오버의 가능성은 예상고객을 유치하는데 좋은 유인책이 되지만 업라인의 활동으로 노력 없이 돈을 벌어보려는 디스트리뷰터를 양산하여 조직의 활성화를 저해하기도 한다.
* 기대 수익을 얻을 수 없는 경우도 있다. 앞에서 얘기했듯이 성실하지 못한 디스트리뷰터들이 존재하면 일부 레벨의 커미션은 받지 못하기 때문에 예상한 수익을 얻기가 어려운 경우가 많으며 폭의 제한에 따라 브레이크어웨이 등 보다 최대 수익이 항상 크다고 할 수 없다. 또한 매트릭스 방식은 직프론트 레벨에 두었으면 훨씬 더 큰 수입을 보장해 주었을지 모를 능력 있는 사람을 먼 레벨에 두게 됨으로써 수익이 적어질 수 있다.

3) 유니레벨(Unilevel)방식
유니레벨 방식은 말 그대로 레벨이 하나인 것으로 폭은 무한하고 깊이는 제한되어 있는 구조를 갖는다. 유니레벨 방식은 가장 단순한 형태의 바이너리의 단점 보상체계로서 초기 사업자들에게는 이해가 빠른 것으로 폭에는 한계가 없고 일정한 수의 레벨이 있다. 각 레벨에 다양한 보너스 율이 주어지며 특정된 레벨에 높은 보너스 율을 주어 동기를 부여하기도 한다.

① 유니레벨 바이너리의 단점 방식의 장점
*단순하여 이해가 쉽다. 유니레벨 방식은 단순하여 사람들이 쉽게 이해할 수 있다. *초기 사업자들에게 수당이 많아 질 수 있다. 초기 사업자들에게 수당이 많이 지급되는 편이기 때문에 소비형 사업가나 수동적인 사업가들이 선호할 수 있다. *승급이 쉽다. 유니레벨 방식은 자신과 프런트라인의 판매 요구량 만으로 승급하기 때문에 승급하여 더 높은 수당을 받기가 쉽다.

② 유니레벨 방식의 단점
*성장의 한계, 수당의 한계 유니레벨 방식은 브레이크어웨이 등의 방식보다 그룹규모나 수당면에서 모두 작은 경우가 많다. 이는 유니레벨은 브레이크어웨이 방식등과 다르게 일정수의 레벨에 대해서만 수당을 받기 때문이다. 폭에는 제한이 없고 깊이에 제한이 있기 때문에 자신에게 수당이 지급되는 최저 선을 넘기지 않으려는 경향이 있어 폭을 넓게 유지하려는 경향이 있다. 폭이 넓어지다 보면 후원해야할 사람이 많아지므로 그룹성장의 한계가 있을 수 있다. 이러한 단점을 극복하고자 롤업(roll-up)과 압축이란 제도를 이용한다.
* 롤업(roll-up)과 압축 수입을 좀 더 극대화시키기 위해서 라인구조에서 수입이 빠져나가는 것을 방지하고 단계별 수입을 증가시키는 롤업 방식은 실적이 없는 회원의 자리에 실적이 있는 다운라인의 회원이 올라와 바이너리의 단점 채워지는 구조이다. 압축도 비슷한 개념이다.

4) 바이너리(Binary) 방식
Binary는 '두 개의 2진수의'뜻이다. 한 사람이 좌측과 우측 두 명씩만 모집해서 확장해가는 방식이다. 2 × ∞의 매트릭스 방식처럼 프런트라인에 2명밖에 가입시킬 수 없다. 다만 2명 이상의 사람은 매트릭스처럼 스필오버가 되지 않고 그룹 내에 자유롭게 위치를 선정하여 가입시킬 수 있다. 양측은 매출량을 따져서 작은 쪽이 커미션을 받을 수 있을 정도의 판매 실적을 올렸다면 그것에 대해 수당을 받게 된다. 이렇게 바이너리 방식은 약한 측의 매출 실적이 수당의 책정에 중요한 요인으로 작용한다.

① 바이너리 방식의 장점
*그룹 성장 속도가 빠르다. 바이너리 방식은 다운라인 구축을 위한 가장 단순하고 그룹성장이 강한 방식이다. 각자가 한 레벨에 두 명씩만 가입시키고 더 여유가 있는 사람은 그룹 내에 좌우균형을 맞춰가며 가입을 시킬 수 있으며 깊이에 제한이 없기 때문이다.
*깊이가 깊다. 바이너리 방식도 브레이크어웨이 방식처럼 깊이에 제한을 두지 않기 때문에 유니레벨이나 매트릭스 방식보다 수익의 잠재성이 높다.

② 바이너리 방식의 단점
*성장 격차에서 오는 수당의 격감 바이너리 방식은 두 그룹이 균형을 맞추어 내려가야만 수당의 극대화가 이루어 질 수 있다. 반대로 균형이 맞지 않을 경우에는 최소의 수당이 주어질 수 있다. 극단적인 예를 들어 한쪽이 1,000만원의 매출이 올랐는데 한쪽의 매출이 없을 때 수당이 한 푼도 나오지 않는다. 한번 성장의 격차가 벌어지면 곱수의 법칙에 의해 성장 속도는 더 가속화 될 수 있다. 이러한 불합리한 점을 보완하기 위해 매칭 보너스를 지급하기도 한다. 그룹이 균형을 이루지 못하고 성장할 경우 큰 쪽의 매출액에 해당하는 수당은 회사에 귀속이 되기 때문에 바이너리가 나쁜 것이라고 하는 사람도 있는데 그런 점 때문에 바이너리가 나쁜 것이라는 결론은 무리가 있다. 큰 그룹이 회사에 귀속되는 것을 막기 위해서 포인트제를 적용하기도 한다.
*매칭보너스 매칭 보너스란 신규 회원을 자기 그룹의 어디에 가입시키더라도 그 사람이 받는 수당에 대해 일정한 수당을 받는 보너스이다.

5) 하이브리드(Hybrid)
Hybrid의 뜻은 혼성의, 혼성물이라는 뜻이다. 즉 두세 가지를 혼합하여 각 방식이 가지고 있는 장점을 살리고자 한 방식이다. 브레이크어웨이의 수익의 무한성과 바이너리의 성장이 빠른 것 등을 혼합하고 바이너리의 성장 격차 시 수당이 작아지는 것 등을 보완하여 혼합하는 경향이 있다.

바이너리의 단점

> endobj 37 0 obj >stream H�T�Mo�0 ��� ;퐄 BZA�z؇F� endobj 39 0 obj > endobj 40 0 obj >stream H��Wmo�8���B_h?l�wY��@��m�M⍝�z� KT��#ye����ߐ�CYr�6 �"]9� �8 u�_��7%u��5������سO�S��X�\qf��eY5�� �M���V�8���%8!$��u��bU4���Α�;5�l��ai̓� �h�A��U�����=_�Weƾ��=M6�����w���w��>\3p��لAGH.W�y�~e��8cy�]57 n�����ae��[��>]�5rUխ�����A�ݎG3����m�.��eBI5_n�eR������-V���5'�^?��oغ����nŋ�d(��2��Z�:�Ku��zg9�? ��/�үgŦ)V+VO�:�'.���bÚi��!q���/Sf]O/-��L�a` ���Q����>�ҋ2������N�݀��=�>Y�MU2�� ���酲f����73�4:T>k��f�Z � �J��z�-S&q���z������MRf���e�Q�l�ڪ��R~r ���^�E�!�m!��x��s��6Nʦ8Y[�F���^=���~�bt�`�X�r�ݚ�j�nEj ݰM��r�-�%Q���RR�W�0YV� �D`����� �iX ���8]�v��a-�3�W%u2���]��7�)���$m�ڲ���]y?Nl�ώ%�>����[ٷo;��^n� � �>.>*2��z�=+^�>�� a�����[Ay��'��8���T2���� 7�tS�Q����C��B+�� ) �yN�[�����j��dC��PR�J:nK+>�p�O�0'Y���/��I�]S�A!���@��'���O��t=���$�%K���^��Z��&��jg�^U�?����5�Nuwؒ��eE���ڰ�Y�j������J���$�2C�q�ޖ�ĵ��f�m��RMگ�]�&3� ;7�f�zw��ÁeӬ�y|���p��|T�w�5\�z ���m�����ή��.��b �L����#e�V6��>��kϰX��2�_|�R>�w�^������s\��A����Ŵ=h ����L�o.+lN����A�˳ҧ����H=����(��$���E�رI�ʈmr�b�JY_ʸ6��w����_�>�3���$�� �y$e|G�G�t[ų@�$nBr��(���Z���'���7��b��I��@��eo��:���^��o5K����zXTV*��]���U�>� F�6��þ��S� ���ȫ"�>Ƃ8�D�Q8�b/��E���]�[email protected]�D������ɬ����u?��L�P&]R�?2�G�.����8�Ij� k��E����^l]��[email protected]� t0�63��7\�Z��9�_�h �dX�]r-��c�ޞ\SC ���޾A��qM%��f�G������n��z��NW�u�vc����>?'U�|,��Wg'W��Jۃ�+�����$s_��cJ�#�^*���ze�O5U��@M5�^`����&!��onǗ@�%�L۳f�*·f>�G�G��G��I�О�V��<>L�ԁy�Y�-l�����na3�n��'����M� F�q37�zw.R�'��k�KX�NT���fB_�I�?�\(�Ğ�?�H�U���~o�s�?dlļ�˿��1�z�o�OH�E>D0�������C�v��Ћ� �9�r4�Y�q��Èr�8�ވ�� �>�ˑ���� 3��ִ.��/�)�#>� ��?*��t1?��;W�7XK;9ԭ�F.�3�m�>�b�V>��x���q�zꝚ!#���Y�k3�A���D;������Q��[biG�c ����04bJ������~���A�yn/Rs�3�͘��z�g��W�u������A���L�H�Q��l�-Cߵ=o������*[email protected]�`�<�������[�ׯ|d��l7����������[�C�c�O�m���I�ް��=��V���ƨ ��= 8`��c��?R��Z��� r>������`g�eg�P�Z��Y\����ZT�X��[�ec���J-��)-���S�6:ADĂ��S�3�R[�� ��6)�[��X��@)�e�ɩ\��c endstream endobj 41 0 obj > endobj 42 0 obj > endobj 43 0 obj > endobj 44 0 obj > endobj 45 0 obj > endobj 46 0 obj >/Type/Filespec>> endobj 47 0 obj >stream 2013-051.fm fff endstream endobj 48 0 obj > endobj xref 0 49 바이너리의 단점 0000000000 65535 f 0000202661 00000 n 0000202787 00000 n 0000203027 00000 n 0000209837 00000 n 0000779791 00000 n 0000779917 00000 n 0000780106 00000 n 0000789026 00000 n 0000789124 00000 n 0000789430 00000 n 0000789956 00000 n 0000790186 00000 n 0000790315 00000 n 0000790535 00000 n 0000797226 00000 n 0000851408 00000 n 0000851537 00000 n 0000851673 00000 n 0000857877 00000 n 0000857936 00000 n 0000858220 00000 n 0000858410 00000 n 0000858538 00000 n 0000858757 00000 n 0000859102 00000 n 0000859262 00000 n 0000860601 00000 n 0000860833 00000 n 0000861685 00000 n 0000861962 00000 n 0000864336 00000 n 0000864552 00000 n 0000864883 00000 n 0000864930 00000 n 0000865100 00000 n 0000871021 00000 n 0000871145 00000 n 0000871501 00000 n 0000871718 00000 n 0000871973 00000 n 0000875070 00000 n 0000875105 00000 n 0000875129 00000 n 0000875207 00000 n 0000875240 00000 n 0000875433 00000 n 0000875510 00000 n 0000878897 00000 n trailer > startxref 116 %%EOF

[데이터 구조] Binary Search Tree

이렇게 세 개의 값이 하나의 노드에 지정되고 새로 생성된 노드들이 각각의 위치를 찾아 계속해서 연결된다.

Big O time complexity 시간 복잡도

Big O / 평균적인 상황
Insertion : O(log n)
Deletion : O(log n)
Search : O(log n)

root 에서 왼쪽이나 오른쪽, 한쪽으로만 쭉 이어져있는 최악의 상황에서는 O(n)의 시간 복잡도가 걸린다.
이 부분을 보완한 것이 Red Black Tree. 입력되는 값에 따라 트리 구조가 균형을 잡을 수 있도록 위치를 계속 변경할 수 있다.

O(n) 은 문제를 해결하기 위한 단계의 수와 입력값 n 이 1:1 관계를 가지는 것을 의미하고
O(log n) 은 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 입력값 n 줄어드는 것을 의미한다.

임의로 index 를 찾는 Hash table 이나 새로운 데이터를 넣는 순서대로 tail 로 엮는 Linked list 와 달리 Binary Search Tree는 값에 따라 위치가 정해지기 때문에 각각의 노드들이 모두 유기적으로 연결되어 BTS 전체를 하나의 노드로 여길 수도 있다는 것이다.


0 개 댓글

답장을 남겨주세요