반응형

09-1 선형 리스트

리스트는 데이터를 순서대로 나열한 자료구조입니다

 

선형 리스트란?

가장 단순한 구조를 이루고 있는 리스트를 선형 리스트 또는 연결리스트라고합니다.

리스트의 데이터는 노드또는 요소라고 합니다.

 

배열로 선형 리스트 만들기

 

09-2 포인터로 연결 리스트 만들기

포인터로 연결 리스트 만들기

연결 리스트에 데이터를 삽입할 때 노드용 객체를 만들고 , 삭제할 떄 노드용 객체를 없애면

앞 페이지의 문제를 해결할 수 있습니다.

 

09-3 커서로 연결 리스트 만들기

포인터 역할을 하는 인덱스를 커서라고 합니다.

 

09-4 원형 이중 연결 리스트

원형 리스트 : 연결 리스트의 꼬리 노드가 머리 노드를 가리키면 원형 리스트라고 합니다.

이중 연결 리스트 연결 리스트의 가장 큰 단점은 노드는 찾기 쉽지만 압쪽의 노드는 찾을 수 

없다는 점입니다. 이 단점을 개선한 자료구조 

원형 이중 연결 리스트 : 앞에서 공부한 두가지의 개념이 합해진 원형 이중 연결리스트

 

 

10-1 트리

트리를 구성하는 요소는 노드와 가지입니다. 

루트: 트리의 가장 윗부분에 위치하는 노드

리프

안쪽노드 

자식 

부모

형제

조상

자손

레벨 : 루트로부터 얼마나 떨어져 있는지에 대한 값

차수: 노드가 갖는 자식의 수

높이

서브트리 : 자손으로 이루어진 트리

널 트리 : 가지가 없는 트리

 순서트리와 무순서 트리

 

순서 트리 검색

너비 우선 검색: 

깊이 우선 검색; 

전위순회 Preorder 노드 방문- > 왼쪽 자식 -> 오른쪽 자식

중위순회 Inorder 왼쪽 방문-> 노드 방문 -> 오른쪽 자식

후위순회 Postorder 왼쪽 자식->오른쪽 자식-> (돌아와 ) 노드 방문 

 

10-2 이진 트리와 이진검색 트리

이진트리 : 노드가 외쪽 자식과 오른쪽 자식을 갖는트리

완전 이진 트리 : 루트부터 노드가 채워져 있으면서 같은 레벨에서는 왼쪽에서 오른쪽으로 노드가 채워져 있는 이진트리

이진 검색 트리: binary search Tree

 

11. 해시

11-1 해시법

해시법은 겁색과 더불어 데이터의 추가와 삭제도 효율적으로 수행할 수 있는 방법입니다.

키-value

해시 테이블의 각 요소를 버킷이라고 합니다.

저장할 버킷이 중복되는 현상을 충돌이라고 합니다.

 

충돌에 대한 대처

1. 체인법: 같은 해시값을 갖는 요소를 연결 리스트로 관리합니다.

2. 오픈 주소법: 빈 버킷을 찾을 때 까지 해시를 반복합니다.

 

체이법: 같은 해시 값을 갖는 데이터를 쇠사슬모양으로 연결 리스트에서 연결하는 방법으로, 오프해시법이라고도 합니다.

 

오픈 주소법

또 다른 해시법인 오픈 주소법은 충돌이 발생했을 때 재해시를 수행하여 비어있는 버킷을 찾아내는 방법으로 , 닫히 해시법이라고도 합니다.

 

 

 

 

출처 : Do It !자료 구조와 알고리즘의 입문

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

07. 집합 08. 문자열 검색  (0) 2020.09.13
06. 정렬  (0) 2020.08.30
04. 스택과 큐 05. 재귀 알고리즘  (0) 2020.08.27
03. 검색  (0) 2020.08.25
02. 기본자료구조  (0) 2020.08.23
반응형

 

07-1 집합

집합이란 객관적으로 범위를 규정한 '어떤 것'의 모임이며 , 그 집합 안에서 각각의 '어떤 것'을 요소 라고 합니다.

부분집합 과 진부분집합(poper subset)

진부분집합  집합 A의 모든 요소가 집합 B의 요소이면서 집합 A와 집합 B가 같지않을 때 'A는 B의 진부분집합' 이다.

 

집합의 연산

합집합  AUB

교집합  AB

차집합  A-B

 

07-2 배열로 집합 만들기

배열로 집합 만들기

모든 요소가 같은 자료형으로 구성된 집합은 배열로 표현할 수 있습니다.

