DS. Class B. HW #4 Solution for

DS. Class B. HW #4 Solution
1. What is the order of each of the following tasks in the worst case?
a. Computing the sum of the first n even integers by using a for loop
-> n개의 짝수를 더하기 위해서는 loop가 n번 돌아야 하므로 -> O(n)
b. Displaying all n integers in an array
-> n개의 integers를 array에서 접근해야 하므로 -> O(n)
c. Displaying all n integers in a sorted linked list
-> linked list의 처음 entity를 복사하여 이것을 가지고 linked list를 traverse 하면 ->
O(n)
d. Displaying all n names in a circular linked list
-> c와 마찬가지로 traverse하면 -> O(n)
e. Displaying one array element
-> array는 모든 element에 random하게 접근할 수 있다. -> O(1)
f. Displaying the last integer in a linked list
-> linked list의 마지막 integer를 출력하기 위해서는 모든 entity를 traverse해야 된다.
-> O(n)
g. Searching an array of n integers for a particular value by using a binary search
-> if array is sorted -> O(log n) (binary search의 worst case)
Else array is not sorted -> O(n*(log n) + log n) -> O(n * (log n)) (sorting
algorithm is quick sort)
h. Sorting an array of n integers into descending order by using mergesort
-> mergesort algorithm의 worst case -> O(n * log n)
i. Adding an item to a stack of n items
-> O(1)
j. Adding an item to a queue of n items
-> O(1)
** i, j의 경우에는 stack과 queue를 무엇으로 구현했느냐에 따라 약간의 차이가 발생할
수 있습니다.
3. Consider the following JAVA method f. Do not be concerned with f’s
purpose
public static void f(int[] theArray, int n) {
int temp;
for(int j=0;j<n;j++) {
int i=0;
while(i<=j) {
if(theArray[i] < theArray[j]) {
temp = theArray[i];
theArray[i] = theArray[j];
theArray[j] = temp;
} // end if
++i;
} // end while
} // end for
} // end f
How many comparisons does f perform?
-> 비교하는 부분은 2개가 존재한다.
일단 while문은 i<j일 때까지 비교를 하므로 이 횟수를 보면,
1+ 2 +L+ n =
n( n + 1)
2
다음으로 while문 안의 if문의 비교 수를 보면, while문 안으로 들어가면 한번 씩 행해
지므로,
1+ 2 +L+ n =
n( n + 1)
2
즉, 총 comparison의 수는
2×
n( n + 1)
= n( n + 1)
2
5. Show that any polynomial f ( x ) = c n x + c n −1 x
n
n −1
+ L + c1 x + c 0 is O( x n ).
-> O(g(x))의 정의는 다음과 같다.
If lim
x −>∞
g(x) = x 이라 두면,
n
lim
f ( x)
= c (c ∈ I ) , f ( x ) = O ( g ( x ))
g ( x)
f ( x) c n x n + c n −1 x n −1 + L + c1 x + c0
=
가 된다.
g ( x)
xn
x − >∞
f ( x) c n x n + c n −1 x n −1 + L + c1 x + c0
=
= cn
g ( x)
xn
cn 은 정수이므로, 정의에 의해 f(x) = O( x n ) 이다.
6. Show that for all constants a, b > 1, f(n) is O (log a n) if and only if f(n) is
O(log b n) . Thus, you can omit the base when you write O (log n) .
-> 5번 문제에서 Order의 정의를 상기하자. f(n) = O (log a n) 이면, g(n)= log a n 라 놓을
수 있다. 그럼 h(n)= log b n 라 두자.
f (n) × log a b
f (n)
f (n)
f (n)
f (n)
=
=
=
=C×
(C = log a b)
h(n) log b n log a n
log a n
g ( n)
log a b
lim
n − >∞
f ( n)
f ( n)
= lim
× C = C × c = C '∈ I
h( n) n − > ∞ g ( n)
(1)에 의해 f(n) = O (log b n)
(1)
14. Write recursive versions of selectionSort, bubbleSort, and insertionSort.
1) Selection Sort
public void selectionSort(Object[] arr, int arrLength) {
if(arrLength != 1) {
Object temp = null;
int index = 0;
for(int i=0;i<arrLength;i++) {
if(temp < arr[i]) {
t = arr[i];
index = I;
}
}
Object tmp = array[arrLength];
arr[arrLength] = temp;
arr[index] = tmp;
selectionSort(arr, arrLength – 1);
}
}
2) Bubble Sort
public void bubbleSort(Object[] arr, int arrLength) {
if(arrLength != 1) {
for(int i=0;i<arrLength;i++) {
if(arr[i] > arr[i+1]) {
Object temp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = temp;
}
}
bubbleSort(arr, arrLength – 1);
}
}
3) Insertion Sort
public void insertionSort(Object[] arr, int location) {
if(location != arr.length – 1) {
Object temp = arr[location + 1];
int index = location + 1;
while(index > 0 && arr[index – 1] > temp) {
arr[index] = arr[index – 1];
index--;
}
arr[index] = temp;
insertionSort(arr, location + 1);
}
}
15. Trace the mergesort algorithm as it sorts the following array into
ascending order. List the calls to mergesort and to merge in the order in
which they occur.
20 80 40 25 60 30
17. Trace the quicksort algorithm as it sorts the following array into
ascending order. List the calls to quicksort and to partition in the order in
which they occur.
20 80 40 25 60 10 15
-> pivot을 배열의 맨 처음 수로 잡음.