ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조 Java] 선형 자료 구조(연결 리스트, 배열, 스택, 큐)
    Computer Science/Data Structure 2022. 10. 5. 15:53
    반응형

    선형자료구조란?

    : 요소가 일렬로 나열되어 있는 자료 구조

    1. 연결 리스트

    : 데이터를 감싼 노드를 포인터로 연결해 공간적 효율성을 극대화 시킨 자료구조로,

    prev 포인터와 next 포인터로 앞과 뒤의 자료들을 연결시킨 것

    1-1. 시간 복잡도

    - 삽입/삭제 : O(1)

    - 탐색 : O(n)

    1-2. 종류

    1) 싱글 연결 리스트: next 포인터만 가짐

    2) 이중 연결 리스트: prev, next 포인터를 둘 다 가짐

    3) 원형 이중 연결 리스트: 마지막 노드의 next 포인터가 헤드 노드(맨 앞의 자료)를 가리킴

    1-3. 주요 명령어

    import java.util.LinkedList;
    import java.util.List;
    
    public class Example {
    
    	public static void main(String[] args) {
    		
    		List<Integer> numList = new LinkedList<>();
    		
    		// 1-1. 리스트의 맨 뒤에 데이터 추가하기.
    		numList.add(3);
    		numList.add(5);
    		numList.add(8);
    		numList.add(32);
    		numList.add(100);
    		System.out.println(numList.toString()); // [3, 5, 8, 32, 100]
    		
    		// 1-2. 리스트의 특정 위치에 데이터 추가하기.
    		numList.add(2, 200);
    		System.out.println(numList.toString()); // [3, 5, 200, 8, 32, 100]
    		
    		// 2. 리스트에서 특정 인덱스 데이터 삭제하기.
    		numList.remove(0);
    		System.out.println(numList.toString()); // [5, 200, 8, 32, 100]
    		
    		// 3. 리스트에서 특정 인덱스 조회하기.
    		System.out.println(numList.get(2)); // 8
    		
    		// 4. 리스트의 크기 조회하기.
    		System.out.println(numList.size()); // 5
    		
    		// 5. 리스트에 특정 값이 있는지 조회하기.
    		System.out.println(numList.contains(200)); // true
    		
    	}
    }

    2. 배열

    : 같은 타입의 변수들로 이루어져 있고, 크기가 정해져 있으며, 인접한 메모리 위치에 있는 데이터를 모아놓은 집합

    2-1. 시간복잡도

    - 탐색 : O(1) ▶︎ 물리적 인덱스를 알고 있으며 한 번에 접근 가능(random access)
    - 삽입/삭제 : O(n) ▶︎ 맨 앞의 자리를 삽입/삭제할 경우, 다른 원소들을 한 칸씩 shift해야하는 비용이 발생

    📍랜덤접근과 순차접근
    - 랜덤접근(직접접근): 동일한 시간에 배열과 같은 순차적 데이터가 있을 경우 임의의 인덱스에 해당하는 데이터에 바로 접근 가능
    - 순차접근: 데이터를 저장된 순서대로 검색해야만 접근 가능

    ✅ 배열과 연결리스트 비교

    구분 배열 연결리스트
    크기 정적으로 정해져 있음 동적으로 변화
    요소 탐색 인덱스를 알고 있을 경우 바로 접근 가능 처음부터 순차적으로 탐색해야 함
    삽입/삭제 요소 삽입/삭제 시 다른 요소들 위치 조정 필요 인덱스를 알고 있을 경우 바로 해당 위치에 삽입/삭제 가능
    메모리 필요한 만큼 확보하므로 공간 효율적 포인터의 여분 메모리가 필요

    3. 스택

    - 입력과 출력이 한 곳으로 제한 되어 있어,
       LIFO(Last In First Out) 성질을 가진 자료구조로, 가장 마지막에 들어간 데이터가 가장 첫 번째로 나옴
    - 차곡차곡 데이터가 쌓이는 자료구조

    3-1. Stack의 활용

    - 함수의 콜스택(함수의 실행 컨텍스트가 호출된 순서로 스택 메모리 공간에 쌓임), 재귀 알고리즘

    - 문자열 역순 출력
    - 후위 표기법 변환 및 연산
    - 수식의 괄호 검사(연산자 우선순위 표현을 위한 괄호 검사)
    - 웹 브라우저 방문 기록(뒤로 가기), 실행 취소(undo)

    3-2. 시간 복잡도

    - 삽입/삭제 : O(1) ▶︎ 맨 위를 기준으로만 데이터의 삽입/삭제가 가능하므로 항상 O(1) 의 시간복잡도를 가짐

    - 탐색 : O(n) ▶︎ 특정 데이터를 찾을 경우, 그 데이터를 찾을 때까지 수행해야하므로 최대 O(n)의 시간 복잡도를 가짐

    3-3. 주요 연산

    - push(item): TOP에 자료(item) 삽입

    - pop(): TOP에 있는 자료 제거

    - peek(): TOP에 있는 자료 반환

    - isEmpty(): 스택이 비어 있을 때 true 반환

    4. 큐

    - 선입선출 형태로 먼저 집어 넣은 데이터가 먼저 나오는 (FIFO, First In First Out) 성질을 가진 자료 구조

    - Java Collection에서의 Queue는 인터페이스로, 이를 구현하고 있는 Priority Queue등을 사용할 수 있음

    3-1. Queue의 활용

    - 데이터가 입력된 순서대로 처리해야 할 필요가 있는 상황에 용이 (BFS)

    - 캐시 구현

    - 우선 순위가 같은 작업 예약(인쇄 대기열)

    - 선입 선출이 필요한 대기열 (티켓 카운터)

    - 콜센터 고객 대기 시간

    - 프린터의 출력 처리

    - 윈도우 시스템의 메시지 처리기

    - 프로세스 관리

    - JS의 Event loop 관리에 필요(비동기 처리)

    3-2. 시간 복잡도

    - 삽입/삭제 : O(1) ▶︎ 삽입은 맨 뒤에서, 삭제는 맨 앞에서만 가능하므로 항상 O(1) 의 시간복잡도를 가짐

    - 탐색 : O(n) ▶︎ 특정 데이터를 찾을 경우, 그 데이터를 찾을 때까지 수행해야하므로 최대 O(n)의 시간 복잡도를 가짐

    3-3. Queue의 주요 연산

    - add(item): item을 큐 리스트의 끝 부분에 추가한다.

    - remove(): 리스트의 첫 번째 항목을 제거한다.

    - poll(): 리스트의 첫 번째 항목을 제거한 후, 해당 값을 반환한다.

    - peek(): 큐에서 가장 앞에 있는 항목을 반환한다. (front)

    - isEmpty(): 큐가 비어 있을 때 true를 반환한다.

     

    반응형

    댓글

Designed by Tistory.