max: 집합의 최대 크기를 나타내는 필드입니다.

num: 집합의 요소 개수 입니다.

set: 집합을 저장할 배열입니다. 배열의 메모리 확보는 생성자에게 합니다.

요소를 검색하는 indexOf메소드 :

검색하여 검색에 성공하면 찾은 요소 n의 인덱스를 반환하고 , 실패하면 -1을 반환합니다.

 

요소 n이 있는지 확인하는 contains메서드

 

요소 n을 집합에 추가하는 add메서드

 

요소 n을 집합에서 삭제하는 remove메서드

 

다른 집합으로 복사하는 copyTo메서드

다른 집합을 복사하는 copyFrom메서드

다른 집합과 같은지 확인하는 equalTo메서드

두 집합의 합집합을 복사하는 unionOf메서드

집합을 문자열로 변환하는 toString메서드

 

오버라이드 : 상속받은 클래스가 부모의 메서드를 다시 정의하는 것입니다. 

 

 

08. 문자열 검색

08-1 부루트-포스법

문자열 검색이란 어떤 문자열 안데 다른 문자열이 들어있는지 조사하고 들어 있다면 그 위치를 찾아내는 것을 말합니다.

쉡게 검색할 문자열 : 패턴 

문자열 원본을 : 텍스트

 

브루트-포스법

선행 검색을 확장한 알고리즘으로 단순법 ,소박법이라고도 합니다.

옆으로 이동하면서 검색한다.

단점 : 이미 검사를 진행한 위치를 기억하지 못하므로 블루트-포스법의 효율은 좋지 않다고 할 수 있습니다.

 

static int bfMath(String txt, String pat){
	int pt = 0;
    int pp = 0;
    
    while(pt!= txt.length() && pp!= pat.length()){
    	if(txt.charAt(pt)== pat.charAt(pp)){
        	pt++;
            pp++;
        }else{
        	pt= pt-pp+1;
            pp = 0;
        }
    }
    if(pp == pat.length())
    	return pt-pp;
    return -1;
    
}

 

String.indexOf 문자열 검색하기

indexOf

lastIndexOf

 

브루트-포스법은 다른 문자를 만나면 패턴에서 문자를 검사했던 위치 결과를 버리고 다음 텍스트의 위치로 1칸 이동한 다음 다시 패턴의 첫번째 문자부터 검사합니다.

 

08-2 kmp법 =>브루트-포스법보다 복잡합니다.

검사했던 위치 결과를 버리지 않고 이를 효율적으로 활용하는 알고리즘입니다.

"몇 번쨰 문자부터 다시 검색할지" 에 대한값을 미리 "표"로 만들어 이 문제를 해결합니다.

static int kmpMatch(String txt, String pat){
	int pt = 1;
    int pp= 0;
    int[] skip = new int[pat.length() +1] ;
    
    skip[pt] = 0;
    while(pt != pat.length()){
    	if(pat.charAt(pt) == pat.charAt(pp))
            skip[++pt] = ++pp
        else if(pp==0)
            skip[++pt] = pp;
        else
            pp = skip[pp];
        }
    }
    
    pt = pp = 0;
    while(pt != txt.length() && pp != pat.length()){
    	if(txt.charAt(pt) == pat.charAt(pp))
            pt++;
            pp++;
        else if(pp==0)
            pt++;
        else
        	pp = skip[pp];
    }
    
    if(pp==pat.length())
    	return pt-pp;
    return -1;
}

단점 : 브루트 -포스법보다 복잡하다

Boyer-Moore법보다 성능이 같거나 좋지 않아 실제 프로그램에서는 거의 사용하지 않습니다.

 

08-3 Boyer-Moore법 

Boyer-Moore법 : 브루트 -포스법을 개선한 kmp법보다 효율이 더 우수하기 때문에 실제로 문자열 검색에 널리 사용하는 알고리즘입니다.

이 알고리즘은 패턴의 마지막 문자부터 앞쪽으로 검사를 진행하면서 일치하지 않는 문자가 있으면 미리 준비한 표에 따라 패턴을 옮길 크기를 정합니다.

각각의 문자를 만났을 때 패턴을 옮길 크기를 저장할 표를 미리 만들어야 합니다.

 

