본문 바로가기
728x90
반응형

공부/Algorithm11

[Algorithm] 펜윅 트리, 이진 인덱스 트리, BIT(Binary Indexed Tree)로 구간 합 문제 해결 어떤 배열의 특정 범위에 해당하는 수의 합을 구할 때 부분 합을 사용한다. 이 부분 합의 전처리 과정의 시간 복잡도는 O(N)이고 원하는 값을 구할 때의 시간 복잡도는 O(1)이다. 전처리 과정 sum[ i ]의 값을 arr의 인덱스 0부터 인덱스 i 까지의 합이라고 정의하고 아래와 같은 배열이 있다고 하자. sum[0]은 1일 것이고 sum[1]은 9일 것이고 sum[2]는 12일 것이다. 이를 구하는 과정을 파이썬을 나타내면 다음과 같고 시간 복잡도는 O(N)이다. arr=[1, 8, 3, 4, 6, 7, 4, 4] sum=[0 for _ in range(8)] sum[0]=arr[0] for i in range(1, 8): sum[i]=sum[i-1]+arr[i] 원하는 값 구하기 그런데 위 sum.. 2023. 4. 23.
[Algorithm] RMQ (Range Minimum Query) RMQ는 어떤 배열이 존재할 때 특정 범위의 가장 작은 값을 구할 때 사용하는 자료구조이다. 다음과 같은 배열이 있다고 하자. RMQ (1, 5)의 의미는 Arr[1] 부터 Arr[5] 까지의 값 중 가장 작은 값을 의미한다. 위 배열의 경우 "3"이 된다. 이 RMQ를 구하는 방법에는 여러가지가 있지만 그 중 전처리 과정의 시간 복잡도가 O(N*log N)이고 원하는 값을 얻을 때의 시간 복잡도가 O(1)인 방법을 공부해보려고 한다. RMQ 전처리 과정 우선 길이가 1인 RMQ를 구한다. RMQ (0, 0), RMQ (1, 1), RMQ(2, 2) ... RMQ(N, N)을 모두 구하는 것이다. 길이가 1이기 때문에 당연하게도 RMQ(i, i)의 값은 arr[ i ]의 값과 똑같을 것이다. 그 다음 길.. 2023. 4. 19.
[Algorithm] 다익스트라 (Dijkstra algorithm), 벨만 포드(Bellman ford algorithm) 그래프에서 특정 노드에서 특정 노드까지 가는 최단 거리를 구하는 알고리즘에 대해서 공부해보려 한다. 다익스트라 알고리즘과 벨만 포드 알고리즘이 있는데 이 둘의 차이는 그래프의 가중치가 음수를 허용하냐 허용하지 않냐의 차이다. 이 둘의 차이점을 기준으로 공부해보려 한다. Dijkstra algorithm 다익스트라 알고리즘은 음의 가중치를 허용하지 않고 양의 가중치만 존재할 때 최단 거리를 구하는 알고리즘이다. 최단 거리를 알고있는 노드와 최단 거리를 모르고있는 노드로 나눈다. 최단 거리를 모르고 있는 노드의 최단거리를 알아내는 것을 반복하는 알고리즘이다. A를 선택하고 연결된 노드 B와 C를 비교한다. 먼저 가장 짧은 거리인 5만큼 떨어져있는 C의 최단 경로는 5라고 확정할 수 있다. 여기서 의문이 생길.. 2022. 12. 19.
[Algorithm] KMP 알고리즘 (문자열 매칭 알고리즘) 문자열 알고리즘이란 어떤 문자열에서 원하는 패턴을 찾는 알고리즘이다. 문자열의 부분 문자열과 패턴을 비교하면서 패턴의 존재 여부를 알 수 있다. 예를 들어서 "banana"에서 "ana"라는 패턴을 찾고자한다면 "banana", "banana" 이렇게 총 두 개가 존재함을 알 수 있다. 그러나 모든 부분 문자열과 패턴을 비교한다면 엄청난 시간이 걸릴 것이다. 그래서 KMP 알고리즘을 사용하면 패턴 비교시간을 줄일 수 있다. KMP 알고리즘의 필요성 굉장히 긴 문자열이 존재하고 이 문자열에서 "abcac"라는 문자열을 찾고 싶다고하자. 패턴을 찾는 와중에 위와 같은 상황이 발생했다고 하자. abca까지는 맞았으나 그 다음 문자열에서 찾고있는 패턴이 아님을 알아냈다. 그럴 경우 패턴을 한 칸 옆으로 옮겨서 .. 2022. 12. 18.
728x90
반응형