대왕판다
ESTP 하고재비로 살아가기
대왕판다
전체 방문자
오늘
어제
  • 분류 전체보기
    • 일상
      • 먹고재비
      • 생각대로
    • 개발
      • html css
      • 자바
      • 자바스크립트
      • 파이썬
      • 알고리즘
      • 북TIL
      • 네트워크
      • 객체지향개발

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 맛집
  • 노개북
  • 코딩
  • 상길북
  • 양산맛집
  • css
  • 마이바티스
  • 파이썬
  • 백준
  • 양산
  • 타입스크립트
  • 클론코딩
  • 자바스크립트
  • 알고리즘
  • 노마드코더
  • 챌린지
  • 브루트포스
  • html
  • 자바
  • 리액트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
대왕판다

ESTP 하고재비로 살아가기

개발/북TIL

파이썬 알고리즘 인터뷰 9, 10, 11장 - 스택, 큐, 데크, 우선순위 큐, 해시 테이블

2022. 11. 7. 23:03

오늘 TIL 3줄 요약

  • 스택은 거의 모든 APP을 만들때 사용되는 자료구조로서, 스택과 연관된 알고리즘을 제대로 이해하느냐 못 하느냐에 따라서 기본 알고리즘을 설계할 수 있느냐 없느냐가 결정되기도 한다.
  • FIFO로 처리되는 큐는 BFS, 캐시 등을 구현할 때 널리 사용된다. 데크나 우선순위 큐 같은 변형들도 유용하다. 성능을 위해 파이썬에서는 데크를 사용하는 것이 가장 좋다.
  • 파이썬에서는 대부분의 우선순위 큐 풀이에 heaqpq 모듈을 사용한다.

TIL (Today I Learned) 날짜

  • d2022 10. 24. ~ 2022. 11.07

오늘 읽은 범위

  • 파이썬 알고리즘 인터뷰 9장 스택, 큐, 10장 데크, 우선순위 큐, 11장 해시 테이블

