'Programming'에 해당되는 글 341건

  1. 2012.12.20 알고리즘의 성능분석 방법
  2. 2012.12.19 자료구조와 알고리즘
  3. 2012.12.05 Dev C++ Potable
  4. 2012.12.03 vim 윈도우 용
  5. 2012.11.29 C++ Language의 창시자 홈페이지
  6. 2012.11.26 논리 연산자
  7. 2012.11.26 관계 연산자(<,>,<=,>=,==,!=)
  8. 2012.11.26 Decimal 자료형

성능분석 방법 중 최소한으로 필요한 수학 함수


        지수식


        로그식


log 함수 (지수함수 적 정의)


a ≠ 1 이고, x>0, y>0 일때, x, y 사이에    라는 관계가 있으면 "x는 a를 밑으로 하는 y의 로그" 라 하고,

  로 표기한다.


ex)   이므로,   이다.

이 때, a ≠ 1 이어야 하는 이유는 1의 거듭제곱은 모두 1이기 때문에 어떠한 값이 오더라도 1이 되어 의미가 없어지기 때문이다.



시간 복잡도(Time Complexity) 와 공간 복잡도(Space Complexity)


그저 잘 동작하는 자료구조와 알고리즘을 찾는 것이 목적이라면 기능별로 자료구조와 알고리즘을 하나씩만 알아도 된다.

하지만 잘 동작하는 것은 물론이거니와 좋은 성능까지 보장받기를 원한다면, 자료구조와 알고리즘을 분석하고 평가할 수 있어야 한다.

모든 경우에 있어서 항상 우월한 성능을 보이는 만능 키와 같은 자료구조와 알고리즘은 존재하지 않기 때문이다. 


알고리즘을 평가하는 두 가지 요소


1. 어떤 알고리즘이 어떠한 상황에서 더 빠르고 또 느릴까?

2. 어떤 알고리즘이 어떠한 상황에서 메모리를 적게 쓰고 또 많이 쓸까?


이렇듯 하나는 '속도'에 관한 것이고 다른 하나는 '메모리의 사용량'에 관한 것인데, 속도에 해당하는 알고리즘의 수행시간 분석결과를 가리켜 '시간 복잡도(Time Cimplexity)' 라 하고, 메모리 사용량에 대한 분석결과를 가리켜 '공간 복잡도(Space Complexity)' 라 한다.


메모리를 적게 쓰고 속도도 빨라야 최적의 알고리즘이라 할 수 있다. 그런데 일반적으로 알고리즘을 평가할 때는 메모리의 사용량보다 실행속도에 초점을 준다.

대게는 속도에 관심이 더 많고, 또 중요한 요소로 판단되기 때문이다. 

물론 특정 알고리즘에 대해서 상대적인 우월성을 입증해야 하는 경우에는 메모리의 사용량도 함께 고려가 되지만, 이미 검증이 끝난 알고리즘의 적용을 고려하는 경우에는 속도에 초점을 두어 적합성 여부를 판단하게 된다.



속도를 측정하는 방법

시계를 가져다 놓고 수행시간을 재고 있을 수는 없다. 혹 시간을 잴 수 있어도 큰 의미를 부여하기 어렵다.

처리해야 할 데이터양의 변화에 따른 속도의 증가 및 감소의 정도도 알아야 하는데, 이를 위해서 조건을 달리하여 수백 번, 수천 번 실행해가면서 시간을 잴 수 는 없는 일이기 때문이다. 그래서 알고리즘의 수행속도를 평가할 때는 다음과 같은 방식을 취한다.

1. 연산의 횟수를 센다.

2. 처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 T(n) 을 구성한다.


※ 식을 구성하면 데이터 수의 증가에 따른 연산횟수의 변화 정도를 판단할 수 있다.


즉, 알고리즘 별 연산횟루를 함수 T(n)의 형태로 구성하면 그래프를 통해서 데이터 수의 변화에 따른 연산횟수의 변화 정도를 한눈에 파악할 수 있으며, 이로 인해서 둘 이상의 알고리즘을 비교하기가 용이해진다.



