배열 vs 리스트

​ **<공통점>**

​ ★가장 기본적인 순차적(sequential) 자료구조

★데이터를 연속적인 메모리 공간에 저장★

-차이점

배열 리스트

연산 제한적 연산 VS 다양한 연산(append, pop…)

저장 배열의 셀에는 실제 값 저장 VS 리스트의 셀에는 데이터 주소가 저장

​ (용량 자동 조절)(=동적 배열)

연산

1) 배열

: 인덱스로 배열의 특정위치 값을 상수시간 내에 읽기 쓰기 연산만 제공하는 자료구조

데이터를 연속적인 메모리 공간에 저장, 저장된 곳의 주소(address, reference)를 통해 빠른 시간에 접근 가능

=>연산: 읽기, 쓰기

Ex) int A[4]={2,4,0,5};

​ A[2] = A[2] +1

​ 쓰기/ 대입 /읽기 /산술

2) 리스트

Ex) A=[2,4,0,5] -> 각각 따로 메모리 차지함

->★연산 시 따로 객체가 생김(=메모리 낭비가 큼)★

-> 효율을 위해선 compact array type 사용하기

-연산

  1. A.append(a): 맨 뒤에 a 삽입 => 평균적으로 O(1)시간

  2. A.pop(): 맨 뒤의 값을 지우고 해당 값 리턴 => 평균적으로 O(1)시간

  3. A.pop(a): A[a] 제거하고 리턴 => 값이 왼쪽으로 한 칸씩 이동하는 시간 필요

    ​ => 최악인 경우는 A.pop(0)으로 O(n)시간(O(len(A))

  4. A.insert(a,b) : A[a]에 b 대입 =>모두 오른쪽으로 이동하므로 A의 크기만큼 시간 필요

    => 최악(+평균)의 경우는 A.pop(0)일 때로 0(n)시간 (O(len(A))

  5. A.remove(value): A에서 value 제거 =>최악(+평균) 0(n)시간

  6. A.index(value), A.count(value) => 최악인 경우 0(n)시간 (O(len(A))

저장

1) 배열

​ => 배열 선언 시 크기 정해야 함

​ => 배열 크기를 변경시엔 새로운 배열을 만들기

​ ex) malloc

​ B=(int *)malloc(6 * 4) : 4비트인 int형을 6개 할당한 배열

=★★시작주소, 저장 값 종류(바이트 개수), 인덱스로 주소 계산 가능★★

​ ex) A[2]의 시작 주소 = A[0]의 시작 주소 + 2*4 (index =2, sizeof(int)=4)

2) 리스트

​ => ★ 리스트는 용량의 크기를 자동 조절 (동적 배열)

​ => 새로운 메모리를 위해선 동적할당으로 통해 할당해줘야 함

-> append나 insert, pop 에서 메모리가 작거나 너무 크면 새로 리스트 만들어 복사

​ -append 연산에서 메모리 늘려야하는 상황 =>resize하는 경우 O(n) ​ image

image