'2016/12'에 해당되는 글 4건

  1. 2016.12.15 Stack 과 Queue
  2. 2016.12.14 연결 리스트
  3. 2016.12.12 배열과 문자열
  4. 2016.12.02 go 언어 사용하기

Stack 과 Queue


  1. Stack

    • LIFO ( Last In First Out ): 후입선출
    • 함수:
      • top
      • push
      • pop
    • 용도:
      • 복귀주소 저장시 (서브 프로그램 호출, 인터럽트 발생 등)
      • 재귀 프로그램의 순서 제어
      • 후위표기법으로 산출된 산술식 연산
  2. Queue

    • FIFO ( First In First Out ): 선입선출
    • 함수:
      • put: enqueue
      • get: dequeue
    • 용도:
      • 대기행렬 처리
      • 운영체제의 작업 스케줄링
  3. 문제 풀이

    • 크기가 제한된 Stack 구현하기
    • 풀기 전 확인사항
      • 스택의 갯수 제한 여부, 확장성
      • 스택에 쌓이는 접시 무더기의 경우 가중치가 다른지 (차지하는 공간이 일정한가? 아닌가?)
      • ArrayList 의 경우 insert 한 순서를 유지 하기 때문에 LinkedList 에 비해 구현이 용이할 것 같다>> ArrayList 와 LinkedList 는 데이터의 삽입, 검색의 성능 차이가 있을 뿐 ordering 과는 무관하다
    • 풀이

        class Dish{
            // int val; // 가중치가 부여된다고 생각했을 때...
        }
      
        class SimpleStack{
            int maxSize;
            ArrayList<Dish> dishList;
      
            public SimpleStack(int maxSize){
                self.maxSize = maxSize;
            }
      
            public Dish pop(){
                Dish d = dishList.get(dishList.size()-1)
                dishList.remove(dishList.size()-1)
                return d;
            }
      
            public void push(Dish d) throws Exception{
                if(dishList.size() >= maxSize){
                    throw new Exception();
                }else{
                    dishList.add(d);
                }
            }
        }
      
        public SimpleStackTest{
      
            int stackMaxSize;
            ArrayList<SimpleStack> stackList;
      
            public SimpleStackTest(int stackMaxSize){
                stackList = new ArrayList<SimpleStack>();
                stackList.add(new SimpleStack(stackMaxSize))
            }
      
            public Dish pop(){
      
                SimpleStack s = stackList.get(stackList.size()-1);
                Dish d = s.pop()
                if(s.dishList.size()==0){
                    stackList.remove(stackList.size()-1)
                }
                return d;
            }
      
            public void push(Dish d) throws Exception{
      
                SimpleStack s = stackList.get(stackList.size()-1);
                try {
                    s.push(d);
                }catch (Exception e){
                    SimpleStack s1 = new SimpleStack(stackMaxSize);
                    s1.push(d);
                    stackList.add(s1);
                }
            }
        }


'알고리즘 관련 > 자료구조' 카테고리의 다른 글

정렬 및 검색  (0) 2017.04.10
트리와 그래프  (0) 2017.01.04
연결 리스트  (0) 2016.12.14
배열과 문자열  (0) 2016.12.12
Posted by 감각적신사
,

