- Iterable(반복가능한) : 주어진 값을 하나씩 뽑아낼 수 있는 것을 의미
int는 iterable하지 않은 객체. 12를 1과2를 나눌수는 없다.
의미는 이해하지만 for문을 통해 뽑아주거나 여러개의 값을 리스트와 같은 형식에 넣어주지 않았을때 자주 접하게 되는 오류
대표적으로 iterable한 타입 - list, dict, set, str, bytes, tuple, rang- .next 내장함수를 통해 지정값의 다음번째 값을 뽑아낼 수 있다.
- 인덱스(Index) : 각 자료마다의 번호를 의미. (Iterable한 타입에서 가능한 것이 아닐까? 싶다.)
번호는 0번부터 지정되며, 음수 인덱스 또한 가능하다.(-1이 제일 마지막 자료, 이후 자료의 역순으로 -2,-3, ...이 지정된다.)- 인덱싱(Indexing) : 주어진 인덱스를 통해서 자료값을 뽑아내는 것.
- 산술기호 // : %과 대비되는 몫을 나타내주는 산술기호
기본적인 내용들인데 강의 진행 하는데 어려움이 있어, 검색을 통해서 내 나름대로 정리해봤다.
(Binary) Heap 강의에서 한 내용을 클론 코딩 해보면서 느낀점을 정리해보면
이진(Binary) 힙, 기본적으로 이진함수 형태로 나타낸다.
삼각형 형태의 나무 형식으로 가장 꼭대기가 root(다른 방식으로 표현하면 Max heap, min heap)로 root에서부터 2개씩 나뉘어져서 나오는 형태
만약 최대힙이라면 자료값은 왼쪽형태, 순서를 지정해주지 않는다면 컴퓨터가 숫자를 읽는 방식대로 인덱스는 오른쪽 형태로 나타난다.7 0 6 5 1 2 2 4 5 3 3 4 5 6
다만, 우리는 계산편의를 위해 0번째 인덱스에 None 값을 넣어줘서 1번부터 차례대로 나오게 할 수 있다. maxheap을 구현하는 코드에서 이닛함수에 self.value = [None] 형태로 지정해주면 클래스를 생성할때 첫번째가 항상 none이 되고 위와 같은 경우에는 리스트 형식으로 [None,7,6,5,2,4,5,3]같은 형태로 표현가능하다. 그리고 만들 수 있는 기능(메서드)가 삽입과 추출이 있는데, 삽입은 아래에서 위로 진행하면서 값을 비교하는 예의 percolate_up 함수가, 추출은 위에서부터 아래로 진행하면서 값을 비교하는 percolate_down 함수가 각각 대응되어야 한다.
def _percolate_up(self): cur = len(self) # left 라면 2*cur, right 라면 2*cur + 1 이므로 parent 는 항상 cur // 2 parent = cur // 2 while parent > 0: if self.items[cur] > self.items[parent]: self.items[cur], self.items[parent] = self.items[parent], self.items[cur] ######################### cur = parent parent = cur // 2
아래에서 위로부터 가야 되기 때문에 생성된 클래스의 길이 len값이 내가 지금 보고 있는 곳(cur)으로 지정되면 된다. len은 1부터 진행해서 7까지 있지만 리스트의 순서는 none이 리스트의 0번째로 되어서 마지막 값이 7로 대응해줄 수가 있다. 다만 cur은 특정값이 아니라 순서의 의미기 때문에 값을 비교할때는 self.value[cur]이런식으로 리스트의 순서에 cur이 들어가줘야 한다.
이진함수의 특성상 2로 나눈 몫이 항상 parent(위치한 녀석의 뿌리)를 지칭해줄 수 있기 때문에 parent(만약 끝까지 올라간다면, 최종적으로는 root)값이 0이상일때까지 while문이 진행된다.