Java를 Command Line에서 실행할 때 Heap Size를 설정해서 실행하자.


환경

  • Command Line 환경에서 Java


JVM을 실행할 때 Heap(힙)메모리 사이즈를 조절하자

Java를 Command Line을 통해서 실행할 때 -Xmx[memory size] 옵션을 지정해주면 원하는 메모리 사이즈로 JVM을 실행할 수 있다. 즉 자바 프로그램 실행이 가능하다.

  • 메모리를 1024mb로 설정
$ java -Xmx1024m [your program]
  • 메모리를 1gb로 설정
$ java -Xmx1g [your program]


Heap 메모리 사이즈 설정을 통해 Weka 실행하기

실제로 Command Line에서 Weka를 실행하는 명령어를 보면 아래와 같습니다.

$ java -Xmx1024m -jar weka.jar

gcc나 g++를 사용해 cpp파일을 Linux 환경에서 컴파일해보자


환경

  • C++언어 및 컴파일러
  • gcc 및 g++


c, cpp, gcc, g++?

  • c: C언어로 만든 코드파일의 확장자명입니다.

  • cpp: C++언어로 만든 코드파일의 확장자명입니다.

  • gcc: GNU 컴파일러 모음(GNU Compiler Collection, 줄여서 GCC)으로 C언어로 만든 파일을 컴파일하기 위한 컴파일러들의 모음이라 볼 수 있습니다.

  • g++: gcc와 마찬가지로 GNU 컴파일러들중에 하나로 C++언어로 만든 파일을 컴파일 할 때 주로 사용합니다.


gcc로 cpp파일 컴파일하기

  • gcccpp를 컴파일하면 다음 아래과 같이 symbol을 찾을 수 없다거나 clang: error: linker command failed with exit code 1와 같은 에러를 보여줍니다.

gcc compile error

  • C++을 위한 라이브러리 혹은 코드가 함께 포함되지 않아서 생기는 문제라서 다음 아래 명령어를 통해 -lstdc++ 같이 옵션으로 주면 gcc로도 cpp파일이 컴파일 가능합니다.
$ gcc -o filename filename.cpp -lstdc++


g++로 cpp파일 컴파일하기

  • 일반적으로 다음과 같이 g++를 통해서 cpp를 컴파일합니다.
$ g++ -o filename filename.cpp

n번째 피보나치 수열을 동적계획법 그리고 재귀함수를 통해서 각각 구현해보자


환경

  • C, C++
  • 동적계획법(Dynamic Programming)에 대한 이해
  • 재귀함수(Recursion)에 대한 이해


재귀함수란?

  • 재귀함수: 재귀함수란 자신의 함수를 재호출하여 실행하는 함수를 의미합니다. 주로 분할정복과 같이 문제를 작은 부분으로 나누어서 문제를 해결할 때 많이 사용합니다.


동적계획법이란?

  • 동적계획법(DP): 동적계획법이란 문제를 작게 쪼개서 작은 문제부터 하나하나 해결한 해를 통해 모아서 큰 문제를 해결하는 방법을 의미합니다.


재귀함수(Recursion)로 구하기

  • Top-down 방식: 큰 문제를 작은 문제로 나누면서 해결하는 방식

fibonacci_by_recursion.c


#include <stdio.h>

int fibonacci_recursion(int n){

	if (n == 0){
		return 1;
	}

	else if(n == 1){
		return 1;
	}

	else{
		return fibonacci_recursion(n-1) + fibonacci_recursion(n-2);
	}


}

int main(){

	int i;

	for(i=0; i<20; i++){
		printf("%d ",fibonacci_recursion(i));
	}
	printf("\n");

    return 0;
}


동적계획법(Dynamic Programming)으로 구하기

  • Bottom-up 방식: 작은 문제부터 하나씩 해결해 올라가는 방식

fibonacci_by_dp.c


#include <stdio.h>

int dp_array[100];

void fibonacci_dp(int n){

	int i;

	dp_array[0] = 1;
	dp_array[1] = 1;

	for(i=2; i< n; i++){
		dp_array[i] = dp_array[i-1] + dp_array[i-2];
	}

}


int main(){

	int i;

	fibonacci_dp(20);

	for(i=0; i<20; i++){
		printf("%d ", dp_array[i]);
	}
	printf("\n");

    return 0;
}


좌표평면에서 x와 y좌표가 주어졌을 때 그 점이 x축과 이루는 각을 구해보자


환경

  • C, C++
  • 삼각함수 및 역함수에 대한 이해


