일차원인 컴퓨터 메모리를 현실에 대응되도록 구조를 만든 것
메모리를 효율적으로 사용하며 빠르고 안정적으로 데이터를 처리하는 것이 궁극적인 목표
상황에 따라 유용하게 사용될 수 있도록 특정 구조를 이루고 있다.
종류
① 단순 구조: 정수, 실수, 문자열, 논리
② 선형 구조: 배열, 연결 리스트, 스택, 큐
💡 선형구조?
한 원소 뒤에 하나의 원소만이 존재하는 형태로 자료들이 선형으로 나열되어 있는 구조
③ 비선형 구조: 트리, 그래프
💡 비선형 구조?
원소 간 다대다 관계를 가지는 구조로 계층적 구조나 망형 구조를 표현하기에 적절하다.
💡 컴퓨터 과학에서 로그의 밑은 기본적으로 2이다.
// 시간 복잡도 예시
// O(n)
for(let i = 0; i < n; i+=1) {
//...
}
// O(log n)
for(let i = 1; i <= n; i*=2) {
//...
}
// O(n log n)
for(let i = 0; i < n; i+=1) {
for(let j = 1; j <= n; j*=2) {
//...
}
}
// O(n²)
for(let i = 0; i < n; i+=1) {
for(let j = 0; j < n; j+=1) {
//...
}
}
// 계수 법칙: 두 루프는 같은 O(n)이다.
for(let i = 0; i < n; i+=1) {
//...
}
for(let i = 0; i < n*5; i+=1) {
//...
}
② 합의 법칙
// 합의 법칙: 두 루프를 합쳐 O(n+m)으로 표기할 수 있다.
for(let i = 0; i < n; i+=1) {
//...
}
for(let i = 0; i < m*5; i+=1) {
//...
}
③ 곱의 법칙
// 곱의 법칙: 두 루프를 곱해 O(n²)으로 표기할 수 있다.
for(let i = 0; i < n; i+=1) {
for(let j = 0; j < n*5; j+=1) {
//...
}
}
④ 다항 법칙
// 다항 법칙: 다음 루프는 O(n³)으로 표기할 수 있다.
for(let i = 0; i < n*n*n; i+=1) {
//...
}
🤷♂️ 쉽게 말해서...
1. 상수항은 무시
2. 가장 큰 항 외엔 무시
시작시간을 구하고 로직을 돌린 다음 끝 시간에서 시작시간을 뺀다
// 성능 측정하기
console.log("start");
const start = new Date().getTime();
const N = 100000000;
let total = 0;
for(let i = 0; i < N; i+=1) {
total+=i;
}
const end = new Date().getTime();
console.log(end-start);
console.log("finish");
연관된 데이터를 연속적인 형태로 구성된 구조를 가진다.
배열에 포함된 원소는 순서대로 번호(index)가 붙는다.
특징
① 고정된 크기를 가지며 일반적으로는 동적으로 크기를 늘릴 수 없다.
💡 자바스크립트처럼 대부분의 스크립트 언어는 동적으로 크기가 증감되도록 만들어져 있다.
② 원하는 원소의 index를 알고 있다면 O(1)로 원소를 찾을 수 있다.
③ 원소를 삭제하면 해당 index에 빈자리가 생긴다.
⌛ 시간 복잡도 계산
① 배열 요소를 삭제하고 앞당기기
② 배열 요소를 중간에 추가
자바스크립트 배열만의 특징
① 동적이다.
② HashMap에 가깝다.
③ index가 number가 아니어도 된다.
배열 생성과 사용법
// 배열 생성
// 1. 빈 배열 생성
let arr1 = [];
console.log(arr1);
// 2. 미리 초기화 된 배열 생성
let arr2 = [1, 2, 3, 4, 5];
console.log(arr2);
// 3. fill 사용 (많은 값을 같은 값으로 초기화할 때)
let arr3 = Array(10).fill(0);
console.log(arr3);
// 4. 특정 로직을 사용한 초기화 (from 이용)
let arr4 = Array.from({ length: 100 }, (_, i) => i);
console.log(arr4);
// 배열 요소 추가, 삭제하기
// 테스트용 배열 생성
const arr = [1, 2, 3];
console.log(arr);
// 끝에 추가
arr.push(4);
// 여러 개를 한 번에 추가
// 맨 뒤 추가는 O(1)의 시간복잡도를 가짐
arr.push(5,6);
console.log(arr);
// 3번 인덱스에 200 추가
arr.splice(3, 0, 200)
console.log(arr);
// 3번 인덱스 값 제거
arr.splice(3, 1);
console.log(arr[3]);
다음에는 연결리스트에 대해 알아보자.
그림 제공: https://programmers.co.kr/