2010-03-12 3 views
3

이상한 작은 일정 대기열이 필요한 통역사 같은 프로젝트를 구현하고 있습니다. 휠 재교육을 피하고 싶기 때문에 비슷한 구조 나 기존 작업에 대한 언급을 누군가에게 줄 수 있기를 바랍니다. 내가 따라갈 때 단순히 여러 개의 큐를 인스턴스화 할 수 있다는 것을 알고있다. 나는 단지 나보다 나은 아이디어를 가진 다른 사람들의 관점을 찾고있다.)나무와 같은 큐

나는 다음과 같이 동작 할 것이라고 상상한다. 단일 루트가있는 트리. 루트에 "insert_iterator"를 가져온 다음 요소를 그 위에 밀어 넣습니다 (예 : 아래 예의 a 및 b). 그러나 언제든지 반복기를 여러 개의 반복기로 분할하여 효과적으로 분기를 만들 수도 있습니다. 브랜치는 하나의 큐에 다시 병합 할 수는 없지만 빈 브랜치를 버려 질 때까지 (큐브의 앞부분에서 다시 "일종의"visitor_iterator를 사용하여) 터지는 요소를 시작할 수 있습니다.

  x -> y -> z 
a -> b -> { g -> h -> i -> j } 
      f -> b 

아이디어가 있으십니까? 자신이 큐의 풀을 사용하지만 난 "처음 생각, 코드 나중에"전략 :

감사를 수행하고있어 구현하는 비교적 간단한 구조처럼 보인다

편집 :은 내가 몇 가지를 추가 할 줄 알았는데 추가 배경 정보. 문제와 관련이 없지만 내 목표를 조금 분명히하는 데 도움이 될 것이라고 생각했습니다. 매우 대략적으로이 구조의 개념은 기본적으로 계산을 예약하는 데 사용된다는 것입니다. 분기는 COMMIT 또는 ROLLBACK 중 하나로 끝날 수 있습니다. > ..., g - -> ... 또는 F - X의 경우라도> ... 그리고, COMMIT 만료

a -> b 

커밋이 끝난 지점뿐만 아니라 순차적으로 실행된다. 예 :

x -> y -> z -> COMMIT 

그러나, - 가지 중 하나 이상이 최선을 다하고 있습니다 때> B는 한 번만 실행됩니다. 세 개의 분기가 모두 ROLLBACK으로 끝나면 초기 이벤트 인 a -> b를 포함하여 전체 트리가 삭제됩니다.

지금까지 큰 답변 주셔서 감사합니다! 나는 집에 돌아 오자 마자 그들을 자세히 검토 할 것이다.

+0

세 번째로 튀어 나오는 요소 : x, g 또는 f 또는 불확정성이 있습니까? x가 세 번째로 튀어 나왔다면 y는 의무적 인 네 번째가 될까요? – msw

+0

b를 밀었 으면 "split"과 같은 것을 호출하여 세 개의 insert_iterator를 얻고 효과적으로 다음에 어느 것을 삽입할지 선택할 수 있습니다. 터지는 것과 동일합니다. 단, 얼마나 많은 방법으로 분할해야 하는지를 물어야합니다. –

답변

0

