반응형







수식의 표기방법에는 Prefix (전위표기법), Infix (중위표기법), Postfix (후위표기법) 이 있다.




예를들어 보자면 위의 표에 나와있는것 처럼 표현할 수 있다.



컴퓨터에서는 수식을 계산할 때 중위표기식으로 표현된 것을 후위표기식으로 바꾼뒤 계산한다.


그리고 이 과정에서 STACK이 사용된다.



예를들어 사용자가 2+3*4 의 연산을 입력하면 컴퓨터는 후위표기법인 234*+ 로 바꾼 뒤 계산하여 14라는 결과를 얻어내는 것이다. 




반응형
반응형








희소행렬을 만드는 과정에서 쓰였던 2차원 배열 전체에서 20%만 값을 할당하는 부분을 검증해 보았다.


이를위해 다음과 같은 코드를 작성해 보았다.





매번 20%의 확률에 들어올 때 카운트 될 수 있게 하는 프로그램을 10000번 반복시켰을 때 평균적으로 20회 카운트 되는것을


결과로 얻을 수 있었다.



따라서 위의 코드는 신뢰할 만하다는 결론을 얻었다.




반응형
반응형




 

2차원 배열을 생성하고 배열 전체의 20%에만 임의의 수가 저장되게 만들어 보았다.

int** InputValue(int *valueCount) {
	int** arr;
	int i,j,rannum;
	int count = 0;

	arr = (int**)malloc(sizeof(int)*MAXSIZE);
	for(i=0;i<MAXSIZE;i++)
	{
		arr[i] = (int*)malloc(sizeof(int)*MAXSIZE);
	} // 2차원 배열 동적할당 선언

	srand(time(NULL));

	// <- 값 입력
	for(i=0;i<MAXSIZE;i++)
	{
		for(j=0;j<MAXSIZE;j++) 
		{
			// 전체 배열중 20%에만 원소를 저장시킨다.
			rannum = rand()%100;
			if(rannum<20) {
				arr[i][j] = (rand()%100)+1; // 값을 저장할 때는 1~100 범위의 숫자를 저장한다. 
				count++; // 값이 입력될때 마다 카운트를 1씩 증가시켜
						 // Sparse Matrix에 값이 몇개 저장되었는지 카운트 한다.
			}
			else
			{
				arr[i][j] = 0; // 나머지 배열의 원소에는 0을 저장한다.
			}

		}

	}
	// ->

	*valueCount = count; // 생성된 Value의 수를 참조를 통하여 저장한다.
	
	return arr;

}

 

main함수에서 

 

int **arr;

 

이라는 변수를 더블포인터 변수를 선언하고

 

arr = InputValue(&valueCount);

 

식으로 연결시켜 주었다. valueCount는 몇개의 값이 생성되었는지 알기 위한 변수로 메인에서 선언해주고 InputValue함수에

 

주소만 넘겨주었다.

 

배열 전체의 20%에만 값을 할당하기 위해 0~99 범위의 랜덤한 숫자를 생성하고 20보다 작을때만 값이 입력되게 만들었는데

 

이에 대한 검증은 따로 하도록 하겠다.

 

 

결론적으로 InputValue함수를 통해 생성된 2차원배열을 파일에 찍어보면 다음과 같이 제대로 생성됨을 볼 수 있었다.

 

 

 

이는 MAXSIZE를 15000으로 해서 15000 x 15000 사이즈의 2차원 배열이 생성되었을 때이다.

 

파일사이즈가 커서 메모장으로는 열리지도 않는다 ㅋㅋ

 

 

 

이제 생성된 2차원 배열을 희소행렬 표현방식으로 저장해 보았다.

 

 

 
메인에서 가지고 있는 2차원 배열의 포인터변수와 생성된 값의 수인 valueSize를 인자로 받는 makeSpsMatrix라는 함수를 만들었다.
 
이는 역시 메인에서 희소행렬을 위한 구조체로 지정해준 spsmt라는 type의 포인터 변수로 연결된다.
 
[0]번 인덱스에는 row, colum값이 MAXSIZE가 되고 value값이 메인에서 부터 인자로 받아온 valueSize가 저장된다.
 
그리고 2중 for문을 이용해 값을 모두 비교해 보며 0이 아닐때에는 희소행렬로 저장하고 0일 경우에는 반복문을 계속 진행시켰다.
 
 
이 역시 결과를 파일로 저장해서 열어보면 다음과 같았다.
 

 

15000 x 15000 사이즈에 value가 45049011개인 희소행렬이 제대로 저장된 것을 확인 할 수 있었다.

 

 

 

