🔓알고리즘/수학8

1부터 n사이의 홀수의 합을 O(1)로 구하는 방법 ( C++ 최적화 기법 ) 갑자기 생각나서 만들어보았습니다. 솔직히 for문으로 1부터 n까지 순회하면서 홀,짝수인지 판별하는것은 구현하기 매우 쉽죠. 하지만, 이랬을때 단점이 n의 수가 커질수록 그 연산시간은 n의 크기에 비례해서 증가한다는 점입니다. 우리는 n의 크기에 영향을 받지않고 항상 같은(짧은)속도로 연산을 하는 방법을 의논하는겁니다. 1부터 n까지의 홀수의 합을 O(1)로 구하는 방법#include using bint = std::int64_t; bint Get_1toN_in_O1(bint n){ bint ncore, ncycle, result; n -= (n & 1) ? 0 : 1; ncore = ((n + 1) >> 1); ncycle = (ncore >> 1); result = (ncycle * (n + 1)) .. 2022. 1. 22.
Softmax function 구현하기 C++ 머신러닝에서 어떠한 여러개의 값이 주어졌을때, 그 여러개의 값중에서 임의의로 고른값을 확률의 수치로써 사용하기위해서 고안된 함수입니다. 예를들어서, 다음과 같은 배열이 있다고할때... [ 2, 3, 5 ] 만약 여기서 "2"를 고를때 전체 배열의 합에서의 확률(차지하는 빈도)의 수치는 몇인가? 에 대한 답을 제시해주는것이 "Softmax function"입니다. 우선 소프트맥스함수는 아래와 같이 생겼습니다. 흠.. 의외로 엄청 심플하게 생겼습니다. 실제 C++코드로 옮기면 다음과 같습니다. #include #include #include // https://www.HostMath.com/Show.aspx?Code=f(sj)%20%3D%20%5Cfrac%7Be%5E%7Bsj%7D%7D%7B%5Csum_%7.. 2021. 10. 11.
행렬곱셈 이론및 실습 c++ 본 포스팅은 행렬곱셈(Matrix Multiplication)에 관한 이론및 c++기반의 실습내용을 포함하고 있습니다. 또한 개인적인 공부차원에서 작성한 글입니다. 참조및 도움 https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88 행렬 곱셈 - 위키백과, 우리 모두의 백과사전 행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열 갯수를 가진다. 행렬 곱셈(matrix mul ko.wikipedia.org http://mathurl.com/ mathURL mathurl.com 행렬 곱셈이란? 두 개의 행렬에서 한 개의 행렬을 만들어내는 이.. 2021. 10. 9.
삼각형 내부에 존재하는지 점인지 확인하는법 c++ 이번에는 삼각형을 이루는 세개의 꼭짓점을 통해서, 어느 한 꼭짓점 N이 해당 삼각형 내부에 존재하는지 확인하는 알고리즘입니다. 코드는 최대한 가독성을 높여서 만들었습니다. #include struct Coord { int x, y; }; void initialize() { std::cin.tie(0); std::cout.tie(0); std::ios_base::sync_with_stdio(0); } int calcTriangle(Coord A_TRIANGLE, Coord B_TRIANGLE, Coord C_TRIANGLE) { int result = std::abs((A_TRIANGLE.x * (B_TRIANGLE.y - C_TRIANGLE.y)) + (B_TRIANGLE.x * (C_TRIANGLE.y.. 2021. 8. 20.
제곱, 제곱근 구현하기 우선은 제곱근은 바빌론방법을 사용하였고, 제곱은 dp를 사용했습니다. 사실 제곱을 일반적으로 구현하면, 시간복잡도가 O(n)이 되는데, 저가 사용한 방법은 dp입니다. 시간복잡도는 예를들어서, 처음 2의 2제곱을 하면 O(n)이고, 그다음은 2의 e제곱을 하면 시간복잡도는 O(n-e)가 됩니다. 그리고, 이미 제곱했었던 수라면 시간복잡도는 O(1)입니다. 먼저 바빌론방법을 이용한 제곱근을 구하는 함수입니다. #include double squareRoot(double n){ double x = n; double y = 1; double e = 0.000001; while(x - y > e){ x = (x + y) / 2; y = n / x; } return x; } int main() { std::cou.. 2021. 8. 13.
나눗셈 연산속도 최적화 C++ 개발환경 >> Devcpp 언어 >> C++17이상 운영체제 >> Windows10 home 💉개요 안녕하세요! 이번에는 나눗셈연산을 비트연산으로 바꾸는 방법들에 대하여 알아보겠습니다. 우선 왜 나눗셈연산을 비트연산으로 바꾸는건가? 나눗셈연산은 곱셈, 덧셈, 뺄셈, 비트연산속도보다 매우느립니다. 만약에 프로그램속도를 최적화하기 위해서는 비트연산으로 바꿔야합니다. 그래서 이번에는 비트연산으로 바꾸는 여러가지 방법에 대하여 알아보겠습니다. 💉참조 https://stackoverflow.com/questions/5558492/divide-by-10-using-bit-shifts Divide by 10 using bit shifts? Is it possible to divide an unsigned intege.. 2021. 8. 2.
여러개의 최댓값,최솟값 찾기 C++ 개발환경 >> DevCpp 언어 >> C++11 WinAPI 운영체제 >> Windows10 안녕하세요!!! 이번에는 심심해서 vector에 저장된값에서 여러개의 최댓값과 최솟값을 동시에 찾는 알고리즘을 만들어봤습니다~~~ #include #include #include using namespace std; typedef pair pii; int main(){ vectorans; vectordb; double d; int n,j,s; cin >> n >> s; //원소갯수,구할 최댓값 최솟값의 갯수 if(s*2>n) return 0; for(j=0;j> d; db.push_back(d); } for(j=0;j 2020. 11. 8.
C++ 피아노 연주 안녕하세요!! 이번에는 백도어만들기 뒤풀이로 간단하게 피아노연주 함수를 만들어봤습니다 혹시 Beep() 이런함수 들어보셨나요? 소리를 출력해주는 함수입니다. 이함수는 #include 헤더파일을 추가하면 정상적으로 작동합니다 사용방법은 Beep(주파수,연주시간) Beep(float,float) 입니다. 하지만 그냥 이렇게사용하면 피아노를 연주하기 힘듭니다 왜냐면 피아노는 옥타브마다 주파수가 다 다르기때문입니다 그래서 사용자가 사용하기 편하게만들어줬답니다. 위에 표는 보시다시피 피아노의 주파수크기를 알려주는 표입니다. 저는 이표에서 특정한 규칙성을 찾았습니다. 바로 n옥타브의 주파수의 음이 (n * 2^n-1)로 규칙적으로 증가하더라구요 이를 바탕으로 옥타브구현 알고리즘을 만들어보았습니다 {{{ 소스코드 }.. 2020. 9. 26.