K 나는 모든 주어진 답변을 매우 진지하게 바라 보았습니다. 특히 퀵실버 (Quicksilver)가 제안한 분리 된 세트를 향상 시켰습니다. (여기에 추가 참조 자료가 있습니다 : http://en.wikipedia.org/wiki/Disjoint-set_data_structure 및 여기 : http://www.boost.org/doc/libs/1_42_0/libs/disjoint_sets/disjoint_sets.html).

그러나 결론은 필자의 데이터 구조는 실제로 다른 사람이 제안한 트리이지만 구조의 알고리즘 요구 사항은 큐의 알고리즘 요구 사항을 훨씬 잘 충족시킵니다. 내가 사용하는 기본 작업은 push_front 및 pop_back이지만 검색, 병합 등은 필요하지 않습니다. 따라서이 경우에 정의 된 "인덱싱 트리"가있는 대기열 풀이이 경우 나에게 더 잘 도움이 될 것입니다.

왼쪽에서 오른쪽, 위에서 아래로 순서대로 모든 요소를 ​​큐에 삽입한다고 가정하면 트리의 "루트"에서 터져 나오고 버퍼 그러나 일단 요소의 루트 문자열을 팝하면 다음 시작 지점에서 "팝"이 다음 메모리에 반드시 있어야하는 것은 아닙니다. 마찬가지로 분기를 롤백하면 반드시 버퍼의 끝 부분에있을 필요는 없습니다. 이 두 가지 상황 모두 분명히 메모리에 공백을 남깁니다. 따라서 간단한 대기열에 대한보다 정교한 색인 구조가 가능할 수도 있지만, 그럴만 한 가치가 없을 것으로 생각됩니다.

이제는 대기열 풀에 대한 간단한 아이디어를 선호합니다. 새 대기열이 필요하면 풀에서 선택하거나 사용 가능한 대기열이없는 경우 새 대기열을 만든 다음 트리에 추가하십시오. 대기열이 비어 있으면 풀로 되돌리고 트리 노드를 삭제하십시오. 풀은 그 자체가 가장 큰 할당 버퍼가 앞에 있고 뒤에서 가장 작은 우선 순위 큐가됩니다. 잠시 후 새 메모리가 거의 할당되지 않습니다 (발생하는 "터짐"의 양이 "푸싱"의 양과 거의 같다고 가정))

모든 제안을 주셔서 감사합니다. 이 전략에 대한 추가 의견이 있으시면 자유롭게 의견을 말하십시오.

0

Tree 인 것처럼 보이지만 균형 잡힌 또는 이진 종류가 아닙니다. 새 노드를 추가하는 방법을 완전히 제어하려면 해당 노드의 작성 방법을 지정해야합니다. a.addSibling(b).

일정을 계획하는 데있어 형제가 대략 동시에 방문해야한다고 생각합니다. 당신의 방문자는, 역 추적 대신에, 당신이 분지를 가지고있는 곳을 위해 다른 방문자를 산채해야 할 것입니다. 따라서 세 번째 요소는 x, f입니다.

JGraphT을 (를) 보는데 도움이 될 수 있습니다.

0

내게는 대기열보다 나무 (일반이 아닌 2 진수)처럼 보입니다. 그러나 노드를 삭제하는 의미는 잘 정의되어야합니다.

BTW, "스케줄링 대기열"에 대한 언급이 Priority Queue의 벨을 울립니다.

2

Boost Graph Library에는 여기에 필요한 구조 (상호 연결된 그룹 그룹)를 모델링하는 분리 세트 (disjoint set)라는 데이터 구조가 들어 있습니다.

이 데이터 구조를 생각하는 또 다른 방법은 포리스트입니다. 숲은 나무의 분리 된 조합입니다.

0

말,

X -> Y -> Z는 ->

을 커밋 또한 집합 Y의 배수 N을 포함하는 트리 형 큐를 참조 할 수있다 상태/데이터 검사를 수행하고 상단 (z)에서 실행되지만 하단 (x ')에서 상태 변경을받습니다.

x[N]("data check") -> x[N-1]("data check") -> x[N-2]("data 

체크 ") -> 확인 -> Y-> 확인 -> Y-> 상태 -> Z -> 확인 -> Z-> 상태 -.> Z-> 커밋

는 큐가 Z에 대한 X에서, 더 큰 작업에 작은에서 코딩 경우,이 구조를 지원하기 위해 열심히 보인다, 그러나 결국, 당신은 바로이 방법을 구현 했습니까? 나 (광산의 비슷한 질문에 대한

What are patterns/types of task queues? Can the multi-level task queue exist in form of a N-tree?)는 세 가지 종류의 st를 사용하여 하위 노드를 통과하는 N 레벨 구조 인 것처럼 보입니다 각 레벨에서 사용할 수있는 기계를 먹었습니다. $ me-> tryCommit (tryAdvanceChildsBelow (tryAdvanceToNextSiblingStep (getNextSibling())) 및 재 작성해야하는 지저분한 구현입니다.