보라색의 알고리즘보다는 빨간색의 알고리즘이 좋다. 

그러나 빨간색의 알고리즘과 같이 안정적인 성능을 보장하는 알고리즘은 보라색의 알고리즘에 비해서 구현의 난이도가 높은 편이다. 따라서 데이터의 수가 많지 않고 성능에 덜 민감한 경우라면 구현의 편의를 이유로 보라색의 알고리즘을 선택하기도 한다.


※ 알고리즘의 정답은 없는 것이 아니라 상황에 맞게 답을 내려야 한다. 구현보다 중요한 것은 종합적으로 사고하고 판단하는 능력이다.


Posted by scii
:

실무에서는 자료구조를 직접 구현하지 않고 검증된 라이브러리를 가져다 쓴다. 그리고 그것은 합리적인 선택이다.

검증된 라이브러리를 활용하는 것이 안전성에서나 성능 면에서나 우월하기 때문이다.

하지만 라이브러리를 잘 가져다 쓰려면 리스트가 무엇이고 트리가 무엇인지 알아야 한다. 그냥 아는 것이 아니라 각각의 특성을 정확히 이해해야 한다.


알고리즘이란?

- 표현 및 저장된 데이터를 대상으로 하는 '문제의 해결 방법'을 뜻한다.


int arr[5] = {1,2,3,4,5};

for(idx=0; idx<5; idx++)

sum += arr[idx];

여기의 반복문은 배열의 저장된 모든 값의 합을 구하는 알고리즘이다. 하지만 자료구조가 결정되어야 그에 따른 효율적인 알고리즘을 결정할 수 있다.

만약 값이 저장된 자료구조가 배열이 아니었다면... 분명 알고리즘의 방법은 달라졌을 것이다. 


결론

- 자료구조에 따라서 알고리즘은 달라진다.

- 알고리즘은 자료구조에 의존적이다.

- 때문에 자료구조와 알고리즘은 분명 다른 과목임에도 불구하고 매우 많은 연관성을 지니고 있다.

Posted by scii
:

'Programming > Related Files' 카테고리의 다른 글

함수 그래프를 그리는 프로그램  (0) 2012.12.20
vim 윈도우 용  (0) 2012.12.03
Posted by scii
:

vim 홈페이지

http://www.vim.org/


확장 팩(syntax, indent 등등).

vim73_46rt.zip


vim 편집기 설치 프로그램.

vim73_46w32.zip


설치 방법

1. vim73_46w32.zip의 압축을 푼다. 

2. vim73_46rt.zip의 압축을 푼다. 

3. 하나의 폴더에 다 집어넣는다.

4. vim.exe 를 windows 폴더에 집어넣는다.

5. 윈도우 키 + r 을 눌러 실행창을 띄운 후 vim을 입력하여 실행한다.




설치하는 vim 편집기.

이것은 GUI 버전이다.

gvim73_46.exe


'Programming > Related Files' 카테고리의 다른 글

함수 그래프를 그리는 프로그램  (0) 2012.12.20
Dev C++ Potable  (0) 2012.12.05
Posted by scii
:

'Programming > C++' 카테고리의 다른 글

namespace (이름 공간)  (0) 2013.03.17
template을 이용한 inline 함수  (0) 2013.03.17
C++ Language Tutorial 사이트  (0) 2012.11.20
dynamic_cast : Polymorphic 클래스 기반의 형 변환  (0) 2012.10.31
C++ 에서의 형 변환 연산  (0) 2012.10.31
Posted by scii
:

논리 연산자

Programming/Python 2012. 11. 26. 16:52 |

부울(Boolean) 연산자는 진리 값을 피연산자로 취해서 논리 값을 계산해 내는 연산자이다.

부울 연산자는 다른 연산자보다 우선 순위가 낮다.


python에서 거짓으로 간주되는 것들

None

0, 0.0, 0L, 0.0+0.0j

"", [], (), {}

이것을 제외한 나머지는 참이다.






논리식 계산 순서

