sonzwon 2022. 7. 29. 01:22

# List

리스트란? 선형적인 자료구조로 데이터를 일렬로 늘여 놓은 형태입니다. 일렬로 늘여 놓았기 때문에 순서가 있습니다.

리스트는 Array List와 Linked List로 나뉘며, 연결방식에 따라 Single Linked List와 Double Linked List로 나뉩니다.

 

# ArrayList

array list는 배열 기반의 리스트 이기 때문에 배열과 같은 인덱스를 사용합니다. 이 인덱스를 통한 데이터 접근은 random access방식이기 때문에 리스트에 얼만큼의 데이터가 있던지 간에 인덱스만 알고 있으면 동일한 시간을 소요해서 데이터에 접근할 수 있습니다.

또한, array list는 실제 컴퓨터의 물리적인 공간(메모리공간)에서도 연속적인 공간을 사용하기 떄문에 컴퓨터가 연산하기 쉬운 구조를 가지고 있습니다. 그래서 다음 인덱스로 접근하는 속도가 빠릅니다.

 

# 코드 구현 (python)

class ArrayList:
    def __init__(self, default_size = 5):
        self.size = 0    #데이터갯수(인덱스가 됨)
        self.max_size = default_size  # 배열의 길이(공간)를 지정
        self.list = [None] * self.max_size

 

[ increase size ]

arraylist는 배열의 길이가 정해져야 합니다. 그래서 데이터를 추가하다보면 공간이 모자를 수 있기 때문에, 배열의 길이를 늘려주는 함수를 생성합니다.

def _increase_size(self):
    new_max_size = self.max_size * 2
    new_list = [None] * new_max_size
    for i in range(new_max_size):
        new_list[i] = self.list[i]
    self.max_size = new_max_size
    self.list = new_list

new_max_size = self.max_size * 2   원래길이의 2배 사이즈 지정
new_list = [None] * new_max_size    2배 길이의 리스트를 새로 만들어주고(None으로 공간을 채워줌)

for i in range(new_max_size):
    new_list[i] = self.list[i]                    원래 리스트의 데이터을 새로운 리스트에 넣어줌
self.max_size = new_max_size        리스트 길이가 2배가 됨
self.list = new_list                              새로운 리스트가 우리의 리스트가 됨

 

[ add ] 

arraylist에서 데이터 추가기능은 원래 배열의 끝에 추가됩니다.

def add(self, value):
    if self.size >= self.max_size:
        self._increase_size()   
    self.list[self.size] = value
    self.size += 1

  

    if self.size >= self.max_size:      데이터를 추가할 공간이 없으면 공간을 늘려준 다음
        self._increase_size()   
    self.list[self.size] = value            원래 배열의 끝에 데이터 추가
    self.size += 1                                추가됐으니까 사이즈 +1

 

[ insert ] 

arraylist에서 데이터 삽입기능도 인덱스를 지정해 바로 삽입가능합니다. 하지만, 중간에 데이터를 삽입했으니 추가한 데이터 이후로 한칸씩 뒤로 미뤄주는 작업이 추가적으로 필요합니다. 그래서, 시간복잡도 O(N)이 소요됩니다.

def insert(self, idx, value):
    if self.size >= self.max_size:
        self._increase_size()   
    for i in range(idx, self.size+1):
        self.list[i+1] == self.list[i] 
    self.list[idx] = value
    self.size += 1

    for i in range(idx, self.size+1):
        self.list[i+1] == self.list[i]           삽입할 공간을 만들어 주기 위해 하나씩 뒤로 미룸

    self.list[idx] = value           공간에 데이터를 삽입
    self.size += 1                       삽입했으니 사이즈 +1

 

[ delete ] & [ delete by index ]

delete기능은 입력한 데이터 값으로 삭제하고, delete by index는 입력한 인덱스의 데이터를 삭제합니다. 삭제 기능도 삽입기능과 마찬가지로 데이터 삭제 후 생긴 빈공간을 매꾸기위해 데이터를 하나씩 앞으로 땡겨옵니다.

def delete(self, value):
    for i in range(self.size):
        if self.list[i] == value:
            for j in range(i,self.size):
                self.list[j] == self.list[j+1]
            self.size -= 1
        else:
            raise Exception ("Can not find the data")

    for i in range(self.size):             배열에서
        if self.list[i] == value:             입력한 데이터값과 같은 데이터가 발견되면

            for j in range(i,self.size):     
                self.list[j] == self.list[j+1]        하나씩 땡겨와서 덮어버림
            self.size -= 1                                사이즈 -1
        else:                                       데이터를 못찾은 경우 예외 발생
            raise Exception ("Can not find the data")

def deletebyidx(self, idx):  
    if idx < 0 or idx > self.size:    #입력한 인덱스가 배열의 길이보다 큰 경우 예외 발생
        raise Exception ("Invalid Index")
    for i in range(idx, self.size):
        self.list[i] = self.list[i+1]
    self.size -= 1

 

# 전체 코드

전체코드와 다른 기능들은 깃허브를 참고하시면 됩니다.

https://github.com/sonzwon/TIL/blob/master/data_structure_List.py

 

GitHub - sonzwon/TIL: Today I Learned

Today I Learned. Contribute to sonzwon/TIL development by creating an account on GitHub.

github.com