연결 리스트


  1. 개념:
    • 등장배경:
      • 순차 선형 리스트(배열)는 논리적인 순서와 물리적인 순서가 같기 때문에 원소의 위치를 찾아 액세스하기 쉽다는 장점이 있지만, 삽입 연산이나 삭제 연산에 원소들을 이동시키는 추가적인 작업과 시간이 필요함
      • 원소의 개수가 많고, 삽입, 삭제 연산이 많이 발생하는 경우에는 원소들의 이동 작업으로 인한 오버헤드가 증가, 결국, 메모리 사용의 비효율성의 문제를 갖음.
    • 단위:
      • 노드: 연결 자료구조 방식에서 원소는 연결될 다음 원소에 대한 주소를 저장해야 하기 때문에, <원소, 주소> 단위로 저장
        • 원소의 값을 저장하는 데이터 필드(Data Field)
        • 다음 노드의 주소를 저장하는 링크 필드(Link Field)
  2. 종류:

    • 단순 연결 리스트:
      • 노드가 하나의 링크 필드에 의해서 다음 노드와 연결되는 구조를 가진 연결 리스트
      • 데이터의 삽입: 노드 중간에 삽입될 경우, 1. 이전노드의 다음노드 주소를 받고 2. 이전노드에 삽입되는 노드의 주소를 전달한다
    • 원형 연결 리스트
      • 장점: 하나의 노드에서 모든 다른 노드로의 접근 가능
      • head 를 두어 시작 노드와 끝 노드를 정의해야 한다
      • 특정 노드를 검색할 때 만일 그 노드가 연결 리스트에 포함되어 있지 않은 노드라면, 무한 루프(loop)에 빠질 가능성 있어, 검색을 끝낼 수 있는 노드를 지정해 두는 것이 좋음
    • 이중 연결 리스트
      • 노드가 두개의 링크 필드를 가지고 있어, 이전 노드와 다음 노드의 정보를 가지고 있다
      • 장점: 양방향 탐색
      • 단점: 변수(링크 필드)를 하나 더 사용 == 메모리를 더 많이 사용한다는 의미
      • 현실에서 사용하는 연결 리스트는 대부분 이중 연결 리스트
    • 이중 원형 연결 리스트
  3. 비교 리스트 종류 간 비교

    • 배열 과 연결리스트:
      • 배열은 할당받은 메모리 내 에서 동작
      • 연결리스트는 동적으로 메모리 할당 후 동작, 메모리 주소에 대한 참조를 하기 때문에 추가 메모리 사용
    • 단순 연결 리스트 VS 이중 연결 리스트
      • 데이터 검색, 삭제 성능: 단순 연결 리스트 < 이중 연결 리스트
      • 메모리 추가 사용: 단순 연결 리스트 < 이중 연결 리스트
    • 이중 연결 리스트 VS 원형 연결 리스트
      • 구조가 유사
      • 데이터 삽입 시, 이중 연결 리스트의 경우 마지막 노드를 찾는데 O(N) 이 소요되나 원형 연결 리스트의 경우 시작 노드에서 마지막 노드 를 바로 찾을 수 있다
  4. JAVA 의 Vector, ArrayList, LinkedList 차이

    • 차이
    • Vector:
      • 구버젼 호환용
      • 동기화 처리가 내부적으로 일어남으로 다른 객체보다 무겁다 == 성능 저하
    • ArrayList:
      • 배열의 복사에 의한 데이터 저장처리를 내부적으로 행한다
      • 각 데이터에 대한 인덱스를 가지고 있기때문에 검색이 매우 빠르다
      • 많은 데이터의 추가 / 삭제시에는 배열의 복사가 빈번하게 일어나, 성능이 떨어지는 단점이 있다
    • LinkedList:
      • 다음 자료의 위치정보를 가지며, 내부적인 인덱스는 가지고 있지 않다
      • 데이터의 추가 / 삭제는 위치정보의 수정만으로 가능하기 때문에 많은 정보의 추가 / 삭제처리가 필요할때 유용하다
      • 데이터가 많은 경우의 검색시 처음 자료로부터 순차적으로 찾아 나가야 하기 때문에 느려지는 단점이 있다
    • 데이터 추가 / 삭제: ArrayList < LinkedList
    • 데이터 검색: ArrayList > LinkedList


'알고리즘 관련 > 자료구조' 카테고리의 다른 글

정렬 및 검색  (0) 2017.04.10
트리와 그래프  (0) 2017.01.04
Stack 과 Queue  (0) 2016.12.15
배열과 문자열  (0) 2016.12.12
Posted by 감각적신사
,

배열과 문자열


