반응형

Python에서의 배열과 리스트

유형 설명
배열
(Array)
같은 Type의 자료끼리 묶은 모음

배열의 요소들은 메모리 상으로도 연속적으로 배치함
리스트
(List)
다른 Type의 자료끼리도 묶일 수 있음

리스트의 요소들은 메모리 상에서 연속적으로 배치될 필요가 없음

 기존에 있던 배열은 요소들을 저장하기 위해 메모리 공간을 연속적으로 사용한다고 했다. 이에 따라 이미 생성된 배열의 중간에 새로운 요소를 삽입하거나, 특정 요소를 삭제하기 위해서는 완전히 새로운 배열의 공간을 할당 받아 새로운 배열을 다시 만들어야 했다.

 

이러한 한계를 연결 리스트를 통해 해결할 수 있다.

 

연결 리스트(Linked List)

 연결 리스트란 위 처럼 '노드'를 연결시킨 자료구조다.

여기서 노드란 값을 저장하는 item과 다음 노드의 주소를 저장하는 link를 저장하는 자료구조다.

위 사진에서 볼 수 있듯이, 마지막 노드에 해당하는 포도 노드의 link는 null이 저장된다.

 

 연결 리스트는 앞서 언급한 '배열에서의 중간 요소 삽입, 삭제의 어려움'을 해결할 수 있다. 다음 노드의 주소를 가리키는 link의 값만 바꾸어주면 중간 요소의 삽입과 삭제를 간편히 해결할 수 있게 된다!

 

다만 연결 리스트는 값만 저장했던 배열과 달리, '노드'(값을 저장하는 item과 다음 노드의 주소를 저장하는 link를 저장하는 자료구조)를 연결했기 때문에 배열보다 메모리 공간을 2배 더 사용한다.

 

그리고 연결 리스트는 노드들이 메모리 내에 어디에 저장되어 있든지 link를 통해 찾을 수 있기 때문에 메모리 공간을 연속적으로 사용할 필요가 없다. 이로 인해 물리적으로 노드들이 저장된 메모리 공간들이 떨어져 있기 때문에 사용할 때 시간이 더 많이 소요될 수 있다.

 

연결 리스트의 장단점

리스트 (List) 설명
장점 요소를 추가할 때 노드 값만 바꾸면 됨

요소들을 저장하기 위해 메모리를 연속적으로 저장할 필요가 없음
단점 메모리를 많이 씀

연속적으로 저장되지 않았기 때문에 느림

연결 리스트는 위와 같은 장단점이 있다.

때문에 삽입, 삭제가 아주 빈번하고 그 규모가 클 경우에 Linked List를 사용하면 좋다.

 

실습: Linked List 구현하기

class Node:
    def __init__(self, item = None, link = None):
        self.item = item
        self.link = link


class LinkedList:
    def __init__(self):
        self.root = Node()
    
    def append(self, item):
        curNode = self.root
        newNode = Node(item)
        if(curNode.link == None):
            curNode.link = newNode
        else:
            while(curNode.link != None):
                curNode = curNode.link
            curNode.link = newNode

    def size(self):
        cnt = 0
        curNode = self.root
        while(curNode.link != None):
            curNode = curNode.link
            cnt += 1
        return cnt
    
    #insert
    def insert(self, index, item):
        curNode = self.root
        newNode = Node(item)
      
        for i in range(index):
            curNode = curNode.link
        _temp = curNode.link
        curNode.link = newNode
        newNode.link = _temp


    #search
    def search(self, item):
        curNode = self.root

        index = 0
        while (True):
            curNode = curNode.link
            if (curNode.item == item):
                break
            index += 1
        
        return index


    #delete
    def delete(self, item):
        curNode = preNode = self.root

        while (True):
            preNode = curNode
            curNode = curNode.link
            if (curNode.item == item):
                break
        preNode.link = curNode.link

    
    def pprint(self):
        #to print prettier, I programmed curNode as self.root.link
        curNode = self.root.link
        while(curNode.link != None):
            print(curNode.item, end=", ")
            curNode = curNode.link
        print(curNode.item)


fruits = LinkedList()
fruits.append('사과')
fruits.append('앵두')
fruits.append('배')
fruits.pprint()
fruits.size()
fruits.insert(2, '딸기')
fruits.pprint()
fruits.delete('배')
fruits.pprint()
#결과

사과, 앵두, 배
사과, 앵두, 딸기, 배
사과, 앵두, 딸기

 

반응형

'대학교 공부 > 자료구조론 (2023)' 카테고리의 다른 글

1주차 - 자료구조란  (0) 2023.02.27

+ Recent posts