책에서 기억하고 싶은 내용을 써보세요.

  • 파이썬의 Global Interpreter Lock
 -  **하나의 스레드가 자원을 독점하는 형태로 실행**된다.


 -  번거로운 동시성 관리를 편하게 하기 위해, 스레드 세이프 하지 않은 CPython의 메모리 관리를 쉽게하기 위해


 -  GIL로 파이썬 객체에 대한 접근을 제한하는 형태로 설계했다.


 -  *스레드 세이프 - 멀티 스레드에도 안전한 프로그래밍 개념. 스레드 세이프 하지 않은 경우 1번 스레드 값이 2번 스레드에서 변경이 될 수 있어 문제가 발생한다.*


 -  CPython이 개발되던 1994년에는 CPU가 싱글코어로 GIL을 선택할 만했고, 디자인에 아무런 문제가 없었다. 하지만 지금처럼 멀티코어가 당연한 세상에서 이런 제약은 치명적이다. **파이썬이 왜 느린가?** 를 얘기할때 가장 자주 듣게 되는 요인!
  • 해시테이블 또는 해시 맵은 키를 값에 매핑할 수 있는 구조인, 연관 배열 추상자료형을 구현하는 자료구조다.
  • 해시테이블의 가장 큰 특징은 대부분의 연산이 분할 상환 분석에 따른 시간복잡도가 O(1)이라는 점이다. -> 데이터 양과 무관하게 빠른 성능 보장
  • 충돌은 생각보다 쉽게 일어난다. 비둘기집 원리에 따라 생일이 같으려면 366명 이상이 모여야 할 것 같다. 그러나 실제로는 23명만 모여도 50%를 넘고, 57명이 모이면 99%를 넘어간다!
  • # 위의 생일 중복자 실험 코드
    import random
    
    TRAIALS = 100000
    smae_birthdays = 0
    # 10만 번 실험 진행
    for _ in range(TRAIALS):
          birthdays= []
        # 23명이 모였을 때 생일이 같을 경우 same_birthdays +=1
        for _ in range(23):
              birthday = random.randint(1, 365)
            if birthday in birthdays:
                  same_birthdays +=1
                break
            birthdays.append(biorthday)
    print(f"{same_birthdays / TRIALS * 100}") 
    # 50.708%
  • 비둘기집 원리란 n개의 아이템을 m개의 컨테이너에 넣을 때, n>m 이라면 적어도 하나의 컨테이너에는 반드시 2개 이상의 아이템이 들어있다는 원리

  • 아무리 좋은 해시함수라도 충돌은 일어난다. 충돌이 발생할 경우

    1. 개별 체이닝으로 처리한다. 충돌 발생 시 연결 리스트로 연결하는 방식을 개별 체이닝이라고 한다.
    2. 오픈 어드레싱 방식으로 해결한다. 이는 충돌 발생 시 탐사를 통해 빈 공간을 찾아나서는 방식이다.
  • 로드팩터란 해시테이블에 저장된 데이터 개수 n을 버킷의 개수 k로 나눈 것이다. 이 로드팩터 비율에 따라 해시 함수를 재작성할지, 해시 테이블의 크기를 조정해야할지를 결정한다

  • 리트코드 771번 보석과 돌의 한줄 풀이

    • # J = "aA",  S = "aAAbbbb"
      def numJewelsINStones(self, J:str, S:str) -> int:
          return sum(s in J for s in S) 
        # == return sum([True, True, True, False, False, False, False])
        # == return 3
  • 파이썬의 zip() 함수

    • zip()함수는 2개 이상 시퀀스를 짧은 길이 기준으로 일대응 대응하는 새로운 튜플 시퀀스를 만든다

    • a = [1,2,3,4,5]
      b = [2,3,4,5]
      c = [3,4,5]
      zip(a,b) # <zip object at 0x105b6d0b0> (제너레이터)
      list(zip(a,b)) # [(1,2), (2,3), (3,4), (4,5)]
      list(zip(a,b,c)) # [(1,2,3), (2,3,4), (3,4,5)]
  • 파이썬 아스테리스크 *

    • 별표, 아스테리스크라 부르는 는 *시퀀스 언패킹 연산자**다.

    • C의 포인터 변수와 혼동될 수 있지만 파이썬에는 포인터 변수가 존재하지 않는다.

    • 다음과 같이 활용될 수 있다.

    • fruits = ['lemon','pear','watermelon','tomato']
      print(*fruits) # lemon pear watermelon tomato
    • 위 zip()과 더불어 활용할 수 있다.

    • nums = [1,1,1,2,2,3] k = 2
      
      collections.Counter(nums).most_common(k) # [(1,3), (2,2)]
      # 언패킹을 하면
      list(zip(*collections.Counter(numse).most_common(k))) # [(1,2), (3,2)]
      # 언패킹을 하지 않으면
      list(zip(collections.Counter(numse).most_common(k))) # [((1,3), (2,2),)]
      
    • 함수의 파라미터가 되었을때는 반대로 패킹도 가능하다.

    • def f(*params):
            print(params)
      f('a','b','c')     # ('a','b','c')
    • 또 다른 예시. 변수의 할당도 묶어서 처리할 수 있다.

    • a, *b = [1,2,3,4]
      a # 1
      b #[2,3,4]

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

  • 여전히 풀이 코드를 쉽게 읽어낼 순 없지만 조금씩 속도가 올라가는 듯하다. 화이팅.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • abstract data type(ADT) 아래 정의를 따르는 데이터 구조의 모델이다.

    1. 데이터 컬렉션의 속성
    2. 데이터에 대해 수행할 수 있는 작업

    An ADT has two parts:

    1. 사용자가 볼 수 있는 항목: 개념적 그림(객체, 구조가 어떻게 구성되었는지에 대한 사용자의 견해). 개념 작업(사용자가 ADT에 수행할 수 있는 작업)
    2. 프라이빗 혹은 내부 파트로 구성되어 있습니다. 작업 구현(실제 구조가 어떻게 저장되는지)의 표현(실제 코드)
  • 파이썬 heappush에서 추가 인자 삽입

    • # Tuple in heappush method args
      heappush(h, value)
      # Heap elements can be tuples. 
      # This is useful for assigning comparison values (such as task priorities)
      h = []
      heappush(h, (5, 'write code'))
      heappush(h, (7, 'release product'))
      heappush(h, (1, 'write spec'))
      heappush(h, (3, 'create tests'))
      heappop(h)
      (1, 'write spec')
      # https://docs.python.org/3/library/heapq.html
      
      # 책 274 페이지 'k개 정렬 리스트 병합' 문제 풀이 중
      for lst in lists:
            heapq.heappush(heap, (lst.val, lst))
      # TypeError: '<' not supported between instances of ListNOde and ListNode
      # (중복된 값을 넣을 수 없다는 에러) 가 있을때 오직 추가 방지만을 위해 추가 인자를 삽입한다.
      for lst in range(len(lists)):
            heapq.heappush(heap, (lists[i].val, i, lists[i]))

'개발 > 북TIL' 카테고리의 다른 글

파이썬 알고리즘 인터뷰 23장 다이나믹 프로그래밍(DP)  (0) 2022.11.11
[북TIL] 파이썬알고리즘인터뷰 6. 문자열 조작  (0) 2022.07.27
파이썬 알고리즘 인터뷰 5장 리스트, 딕셔너리  (0) 2022.07.20
[북TIL] 파이썬 알고리즘 인터뷰 1~3장  (0) 2022.07.14
[북TIL] 실용주의 프로그래머 4. 실용주의 편집증  (0) 2022.05.20
    '개발/북TIL' 카테고리의 다른 글
    • 파이썬 알고리즘 인터뷰 23장 다이나믹 프로그래밍(DP)
    • [북TIL] 파이썬알고리즘인터뷰 6. 문자열 조작
    • 파이썬 알고리즘 인터뷰 5장 리스트, 딕셔너리
    • [북TIL] 파이썬 알고리즘 인터뷰 1~3장
    대왕판다
    대왕판다
    let's learn and roll!

    티스토리툴바