참고

  1. 기본 자료 구조 비교

    • 배열(array):
      • + 내부 인덱스를 이용하여 자료의 검색이 한번에 이루어지기 때문에 빠른 검색 속도
      • - 데이터의 삽입, 삭제시 많은 데이터가 밀리거나 빈자리를 채우기 위해 이동해야 하기 때문에 많은 시간이 소요된다
    • 리스트(list):
      • + 삽입, 삭제시 인근 노드들의 참조값만 수정해 줌으로써 빠른 처리가 가능
      • - 데이터의 수가 많아질수록 효율이 떨어진다
    • hash:
      • 배열(array), 리스트(list)의 한계를 극복하기 위한 자료구조
      • 내부적으로 배열을 사용하여 데이터를 저장하기 때문에 빠른 검색 속도를 갖는다
      • 데이터의 삽입과 삭제시 기존 데이터를 밀어내거나 채우는 작업이 필요 없도록 특별한 알고리즘을 이용하여 데이터와 연관된 고유한 숫자를 만들어 낸뒤 이를 인덱스로 사용한다
      • 특정 데이터가 저장되는 인덱스를 그 데이터만의 고유한 위치이기 때문에 삽입시 다른 데이터의 사이에 끼어들거나 삭제시 다른 데이터로 채울 필요가 없으므로 삽입과 삭제시 데이터의 이동이 없도록 만들어진 구조다
    • JAVA 기준으로 각 자료 구조의 특징 정리
      • ArrayList: 배열 기반, 데이터의 추가와 삭제 유용하지 못함, 순차적인 추가 삭제는 제일 빠름, 인덱스가 있어 임의의 요소에 대한 접근성이 뛰어남
      • LinkedList: 연결 기반, 데이터의 추가와 삭제에 유용함, 임의의 요소에 대한 접근성이 좋지 못함
      • HashMap: 배열과 연결이 결합된 형태, 추가, 삭제, 검색, 접근성이 모두 뛰어남, 검색에는 최고 성능을 보인다
  2. hash table

    • key-value 의 쌍
    • key 의 유일성이 보장되어야 데이터가 안전하게 저장된다
    • 이진 탐색 트리 를 사용한 hash table 의 경우 시간복잡도 O(logN) 을 보장한다
    • JAVA 에서의 hashtable
      • HashTable(o), HashMap(x): thread safe 한지 하지않은지 로 나뉜다
  3. ArrayList

    • 동적으로 크기가 조정되는 배열
    • 일반적으로 배열의 크기가 증가할 때, 배열의 크기를 늘리는 시간은 O(N)
    • 자주 일어나는 일이 아니므로 O(1) 로 생각한다
  4. StringBuffer

    • String 과 비교: append 작업시 O(xN2) 만큼 차이를 보인다
    •   for(String a:aLists){
            string = string + a; // 계속해서 새로운 객체를 생성하기 때문이다
            stringBuffer.append(a);
        }
      
  5. 문제풀이

    • 문제 풀기 전 확인하고 싶은 사항
      • 같은 문자는 대소문자 구분이 없는가
      • 문자열의 길이 제한이 있는가
    •   StringBuffer result = "";
        String previousChar = "";
        int sameCnt = 0;
        for(int i=0;i<str.length();i++){
            if (result.toString().length() > str.length()){
                return str;
            }else{
                if(previousChar.equel(str.indexOf(i))){
                    sameCnt++;
      
                    if(){
      
                    }
                }else{
                    if(sameCnt!=0){
                        // result.append(previousChar+sameCnt);
                        result.append(previousChar);
                        result.append(sameCnt);
                    }
      
                    previousChar = str.indexOf(i)
                    sameCnt = 1;
                }
            }
        }


'알고리즘 관련 > 자료구조' 카테고리의 다른 글

정렬 및 검색  (0) 2017.04.10
트리와 그래프  (0) 2017.01.04
Stack 과 Queue  (0) 2016.12.15
연결 리스트  (0) 2016.12.14
Posted by 감각적신사
,

go 언어 사용하기

개발 2016. 12. 2. 08:35

go 

1. 설치 및 설정

    - https://golang.org/doc/install


2. 튜토리얼 사이트

    - https://go-tour-kr.appspot.com/


3. Go 프로그램 패키지

    - 프로그램은 main 패키지에서부터 실행을 시작한다

    - 패키지 호출 명명규칙

        - 디렉토리 경로의 마지막 이름을 사용

example "{GO_PATH}/src/{package_name}/example.go" 를 사용한다면

 import "{package_name}" 

example (둘다 가능)

 import (

  "fmt"

  "math"
 )


import "fmt"

import "math"

    - 패키지를 Import 하면 패키지가 외부로 export 한 것들(메서드나 변수, 상수 등)에 접근한다

    - Go 에서는 첫 문자가 대문자로 시작하면 그 패키지를 사용하는 곳에서 접근할 수 있는 exported name이 된다

      예를 들어 Foo 와 FOO 는 외부에서 참조할 수 있지만 foo 는 참조 할 수 없다


4. 함수 호출

    - 매개변수(인자) 포함 가능

        - 매개변수의 타입 : 변수명 뒤에 명시

       - Multiple results 가능
          example : 

x int

func add(x int, y int) int {
   return x + y
}

func swap(x, y string) (string, string) {
   return y, x
}


5. go 시작해보기 

>> hello.go

package main

import "fmt"
func main() {
fmt.Println("Hello, 안녕")
}

>> 실행
PS D:\02.workspace\11.go> go run .\hello.go
Hello, 안녕


'개발' 카테고리의 다른 글

Git 입문  (0) 2017.12.17
Docker 기초 - 1  (0) 2017.06.10
swagger 사용하기  (0) 2016.11.15
iOS custom framework 만들기  (0) 2016.11.04
Ubuntu 머신에서 다른 머신 제어하기  (0) 2016.09.09
Posted by 감각적신사
,