[자료구조] Set과 HashSet: 개념, List vs Set (메모리와 iteration 속도 관점에서)

2023. 12. 20. 16:00· Computer Science/Data Structure
목차
  1. 💋 Set ADT
  2. ✔️ 개념
  3. ✔️ 주요 동작
  4. ✔️ 언제 사용할까?
  5. ✔️ 구현
  6. 💋 Hash Set
  7. ✔️ 개념
  8. ✔️ 특징
  9. ✔️ Python Set vs Java HashSet
  10. 💋 List vs Set
  11. ✔️ 메모리 측면
  12. ✔️ iteration 속도
  13. ✔️ 결론
  14. 💋 참고자료
반응형
반응형

 

 

Computer Science 모아보기 👉🏻 https://github.com/seoul-developer/CS

 

GitHub - seoul-developer/CS: 주니어 개발자를 위한 전공 지식 모음.zip

주니어 개발자를 위한 전공 지식 모음.zip. Contribute to seoul-developer/CS development by creating an account on GitHub.

github.com

 

💋 Set ADT

✔️ 개념

  • 데이터를 저장하는 추상 자료형
  • 순서 보장 X
  • 데이터 중복 X

 

✔️ 주요 동작

  1. 삽입(Insertion)
    • 새로운 원소를 집합에 추가하는 동작
    • 집합에 이미 존재하는 원소는 중복으로 삽입되지 않는다.
  2. 삭제(Removal)
    • 주어진 원소를 집합에서 제거하는 동작
  3. 포함 여부(Containment)
    • 주어진 원소가 집합에 속하는지 여부를 확인하는 동작
  4. 교집합(Intersection)
    • 두 집합 간의 공통된 원소들을 모은 새로운 집합을 생성하는 동작
  5. 합집합(Union)
    • 두 집합의 모든 원소를 포함한 새로운 집합을 생성하는 동작
  6. 차집합(Difference)
    • 한 집합에서 다른 집합의 원소를 제거한 새로운 집합을 생성하는 동작
  7. 부분 집합 여부(Subsetting)
    • 한 집합이 다른 집합의 모든 원소를 포함하는지 여부를 확인하는 동작

 

✔️ 언제 사용할까?

  • 중복된 데이터를 제거해야 할 때
  • 데이터의 존재 여부를 확인해야 할 때

 

✔️ 구현

  • hash set
  • linked hash set (java)
  • tree set (java)

 

이중 오늘 살펴볼 것은 hash set이다!

 

💋 Hash Set

✔️ 개념

 

  • 해시 테이블을 사용해 구현 ⇒ 크기 상관없이 데이터 조회가 빠르다! 
    • 탐색에 특화된 자료구조로 평균 O(1)의 시간복잡도로 데이터를 탐색, 삽입, 삭제가 가능해, List보다 빠르다.
      • 단순하게 해시 함수에 키 값을 넣어 나온 해시 값으로 인덱스를 알고 접근할 수 있기 때문
      • 해시 충돌이 발생하여 하나의 인덱스에 데이터가 몰려있을 경우 시간복잡도는 O(N)으로 증가할 수 있다.
public HashSet() {
	this.map = new HashMap();
}

 

 

✔️ 특징

  • 데이터 삽입 시 해시값을 키로 사용해서 저장한다.
public boolean add(E e) {
	return this.map.put(e, PRESENT) == null;
}

 

  • 데이터 존재 여부 확인 시 해시값을 키로 사용해서 데이터에 접근한다.
public boolean contains(Object o) {
	return this.map.containsKey(o);
}

 

 

✔️ Python Set vs Java HashSet

 

 

 

💋 List vs Set

✔️ 메모리 측면

  • Set은 해시값을 저장해야 하기 때문에, 메모리를 많이 차지한다.
  • List는 해시값이나 포인터 없이 값만 순차적으로 저장해, 메모리를 적게 쓴다.

 

✔️ iteration 속도

  • List가 구현 특성 상 단순해서 더 빠르다.
  • HashSet은 내부 배열에 빈 공간이 존재해 데이터 iteration 시에 오버헤드가 발생한다.
    • Java의 LinkedHashSet는 이 점을 보완하기 위해서, 존재하는 데이터끼리 LinkedList로 이어 놓았지만, 여전히 포인터가 필요하게 되어 여전히 메모리를 더 사용해야 한다는 단점이 있다.
    • Java의 TreeSet의 경우에도 데이터를 순차적으로 순회하는데 비용이 발생한다.
    • iteration 속도가 비슷하다고 할지라도, 메모리 측면에서 리스트가 더 좋다!

 

 

✔️ 결론

  • Set이 적절한 상황이 아니라면, 대부분 List를 사용하는 것이 좋다.

 

💋 참고자료

  • https://www.youtube.com/watch?v=IkImFugfFQk&list=PLcXyemr8ZeoR82N8uZuG9xVrFIfdnLd72&index=6

 

 

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!

 

반응형

'Computer Science > Data Structure' 카테고리의 다른 글

[자료구조] Trie 자료구조로 문자열을 빠르게 탐색해 보자! (feat. 검색창 자동 완성)  (0) 2023.12.21
[자료구조] Graph: 개념, Vertices/Edges, 종류, 트리구조와 비교, 표현 (Adjacency Matrix vs Adjacency List)  (4) 2023.12.20
[자료구조] Map과 Hash Table: 해시 함수와 해시 충돌의 해결, 해시 테이블 리사이징  (3) 2023.12.19
[자료구조] B-Tree 자료구조가 DB 인덱스에 사용되는 이유: secondary storage 접근과 block 단위의 저장 공간 활용 관점에서  (0) 2023.12.19
[자료구조] B-Tree의 개념, 파라미터, 데이터 삽입, 삭제 과정을 알아보자!  (2) 2023.12.18
  1. 💋 Set ADT
  2. ✔️ 개념
  3. ✔️ 주요 동작
  4. ✔️ 언제 사용할까?
  5. ✔️ 구현
  6. 💋 Hash Set
  7. ✔️ 개념
  8. ✔️ 특징
  9. ✔️ Python Set vs Java HashSet
  10. 💋 List vs Set
  11. ✔️ 메모리 측면
  12. ✔️ iteration 속도
  13. ✔️ 결론
  14. 💋 참고자료
'Computer Science/Data Structure' 카테고리의 다른 글
  • [자료구조] Trie 자료구조로 문자열을 빠르게 탐색해 보자! (feat. 검색창 자동 완성)
  • [자료구조] Graph: 개념, Vertices/Edges, 종류, 트리구조와 비교, 표현 (Adjacency Matrix vs Adjacency List)
  • [자료구조] Map과 Hash Table: 해시 함수와 해시 충돌의 해결, 해시 테이블 리사이징
  • [자료구조] B-Tree 자료구조가 DB 인덱스에 사용되는 이유: secondary storage 접근과 block 단위의 저장 공간 활용 관점에서
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기 N
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science N
      • Operating System
      • Computer Architecture
      • Network N
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • Graphics
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA N
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 아키텍처
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • OOP
  • 레벨로그
  • 컴포지션
  • TDD
  • Composition
  • 상속과조합
  • 상속
  • 스트림
  • lamda
  • 함수형프로그래밍
  • Stream
  • 람다와스트림
  • 우테코
  • 예외
  • 우테코5기
  • Java
  • 우아한테크코스
  • 우아한테크코스5기
  • 조합
  • 람다
hELLO · Designed By 정상우.v4.2.0
깃짱
[자료구조] Set과 HashSet: 개념, List vs Set (메모리와 iteration 속도 관점에서)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.