[자료구조] 3. Set, hash

lilyoh·2020년 8월 10일
0

1. 특징

  • 데이터를 비순차적(unordered)으로 저장할 수 있는 순열 자료구조 (collection)
  • 삽입 순서대로 저장되지 않는다. 특정한 순서를 기대할 수 없는 자료구조이다.
  • 수정 가능하다.
  • 동일한 값을 여러번 삽입 불가능하다. 동일한 값이 여러번 삽입되면 하나의 값만 저장된다.
  • Fast Lookup 이 필요할 때 주로 쓰인다.
>>> my_set = {1, 2, 3, 4, 5, 1, 2}
>>> my_set
{1, 2, 3, 4, 5}
>>> for i in my_set:
...     print(i)
...
1
2
3
4
5
>>> my_set.append(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'set' object has no attribute 'append'
>>> my_set[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing
>>> my_set.add(7)
>>> my_set
{1, 2, 3, 4, 5, 7}
>>>
>>> 5 in my_set # look up
True

2. 구조

  • set 의 요소들은 순차적으로 저장되지 않는다.
  • set 에서 요소들이 저장될 때의 순서는 이렇다.
    1. 저장할 요소의 값의 hash 값을 구한다.
    2. 해쉬값에 해당하는 공간(bucket) 에 값을 저장한다.
  • set 은 저장하고자 하는 값의 해쉬값에 해당하는 bucket 에 값을 저장하기 때문에 순서가 없다. 순서가 없으므로 index 도 없다.
  • 해쉬값 기반의 bucket 에 저장하기 때문에 중복된 값을 저장할 수 없다.
  • 해쉬값을 기반으로 저장하기 때문에 look up 이 굉장히 빠르다.
    • look up: 특정 값을 포함하고 있는지 확인하는 것 ex) 5 in my_set
    • set 의 총 길이와 상관없이 단순히 해쉬값 계산 후 해당 bucket 을 확인하면 되므로 0(1)

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

3. 언제 사용할까?

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

  • 빠른 look up 을 해야할 때

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

  • 유일한 값을 가지는 배열을 재생성하기

function isDuplicated(arr) {
    var mySet = new Set(arr);
    return mySet.size < arr.length;
}
console.log(isDuplicated([1,1,2,3]));
console.log(isDuplicated([1,2,3]));

function uniqueElements(list1, list2) {
    var mySet = new Set(list1.concat(list2));
    return Array.from(mySet);
}

console.log(uniqueElements([1,2,4,5],[ 2,3,5,6]));

0개의 댓글