본문 바로가기

분류 전체보기

(317)
# Foundation/기초수학 최소 공배수 알고리즘 이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. https://github.com/AeroCodeX/ 두 수의 최소 공배수 구하기두 수의 최소 공배수를 구하는 방법을 알아보자.배수를 구하는 방법은.. 다들 알 것이라 굳게 믿는다. 자, 처음에 소개할 방법은 가장 기초적이고 직관적이다!이중 반복문을 순회하면서 a * i == b * j 를 만족할 때 값을 반환한다. 최악의 경우는 두 수가 서로소인 경우이고, 이 때의 최소 공배수는a * b이다.따라서 각각의 반복문의 범위는 b, a 까지로 한정된다. 물론 간단한 만큼 성능은 떨어진다. 최악의 경우에서의 시간 복잡도는 O( a*b )이므로 O( n^2 )에 근사하다고 볼 수 있고,입력값이 각각 46341, 46340 인 경우에서 평균 소요시간은 4..

2018. 10. 23. 03:10

# Foundation/기초수학 최대 공약수 알고리즘 이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. https://github.com/AeroCodeX/ 두 수의 최대 공약수 구하기이번에는 두 숫자의 최대 공약수를 구하는 방법에 대해서 알아보자. 약수를 빠르게 찾는 방법은 이전 게시글을 참고하도록 하자. 먼저 쉽게 가보자. 지금보다 큰 공약수가 나올때마다 갱신하면 된다. 물론 성능은 보장할 수 없다. a = 1,000,000,000 이고 b = 876,543,210 일 때, 평균 2711 ms가 걸렸다. 반복문이 min(a, b)번 만큼 순회하므로, 시간 복잡도는 O( min(a, b) ) 이고, 큰 입력값이나 횟수나 들어온다면 더더욱 성능을 보장할 수 없다. 여기서 잔머리를 한번 굴려보자, 뒤에서 첫 공약수가 최대 공약수임을 눈치챘다면 공약수..

2018. 10. 22. 14:01

# 미사용 [백준 1011] Fly me to the Alpha Centauri 통찰노트 이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. https://github.com/AeroCodeX/ Fly me to the Alpha Centauri문제를 대충 요약하면, 다음 조건을 갖는 최적화 문제와 같다. 워프거리는 위의 점화식을 만족해야 하고, 출발할때는 1로 출발해야 하며, 도착할때도 1로 도착해야 한다. 다만, 최소횟수로 워프해야 한다. 조건 (1, 2, 4)에 의해 속력은 출발점에서 우쪽으로 선형 증가하며, 조건 (1, 3, 4)에 의해 속력은 도착점에서 좌측으로 선형 증가하고, 조건 (1)에 의해 그래프는 연속이어야 한다. 즉, 위의 조건을 모두 만족하는 그래프는 다음과 같은 형태일 것 이다. 아래는 짝수 횟수로 최대 워프할 때의 그래프. 아래는 홀수 횟수로 최대 워프할 때의..

2018. 10. 22. 03:45

# Foundation/기초수학 약수 알고리즘 이 블로그의 모든 예제코드는 깃허브에서도 볼 수 있습니다. https://github.com/AeroCodeX/ 성능은 중요해아무런 고려없이 약수 알고리즘을 만든다면 아래와 같지 않을까. 아무리 심플한게 좋다지만, 이건 좀 과한 듯 싶다. 이 심플한 알고리즘은 v = 1,000,000,000 기준으로 평균 4208 ms가 걸렸으며, 전체 연산량이 입력값에 대해 선형으로 증가하므로, 시간복잡도는 O(n)이다. 입력값이 작은 상황에서는 괜찮겠지만, 입력값이 크거나 타임 크리티컬한 상황에서는 절대 사용하면 안된다. 상당한 개선이 필요해보인다. 음.. 전체 연산량을 줄일 수 있는 방법은 없을까? 있다. 약수의 정의를 생각하면 좀 더 빠르게 동작하는 약수 알고리즘을 구현할 수 있다. 정수 V, A, B에 대하여 ..

2018. 10. 21. 21:59

티스토리 깃허브 연동하기 보호되어 있는 글입니다.
# 미사용 Fetch And Add(FAA) 명령어 Fetch And AddFetch And Add (FAA) 명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 추출과 덧셈 연산을 원자성을 가지고 수행한다. 행동 정보이전 값을 반환하고,주어진 값 만큼 더한다. 인자 정보value : 더해지는 변수.n : 더해질 값. 반환 정보더해지기 이전의 값. (덧셈 명령도 동시에 일어남.) 기본적인 구현은 다음과 같으며, 매커니즘을 설명하기 위한 것 뿐이지 실제로 적용가능한 함수는 아니다. 위의 동작은 후위 연산자 n++ 와 같다. Usage이 함수는 공유자원의 덧셈이 원자성을 가져야 할 때 사용된다. 가장 간단한 예로는 카운터가 있다. C++11 Standardfetch_add 함수는 C++11에서 추가되었으며, 원자계 프리미티브 타입인 ..

2018. 10. 15. 16:07

# 미사용 Compare And Exchange(CAS) 명령어 Compare And Exchange (CAS)Compare And Exchange (CAE) 명령어는 락을 사용하지 않는 기본 원자함수이며(CPU 레벨에서 지원한다.), 비교와 교환을 원자성을 가지고 수행한다. Compare And Swap (CAS) 라는 이름으로도 불린다. 행동 정보서로다른 두 값을 비교하고,두 값이 같다면 새로운 값으로 덮어쓴다. 인자 정보current : 현재 값old : 현재 값 이라고 예상되는 값. (다른 쓰레드에 의해 다른 값으로 갱신 되었을 수 있다.)newVal : current == old 이면 새롭게 current 에 대입될 값. 반환 정보true : current == old 일 때, ( current = newVal 명령도 동시에 일어남. )false : curr..

2018. 10. 14. 17:21

# 미사용 Test And Set(TAS) 명령어 Test And Set Test And Set 명령어는 락을 사용하지 않는 기본적인 원자함수이며, 여느 원자함수가 그렇듯이 CPU 레벨에서 지원한다. 검사와 지정을 원자성을 가지고 수행한다. bool test_and_set(bool& flag); 동작 내용 주어진 불리언 값의 현재 값을 반환하고, 그 불리언 값을 true 로 덮어쓴다. 반환 정보 true : 플래그가 원래 true 일 때. false : 플래그가 원래 false 일 때. ( flag = true 명령도 동시에 일어남) 구현 기본 구현 기본적인 구현은 다음과 같으며, 매커니즘을 설명하기 위한 것 뿐이지 실제로 적용가능한 함수는 아니다. 중간에 문맥교환이 발생할 수 있기 때문이다. 아래는 간략한 상태도이다. 한번 세트된 플래그는 계속해서 t..

2018. 10. 12. 02:13