아무것도 모르는 공대생의 지식 탐험기
Problem Set 2 본문
34번 문제 해설 :
해당 문제를 파이썬 코드로 나타내면 아랴와 같습니다.
for i in range(1, n+1, 2):
for j in range(1, n+1, 2):
# some constant number of operations
여기서 range(1, n+1, 2)는 1부터 n까지 2씩 증가하는 값을 가지는 리스트를 생성합니다. 즉, 외부 루프는 i가 2씩 증가하면서 최대 log₂n번 반복됩니다. 내부 루프도 마찬가지로 j가 2씩 증가하면서 최대 log₂n번 반복됩니다.
따라서, 이중루프의 시간복잡도 T(n)은 O(log₂n) 입니다. 코드에서 상수 시간으로 수행되는 연산이 있을 수 있으나, 시간 복잡도에서는 무시됩니다.
2. 생일 문제에 대한 각각의 정렬
1) 버블 정렬(Bubble Sort)은 인접한 두 원소를 비교하여 정렬하는 알고리즘입니다. 주어진 리스트를 n번 순회하면서 인접한 두 원소를 비교하고, 만약 뒤의 원소가 더 작다면 두 원소를 교환합니다. 이러한 과정을 n-1회 반복하면 정렬이 완료됩니다.
생일 데이터를 버블 정렬로 설명하자면, 생일을 날짜와 월로 구분하여 리스트에 저장하고, 인접한 두 생일을 비교하면서 같은 생일을 가진 사람의 쌍을 찾습니다. 리스트의 길이가 n일 때, 이중 루프를 사용하게 되므로 시간 복잡도는 O(n^2)입니다.
하지만 이 방법은 비효율적이며 큰 데이터셋에서는 시간이 오래 걸립니다. 따라서, 더 효율적인 정렬 알고리즘을 사용하는 것이 좋습니다.
버블 정렬은 시간 복잡도가 O(n^2)으로, 데이터의 크기가 커질수록 비효율적입니다. 따라서, 큰 데이터셋에서는 성능이 매우 떨어지므로 위 문제에 대해서도 정확도는 높지 않을 것입니다. 또한, 이 문제는 정렬 자체보다는 중복된 데이터를 찾는 문제이기 때문에 다른 알고리즘을 사용하는 것이 더 적합합니다.
2) 선택정렬은 대규모 데이터에 대해서는 매우 느릴 수 있습니다.
데이터의 크기가 작은 경우, 선택 정렬은 동작하기에는 빠를 수 있지만, 더 큰 데이터에서는 비효율적입니다. 데이터가 n개라면 선택정렬은 O(n^2)의 시간복잡도를 가집니다.
따라서 생일 데이터와 같이 큰 데이터를 다룰 경우 선택정렬은 매우 느리며, 다른 알고리즘을 사용해야합니다.
정확도는 알고리즘 자체에 영향을 끼치지 않습니다. 선택정렬을 사용하여 같은 생일을 가진 사람의 쌍을 찾는 경우, 선택정렬 자체는 올바른 결과를 반환합니다. 다만, 시간 복잡도가 높아서 처리 시간이 오래 걸릴 뿐입니다.
3) 삽입 정렬은 배열의 각 요소를 기존의 정렬된 부분 배열과 비교하여 적절한 위치에 삽입하는 정렬 알고리즘입니다. 생일 문제에서는 각 생일을 기존에 발견된 생일과 비교하여 쌍을 찾아내는 것이므로, 삽입 정렬의 개념과 유사합니다.
생일 데이터에서 삽입 정렬로 같은 생일을 가진 사람 쌍을 찾는 것은 효율적이지 않습니다. 삽입 정렬은 각 항목이 정렬된 부분 배열에 삽입되는 방식으로 동작하기 때문에, 모든 쌍을 확인하기 위해서는 이중 루프를 사용해야 합니다. 따라서 시간 복잡도는 O(n^2)이며, 데이터 크기가 커질수록 더 오랜 시간이 소요됩니다.
또한, 이 방법은 정확도 측면에서도 좋지 않습니다. 이 방법을 사용하면 같은 생일을 가진 모든 쌍을 찾을 수 있지만, 중복된 쌍을 두 번 계산하게 됩니다. 이는 전체 쌍의 수가 많아질수록 문제가 심각해지며, 정확한 결과를 얻을 수 없습니다.
4) 병합 정렬의 시간 복잡도는 O(n log n)으로 매우 효율적입니다. 따라서 생일 데이터를 병합 정렬로 정렬하는 경우 정확도는 높으면서도 처리 속도는 매우 빠를 것으로 예상됩니다.
하지만 생일 데이터에서 같은 생일을 가진 사람의 쌍을 찾는 경우, 정렬 후에도 추가적인 탐색 과정이 필요하기 때문에, 이 경우에는 정렬 알고리즘의 효율성만으로는 충분하지 않을 수 있습니다.
5) 퀵 정렬의 시간 복잡도는 O(nlogn)이기 때문에 입력 데이터의 크기가 작을 경우에는 효율적으로 동작합니다. 그러나 최악의 경우(입력 데이터가 이미 정렬되어 있는 경우)에는 시간 복잡도가 O(n^2)이 되어 효율성이 떨어집니다.
생일 데이터를 퀵 정렬로 정렬한다면, 이 경우에는 생일 데이터가 이미 정렬되어 있는 경우는 없으므로 최악의 경우의 시간 복잡도에 대해 걱정할 필요는 없습니다. 따라서 일반적인 경우에는 적절한 효율성을 보일 것으로 예상됩니다. 그러나 생일 데이터의 경우에는 같은 생일을 가진 사람을 찾는 것이 중요한데, 퀵 정렬은 일반적으로 값이 같은 경우에 대한 순서를 보장하지 않으므로 정확성이 보장되지 않을 수 있습니다. 따라서 생일 데이터에서 같은 생일을 가진 사람의 쌍을 찾는 문제에 대해서는 다른 알고리즘을 사용하는 것이 더 적절할 것입니다.
'IT > 알고리즘' 카테고리의 다른 글
Problem Set 6 (0) | 2023.04.11 |
---|---|
Assignments 4 (0) | 2023.04.04 |
3 Week assignment (0) | 2023.03.20 |
알고리즘 생일 과제 (0) | 2023.03.07 |