코딩테스트/자료구조(스택,큐,해시,힙)

[해시] 해시 이론

영최 2024. 9. 5. 14:18
728x90

✅ 파이썬에서 해시(Hash)Dictionary 를 통해 구현 가능함

 

언제 사용?

1) 키-값으로 저장할때 (숫자 아닌값으로 저장-찾을때)
2) 빠른 접근-탐색 시 O(1)
3) 집계 필요 시  -> from collections import Counter

 

✅ Dictionary 사용법

#dict.fromkeys([arr],value)
arr원소를 key로하고 value를 가진 딕셔너리가 생성됨
keys = ['a', 'b', 'c']
value = 0
d = dict.fromkeys(keys, value)
print(d)  # 출력: {'a': 0, 'b': 0, 'c': 0}

# 빈딕셔너리 생성
dict1 = {} # {}
dict2 = dict() # {}

# 특정 key-value쌍을 가진 dictionary 선언
student1 = { 'name': '나영' , 'age': 28}

# dictionary를 value로 가지는 dictionary 선언
class = 
{ 'student1 = { 'name': '나영' , 'age': 28},
   'student2': {'name': '아영','age': 28 }}
   
# [] 기호 사용해 원소 가져오기
student1['name'] # 나영

# get 메소드를 아용해 원소 가져오기 1
# 딕셔너리에 해당 key가 없을때 Key Error 를 내는 대신, 지정한 값을 가져온다.
student1.get('height', 0) # 0
student1.get('name', 0) # 나영

# 값 집어넣기
student1['age'] = 120

# 값 수정
student1['age'] += 120

# del 이용하기 - 키가 있는 경우
dict = {'김철수': 300, 'Anna': 180}
del dict['김철수']

# pop 이용하기 - 키가 있는 경우 대응하는 value 리턴
my_dict = {'김철수': 300, 'Anna': 180}
my_dict.pop('김철수', 180) # 300

 

 Counter 사용법

from collections import Counter

>>> Counter(["hi", "hey", "hi", "hi", "hello", "hey"])
Counter({'hi': 3, 'hey': 2, 'hello': 1})

>>> Counter("hello world")
Counter({'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})

>>> counter = Counter("hello world")
>>> counter["o"], counter["l"]
(2, 3)


>>> counter["l"] += 1
>>> counter["h"] -= 1
>>> counter
Counter({'h': 0, 'e': 1, 'l': 4, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1})


>>> if "o" in counter:
>>>     print("o in counter")

>>> del counter["o"]

>>> if "o" not in counter:
>>>     print("o not in counter")
    
# most_common() 가장 많은 순 정렬
>>> Counter('hello world').most_common() 
[('l', 3), ('o', 2), ('h', 1), ('e', 1), (' ', 1), ('w', 1), ('r', 1), ('d', 1)]

# most_common(K)가장 많은 순 정렬중 K만큼 반환
>>> Counter('hello world').most_common(1)
[('l', 3)]


counter1 = Counter(["A", "A", "B"])
counter2 = Counter(["A", "B", "B"])

#이 두 객체를 더할 수도 있음
>>> counter1 + counter2
Counter({'A': 3, 'B': 3})

#이 두 객체를 뺄 수도 있습니다.
>>> counter1 - counter2
Counter({'A': 1})
728x90