'Computer Science'에 해당되는 글 12건

  1. 2014.06.29 Quick Select - Find k-th item in an unsorted array.
  2. 2012.10.05 [OS] upcall , callback 차이
  3. 2011.05.30 quick sort - Java
  4. 2011.05.30 quick sort - c
  5. 2011.05.28 insertion sort - c
Computer Science/Algorithm2014. 6. 29. 23:17

1. Sort and find: O(nlogn)


2. Quick Select: O(n)

Quick Select: It is similar to Quick Sort about partitioning, but it does not need to sort all elements in an array. The most important thing is the location of pivot. If k, an index of the array, is less than an index of pivot, we need to care about only left part of k. We do not need to worry about a right side of pivot.


Ideal case: n + n/2 + n/4 + .... = n(1 + 1/2 + 1/4 + ....) = n ( 1 / (1 - 1/2) ) = 2n = O(n)

* Sn = a + ar + ar^2 + ar^3 + ... + ar^(n-2) + ar^(n-1) = a / (1 - r)


QuickSelect.groovy

def swap(list, a, b) {
    def temp = list[a]
    list[a] = list[b]
    list[b] = temp
}

def partition(list, pivot, left, right) {
    def storeIdx = left
    swap(list, pivot, right)

    for(int i = left; i < right; ++i) {
        if(list[i] < list[right]) {
            swap(list, i, storeIdx)
            storeIdx++
        }
    }
    swap(list, storeIdx, right)
    return storeIdx
}

def select(list, k, left, right) {
    while(true) {
        def pivot = new Random().nextInt(right - left +1) + left
        println "pivot = " + pivot

        def newPivot = partition(list, pivot, left, right)
        println list

        if(k == newPivot) {
            return list[k]
        } else if (newPivot < k) {
            left = newPivot + 1
        } else {
            right = newPivot - 1
        }
    }
}

def list = [9,8,7,4,5,0,2,1,6,3]
def left = 0
def right = list.size() - 1
def k = new Random().nextInt(right - left + 1 ) + left

println "k = " + k
println list

def answer = select(list, k, left, right)
println "[ANSWER] " + answer






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

quick sort - Java  (0) 2011.05.30
quick sort - c  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피

운영체제 수업시간에 upcall과 callback의 차이가 궁금해서 교수님께 질문을 드렸다. 다음은 질문에 대한 답변이다.


upcall : kernel 에서 process에게 그 process가 요구한 일이 끝났음을 알리는 신호.

callback : 어떤 이벤트와 그 이벤트가 발생했을 때 실행시킬 함수 사이에는 링크가 맺어져 있다. 따라서 어떤 이벤트가 발생한다면 링크 맺어진 함수를 실행한다. 


개인적으로 callback이 upcall을 포함한다고 생각한다. 

논리학적으로 callback과 upcall 은 대소관계라고 생각한다. (callback 이면 upcall이지만 모든 upcall이 callback은 아니다.)

Posted by 준피
Computer Science/Algorithm2011. 5. 30. 15:37
Java로 퀵소트를 구현해봤다. 이전에 포인터로 구현을 했을때랑 재귀함수 파라미터에 대한 접근법이 달라서 약간 헷갈렸다.

@Test
public void main(){
int[] x = new int[10];
for (int i = 0; i < x.length; i++) 
x[i] = (int) (Math.random() * x.length);
quicksort(0, x.length-1, x);
}

private void quicksort(int l, int u, int[] x) {
if(u <= l)
return;
int m = l;
for(int i = l + 1; i <= u; ++i) 
if(x[l] > x[i])
swap(++m, i, x);
swap(m, l, x);
quicksort(l, m-1, x);
quicksort(m+1, u, x);
}

private void swap(int a, int b, int[] x) {
int temp = x[a];
x[a] = x[b];
x[b] = temp;
}







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

