CS/자료구조

[자료구조] 배열, 리스트(Array, List)

2021. 2. 7. 14:35
목차
  1. 배열이란?
  2. C언어의 배열(Array)
  3. Python의 리스트(List)
  4. 동적 배열(Dynamic Array)
  5. Python의 Array
  6. 참고

배열이란?

데이터를 연속적인 메모리 공간에 저장하고, 저장된 곳의 주소(address, reference)를 통해 매우 빠른 시간에 접근할 수 있는 가장 많이 쓰이는 기본적인 자료구조

 

Array

 

C언어의 배열(Array)

  • 크기가 고정되어 있으며, 한 번 생성한 배열은 크기를 변경하는 것이 불가능하다.
  • 배열의 시작 주소, 저장된 값의 종류(바이트 개수), 몇 번째에 저장되어 있는지를 나타내는 인덱스(index) 세 가지 정보만으로 값이 저장된 곳의 주소를 계산할 수 있다.
  • 읽기와 쓰기 연산에 O(1) 시간 소요

 

Python의 리스트(List)

  • C의 배열의 셀에는 실제 값(데이터)이 저장된 형식이지만, Python 리스트의 셀에는 데이터가 아닌 데이터가 저장된 곳의 주소(address 또는 reference)가 저장된다.
  • 항상 객체의 주소만 저장하기 때문에, 리스트의 셀의 크기를 메모리의 주소를 표현할 수 있는 (4 바이트 또는) 8 바이트로 고정하면 된다.
  • 모든 셀의 크기가 같기 때문에 index에 의해 O(1) 시간 접근이 가능하다
  • 단순한 읽기/쓰기 연산 외에도 다양한 연산을 지원한다(append, pop, insert, count 등).

List

동적 배열(Dynamic Array)

  • 리스트는 크기(셀의 개수)가 필요에 따라 자동으로 증가/감소한다.
  • 그래서 append 또는 insert 연산을 위한 공간(메모리)이 부족하면 더 큰 메모리를 할당받아 새로운 리스트를 만들고
    이전 리스트의 값을 모두 이동한다. 이를 더블링이라고 한다.
  • 반대로 pop 연산을 하면서 실제 저장된 값의 개수가 리스트 크기에 비해 충분히 작다면 더 작은 크기의 리스트를 만들고 모두 이동한다.
  • 이렇게 필요에 따라 크기가 변하는 배열을 동적 배열(dynamic array)라 부른다. 따라서 사용자는 배열의 크기를 전혀 신경쓰지 않아도 된다. 
  • Java에서는 ArrayList, C++에서는 std::vector와 같은 동적 배열 자료형을 지원한다.
>>> A = []
>>> sys.getsizeof(A)
64 # 빈 리스트도 64 바이트 할당
>>> A.append("Python") # append 후 96 바이트로 재할당
>>> sys.getsizeof(A)
96

Dynamic Array

Python의 Array

  • Python에서는 또한 numpy모듈에서 array 자료구조를 지원한다.
  • 특정 원소에 대해 O(1) 접근 가능
  • mutable하다
  • 한 종류의 값만 저장 가능
  • 메모리를 리스트보다 적게 사용한다.
  • 배열 단위의 연산이 매우 빠르다.
>>> import numpy as np
>>> A = np.arange(10) # range(start, stop, step) 유사
>>> A
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> print(A)
[0 1 2 3 4 5 6 7 8 9]

참고

Data Structures with Python(신찬수 저)

파이썬 알고리즘 인터뷰(박상길 저)

 

저작자표시 비영리 (새창열림)

'CS > 자료구조' 카테고리의 다른 글

[자료구조] 스택, 큐, 덱(Stack, Queue, Dequeue)  (0) 2021.02.15
  1. 배열이란?
  2. C언어의 배열(Array)
  3. Python의 리스트(List)
  4. 동적 배열(Dynamic Array)
  5. Python의 Array
  6. 참고
'CS/자료구조' 카테고리의 다른 글
  • [자료구조] 스택, 큐, 덱(Stack, Queue, Dequeue)
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • fastapi
  • Shortest Path
  • http
  • atdd
  • 파이썬
  • dp
  • 그래프
  • 브루트포스
  • Git
  • 깊이 우선 탐색
  • mysql
  • 그래프 탐색
  • BOJ
  • 장고
  • 백준

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[자료구조] 배열, 리스트(Array, List)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.