c# 딕셔너리, 그래프

JHO·2024년 8월 1일
0

c#스터디

목록 보기
7/9

1. 딕셔너리

1-1. Dictionary

  • c#에서 Dictionary는 해시테이블로, key와 value로 이루어진 자료구조.
  • 키 값을 해시함수로 해싱하여 해시테이블의 특정 위치로 직접 엑세스하도록 만든 방식.
  • 해시: 임의의 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑

1-2. 해시테이블 구현

  • 데이터를 담을 테이블을 이미 크게 확보.
  • 입력받은 키를 해싱함수를 통해 해싱하여 테이블 고유한 index를 계산하고 데이터를 담아 보관.
  • Entry배열에 Hash, next, Key, value 값을 가짐.
  • Hash값이 bucket배열의 index를 가르킴.
  • Bucket배열에서는 Entries배열 중에서 매칭되는 data의 index값을 가르킴.

1-3. 키 충돌

  • 해시 함수가 서로 다른 입력 값에 대해 동일한 해시테이블 주소를 반환하는 것
  • 모든 입력 값에 대해 고유한 해시 값을 만드는 것은 불가능하며 충돌은 피할 수 없음.
    -> 해결방안으로 체이닝, 개방주소법 존재.
  • c#에서는 Hash 충돌일어나면 배열을 순회하면서 Entries 빈자리에 data를 삽입.
  • next값에 충돌이 일어난 index값 삽입.
  • bucket에서는 매칭되는 data의 index값을 바꿔줌.

1-4. 체이닝

  • 해시 충돌이 발생하면 연결리스트로 데이터들을 연결하는 방식.
  • 장점: 해시테이블에 자료사용률에 따른 성능저하가 적음.
  • 단점: 해시테이블 외 추가적인 저장공간 필요, 삽입삭제시 오버헤드가 발생.

1-5. 개방주소법

  • 해시 충돌이 발생하면 다른 빈 공간에 데이터를 삽입하는 방식.
  • 해시 충돌시 선형탐색, 제곱탐색, 이중해시 등을 통해 다른 빈 공간을 선정.
  • 장점: 추가적인 저장공간이 필요x, 삽입삭제시 오버헤드가 적음
  • 단점: 해시테이블에 자료 사용률에 따른 성능저하가 발생.

1-6. 재해싱

  • c#에서는 개방주소법을 사용.
  • 해시테이블의 공간 사용률이 높은 경우(70%이상) 급격한 성능저하가 발생.
    -> 따라서, c#에서는 70%이상의 공간을 사용하는 경우 재해싱!
  • 해시테이블의 크기를 늘리고 테이블 내의 모든 데이터를 다시 해싱하여 보관한다.

1-7. 시간복잡도

  • 접근: x
  • 탐색: O(1)
  • 삽입: O(1)
  • 삭제: O(1)
  • 해시테이블의 탐색 삽입 삭제는 모두 O(1)이지만, 삽입과 삭제가 빈번하게 일어나는 경우 재해싱 과정이 일어나 공간사용률이 높아져 효율이 떨어진다.

1-8. 해시테이블 사용목적

  • 해시테이블은 탐색을 목적으로 하고, 무의미하고 빈번한 삽입 삭제를 피하여 공간사용률을 늘리지 않는 상태로 탐색하는 방식을 선호.
    -> 처음에 최대한 많이 삽입을 한상태에서 탐색하는 것은 좋지만, 중간에 삭제가 일어나고 삽입이 일어나고 반복하면 좋지 않음!

2. 인접행렬그래프와 인접리스트그래프


2-1. 인접행렬그래프

  • 2차원 배열을 사용
  • 장점: 인접 여부 접근 빠름 O(1)
  • 단점: 메모리 사용량 많음 O(n^2) ex) 노드가 4개면 4x4이차원배열 필요.

2-2. 인접리스트그래프

  • c#에서 리스트 사용
    장점: 메모리 샤용량 적음 O(n)
    단점: 인접 여부를 확인하기 위해 리스트 탐색필요 O(n)
profile
개발노트

0개의 댓글