본문 바로가기
-----ETC2-----/알고리즘(심화)

[알고리즘] Week 1: 고급 정렬 알고리즘 - 계수 정렬, 기수 정렬, 버킷 정렬

by cogito21_python 2024. 6. 2.
반응형

Day 1: 계수 정렬 (Counting Sort)

  • 강의 내용:
    • 계수 정렬의 개념
      • 계수 정렬이란 무엇인가?
      • 계수 정렬의 작동 원리
    • 계수 정렬의 시간 복잡도
      • 시간 복잡도: O(n + k) (n은 배열의 길이, k는 배열의 최대값)
      • 공간 복잡도: O(k)
    • 계수 정렬의 장단점
      • 장점: 매우 빠름, 안정적
      • 단점: 메모리 사용량이 큼, 숫자 범위가 제한적일 때 적합
  • 실습:
    • 파이썬을 사용한 계수 정렬 구현 및 예제
def counting_sort(arr):
    max_val = max(arr)
    count = [0] * (max_val + 1)
    
    for num in arr:
        count[num] += 1
    
    sorted_arr = []
    for i, cnt in enumerate(count):
        sorted_arr.extend([i] * cnt)
    
    return sorted_arr

# 예제 실행
data = [4, 2, 2, 8, 3, 3, 1]
print("계수 정렬 결과:", counting_sort(data))  # [1, 2, 2, 3, 3, 4, 8]

 

Day 2: 기수 정렬 (Radix Sort)

  • 강의 내용:
    • 기수 정렬의 개념
      • 기수 정렬이란 무엇인가?
      • 기수 정렬의 작동 원리 (기수별 정렬)
    • 기수 정렬의 시간 복잡도
      • 시간 복잡도: O(d*(n+b)) (d는 자릿수, n은 배열의 길이, b는 기수)
      • 공간 복잡도: O(n + b)
    • 기수 정렬의 장단점
      • 장점: 매우 빠름, 안정적
      • 단점: 특정 조건에서만 사용 가능 (정수 또는 고정 길이 문자열)
  • 실습:
    • 파이썬을 사용한 기수 정렬 구현 및 예제
def counting_sort_for_radix(arr, exp):
    n = len(arr)
    output = [0] * n
    count = [0] * 10

    for i in range(n):
        index = arr[i] // exp
        count[index % 10] += 1

    for i in range(1, 10):
        count[i] += count[i - 1]

    i = n - 1
    while i >= 0:
        index = arr[i] // exp
        output[count[index % 10] - 1] = arr[i]
        count[index % 10] -= 1
        i -= 1

    for i in range(len(arr)):
        arr[i] = output[i]

def radix_sort(arr):
    max_val = max(arr)
    exp = 1
    while max_val // exp > 0:
        counting_sort_for_radix(arr, exp)
        exp *= 10

# 예제 실행
data = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(data)
print("기수 정렬 결과:", data)  # [2, 24, 45, 66, 75, 90, 170, 802]

 

Day 3: 버킷 정렬 (Bucket Sort)

  • 강의 내용:
    • 버킷 정렬의 개념
      • 버킷 정렬이란 무엇인가?
      • 버킷 정렬의 작동 원리 (버킷 분배, 개별 버킷 정렬, 버킷 합병)
    • 버킷 정렬의 시간 복잡도
      • 시간 복잡도: O(n + k) (n은 배열의 길이, k는 버킷의 수)
      • 공간 복잡도: O(n + k)
    • 버킷 정렬의 장단점
      • 장점: 매우 빠름, 안정적
      • 단점: 특정 조건에서만 사용 가능 (균등하게 분포된 데이터)
  • 실습:
    • 파이썬을 사용한 버킷 정렬 구현 및 예제