static int bmMatch(String txt, String pat){
	int pt;
    int pp;
    int txtLen = txt.length();
    int patLen = pat.length();
    int[] skip = new int[Character.MAX_VALUE +1];
    
    for(pt = 0; pt<Character.MAX_VALUE; pt++)
    	skip[pt] = patLen;
    for(pt = 0; pt<patLen-1; pt++)
    	skip[pat.charAt(pt)] = patLen - pt -1;
        
    while(pt < txtLen){
    	pp = patLen -1;
        while(txt.charAt(pt) == pat.charAt(pp){
        	if(pp==0)
            	return pt;
            pp--;
            pt--;
        }
        pt+= (skip[txt.charAt(pt)] > patLen -pp) ? skip[txt.charAt(pt)] : patLen - pp;
    }
    return -1;
}

 

출처 : 자료구조와 함께 배우는 알고리즘 입문 자바편

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

09. 리스트,10. 트리,11. 해시  (0) 2020.09.17
06. 정렬  (0) 2020.08.30
04. 스택과 큐 05. 재귀 알고리즘  (0) 2020.08.27
03. 검색  (0) 2020.08.25
02. 기본자료구조  (0) 2020.08.23
반응형

06-1 정렬

정렬은이름 , 학번, 키 등 핵심 항목의 의 대소 관계에 따라 데이터 집합을 일정한 순서로 줄지어 늘어서도록 바꾸는 작업을 말합니다.

오름차순 ascending order 내림차순 descending order

정렬 알고리즘의 안정성

안정 된 정렬: 같은 값의 키를 가진 요소의 순서가 정렬 전후에도 유지되는 것을 말합니다.

안정되지 않은 알고리즘은 같은 점수인 경우 반드시 학번 순서대로 정렬되지는 않습니다.

 

내부정렬과 외부 정렬

정렬 알고리즘도 하나의 배열에서 작업할 수 있는 경우에는 내부 정렬 internal sorting

하나의 배열에서 작업할 수 없는 경우에는 외부 정렬 external sorting

 

정렬 알고리즘의 핵심 요소 

교환 , 선택 ,삽입

 

06-2 버블 정렬

버블 정렬은 이웃한 두 요소의 대소 관계를 비교하여 교환을 반복합니다.

                                                                                                              ←----------------------------       

6 4 3 7 1 9 8

                                                                                      ←----------------------------  

6 4 3 7 1 8 9

static void swap(int[] a,int idx1,int idx2){

  int t = a[idx1];

  a[idx1] = a[idx2];

  a[idx2] = t;

}

 

static void bubbleSort(int[] a,int n){

  for(int i = 0; i< n-1;i++)

    for (int j = n-1; j>i ; j--)

      if (a[j-1] > a[j])

         swap(a, j-1,j);

}

 

알고리즘 개선

static void bubbleSort(int[] a,int n){

  for(int i = 0; i< n-1;i++){

    int exchg =0;

    for (int j = n-1; j>i ; j--)

      if (a[j-1] > a[j]){

        swap(a, j-1,j);

        exchg++;

      }

    if(exchg == 0) break;

  }

}

 

알고리즘 개선(2)

static void bubbleSort(int[] a,int n){

  int k = 0;

  while( k < n-1){ 

    int last = n-1;

    for (int j = n-1; j>i ; j--)

      if (a[j-1] > a[j]){

        swap(a, j-1,j);

        last= j;

      }

    k = last;

  }

}

 

06-3 단순 선택 정렬

가장 작은 요소부터 정렬하는 알고리즘이기 때문에 가장 작은 값의 요소인 1을 선택해 정렬을 시작합니다.

6 4 3 7 1 9 8

1을 6과 교환합니다.

1 4 3 7 6 9 8
static void selectoinSort(int[] a, int n){
  for(int i = 0; i< n-1; i++){
  	int min = i; //아직 정렬되지 않은 부분에서 가장 작은 요소의 인덱스를 기록합니다.
    for(int j = i+1; j <n;j++)
    	if(a[j] < a[min])
        	min = j;
    swap(a,i,min); //아직 정렬되지 않은 부분의 첫 요소와 가장 작은 요소를 교환합니다.
  }
}

06-4 단순 삽입 정렬

선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 '삽입하는' 작업을 반복하여 정렬하는 알고리즘입니다.

트럼프 카드를 한 줄로 늘어놓을 때 사용하는 방법과 비슷한 알고리즘입니다.

 

아직 정렬되지 않은 부분의 첫 번째 요소를 정렬된 부분의 알맞은 위치에 삽입힙니다.

static void insertionSort(int[] a, int n){
	for (int i = 1; i <n;i++){
    	int j ;
        int tmp = a[i];
        for (j = 1; j>0 && a[j-1] > tmp; j--)
        	a[j] = a[j-1];
        a[j] = tmp;
    }
}

06-5 셸 정렬

단순 삽입 정렬 :

장점:정렬을 마쳤거나 정렬을 마친 상태에 가까우면 정렬 속도가 매우 빨라집니다.

단점:삽입할 위치가 멀리 떨어져 있으면 이동(대입)해야 하는 횟수가 많아집니다.

단순 삽입 정렬의 장점은 살리고 단점은 보완한 정렬 알고리즘으로 도널드 셸이 고안했습니다. 먼저 정렬할 배열의 요소를 그룹으로 나눠 각 그룹별로 단순 삽입 정렬을 수행하고 , 그 그룹을 합치면서 정렬을 반복하여 요소의 이동 횟수를 줄이는 방법입니다.

static void shellShort(int[] a, int n){
	for (int h = n/2; h >0; h/=2)
    	for(int i = h; i<n;i++){
        	int j;
            int tmp = a[i];
            for(j = i-h; j>=0 && a[j] > tmp; j-=h)
            	a[j+h] = a[j];
            a[j+h] = tmp;
        }
}

증분값(h값)의 선택

h값은 n부터 감소시켜 마음에 1이 되면 됩니다. 

static void shellShort(int[] a, int n){
	int h ;
    for (h = 1; h < n /9; h = h * 3 + 1)
    ;
	for (; h >0; h/=3)
    	for(int i = h; i<n;i++){
        	int j;
            int tmp = a[i];
            for(j = i-h; j>=0 && a[j] > tmp; j-=h)
            	a[j+h] = a[j];
            a[j+h] = tmp;
        }
}

06-6 퀵 정렬

퀵 정렬은 일반적으로 사용되고 있는 아주 빠른 정렬알고리즘입니다.

피벗 pivot

pl

pr

static void quickSort(int[] a, int left, int right){
	int pl = left;
    int pr = right;
    int x = a[(pl+pr) / 2];
    
    do {
    	while(a[pl] < x) pl++;
        while(a[pr] > x) pr--;
        if(pl <= pr)
        	swap(a, pl++, pr--);
    }while(pl <= pr);
    
    if(left < pr) quickSort(a, left, pr);
    if(pr<ringht) quickSort(a, pl, right);
}

 

 

시간 복잡도 : O(n log n)

최악의 시간 복잡도 O(n^2)

 

06-7 병합 정렬

먼저 정렬마친 두 배열의 병합을 살펴보겠습니다. 각 배열에서 선택한 요소의 값을 비교하여 작은 값의 요소를 꺼내 새로운 배열에 넣는 작업을 반복하여 정렬을 마치는 배열을 만듭니다.

 

//정렬을 마친 

static void merge(int[] a, int na,int[] b, int nb, int[] c){
	int pa = 0;
    int pb = 0;
    int pc = 0;
    
    while(pa<na&& pb <nb)
    	c[pc++] = (a[pa] <= b[pb]) ? a[pa++] : b[pb++];
        
    while(pa < na)
    	c[pc++] = a[pa++];
    
    while(pb < nb)
    	c[pc++] = b[pb++]
}

Arrays.sort로 퀵 정렬과 병합 정렬하기

 

06-8 힙 정렬

힙을 사용하여 정렬하는 알고리즘 입니다.

힙은 '부모의 값이 자식의 값보다 향상 크다'는 조건을 만족하는 완전이진트리입니다.

가장 큰 값이 루트에 위치

부모이 값 >= 자식의 값

 

힙 정렬

루트를 없애고 힙 상태 유지하기

루트 꺼냅니다. 그런 다음 비어 있는 루트 위치로 힙의 마지막 요소를 옮깁니다.

static void downHeap(int[] a, int left, int right){
	int temp = a[left];
    int child;
    int parent;
    
    for(parent = left; parent < (right+1)/2 ; parent = child){
    	int cl = parent * 2 +1;
        int cr = cl +1;
        child = (cr <= right && a[cr] > a[cl]) ? cr:cl;
        if (temp >= a[child])
        	breakl
        a[parent] = a[child];
    }
    a[parent] = temp;
}

static void heapSort(int[] a, int n){
	for (int i = (n-1) / 2 ; i >=0;i--)
    	downHeap(a,i,n-1);
        
    for(int i = n-1; i>0; i--){
    	swap(a, 0, i);
        downHeap(a,0,i-1);
    }
}

06-9 도수 정렬

도수 정렬 요소를 비교할 필요가 없다는 특징이 있습니다.

도수 정렬 알고리즘은 도수분포표 작성, 누적도수 분포표 작성, 목적 배열 만들기, 배열 복사의 4단계로 이루어집니다.

도수분포표 작성:

각 점수에 해당하는 학생이 몇 명인지를 나타내는 도수분포표를 작성합니다.

누적도수 분포표 작성:

'0점 부터 점수 n까지 몇 명의 학생이 있는지 ' 누적된 값을 나타내는 누적도수분포표를 만든다..

목적 배열 만들기:

각각의 점수를 받은 학생이 몇 번쨰에 위치하느닞 알수 있으므로 이 시점에서 정렬은 거의 마쳤다고 할 수 있습니다.

배열 복사

정렬은 끝났지만 정렬 결과를 저장한 곳은 작업 배열입니다.

static void fSort(int[] a, int n, int max){
	int[] f = new int[max+1];
    int[] b = new int[n];
    
    for(int i = 0; i<n;i++) f[a[i]]++;
    for(int i = 1; i<=max;i++) f[i] += f[i-1];
    for(int i = n-1; i>=0;i--) b[--f[a[i]]] = a[i];
    for(int i = 0; i<n;i++) a[i] = b[i];
}

 

 

[출처] :Do it! 자료구조와 함께 배우는 알고리즘 java편

반응형
반응형

04-1. 스택 데이터를 일시적으로 저장하기 위한 자료구조

 

스택이란: 

스택은 Stack은 데이터를 일시적으로 저장하기 위해 사용하는 자료구조로 , 데이터의 입력과 출력 순서는

후입선출LIFO Lst In First Out입니다. 가장 나중에 넣은 데이터를 가장 먼저 꺼냅니다.

스택에 데이터를 넣는 작업을 push 꺼내는 작업을 pop이라고 합니다.

푸시와 팝을 위치하는 위치를 top이라고 하고 , 스택의 가장 아랫부분을 bottom이라고 합니다.

 

스택 만들기

스택 본체용 배열 : stk

스택 용량: max

스택 포인터 ptr 스택에 쌓여 있는 데이터 수를 나타내는 필드

 

푸시 메소드 push OverflowIntStackException 

팝 메서드 pop EmptyIntStackException

피크 메서드 peek 스택의 꼭대기에 있는 데이터를 "몰래 엿보는 " 메소드입니다.

검색 메서드 indexOf

스택의 모든 요소를 삭제하는 메서드 clear

용량을 확인하는 메소드 capacity

데이터 수를 확인하는 메소드 size

스택이 비어 있는지 검사하는 메소드 IsEmpty

스택이 가득 찼는지 검사하는 메서드 IsFull

스택안에 모든 데이터를 표시하는 메서드 dump

 

04-2 큐

가장 먼저 넣은 데이터를 가장 먼저 나오는 선입선출(First In First Out)인 점이 스택과 다릅니다.

큐란: 스택과 마찬가지로 데이터를 일시적으로 쌓아 두기 위한 자료구조

인큐 enqueue 데이터를 넣은 작업

디큐 dequeue 데이터를 꺼내는 작업

데이터를 꺼내는 쪽을  front

데이터를 넣는 쪽을 rear

 

링 버퍼 : 배열의 처음이 끝과 연결되었다고 보는 자료구조

큐 클래스 IntQueue

1. 큐로 사용할 배열 que

2. 큐의 최대 용량 max

3. 프런트 front

4. 리어 rear

5. 현재 데이터 수 num

 

인큐 메서드 enque 인큐에 성공하면 인큐한 값을 그래도 반환합니다.

디큐 메서드 deque  큐에서 데이터를 디큐하고 그 값을 반한하는 메서드 입니다.

프크 메서드 peek :

검색 메서드 indexOf

모든 요소를 삭제하는 메서드 clear

최대 용량을 확인하는 메소드 capacity

데이터 수를 확인하는 메소드 size

큐가 비어 있는지 검사하는 메소드 IsEmpty

큐가 가득 찼는지 검사하는 메서드 IsFull

큐안에 모든 데이터를 표시하는 메서드 dump

 

05. 재귀 알고리즘

05-1 재귀의 기본

재귀란: 어떤 사건이 자신을 포함하고 다시 자기 자신을 사용하여 정의될 때 재귀적 이 라고 합니다. recursive

 

재귀적 정의 recursive definition : 무한으로 존재하는 자연수를 위의 두 문장으로 정의 할 수 있습니다.

 

팩토리얼 구하기 

1. 0! =1

2. n>0이면 n! = n * (n-1)!

 

static int factorial(int n){

  if(n>0)

    return n * factorial(n-1);

  else

    return 1;

}

 

직접 재귀 : 자신과 같은 메소드 호출 하면 

간접 재귀 : 메소드 a가 메소드 b를 호출하고  다시 메소드 b가 메소드 a를 호출하는 구조로 이루어집니다.

 

유클리드 호제법

두 정수의 최대공약수(greatest common division)

static int gcd(int x, int y){

  if(y == 0)

    return x;

  else

    return gcd(y , x % y);

}

 

05-2 재귀 알고리즘 분석

하향식 분석 top down : 가장 위쪽에 위치한 상자의 메소드 호출부터 시작해 계단식으로 자세히 조사하는 분석 기법

상향식 분석 bottom down :  위쪽부터 분석하는 하향식 분석과는 대조적으로 아래쪽부터 쌓아 올리며 분석하는 방법

 

05-3 하노이의 탑

하노이의 탑 Towers of Hanoi 작은 원반이 위에 , 큰 원반이 아래에 위치할 수 있도록 원반을 3개의 기둥 상이에서 옮기는 문제입니다.

 

statc void move(int no, int x, int y){

  if (no >1)

    move(no-1, x, 6-x-y);

  

  if (no >1)

    move(no-1, 6-x-y, y);

}

 

05-4 8퀸 문제 8-Queen problem: 재귀 알고리즘에 대한 이해를 돕기 위한 예제로 자주 등장할 뿐만 아니라 19세기의 유명한 수학자 카를 프리드리히 가우스 가 잘못된 해답을 낸 사실로도 잘 알려진 문제입니다.

 

static void set(int i){

  for(int j = 0 ; j < 8; j++){

    if(flag_a[j] == false &&

       flag_b[i+j] == false &&

       flag_c[i-k+7] == false{

      pos[i] = j;

      if (i == 7)

        print();

      else{

        flag_a[j] = flag_b[i+j] = flag_c[i-j+7] = true;

        set(i+1);

        flag_a[j] = flag_b[i+j] = flag_c[i-j+7] = false;

      }

    }

  }

}

 

divide and conquer분할 정복법 : 문제를 세분하고 세분된 작은 문제의 풀이를 결합해 전체 문제를 풀이하는 기법

 

 

 

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

07. 집합 08. 문자열 검색  (0) 2020.09.13
06. 정렬  (0) 2020.08.30
03. 검색  (0) 2020.08.25
02. 기본자료구조  (0) 2020.08.23
01. 기본 알고리즘  (0) 2020.08.22
반응형

03-1 검색 알고리즘 

검색과 키

그 주목하는 항목을 키(key)라고 하겠습니다.

 

배열에서 검색 

1. 선형 검색: 무작위로 늘어놓은 데이터 모임에서 검색을 수행합니다.

2. 이직 검색: 일정한 규칙으로 늘어놓은 데이터 모임에서 아주 빠른 검색을 수행합니다.

3. 해시법: 추가 , 삭제가 자주 일어나는 데이터 모임에서 아주 빠른 검색을 수행합니다.

  체인법: 같은 해시 값의 데이터를 선형 리스트로 연결하는 방법

  오픈 주소법: 데이터를 위한 해시 값이 충돌할 때 재해시하는 방법

 

03-2 선형 검색 linear search sequential search

요소가 직선 모양으로 늘어선 배열에서의 검색은 원하는 키 값을 갖는 요소를 만날 때 까지 맨앞부터 순서대로

요소를 검색하는 것

static int seqSearch(int[] a, int n , int key){

  int i = 0

  while(true){

    if(i == n)

      return -1;

    if (a[i] == key)

      return i;

    i++;

  } 

}

 

int[] x = new int[num];

 

무한 루프의 구현 

while(true){
}
for(;;){
}
do{
}

보초 sentinel method

이 비용을 반으로 줄이는 방법 

static int seqSearch(int[] a, int n , int key){

  int i = 0

  a[n] = key;

  while(true){

    if (a[i] == key)

      break;

    i++;

  } 

  return i == n ? -1 : i ;

}

 

int[] x = new int[num+1];

 

03-3 이진검색 binary search

요소가 오름차순 또는 내림차순으로 정렬된 배열에서 검색하는 알고리즘입니다.

맨 앞 인데스를 pl , 맨 끝 인덱슬르 pr, 중앙 인덱스를 pc

초기화 pl = 0, pr = n-1, pc = (n-1)/2

1. a[pc] < key 

a[pl] ~ a[pc]는 제외 , 검색 범위는 중앙요소 a[pc]보다 뒤쪽의 a[pc+1] ~ a[pr]

pl값을 pc+1로 업데이트 한다.

2. a[pc] > key 

a[pc] ~ a[pr]는 제외 , 검색 범위는 중앙요소 a[pc]보다 뒤쪽의 a[pl] ~ a[pc-1]

pr값을 pc-1로 업데이트 한다.

이진 검색은 검색을 반복할 때 마다 검색 범위가 절반이 되므로 검색에 필요한 비교 횟수의 

평균값은 log n이다.

이진 검색 알고리즘은 검색 대상(배열)되어 있음을 가정합니다.

 

static int binSearch(int[] a, int n , int key){

  int pl = 0

  int pr = n-1;

  do{

    int pc = (pl+pr)/2;

    if (a[pc] == key)

      return pc;

    else if(a[pc] < key)

      pl = pc+1;

    else 

      pr = pc -1 

  }while(pl <= pr);

  return -1;

}

 

복잡도 

알고리즘의 성능을 객관적으로 평가하는 기준을 복잡도 (complexity)라고 합니다.

1. 시간 복잡도 time complexity: 실행에 필요한 시간을 평가하는 것

2. 공간 복잡도 space complexity : 기억 영역과 파일 공간이 얼마나 필요한가를 평가 하는 것 

 

선형 검색의 시간 복잡도  O(n)

평균 실행 횟수는 n/2입니다.

 

 이진 검색의 시간 복잡도 

static int binSearch(int[] a, int n , int key){

  int pl = 0

  int pr = n-1;

  do{

    int pc = (pl+pr)/2;

    if (a[pc] == key)

      return pc;

    else if(a[pc] < key)

      pl = pc+1;

    else 

      pr = pc -1 

  }while(pl <= pr);

  return -1;

}=>O(log n)

 

Arrays.binarySearch에 의한 이진 검색 

binarySearch

장점 1 . 이진 검색 메소드를 직접 코딩할 필요가 없다.

장점 2 . 모든 자료형 배열에서 검색 할 수 있다.

 

검색에 성공한 경우 : key와 일치하는 요소의 인덱스를 반환

검색에 실패한 경우 x라고 할 떄 -x-1

 

기본 자료형 배열에서 binarySearch메소드로 검색하기

 

 

클래스 메서드와 인트턴스 메서드

인스턴스 메서드 (비정적 메서드) static붙이지 않고 선언한 메소드

클래스 메서드(정적 메서드) static 을 붙여 선언한 메소드

둘의 차이점은 메서드가 인스턴스에 포함되는지'의 여부에 있습니다.

 

자연 정렬 : 사람에게는 오른쪽 형태의 정렬이 더 자연스럽습니다. 바로 이 정렬을 자연 정렬 이라고 한다.

 

 

파라미터 이름 작성 :

1. 1개의 대문자를 사용합니다.(소문자는 가급적 사용하지 않습니다.)

2. 컬렉션의 자료형은 element의 앞글자인 E를 사용합니다.

3. 맵의 키 , 값은 key와 value의 앞글자인 K와 V를 사용합니다.

4. 일반적으로는 T를 사용합니다.

 

 

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

반응형
반응형

02-1 배열

자료구조 data structure : 데이터 단위와 데이터 사이의 물리적 또는 논리적인 관계

 

배열 array 

배열은 같은 자료형의 변수로 이루어진 구성요소component가 모인 것입니다.

 

구성요소

구성 요솟수(길이)

 

배열의 구성 요소는 자동으로 0으로 초기화 되는 규칙이 있습니다.

 

배열의 복제 

a.clone()

 

주사traverse: 배열의 요소를 하나씩 차례로 살펴보는 과정을 알고리즘 용어 

 

Random클래스의 인스턴스는 일련의 의사 난수를 생성합니다.

난수는 무에서 생성되는 것이 아니라 seed이라는 수의 값을 바탕으로 여러 연산을 수행하여 얻습니다

 

배열 a의 최댓값 구하기

static int maxOf(int[] a){

  int max = a[0];

  for (int i = 1; i < a.length;i++)

    if (a[i] > max)

      max = a[i];

  return max;

}

 

배열 요소를 역순으로 정렬하기 

 

static void swap(int[] a, int idx1, int idx2){

  int t = a[idx1];

  a[idx1] = a[idx2];

  a[idx2] = t;

}

 

static void reverse(int[] a){

  for(int i = 0; i <a.length/2; i++)

    swap(a, i, a.alength-i-1);

}

 

두 배열의 비교

static boolean equals(int[] a, int[] b){

  if(a.length != b.length)

    return false;

  for (int i = 0; i < a.length;i++)

    if(a[i] != b[i])

      return false;

 

  return true;

}

 

기수 변환

정수값을 임의의 기수로 변환하는 알고리즘 

기수: 수를 나타내는데 기초가 되는 수

서수 사물의 순서를 나타내는 수 

static int cardConvR(int x, int r, char[] d){

  int digits = 0;

  String dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 

  do {

    d[digists++] = dchar.charAt(x%r);

    x /= r;

   }while(x != 0);

   return digits;

}

 

전위형 증가 연산자 ++a

++를 앞에 놓으면 식 전체를 평가하기 전에 피 연산자의 값을 증가시킵니다.

후위형 증가 연산자 a++

++를 뒤에 놓으면 식 전체를 평가한 후에 피연산자의 값을 증가시킵니다.

 

다차원 배열: 

int[][] x = new int[2][4]

2행 4열

 

서기 year년은 윤년인가?

static int isLeap(int year){

  return (year % 4 == 0 && year $ 100 != 0 || year % 400 == 0 ) ? 1:0;

}

 

02-2클래스

클래스: 여러 형의 요소를 조합하여 만든 자료구조 

필드 filed데이터 요소

 

공개클래스 : 클래스 접근 제한자 public을 붙여 선언한 클래스로 , 다른 패키지에서 사용할 수 있는 것

final 클래스 : 클래스 접근 제한자 final을 붙여 선언한 클래스로 , 서브 클래스를 가질 수 없습니다. 

(새로운 클래스를 상속할 수 없습니다.)

파생클래스 :

  direct superclass

  direct subclass

 

추상클래스 : abstract

 

중첩클래스 : nested class

 

 

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

07. 집합 08. 문자열 검색  (0) 2020.09.13
06. 정렬  (0) 2020.08.30
04. 스택과 큐 05. 재귀 알고리즘  (0) 2020.08.27
03. 검색  (0) 2020.08.25
01. 기본 알고리즘  (0) 2020.08.22
반응형

01-1 알고리즘이란 ?

 

세 값의 최대값 : 

 

int max = a;
if(b > max) max = b;
if(c > max) max = c;

 

이렇게 여러 문장(프로세스)이 순차적으로 실행되는 구조를 순차적(concatenation)구조라고 합니다.

 

세 값의 중앙값 :

if (a >= b)

  if (b >= c)

    return b;

  else if (a <= c)

    return a;

  else 

    return c;

else if (a > c)

  return a;

else if(b>c)

  return c;

else 

  return b;

 

연산자: 기호 +- 등

피 연산자 숫자

 

 

01-2 반복 

 

1부터 n까지의 정수 합 구하기 

int sum = 0;

int i = 1;

while ( i <= n){

  sum += i;

  i++;

}

===> 사전 판단 반복 구조 

 

for 문 반복

int sum = 0;

for (int i = 1; i <= n; i++){

  sum += i;

}

 

사전 판단 반복: while문과 for문은 처음에 제어식을 평가한 결과가 0이면 루프 본문은 한번도 실행되지 않습니다.

사후 판단 반복: do문은 루프 본문이 반드시 한번 은 실행됩니다.

 

구조적 프로그래밍: 하나의 입구와 출구를 가진 구조 요소만을 계층적으로 배치하여 프로그램을 구성하는 방법

 

단축 평가(short circuit evaluation) 논리 연산의 식 전체를 평가한 결과가 왼쪽 피연산자의 평가 결과만으로 정확해지는 경우 오른쪽 피 연산자의 평가를 수행하지 않는데 이를 단축평가라로 합니다.

 

드로르간 법칙 (De Morgan's laws): 각 조건을 부정하고 논리곱을 논리합으로 , 논리합을 논리곱으로 바꾸고 다시 전체를 부정하면 원래의 조건과 같다.

 

다중 루프 

곱셈표 :

for (int i = 1; i<=9; i++){

  for (int j = 1; j<=9; j++){

    System.out.printf("%3d",i*j);

  }

}

 

직각 이동변 삼각형 출력

for(int i=1; i<=5;i++){

  for (int j=1;j<=i;j++){

    System.out.print("*")

  }

  System.out.println();

}

출처 : Do it ! 자료구조와 함께 배우는 알고리즘 입문 자바편

 

 

반응형

' > Do it! 자료구조와 함께 배우는 알고리즘 입문 자바편' 카테고리의 다른 글

07. 집합 08. 문자열 검색  (0) 2020.09.13
06. 정렬  (0) 2020.08.30
04. 스택과 큐 05. 재귀 알고리즘  (0) 2020.08.27
03. 검색  (0) 2020.08.25
02. 기본자료구조  (0) 2020.08.23

+ Recent posts