바이너리의 단점
1. 수당받는 조건 동일(데일리매칭제외)
매출금액 또는 직급이 높을 수록 수당을
많이 받아가는 기존 구조 탈피
누구나 동등한 수입구조로 만듬
2. 일정산 익일 수당 지급(비트코인100%지급)으로 수입의 현금화가 매일됨
비트코인의 가격상승시 시너지효과 달러기반 아닌 비트코인 기준
비트코인 1개 매출시 3개 지급 / 비트 가격 상승시 수입증가
3. 바이너리의 단점인 소실적 매출 없으면
수입이 안되는 부분을 데일리 매칭으로 보완
4. 300% 순환 마켓팅으로 추천 후원 추천매칭 등의
지속적으로 발생 신규매출과 기존 매출이 복합적 발생으로
수입의 구조 빨라짐
(- 위의 플랜은 오픈시 조정될수있습니다 )
추천 보너스 -
1대 10% 2대 5%
위 그림예시
1대: 3,000$좌 우 추천시 600$
1대 2명이 각 2명씩 추천하면 150$×4=600$
합1,200$ 수령
(매출시점의 비트수량으로1대10% 2대5%지급)
1회성이지만 추천을 많이 하고
나의 1대가 추천할수있게 서포트해주면
수입이 증가하며 추천 매칭보너스와 데일리 매칭보너스의 수입증대
후원 보너스 -
소실적 매출의 10% 1:1 남은매출누적
일극점 -
본인 매출시점의 비트수량의 2배
비트 가격 상승시 일극점 더 오를 수 있음.
추천 매칭 보너스 -
추천 라인의 1대~8대 까지 받아가는 후원 보너스
비트 수량의 1대- 30% 2대~ 8대까지 각10% = 총합 100%
데일리 매칭 보너스 -
추천매칭과 레그동일
신규매출이 없더라도 수당 지속적 발생
패키지를 구매한 분들의
300% 보너스발생될때까지 수입(월8~12%)의
5%를 추천계보로 14대까지발생됨. (바이너리 단점보완)
주의! -
다양한 하이리스크가 발생될 수 있으므로
이를 인지하시고 진행해주시기 바랍니다.
투자 결정은 모두 본인이 결정하는 것이고
이에 대한 모든 책임은 본인 몫입니다.
Binary Search Tree
이진탐색(binary search)과 연결리스트(linked list)를 결합한 자료구조입니다.
- 이진탐색의 장단점 : 탐색 시간복잡도는 𝑂(log𝑛)으로 빠르지만 자료 입력, 삭제가 불가능
- 연결리스트의 장단점 : 자료 입력, 삭제 시간복잡도는 𝑂(1)로 효율적이지만 탐색은 𝑂(𝑛)의 시간복잡도가 소요되어 비효율적
이진탐색의 효율적인 탐색 능력을 유지하면서도, 빈번한 자료 입력과 삭제를 가능하게 만들어진 자료구조입니다.
- 중복된 값을 가진 노드는 없습니다.
- 각 노드의 왼쪽 서브트리는 해당 노드의 값보다 작은 값을 지닌 노드들로만 이루어집니다.
- 각 노드의 오른쪽 서브트리는 해당 노드의 값보다 큰 값을 지닌 노드들로만 이루어집니다.
- 왼쪽 서브트리, 오른쪽 서브트리 또한 위의 조건을 만족합니다.
이진탐색트리를 중위순회(inorder) 방식(왼쪽 서브트리-노드-오른쪽 서브트리 순)으로 탐색하면 이진탐색트리 내의 모든 값들을 정렬된 순서대로 읽을 수 있습니다.
operations
이진탐색트리의 핵심 연산은 네가지입니다.
- 순회(traversal)
- 검색(retreive/find)
- 삽입(insert)
- 삭제(delete)
이밖에 이진탐색트리 생성(create), 이진탐색트리 삭제(destroy), 해당 이진탐색트리가 비어 있는지 확인(isEmpty), 트리순회(tree traverse) 등의 연산이 있습니다.
Tree 구현
traversal
이진탐색트리를 순서대로 탐색하는 방법은 중위순회입니다.
retreive/find
이진탐색트리의 특징(부모노드가 왼쪽 자식노드보다 크고, 오른쪽 자식노드보다 작다)을 활용하여 효율적인 탐색이 가능합니다.
리프노드까지 탐색하였는데 해당 값이 없다면 값이 트리에 존재하지 않음을 의미합니다.
이진탐색트리 탐색의 시간복잡도는 트리의 높이(루트노드-잎새노드에 이르는 엣지 수의 최대값) ℎ에서 𝑂(ℎ)가 됩니다.
최악의 경우 잎새노드까지 탐색해야 하는데, 이 때 ℎ번 비교 연산을 수행합니다.
insert
이번엔 삽입 연산은 새로운 데이터를 트리의 리프노드에 붙이는 연산입니다.
(트리의 중간에 새 데이터를 삽입하게 되면 서브트리의 속성이 깨질 수 있기 때문에 삽입 연산은 반드시 리프노드에서 이뤄집니다.)
이진탐색트리 삽입의 시간복잡도는 트리의 높이(루트노드-리프노드에 이르는 엣지 수의 최대값)가 ℎ일 때 𝑂(ℎ)가 됩니다.
삽입할 위치의 리프노드를 탐색하며 ℎ번 비교하는 데 걸리는 시간이고, 연결리스트 삽입에 𝑂(1)만큼 추가로 소요됩니다.
delete
삭제 결과로 자칫 이진탐색트리의 속성이 깨질 수 있기 때문에 다른 연산보다 복잡합니다.
삭제 연산은 세가지 경우로 나누어 처리해주어야 합니다.
Case1) 자식노드가 없는 경우 : 해당 바이너리의 단점 노드를 삭제하면 됩니다. 아래 고려해야할 자식 노드가 없습니다.
Case2) 자식노드가 하나 있는 경우 : 해당 노드를 삭제하고, 해당 노드의 자식노드와 부모노드를 연결해주어야 합니다.따라서 자식노드를 부모노드와 연결시켜주면 이진탐색트리의 속성이 깨지지 않습니다.
ex. 위의 그림에서 50의 자식노드인 55를 삭제하는 자리로 옮기면 속성이 깨지지 않게됩니다.
이 때, 서브트리가 부모노드의 왼쪽이라면 자식노드들은 부모노드보다 모두 작고, 부모노드의 오른쪽이라면 자식노드들은 부모노드보다 모두 큽니다. (이진탐색트리의 속성)
Case3) 자식노드가 두 개 있는 경우
- 노드를 삭제하고 Case2 처럼 자식 노드 중 하나를 그 자리에 놓으려고 하면 두 가지 방법(왼쪽/오른쪽)이 있는데, 이 때 문제가 발생할 수 있습니다.
- 왼쪽 노드를 놓는 경우, 자식 노드가 오른쪽에 존재한다면 겹치게 됩니다.
- 오른쪽 노드를 놓는 경우, 자식 노드가 왼쪽에 존재한다면 겹치게 됩니다.
ex. 위의 그림에서 17 노드를 삭제하는 경우입니다. 왼쪽 바이너리의 단점 자식 노드로 대체하면 15 vs 40, 오른쪽 자식 노드로 대체하면 13 vs 30 인 상황입니다. 이 상황을 해결할 수 있는 방법이 필요합니다.2, 3, 바이너리의 단점 4, 5, 7, 13, 15,
, 25, 30, 35, 40, 50, 52, 55여기서
- 15를 predecessor(삭제 대상 노드 왼쪽 서브트리 중 최댓값)
- 25를 successor(삭제 대상 노드 오른쪽 서브트리 중 최솟값)
- 두 노드는 반드시 자식 노드를 하나 이하만 갖습니다.
- 또 자식노드를 하나 가질 경우
-
바이너리의 단점
- predecessor 는 왼쪽
- successor 는 오른쪽에 있습니다. 즉, predecessor or successor 를 삭제한 노드의 자리에 위치시키고 있던 자리를 case0/case1로 처리해주면 트리의 속성을 깨지 않고 노드를 삭제할 수 있습니다.
삭제 방법은 successor를 기준으로 다음과 같습니다.
- 삭제 대상 노드의 오른쪽 서브트리에서 successor 노드를 찾는다.
- 1에서 찾은 successor 노드를 삭제한다(Case1 or Case2).
- successor 노드를 삭제 대상 노드로 옮긴다.
결과와 트리를 보면 지우려는 노드의 왼쪽 서브트리는 모두 해당노드(17) 보다 작고 오른쪽 바이너리의 단점 서브트리는 큽니다. 결과에서 지우려는 노드의 양 옆 값을 주목해보겠습니다.
이진트리는 중위순회로 탐색을 했을 때, 정렬된 순으로 탐색하게 됩니다. 현재 삭제하고 싶은 곳을 확인해보면 아래와 같죠.
Delete 연산의 시간복잡도는 Big-O notation으로 최악의 케이스를 고려해야 하므로 가장 연산량이 많은 case 3(삭제 대상 노드의 자식노드가 두 개인 경우)이 기준이 됩니다.
트리의 높이가 ℎ이고 삭제대상 노드의 레벨이 𝑑일 때, 1번 과정에서는 𝑑번의 비교 연산이 필요하고, successor 노드를 찾기 위해서는 삭제 대상 노드의 서브트리 높이(ℎ−𝑑)에 해당하는 비교 연산을 수행해야 합니다. 2번 3번 과정은 복사하고 삭제하는 과정으로 상수시간으로 계산할 수 있습니다. 즉, 𝑂(𝑑+ℎ−𝑑) = 𝑂(ℎ)가 됩니다.
이진탐색트리 탐색, 삽입, 삭제의 시간복잡도는 모두 𝑂(ℎ)입니다.
트리의 높이에 의해 수행시간이 결정되는 구조입니다.
이로 인한 한계가 존재합니다.
균형이 맞지 않게 연산이 이루어지게 될 경우, 아래의 그림처럼 극단적으로는 𝑛개의 노드가 크기 순으로 일렬로 늘어뜨려져 높이 또한 𝑛이 되는 이진트리탐색이 될 수 있습니다.
이 경우, 결과적으로 이진탐색트리의 시간복잡도는 𝑂(𝑛)이 됩고, 탐색 속도가 𝑂(log𝑛)으로 빠른 이진탐색의 장점을 활용할 수 없게 됩니다.
이러한 한계를 극복하기 위해 트리의 입력, 삭제 단계에 트리 전체의 균형을 맞추는 이진탐색트리의 일종인 AVL Tree가 만들어지게 됩니다.
이진 트리
이진 트리
이진 트리 - 특성
- 레벨 i에서의 노드의 최대 개수는 2^i개
- 높이가 h인 이진 트리가 가질 수 있는 노드의 최소 개수는 (h+1)개, 최대 개수는 (2^(h+1) - 1)개
이진 트리 - 종류
포화 이진 트리(Full Binary Tree)
- 모든 레벨에 노드가 포화상태로 차있는 이진 트리
- 높이가 h일 때, 노드의 개수가 (2^(h+1) - 1)인 이진 트리
- 높이가 3일 때 노드의 개수 : 2^(3+1) - 1 = 15개
- 루트를 1번으로 하여 2^(h+1) - 1까지 정해진 위치에 대한 노드 번호를 가짐
포화 이진 트리
완전 이진 트리(Complete Binary Tree)
완전 이진 트리
편향 이진 트리(Skewed Binary Tree)
- 높이 h에 대한 최소 개수의 노드를 가지면서 한쪽 방향의 자식 노드만을 가진 이진 트리
왼쪽 편향 이진 트리 / 오른쪽 편향 이진 트리
이진 트리 - 순회(traversal)
순회(traversal)
- 트리의 노드들을 체계적으로 방문하는 것
- 트리의 각 노드를 중복되지 않게 전부 방문(visit)하는 것을 말하는데 트리는 비선형 구조이기 때문에 선형구조에서와 같이 선후 연결 관계를 알 수 없다. 따라서 특별한 방법이 필요하다.
순회 방법
순회 방법
1. 전위 순회(preorder traversal) : VLR
- 부모 노드 방문 후, 자식 노드를 좌→우 순서로 방문
- 수행 방법
1. 현재 노드 n을 방문하여 처리한다. (V)
2. 현재 노드 n의 왼쪽 서브트리로 이동한다. (L)
3. 현재 노드 n의 오른쪽 서브트리로 이동한다. (R)
전위 순회
2. 중위 순회(inorder traversal) : LVR
- 왼쪽 자식 노드→부모노드→오른쪽 자식 노드 순으로 방문
- 수행 방법
1. 현재 노드 n의 왼쪽 바이너리의 단점 서브트리로 이동한다. (L)
2. 현재 노드 n을 방문하여 처리한다. (V)
3. 현재 노드 n의 오른쪽 서브트리로 이동한다. (R)
중위 순회
3. 후위 순회(postorder traversal) : LRV
- 자식 노드를 좌→우 순서로 방문 후, 부모 노드로 방문
- 수행 방법
현재 노드 n의 왼쪽 서브트리로 이동한다. (L)
현재 노드 n의 오른쪽 서브트리로 이동한다. (V)
현재 노드 n을 방문하여 처리한다. (R)
후위 순회
순회(traversal) 연습 문제
이진 트리 순회 연습문제
전위 순회 (preorder traversal)
- A - B - D - H - I - E - J - C - F - K - G - L - M
중위 순회 (inorder traversal)
- H - D - I - B - J - E - A - F - K - C - L - G - M
후위 순회 (postorder traversal)
- H - I - D - J - E - B - K - F - L - M - G - C - A
이진 트리의 표현
트리의 표현 - 연결리스트
1. 이진 트리에 각 노드 번호를 다음과 같이 부여(루트의 번호를 1로 함)
2. 레벨 n에 있는 노드에 대하여 왼쪽부터 오른쪽으로 (2^n)부터 (2^(n+1) - 1)까지 번호를 차례로 부여
이진 트리의 노드 번호
1. 노드 번호가 i인 노드의 부모 노드 번호 : floor(i/2)
2. 노드 번호가 i인 노드의 왼쪽 자식 노드 번호 : 2 * i
3. 노드 번호가 i인 노드의 오른쪽 자식 노드 번호 : 2 * i + 1
4. 레벨 n의 노드 시작 번호 : 2^n
노드 번호의 성질 인덱스 번호
- 노드 번호를 배열의 인덱스로 사용
- 레벨 I의 최대 노드 수 : 2^i
- 높이가 h인 이진 트리를 위한 배열의 크기 : 1 + 2 + 4 + 8 + .. + 2^i = 2^(h+1) - 1
노드 번호 - 인덱스 노드 번호 - 인덱스
배열을 이용한 이진 트리 표현의 단점
- 편향 이진 트리의 경우에 사용하지 않는 배열 원소에 대한 메모리 공간 낭비 발생
- 트리의 중간에 새로운 노드를 삽입하거나 기존의 노드를 삭제할 경우 배열의 크기 변경이 어려워 비효율적
트리의 표현 - 연결리스트
- 배열을 이용한 이진 트리의 단점을 보완하기 위해 연결리스트를 이용하여 트리를 표현할 수 있다.
- 연결 자료구조를 이용한 이진트리의표현
- 이진 트리의 모든 노드는 최대 2개의 자식 노드를 가지므로 일정한 구조의 단순 연결 리스트 노드를 사용하여 구현
연결 리스트
수식 트리
- 수식을 표현하는 이진 트리
- 수식 이진 트리(Expression Binary Tree)라고 부르기도 함
- 연산자는 루트 노드이거나 가지 노드
- 피연산자는 모두 잎 노드
수식 트리의 순회
수식 이진 트리
ScienceON Chatbot
※ 국가연구개발사업의 관리 등에 관한 바이너리의 단점 규정(2012.7.1 시행)
에 의해 추후 공개로 전환될 가능성은 있습니다.과제관리기관과의 협의를 통하여 비공개 보고서를 공개로 전환할 수
있도록 계속적으로 관리되고 있으며, 현재 비공개 처리된 보고서의
열람이 어려운 점 양해 부탁드립니다.보고서 상세정보
바이너리 코드 동적고유정보 기반 SW 유사성 감지 기술 개발
Measurement of Software Similarity based on Dynamic Characteristics of Binary Codes
과제명 바이너리 코드 동적고유정보 기반 SW 유사성 감지 기술 개발 주관연구기관 단국대학교 산학협력단 연구책임자 조성제 참여연구자 박민규, 우진운, 임을규, 최종무, 한환수, 홍지만, 김동진, 장혜영, 최종천, 정윤식, 한용만 . 더보기 보고서유형 연차보고서 발행국가 대한민국 바이너리의 단점언어 한국어 발행년월 2013-03 과제시작년도 2012 주관부처 문화체육관광부 사업 관리 기관 한국저작권위원회 등록번호 TRKO201300031765 과제고유번호 1375025645 사업명 저작권보호및이용활성화기술개발 DB 구축일자 2013-12-21 키워드 바이너리코드.동적 고유정보.특징정보.SW 유사성.불법 SW 필터링.프로파일.패킹.이기종 컴파일러.SW 버스마크.Binary code.Dynamic characteristics.Feature.SW similarity.Pirated SW filtering.Profile.Packing.Dissimilar compilers.SW birthmark. 연구과제
타임라인
▼연구과제 성과물(0)
참여연구원의 다른 문헌(0)
Ⅱ. 기술개발의 목적 및 필요성
사무용 소프트웨어 연합(BSA)의 2011년 조사에 의하면 국내SW 불법복제율 40%로 약 7,500억원의 손실액을 보였고, 애플은 앱 스토어 개설 후 유료 앱 불법복제로 4억 5,000만달러의 .Ⅱ. 기술개발의 목적 및 필요성
사무용 소프트웨어 연합(BSA)의 2011년 조사에 의하면 국내SW 불법복제율 40%로 약 7,500억원의 손실액을 보였고, 애플은 앱 스토어 개설 후 유료 앱 불법복제로 4억 5,000만달러의 매출손실을 기록하였고, 독일 SW 업체 SAP은 오라클에 13억달러 배상 판결을 받는 등, SW 불법복제 및 표절로 인해 사회·경제·문화적인 피해가 급증하고 있다. 하지만 바이너리코드 수준에서 실행파일의 동일성/유사성을 객관적으로 검증하는 기술에 대한 연구는 매우 미비한 실정이다.
BSA에 조사에 의하면 SW 불법복제율을 10% 절감할 경우 미화 15억 달러의 경제성장 효과가 전망되고 약 7억달러의 조세 수입이 증가될 수 있으며 1만개의 신규 일자리 창출이 가능하다.
바이너리코드의 정적·동적 고유정보를 기반으로 실행파일들의 동일성 또는 유사성을 비교할 수 있는 기술을 개발하여, SW 불법복제 여부 확인 및 유사 SW 식별, 그리고 코드 표절 바이너리의 단점 여부 등을 확인하여, 의도적 또는 비의도적인 저작권 위반을 방지할 수 있는 환경을 조성하고 SW 산업 육성을 도모하는 것이 본 기술개발의 목적이다.Abstract
▼Ⅱ. Purpose and necessity of the research project
The Business Software Alliance (BSA) publishes the yearly study about copyrigh.Ⅱ. Purpose and necessity of the research project
The Business Software Alliance (BSA) publishes the yearly study about copyright infringement of software. The Ninth Annual BSA 2011 Piracy Study reported that 40 percent of Korea’s personal computer users admit to pirating software. The commercial value of all these pirated software is $1,223 million in 2011. Apple App Store has lost over $450 million to piracy from July 2008 to January 2010. On November 2010, a US court has ordered SAP to pay rival Oracle $1.3 billion in damages for the theft of intellectual property. The fine is very high and would have a significant impact on the company’s financial
performance in 2010.
In this way, social, SW piracy and plagiarism have caused serious social, economic and cultural losses. However, very little research has been done to verify objectively the technology research to verify objectively the co-identity or similarity of executable files at binary code-level.
BSA estimated that reducing the current SW piracy rate by 10% over four years would contribute $1.5 billion to GDP, increase the tax revenue of approximately $ 0.7 billion, and create an additional 10,000 IT jobs.
Therefore, the purpose of this research project is to develop the technology to examine co-identity or measure similarity of MS Windows executable files based on static and dynamic characteristics of binary codes. Using the technology, we can determine whether SW is illegally copied and stolen, prevent intentional or unintentional infringement of SW copyright, and promote the development of SW industry.# [Java] 컴파일 과정
자바는 OS에 독립적인 특징을 가지고 있다. 그게 가능한 이유는 JVM(Java Vitual Machine) 덕분이다. 그렇다면 JVM(Java Vitual Machine)의 어떠한 기능 때문에, OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 통해 알아보도록 하자.
# 자바 컴파일 순서
개발자가 자바 소스코드(.java)를 작성합니다.
자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 바이너리의 단점 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
컴파일된 바이크 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.
# 클래스 로더 세부 동작
로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.
준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)
분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.
초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)
실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.
인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.
JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
0 개 댓글