If today was hard, tomorrow will be easy.

간결하고 의미있는 코딩을 위하여.

GitHub - Inchijeong 바로가기→

DataStructure

[ArrayList] Array List 개념, 구현

꼬스차 2021. 1. 14. 19:35
728x90
반응형

Array List에 대해 알아볼겠습니다.

Array List란?

크기가 고정되지 않은 배열

언어별 Array Size

  • PHP - Dynamic
  • Java - Fixed

Java에서 제공해주는 ArrayList는 데이터를 넣어주는만큼 사이즈가 늘어남.

Array List의 입력 및 검색 시간

ArrayList는 배열이 다 차면 배열을 두배로 늘려준다.

그래서 검색시 고정된 배열에서 검색을 하게 된다. (검색 시간 O(1))

Doubling - 기존 배열에서 2배로 늘려준 배열에 데이터를 복사(O(n))

ArrayList에서 Doubling을 할때 기존 데이터를 복사해오는 작업은 n/2가 소요된다.

이전에는 n/4가 소요됐을 것이고 그 이전에는 n/8이 소요됐을 것이다.

n/2 + n/4 + n/8 + ... + 2 + 1 < n

때문에 n개의 데이터를 넣을때 n의 시간보다 적게 걸리므로 O(1)이 된다.

결론

ArrayList의 평균시간

  • 검색 시간 O(1)
  • 입력 시간 O(1)

Array List 구현 코드 in Java

class ArrayList{
    private Object[] data;
    private int size;
    private int index;

    public ArrayList() {
        this.size = 1;
        this.data = new Object[this.size];
        this.index = 0;
    }
    public void add(Object obj) {
        System.out.println("index: " + this.index
                        + ", size: " + this.size
                        + ", data size: " + this.data.length);
        if(this.index == this.size -1) {
            doubling();
        }
        data[this.index] = obj;
        this.index++;
    }
    private void doubling() {
        this.size = this.size * 2;
        Object[] newData = new Object[this.size];
        for(int i = 0; i < data.length; i++) {
            newData[i] = data[i];
        }
        this.data = newData;
        System.out.println("doubling >>> index: " + this.index
                        + ", size: " + this.size
                        + ", data size: " + this.data.length);
    }
    public Object get(int i) throws Exception{
        if(i > this.index-1) {
            throw new Exception("ArrayIndexOutOfBound");
        }else if(i < 0) {
            throw new Exception("Negative Value");
        }
        return this.data[i];
    }
    public void remove(int i) throws Exception{
        if(i > this.index-1) {
            throw new Exception("ArrayIndexOutOfBound");
        }else if(i < 0) {
            throw new Exception("Negative Value");
        }
        System.out.println("data removed: " + this.data[i]);
        for(int x = i; x < this.data.length -1; x++) {
            data[x] = data[x + 1];
        }
        this.index--;
    }
}

public class ArrayListTest {
    public static void main(String[] args) throws Exception{
        ArrayList al = new ArrayList();
        al.add("0");
        al.add("1");
        al.add("2");
        al.add("3");
        al.add("4");
        al.add("5");
        al.add("6");
        al.add("7");
        al.add("8");
        al.add("9");
        System.out.println(al.get(5));
        al.remove(5);
        System.out.println(al.get(5));
    }
}

링크

아래 강의를 참고하여 작성하였습니다.

728x90
반응형

'DataStructure' 카테고리의 다른 글

[HashTable] Hash Table 개념, 구현  (0) 2021.01.14
[Graph] Graph 탐색 DFS, BFS  (0) 2021.01.14
[Graph] Graph 개념, 표현 방법  (0) 2021.01.14
[Tree] Trie Tree 개념  (0) 2021.01.14
[Tree] Binary Heaps 개념  (0) 2021.01.14