def bucket_sort(arr):
    bucket_count = len(arr)
    buckets = [[] for _ in range(bucket_count)]
    
    for num in arr:
        index = int(num * bucket_count)
        buckets[index].append(num)
    
    for bucket in buckets:
        bucket.sort()
    
    sorted_arr = []
    for bucket in buckets:
        sorted_arr.extend(bucket)
    
    return sorted_arr

# 예제 실행
data = [0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]
print("버킷 정렬 결과:", bucket_sort(data))  # [0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.68, 0.72, 0.78, 0.94]

 

Day 4: 고급 정렬 알고리즘의 비교 및 응용

  • 강의 내용:
    • 계수 정렬, 기수 정렬, 버킷 정렬의 비교
      • 각 알고리즘의 장단점 및 사용 사례
      • 성능 비교 (시간 복잡도 및 공간 복잡도)
    • 고급 정렬 알고리즘의 응용 사례
      • 데이터 정렬의 실제 응용 사례 (예: 데이터 분석, 그래프 알고리즘)
  • 실습:
    • 다양한 데이터 셋을 사용한 고급 정렬 알고리즘의 성능 비교
# 성능 비교 예제
import time

def measure_time(sort_func, data):
    start_time = time.time()
    sort_func(data.copy())
    end_time = time.time()
    return end_time - start_time

data = [170, 45, 75, 90, 802, 24, 2, 66]
counting_time = measure_time(counting_sort, data)
radix_time = measure_time(radix_sort, data)
bucket_data = [x / max(data) for x in data]
bucket_time = measure_time(bucket_sort, bucket_data)

print("계수 정렬 시간:", counting_time)
print("기수 정렬 시간:", radix_time)
print("버킷 정렬 시간:", bucket_time)

 

Day 5: 실습 문제 풀이 및 토론

  • 강의 내용:
    • 실습 문제 풀이
      • 계수 정렬, 기수 정렬, 버킷 정렬을 사용한 다양한 문제 해결
    • 토론 및 피드백
      • 알고리즘의 성능 및 효율성에 대한 토론
      • 개선점 및 최적화 방안 논의
  • 실습:
    • 실습 문제 해결 및 결과 분석
### 실습 문제 예시
1. 주어진 배열을 계수 정렬, 기수 정렬, 버킷 정렬을 사용하여 정렬하세요.
2. 각 정렬 알고리즘의 시간 복잡도와 공간 복잡도를 비교하고 분석하세요.
3. 특정 조건에서 가장 적합한 정렬 알고리즘을 선택하고 그 이유를 설명하세요.

 

Day 6: 종합 연습 및 프로젝트 준비

  • 강의 내용:
    • 종합 연습
      • 계수 정렬, 기수 정렬, 버킷 정렬을 활용한 종합 문제 풀이
    • 프로젝트 준비
      • 프로젝트 주제 선정 및 요구사항 분석
      • 프로젝트 계획 수립
  • 실습:
    • 종합 문제 해결 및 프로젝트 준비
### 종합 연습 문제 예시
1. 대규모 데이터셋을 계수 정렬, 기수 정렬, 버킷 정렬을 사용하여 정렬하고 성능을 비교하세요.
2. 데이터 분석 프로젝트에서 고급 정렬 알고리즘을 활용하여 효율적인 데이터 처리를 구현하세요.

### 프로젝트 주제 예시
1. 대규모 데이터 분석 도구 개발
2. 실시간 데이터 스트림 처리 시스템

### 프로젝트 계획 예시
1. 데이터 입력 모듈 구현
2. 고급 정렬 알고리즘 구현 (계수 정렬, 기수 정렬, 버킷 정렬 등)
3. 데이터 출력 및 성능 분석 모듈 구현

 

이 강의는 파이썬의 고급 정렬 알고리즘, 특히 계수 정렬, 기수 정렬, 버킷 정렬의 기본 개념과 구현을 익히는 것을 목표로 하며, 각 강의는 이론과 실습을 포함합니다. 다음 주차에 대한 상세 강의를 원하시면 말씀해 주세요!

 

반응형