tangent란?

기본적으로 삼각함수를 알고 있다는 가정하에 x,y좌표가 주어졌을 때 x축과 이루는 각을 θ라고 하면 다음과 같이 tan(θ) = y/x라고 볼 수 있습니다.


atan(arctangent)란?

그렇다면 θ를 구할 때는 위에 있는 tan(θ) = y/x에 대해서 역함수를 취해주면 각 θ를 구할 수 가 있게됩니다.

그 역함수가 arctangent이며 tan-1(x)=arctan(x)=atan(x)=θ로 표현합니다.


C언어에서 atan2()를 이용해서 각도 구하기

C언어에서 atan()atan2()가 있지만 atan2()-π부터 π까지이기 때문에 즉, 음의 값 또한 표현 가능하기 때문에 atan2()를 사용한 예제입니다.

return 값들은 Radian 값이기 때무에 각도를 구하려면 180/π를 곱해줘야 합니다.

HelloWorld.c


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define PI 3.1415926535

double getDegree(double y, double x){
   return atan2(y,x) * 180 / PI;
}

int main()
{
   printf("%lf\n", getDegree(1,1));
   printf("%lf\n", getDegree(1,-1));
   printf("%lf\n", getDegree(-1,1));
   printf("%lf\n", getDegree(-1,-1));

    return 0;
}


결과는 아래와 같습니다.

Result

C언어의 stdlib.h에서 제공하는 정렬함수인 qsort를 사용해보자


환경

  • C언어 및 컴파일러


Quick Sort란?

원리

  • pivot을 정하고 pivot보다 작은 값들을 pivot의 왼쪽 pivot보다 큰 값들은 pivot의 오른쪽으로 위치시키고 pivot의 왼쪽 값들과 오른쪽 값들을 각각 따로 또 재귀를 통해 분할정복한다.

특징

  • O(nlogn)의 성능을 보이는 정렬 알고리즘중에 하나로 최악에는 O(n^2)의 성능을 보이지만 일반적으로 빠른 성능을 나타내기에 보편적으로 많이 쓰는 알고리즘 입니다.
  • Divide and Conquer이라는 분할정복 방법으로 정렬을 진행하며 자세한 부분은 다음을 참고하시면 좋습니다.
  • in-place sorting: 정렬 할 원소들을 위한 추가적인 메모리를 사용하지 않고 현재 메모리에서 정렬을 진행


C에서 Quick Sort인 qsort함수 사용하기

기본 구조

기본적으로 stdlib.h에서 Quick Sort 함수인 qsort 함수를 제공해주며 아래와 같습니다.


void qsort (void *base, size_t nel, size_t width, int (*compare)(const void *, const void *);

  • base: 정렬하고자 하는 배열의 포인터입니다.
  • nel: 배열의 각 원소들의 총 수입니다.
  • width: 배열에서 원소 하나의 크기입니다.
  • (*compare): 비교를 수행할 함수 포인터입니다. C언어에서는 함수를 선언하고 구현한 후에 다음처럼 포인터로 특정 함수를 지정할 수 있습니다.

비교 함수에 대해서

4번째 인자에 대해서 조금 더 자세히 설명하면 비교함수 내부에는 1, 0 , -1중에 하나를 반환해야합니다. 만약 오름차순으로 정렬을 하고 싶다면 비교함수 내부에서 첫번째 변수가 두번쨰 변수보다 클 때 1첫번째 변수가 두번째 변수보다 작을 때 -1같을 때 0을 반환하도록 작성하면 됩니다. 물론 내림차순의 경우 1과 -1을 반환하는 부분의 등호를 바꾸어주면됩니다.


예제 코드

예제 코드는 아래와 같습니다.

HelloWorld.c

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

// 오름차순으로 정렬할 때 사용하는 비교함수
int static compare (const void* first, const void* second)
{
    if (*(int*)first > *(int*)second)
        return 1;
    else if (*(int*)first < *(int*)second)
        return -1;
    else
        return 0;
}

int main()
{
    int arr[] = {32, 11, 97, 42, 21, 70, 56, 67, 88, 100};
    int array_size = sizeof(arr) / sizeof(int);
    int i;

    // 정렬 전
    for (i = 0; i < array_size; i++) printf("%d ", arr[i]);
    printf("\n");

    qsort(arr, array_size, sizeof(int), compare);

    // 정렬 후
    for (i = 0; i < array_size; i++) printf("%d ", arr[i]);
    printf("\n");

    return 0;
}


결과는 아래와 같습니다.

Result


참고자료