2차원 배열과 희소행렬의 결과값을 비교해서 검증해 보면

 

 

 

 [0][4] 위치에 value값 76이 생성되어 있다는걸 확인할 수 있다.

 

 

반응형
반응형







Sparse Matrix, 희소행렬이란 행렬의 원소로 0이 많은 것을 의미한다.


즉 2차원 배열로 Matrix를 만들고, 원소들 중 0이 많이 있을 때 0을 위한 저장공간이 아깝기 때문에


이러한 메모리를 절약하기 위해 사용한다.



예를들어 다음과 같은 2차원 배열이 있다고 할 때



불필요하게 0을 저장하는 공간이 많아지기 때문에


다음과 같이 표현하는 것이다.


이는 구조체를 이용해서 배열을 만들어 주면 간단하게 1차원 배열로도 값을 표현해 낼 수 있다.



[0]번 인덱스에는 원래의 2차원 배열이 몇행 몇열로 이루어 져있고 값이 몇개인지가 저장되고,


[1]번 인덱스 부터 row값을 기준으로 0이 아닌 값들의 위치와 값이 저장된다.




반응형
반응형







마지막으로 Binary Search를 Recursive한 방식, 즉 재귀적인 방법으로 구현해 보았다.


메인함수는 Binary Search (2) 와 같으며 Recursive 함수만 추가적으로 작성하였다.





차이점이 있다면 return시에 함수를 다시 call 하게 되는 것인데, 함수의 인자로 mid 값을 이용하는 것이 중요한 것 같다.


예를들어 찾고자 하는 값이 중간값 (arr[mid]) 보다 크다면 head index로 mid+1을 넘겨주는것,


찾고자 하는 값이 중간값보다 작다면 tail index로 mid-1을 넘겨주는 것이다.


그리고 찾고자 하는 값이 중간값과 같다면 1을 리턴하면서 함수가 종료된다.



아... 하면서 매번 느끼지만 Recursive는 어려운것 같다...



어쨌든 이러한 방식으로 구현을 한 뒤 Iterative 함수를 사용했을때와 Recursive 함수를 사용했을때의 시간을 측정하고


비교해보았다.




6753 이라는 숫자를 검색하였을 때


먼저 Iterative한 방식에서는



3 microsec의 시간이 측정되었으며


Recursive한 방식에서는



역시 3 microsec의 시간이 측정되었다.



이는 속도상 큰 차이를 보이지 않음을 알 수 있었다.



하지만 내가 비교해본 숫자의 크기는 비교적 작은 단위이기 때문에 인터넷에서 검색을 좀 해보고 찾아봤는데


재귀함수는 보통 일정한 수행속도를 가지고, 반복문은 수행횟수에 따라서 수행속도가 길어질 수 있다고 한다.


그리고 궁금한점은 재귀함수를 사용하면 계속해서 함수가 STACK영역에 올라오게 될 텐데 메모리에 영향을 주는건 없을지...


이것도 좀 궁금증이 생기는것 같다.



그리고 무엇보다도 피부로 느끼는건 ㅋㅋ 재귀함수는 아직 어렵게 느껴진다...


하지만 이러한 과제를 하다보면 가끔은 재귀함수로 구현할때 더 쉽게 구현되는 것들이 있다. 예를들어서 Tree에서


Preorder, Postorder, Inorder 방식으로 Tree를 탐색하는 것이라던지... ㅋ 이런건 재귀함수가 더쉬운것 같다.


Tree에 대해서는 나중에 다시 포스팅 하도록 하겠다!



반응형
반응형







Binary Search (1) 에서 생성된 10,000개의 정수를 가지고 원하는 값을 찾아내는 함수를 구현하였다.


그리고 이 함수는 Iterative 방식, 즉 반복문을 통해 검색을 하는 방식으로 구현해 보았다.



searchFlag 라는 int형 변수에 함수를 달아 주었는데, 원하는 값을 찾았을 때에는 1을 return하고 값을 찾지 못했을 때에는 0을

return 하도록 함수를 만들어 주었다.




함수 내에서 while문이 한번씩 돌 때 마다, 즉 비교를 한번씩 할 때마다 searchCnt를 1씩 증가시켜주고,


메인함수에서 넘겨받은 포인터 변수로 array의 head값과 tail값을 연산에 맞춰 변형 시켜가면서 연산을 해 주었다.



이렇게 구현한 함수를 이용하여 실제로 3930이라는 수를 검색해 보고 검색에 걸리는 시간을 측정해 보았다.




총 13번 비교과정을 통해 2 microsec가 소요되는 것을 확인할 수 있었다.




다음으로는 Recursive한 방법을 이용한 함수를 통해서 검색을 해보고 소요된 시간을 측정해 보도록 하겠다.


반응형

+ Recent posts