Quick Select - Find k-th item in an unsorted array.  (0) 2014.06.29
quick sort - c  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피
Computer Science/Algorithm2011. 5. 30. 14:52
퀵소트를 c로 구현해봤다. 퀵소트는 처음부터 재귀호출을 이용해서 구현했다.

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <time.h>


void print_array(int *x, int n);

int* scaffolding(int n);

void quicksort(int *x, int n);

void swap(int *, int *);


int main() {

int *x, n, i;


printf("배열 크기 : ");

scanf("%d", &n);

x = scaffolding(n);

print_array(x, n);


quicksort(x, n);

print_array(x, n);


return 0;

}


void quicksort(int *x, int n) {

if(n <= 1)

return;


int i, m = 0;


for(i = 1; i < n ; ++i) {

if(x[0] > x[i]) {

swap(&x[++m], &x[i]);

}

}

swap(&x[m], &x[0]);

quicksort(x, m);

quicksort(x+m+1, n-m-1);

}


void swap(int *a, int *b) {

int temp = *a;

*a = *b;

*b = temp;

}


void print_array(int *x, int n) {

int i;

for(i = 0; i < n; ++i)

printf("%d ", x[i]);

printf("\n");

}


int* scaffolding(int n) {

srand((unsigned) time(NULL));

int *x, i;


x = (int *)malloc(n * sizeof(int));

for(i = 0; i < n; ++i)

x[i] = rand() % n;


return x;

}


밑의 함수는 정렬하는 부분만 다른 알고리즘으로 풀어봤다.

void quicksort(int *x, int n) {

if(n <= 1)

return;


int l = 0, u = n;

while(1) {

do {++l;} while(x[0] > x[l] && l < n);

do {--u;} while(x[0] <= x[u] && u > 0);

if(u < l)

break;

swap(&x[l], &x[u]);

}

swap(&x[0], &x[u]);

quicksort(x, u);

quicksort(x+u+1, n-u-1);

}




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

Quick Select - Find k-th item in an unsorted array.  (0) 2014.06.29
quick sort - Java  (0) 2011.05.30
insertion sort - c  (0) 2011.05.28
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
Posted by 준피
Computer Science/Algorithm2011. 5. 28. 21:09
삽입정렬을 c로 구현해봤다. 이진탐색을 구현하면서 포인터에 익숙해진터라 좀 더 수월하게 작업했다.

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>

int* scaffolding(int);
void print_array(int *, int);
void insertionsort(int *, int);

int main() {
int *x, n, i;
printf("배열 크기 : ");
scanf("%d", &n);
x = scaffolding(n);
printf("입력 : ");
print_array(x, n);

insertionsort(x, n);
printf("결과 : ");
print_array(x, n);

return 0;
}

void insertionsort(int *x, int n) {
int i, j;
for(i = 1; i < n; ++i){
for(j = i; j > 0 && x[j-1] > x[j]; --j){
int temp = x[j-1];
x[j-1] = x[j];
x[j] = temp;
}
}
}

void print_array(int *x, int n) {
int i;
for(i = 0; i < n; ++i)
printf("%d ", x[i]);
printf("\n");
}

int* scaffolding(int n) {
srand((unsigned) time(NULL));
int *x, i;

x = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; ++i)
x[i] = rand() % n;

return x;
}


위의 삽입정렬에서 배열의 값을 swap 해주는 부분만 알고리즘을 바꿔봤다.
메모리에 쓰는 작업을 덜하기 때문에 좀 더 효율적이다.

void insertionsort(int *x, int n) {
int i, j, temp;
for(i = 1; i < n; ++i){
temp = x[i];
for(j = i; j > 0 && x[j-1] > temp; --j)
x[j] = x[j-1];
x[j] = temp;
}
}





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

quick sort - Java  (0) 2011.05.30
quick sort - c  (0) 2011.05.30
insertion sort - Java  (0) 2011.05.26
binary search - Java  (0) 2011.05.17
binary search - c  (0) 2011.05.16
Posted by 준피