본문 바로가기

Data Structure

[Data Structure] #2. Set, Dictionary, Hash

What you will learn

  • 자료구조의 개념 필요성, 그리고 다양한 종류의 자료구조에 대한 이해

  • set의 개념과 장점, 단점, 그리고 언제 사용하면 좋을지에 대한 이해

  • dictionary 의 개념과 생성방법, 그리고 어떻게 접근하는 지에 대한 이해

SET

  • Set은 리스트처럼 순열 자료구조이지만, 순서라는 개념이 부재.

  • 데이터를 비순차적(unordered)으로 저장할 수 있는 순열 자료구조(collection)

  • 삽입(insertion) 순서대로 저장되지 않는다. 즉 특정한 순서를 기대할 수 없는 자료구조.

  • 수정 가능하다 mutable

  • 동일한 값을 여러번 삽입 불가능하다. 동일 값이 여러번 삽입되면 하나의 값만 저장된다.

  • Fast Lookup이 필요할 떄 주로 쓰인다.

  • Set에서 요소들이 저장될 때 순서는 다음과 같다

    • 1) 저장할 요소의 값의 hash값을 구한다.

    • 2) hash값에 대하당하는 공간(bucket)에 값을 저장한다.

  • 이렇게 set은 저장하고자 하는 값의 해쉬값에 해당하는 버켓에 값을 저장하기 때문에 순서가 없다. 순서가 없기 때문에 인덱싱도 없다. 

  • 그리고 해쉬값 기반의 버켓에 저장하기 때문에 중복된 값을 저장할 수 없다.

  • 해쉬값을 기반으로 저장하기 때문에 look up이 굉장히 빠르다

    • Look up: 특정한 값을 포함하고 있는 지를 확인하는 것. ==> 5 in my_set

    • Set의 총 길이와 상관없이 단순히 해쉬값 계산 후 해당 버켓을 확인하면 됨으로 0(1)

  • hash는 단방향(one way) 암호화 이다. 단방향이란 한 번 암호화가 하면 복호화가 안된다는 뜻이다. 실제 값의 길이와 상관없이 헤쉬값을 일정한 길이를 가진다. 그러므로 hash는 주로 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑할 때 사용된다. 

 

When To Use Set

  • 중복된 값을 골라내야 할 때

  • 빠른 look up 을 해야 할 때

  • 그러면서 순서는 상관 없을 때


Dictionary / HashMap / HashTable

 

Dictionary(다른 언어에서는 hashmap이나 hash table이라고 하기도 함)는 Key-value 형태의 값을 저장할 수 있는 자료구조이다. 이름은 "정우성" 등 실제 데이터 값과 데이터를 설명하는 key의 대응 관계를 표현할 때 유용하다. 

 

딕셔너리의 특성

  • Set과 마찬가지로 특정 순서대로 데이터를 리턴하지 않는다.
  • Key의 값은 중복될 수 없다. 만일 중복된 key가 있으면 먼저 있던 key 와 value 를 대체한다.
  • 수정가능하다(mutable)

딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는 get(x, '디폴트 값')을 사용하면 편리하다.

>>> a.get('foo', 'bar')
'bar'

 

  • Set와 비슷하게 key 값의 해쉬값을 구한 후, 해쉬값에 속해있는 bucket에 값을 저장한다.
  • 그러므로 set과 마찬가지로 순서가 없고, 중복된 키값은 허용되지 않는다. 

When To Use Dictionary

  • 마치 데이터베이스처럼 키와 값을 묶어서 데이터를 표현해야 할 때 유용하다. 실제 데이터베이스에서 읽어들인 값을 딕셔너리로 변환해서 사용 자주 함. 

Set 자료구조는 어떤 경우에 유용하게 사용할까? set 을 사용하면 배열의 중복 항목을 간단하게 확인하는 함수를 구현할 수 있다.

그리고 여러 배열들로부터 유일한 값을 가지는 배열을 재생성할 수 있다.

 

 

 

 

hash값은 일정한 길이를 가지고, 주로 임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑할 때 사용한다.