JEon.E
일단 ML 엔지니어 생존일지
JEon.E
전체 방문자
오늘
어제
  • 분류 전체보기 (164)
    • 논문 스터디 (8)
      • 논문 구현 (0)
      • Code-LLM (0)
      • ML attack (6)
      • Fuzzing (2)
    • 동향 및 조사 (3)
    • Stack Overflow (6)
    • Setting Tips (14)
    • ML 엔지니어링 (1)
      • AI Math (0)
      • Pytorch (1)
    • 알고리즘 (132)
      • 이론 (8)
      • 문제풀이 (105)
      • 삼성 기출 문제풀이 (18)
    • Hack (0)
      • 해킹 맛보기 (0)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • dfs
  • 백트래킹
  • 강화학습
  • 네이버 부스트캠프
  • 시뮬레이션
  • Graph
  • NLP black-box attack
  • Fuzzing 동향
  • keras
  • 프로그래머스
  • greedy
  • 그래프
  • BFS
  • 구현
  • 크루스칼
  • BOJ
  • Adversarial Defense
  • 플로이드-워샬
  • 다시
  • dp

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
JEon.E

일단 ML 엔지니어 생존일지

알고리즘/이론

[알고리즘 파이썬편] 해시와 셋의 사용방법

2022. 2. 20. 17:34

Python:: 해시, 셋 사용방법

 

해시 개념 및 사용방법


Python의 Hash는 Dictionary는 기본으로 dict 클래스에 구현되어있음

해시는 언제 사용해야하는가.

 

데이터의 중복이 없어도 될 때 : 집합의 모든 데이터는 유일함. 동일 원소를 제거할 때 사용하자.

빠른 접근 / 탐색이 필요할 때 : 딕셔너리는 대부분의 시간복잡도가 O(1)로 탐색이 매우 빠른 자료구조임

집계를 할때 : 코딩테스트에서는 각 원소의 개수를 세야하는 문제가 많이 나온다. 이때 사용하기 유용함! (collections의 모듈 Counter 클래스!!)

Dictionary와 리스트의 시간 복잡도를 비교해보자.

Operation Dictionary List
Get Item O(1) O(1)
Insert Item O(1) O(1) ~ O(N)
Update Item O(1) O(1)
Delete Item O(1) O(1) ~ O(N)
Search Item O(1) O(N)

Dictionary :: init

dict1 = {} dict2 = dict() dict3 = {'name' = 'a', 'age' = 60} dict4 = {'countries': {'capital':'seoul','continent':'Asia'}}

 

Dictionary :: Get

  my_dict.get('name', '홍길동')

 

딕셔너리 원소를 가져올 때는 1) []  2)get(key, x) 메소드를 사용한다.


1) 방법의 경우 딕셔너리에 key가 없으면 keyerror가 발생함
2) 의 경우 key가 없으면 x를 반환한다.

 

 

Dictionary :: Set

  my_dict['name'] = '에이미'
  my_dict['age'] += 30

딕셔너리에 값을 집어넣거나 업데이트 시 [key]를 사용한다.

 

 

Dictionary :: Delete

  del my_dict['김철수']
  my_dict.pop('김철수', 100)

딕셔너리에 특정 key값을 지우려면
1) del dict1[key] (key가 없으면 keyerror)
2) dict1.pop(key, default_value) (key가 없으면 default_value 리턴)

 

 

Dictionary :: Iterate

 

for key in my_dict: print(key, my_dict[key]) #key만 조회 for key, value in my_dict.items(): print(key, value) #key와 value 같이 조회 print(my_dict.keys()) #key만 뽑아냄 print(my_dict.values()) #값만 뽑아냄 print(my_dict.items()) #key, value를 튜플로 뽑아냄

 

 

Dictionary :: 집계를 위한 클래스 collections Counter class

  from collections import Counter
  my_list = ["박수진", "박수진", "홍길동", "김철수", "김철수"]
  my_counter = Counter(my_list)
  my_counter['박수진']
  dict(my_counter)

문제를 풀다보면 어떤 원소 x가 몇번 등장하는지 셀 필요성이 있음

 

 

 

집합 개념 및 사용방법


Python의 집합은 Set

 

집합은 언제 사용해야하는가.

 

리스트를 사용할 수 없을 때 : 원소에 접근하는 요소가 숫자 인덱스가 아닌 문자열이나 튜플일때, 사용한다.

 

다루는 데이터의 삽입/삭제/탐색 이 자주 일어날 때 (데이터가 정수가 아닐 때) : 문자열 등 리스트가 index로 활용하지 못하는 데이터를 빠르게 탐색할 때 매우 유용함. O(1) 소요

 

수학적으로 교집합/합집합/차집합을 구할 때 : 파이썬의 set은 수학 집합의 대부분의 기능을 수행한다.

 

 

 

set와 리스트의 시간 복잡도를 비교해보자.

Operation Dictionary List
탐색 O(1) "abc" in my_set
제거 O(1) my_set.remove("abc")
합집합 O(len(set1) + len(set2)) my_set1
교집합 O(min(len(set1), len(set2))) my_set1 & my_set2
차집합 O(len(set1)) my_set1 - my_set2
합집합 - 교집합 O(len(set1)) my_set1 ^ my_set2

 

집합의 주의사항

hashable한 타입만 집합에 넣을 수 있다. list, dict, set 유저 클래스 사용 불가능, tuple은 삽입 가능!

 

Set :: init

empty_set = set() my_set = set([1,2,3,4])

 

Set :: add

my_set.add('demi')

 

Set :: delete

my_set.remove('demi')

 

Set :: 집합

set1 = set([1,2,3,4,5]) set2 = set([3,4,5,6,7]) f_set = set1 | set2 s_set = set1 & set2 t_set = set1 - set2

반응형
저작자표시 비영리 변경금지

'알고리즘 > 이론' 카테고리의 다른 글

재귀 (== 분할정복)  (0) 2023.05.17
그래프 관련 알고리즘 요약 정리 (크루스칼, 프림, 위상 정렬)  (0) 2023.04.11
그래프 이론 요약 정리  (0) 2023.03.27
동적 계획법, 다이나믹 프로그래밍  (0) 2023.03.07
[알고리즘 파이썬편] 큐와 힙의 사용법  (0) 2022.02.20
    '알고리즘/이론' 카테고리의 다른 글
    • 그래프 관련 알고리즘 요약 정리 (크루스칼, 프림, 위상 정렬)
    • 그래프 이론 요약 정리
    • 동적 계획법, 다이나믹 프로그래밍
    • [알고리즘 파이썬편] 큐와 힙의 사용법
    JEon.E
    JEon.E
    ML Security Engineer로 살아남기 도전중 lluot.llu@gmail.com

    티스토리툴바