2012-05-29 13 views
3

R에서 우선 순위 큐를 생성해야하는데, 여기서 OPTICS 클러스터링 알고리즘에 대해 정렬 된 시드 개체 (또는 개체 인덱스)를 배치합니다.OPTICS 구현을위한 R의 우선 순위 큐

  • 하나의 가능성은 배열 표현과 힙을 구현하고, 각 삽입에 힙 배열을 전달 키 호출을 감소하고, 변경된 배열을 반환하고 호출하는 함수에 재 할당하는 것입니다. 이 경우 재 할당 작업으로 인해 성능이 매우 떨어지고 삽입 또는 감소 작업이 실행될 때마다 전체 배열을 호출하기 위해 한 번씩 두 번 복사하고 다시 한 번 재 할당하려면 한 번만 복사해야합니다.

  • 또 다른 가능성은 힙 작업을 호출하는 대신 함수 내부에서 코딩하는 것입니다. 이렇게하면 코드 반복과 성가신 코드가 발생합니다.

  • 액세스와 같은 어떤 포인터가 거기에 우리가

  • C에 내가 R의 S3 또는 S4 클래스의 사용자 정의 함수를 선언 할 수처럼? 이 경우에는 이러한 함수에 대한 호출이 반환 된 후에도 동일한 재 할당이 필요하다고 생각합니다 (C++/Java 클래스가 아닌 객체에서 작동합니다.)

  • 큐에있는 객체를 삽입하고 추출 할 수 있습니까? O(log(n)) R에 시간이 있습니까?

  • 각 삽입 후에 명시 적으로 정렬을 제외하고 OPTICS 알고리즘에서 개체의 도달 거리에 따라 우선 순위 기반 삽입 및 제거를 유지하는 목표를 달성 할 수있는 다른 방법이 있습니까?

+1

[R5 클래스] (https://github.com/hadley/devtools/wiki/R5)는 개체 수정시 복사본을 피할 수 있도록해야합니다. –

+1

이 토론을 보셨습니까? (http://www.mail-archive.com/[email protected]/msg108876.html) – nograpes

+0

nograpes : 대기열 구현이 도움이되지 않습니다. Vincent Zoonekynd : C++/Java 클래스에 훨씬 더 가까이있는 유용한 것처럼 보이지만 자세한 내용을 알아야합니다. – phoxis

답변

1

R5 classes 는 변경 가능한 객체를 정의하고 자바 클래스와 매우 유사합니다 : 그들은 개체가 수정 될 때 복사를 방지 할 수 있도록해야한다.

1

우선 순위 큐가 필요하지 않습니다.

실제로 효율적인 업데이트를 지원해야합니다. 간단한 힙은 충분하지 않습니다. 해시 맵을 동기화하여 객체를 효율적으로 찾아 값을 업데이트해야합니다. 그런 다음 변경된 위치에서 힙을 복구해야합니다.

+0

이것은 정확하게 알고리즘을 설계 할 때 발견되었습니다. 기본 힙 구현에서 키를 갱신하는 것은 O (lg (n)) 액세스를 위해 힙을 사용하는 목적을 무효로하는 O (n + lg (n))입니다. 어떤 문서/리소스를 제공하여 R 구현에 대해이 점을 밝힐 수 있습니까? – phoxis

+0

죄송합니다. 저는'R'을 사용하지 않습니다. 나는 OPTICS의 ELKI 구현만을 알고 있으며, OPTICS가 필요로하는 방식으로 업데이트 할 수있는 상당히 진보 된 힙을 포함하고 있으며, 지연 힙 생성/복구를위한 몇 가지 트릭을 가지고있다. 예를 들어, 여러 개의 "추가"작업을 대기열에 넣은 다음 실제로 필요할 때 힙을 대량 수정합니다. 평균 힙은 모든 추가 작업에서 힙을 수정합니다. 힙을 대량로드하는 것은 O (n)이며 점진적으로 고정하는 것은 O (n log n)입니다.부분적인 벌크 작업에 대해서도 마찬가지인지 여부는 알 수 없습니다. –

+0

현재 나는 첫 번째 반복을 만들고 있으므로 게으른 힙 복구가 필요하지 않습니다. 제 경우에는 힙에 객체를 삽입하지 않고 대신 힙에 주 배열의 객체 색인을 삽입하므로 힙 배열에 객체 색인의 위치를 ​​저장하는 보조 색인 배열이 정상적으로 수행되고 있습니다. – phoxis