앞선 게시물에서 큐를 구현할 때 링 버퍼를 사용했다. 링 버퍼는 배열의 끝과 끝을 연결해서 원형 배열을 만들었다고 생각하면 이해하기 쉽다. 그래서 보통 크기가 n인 배열을 순서대로 읽으면 index 0의 값, index 1의 값 ... index n-1의 값 이렇게 n개를 읽고 나면 끝난다. 하지만 링 버퍼에서는 index n-1 다음에 index 0이 이어진 개념이기 때문에 순서대로 읽으면 index 0의 값, index 1의 값 ... index n-1의 값, index 0의 값, index 1의 값 이런 식으로 계속 읽어낼 수 있다.
그렇다면 어떻게 링 버퍼를 구현할 수 있는가? 사실 그냥 배열을 쓰는 것은 일반적인 배열과 같다고 볼 수 있다. 하지만 요소값을 읽는 과정에서 차이가 발생한다. 만약 읽고싶은 요소의 index 값이 배열의 크기인 n이상이면 일반적인 배열에서는 오류가 발생하지만 링 버퍼에서는 모든 index 입력값을 배열의 크기인 n으로 나눈 나머지 값으로 받기 때문에 오류가 발생하지 않는다. (배열 크기가 n인 링 버퍼 배열 a에서 index = (입력index)%n 이다.) 예시를 보면 다음과 같다.
public static void main(String[] args){
int[] a = new int[100]; // 크기가 100인 링 버퍼
for(int i=0; i<1000; i++ ){
int index = (i)%a.length;
a[index] = i;
}
}
위와 같이 크기가 100인 링 버퍼에 i 를 index로 하고 a[index]에 i값을 대입하는 경우를 생각해 보자.
여기서 i를 index로 할때 index = i%a.length의 과정을 넣어주면 링 버퍼가 완성되고 결과는 다음과 같다.
순서대로 실행 : i = 0 >> a[0]=0;
i = 1 >> a[1]=1;
.
.
i = 99 >> a[99]=99;
i = 100 >> a[0]=100;
i = 101 >> a[1]=101;
.
.
i = 998 >> a[98]=998;
i = 999 >> a[99]=999;
오류없이 i = 999까지 진행이 완료된다.
링 버퍼는 입력은 계속 받되 오래된 데이터는 버리는 용도로 사용할 수 있다. 즉 입력을 끊입없이 하지만 최근 입력값 몇개만 저장하고 싶은 경우 사용하는 것이 좋다.
재귀 알고리즘 예제(하노이의 탑, 8퀸 문제) (0) | 2023.01.13 |
---|---|
재귀 알고리즘 (0) | 2023.01.13 |
스택(Stack)과 큐(Queue) 그리고 덱(Deque) (0) | 2023.01.10 |
제너릭스와 Comparable, Comparator (0) | 2023.01.09 |
Java import선언과 Java.lang 패키지 + 클래스 메서드와 인스턴스 메서드 (0) | 2023.01.09 |