'and', 'or'가 포함된 논리식은 식의 결과 값을 판정하는 데 최종적으로 기여한 객체의 값을 식의 값으로 리턴한다.

다시 말하면, and, or 연산자는 왼쪽부터 식을 계산하다가, 어떤 시점에서 결과가 알려지면 더 이상 계산을 하지 않고 그 시점의 객체를 리턴한다.

리턴되는 값은 참, 거짓이 아님을 주의해야 한다!!!



C/C++ 에서는 and, or를 하면 bool방식으로 참이나 거짓만을 리턴한다. 반면.. python은...



python에서는 값을 리턴한다. 이것을 주의해야 한다.





'Programming > Python' 카테고리의 다른 글

str 과 repr  (0) 2013.02.08
임의의 정수를 비트단위로  (0) 2013.02.01
관계 연산자(<,>,<=,>=,==,!=)  (0) 2012.11.26
Decimal 자료형  (0) 2012.11.26
python의 Backticks ( repr() )  (0) 2012.11.26
Posted by scii
:

자료형 간에도 크기가 있다.


숫자 < 사전 < 리스트 < 문자열 < 튜플


작은것 -> 큰것


>>> {3:2} < [1,2,3]

>>> true





==는 객체가 같은 값을 가지고 있는지를 검사한다. 


만일 두 개의 레퍼런스가 같은 객체를 가리키고 있는지 알고 싶다면 is 연산자를 이용한다.



x와 y는 값이 같지만 다른 객체이다. 

y와 z는 값도 같고 같은 객체임을 알 수 있다. 그 이유는, z = y에 의해서 새로운 객체가 생성되는 것이 아니라 동일 객체에 대한 레퍼런스가 복사되기 때문이다.

즉, y와 z는 동일한 객체임을 알 수 있다.


'Programming > Python' 카테고리의 다른 글

임의의 정수를 비트단위로  (0) 2013.02.01
논리 연산자  (0) 2012.11.26
Decimal 자료형  (0) 2012.11.26
python의 Backticks ( repr() )  (0) 2012.11.26
함수  (0) 2012.11.26
Posted by scii
:

Decimal 자료형

Programming/Python 2012. 11. 26. 13:53 |

컴퓨터의 부동 소수점(Floating Point)에 의한 실수 표현은 어쩔 수 없이 오차를 동반한다.

계산 시간에 관계없이 정확한 결과 값을 얻기를 원하면 Decimal 모듈을 사용할 수 있다.(Import decimal)


Decimal 모듈은 두 개의 클래스 Decimal, Context를 제공한다.


Decimal 클래스 =  숫자를 표현.

Context 클래스 = 정확도나 반올림 방법 등과 같은 환경 설정.


Decimal을 하지않고 그냥 했을 경우, 원래라면 1이 나와야하는데 1의 근삿값이 나왔다.



Decimal을 이용해여 계산을 했을 때 정확한 값이 나왔다.

오차 없이 어떤 계산 결과를 얻어야 한다면 Decimal 클래스의 활용을 생각해 볼 수 있다. 하지만, 남용하면 안된다. 계산 시간이 많이 걸린다.



Decimal 인스턴스끼리는 일반 수치와 같이 연산이 가능하다.



Decimal 인스턴스 객체를 생성하는 또 다른 방법은 튜플을 이용해서 부호, 지수부, 가수부를 별도로 지정하는 것이다.

첫 숫자 1은 부호(0=양수, 1=음수)를 나ㅏ내고, (1,5,4,3)은 가수부, -2는 소수점의 위치를 나타낸다.

그리고 decimal 모듈의 Context는 Decimal 연산에 대한 설정 값을 가지는 객체로 계산 정확도와 반올림 정책 등을 설정할 수 있다.



method를 지원하는 연산도 있다.


'Programming > Python' 카테고리의 다른 글

논리 연산자  (0) 2012.11.26
관계 연산자(<,>,<=,>=,==,!=)  (0) 2012.11.26
python의 Backticks ( repr() )  (0) 2012.11.26
함수  (0) 2012.11.26
예약어 pass  (0) 2012.11.26
Posted by scii
: