2012-05-31 3 views
5

나는 사용자 활동을 캡쳐하고 다른 사이트의 로봇에 의해 실행되는 클라이언트간에 공유되는 활동 큐를 가지고있다.대기열 감소 알고리즘?

CREATE FOLDER /docs 
CREATE FILE /docs/journal.txt 
DELETE FILE /docs/blog.txt 
MOVE FOLDER /docs/images /docs/photos 
... 

은 종종 하나 하나, 또는 없음으로 감소 될 수있다하는 행동이가 : 좋아하는 행동이의 예는 수 있습니다. 예를 들어 :

CREATE FOLDER /docs 
RENAME FOLDER /docs /documents 

간단하게 변경할 수 있습니다 :

CREATE FOLDER /documents 

그리고 뭔가 같은 :

CREATE FOLDER /docs 
RENAME FOLDER /documents 
DELETE FOLDER /documents 

큐에서 완전히 제거 할 수 있습니다.

이러한 종류의 축소/최적화는 매우 일반적인 문제인 것처럼 보입니다. 공격하기 전에 일부 일반적인 해결책을 시도하고 싶습니다. 그것은 길 찾기 최적화 문제처럼 보입니다.

아이디어가 있으십니까?

답변

2

이 작업을 수행하는 라이브러리 나 프레임 워크에 대해 알지 못합니다. 다른 한편으로는, 당신은 당신 자신의 논리를 그 자체로 지정해야 할 것입니다, 그리고 제가 보았을 때 그것은 어쨌든 많은 일이 될 것입니다.

  1. 은 행동의 위상 종류를 수행합니다 (폴더의 이름을 변경 등등 폴더를 만들 수 "에 따라"...)

  2. 각각의 명령을 더 함께 : 여기

    내가 취하지 것 접근법 종속성은 종속성 트리의 "루트"를 나타냅니다.

  3. 각 루트에서 반복적으로이 트리를 접습니다. (다소 헤비급 일이기는하지만)

+0

나는 정말로 도서관을 찾고 있지는 않지만, 내가 있으면 행복 할 것이다. "나무 붕괴"가 정확히 무엇을 의미하는지 명확히 할 수 있습니까? –

1

하나의 옵션은 큐 기록을 통해 걸어 당신이 프로그램 안에 만들 트리 표현의 파일 시스템에서 수행되는 작업을 시뮬레이션하는 것입니다. 참조 된 각 디렉토리에 대해 수행되는 네트 작업을 추적 할 수 있습니다. 완료되면 수정 된 트리 구조를 거쳐 각 디렉토리 및 하위 디렉토리에 적용된 순 변환을 나타내는 일련의 명령을 출력 할 수 있습니다.

희망이 도움이됩니다.

0
  1. 당신의 작업 (, 이동, 생성, 이름 변경)
  2. 가 작업을 위해 작업 + 매개 변수를 포함하는 명령 클래스를 정의 모두를 정의합니다.
  3. 두 명령을 결합 할 수 있는지 여부와 해당 조합의 결과가 무엇인지 알려주는 내용을 구현하십시오.

나는 당신이 서로를 즉시 따르는 명령 만 결합 할 수 있다고 생각해야합니다. 그렇지 않으면 원하지 않는 부작용을 가져올 수 있습니다. 따라서 yoru 대기열에서 명령을 실행하려면 결합 할 수없는 명령이 발생할 때까지 엿보기/터지는/빌드 명령을 시작하십시오.

+0

좋은 의도를 가져 주셔서 감사합니다,하지만 당신이 그 문제를 이해하지 못한다고 생각합니다. 첫째, 구현 세부 사항은 관련이 없으며 알고리즘을 찾고 있습니다. 둘째, 명령이 반드시 인접하지 않을 수도 있으므로 제안한 명령이 작동하지 않거나 n * n 검색을 요구합니다. 내가 감당할 수있는 분명한 해결책이있다. –

+0

op (are = areTheyCombinable?)의 결과로 n 개의 요소를 일치시키는 O (n) 또는 O (1) 방법을 찾으면 매우 놀랄 것입니다. 응답의 첫 번째 부분에 대해 내 구현 세부 사항 밖으로 알고리즘을 가져 가라. 나는 당신을 도우려는 시도로서 코드 스냅 샷을 제공했다. 행운을 빌어 요 내가 바라는 마술 솔루션을 찾으 셨으면 좋겠다. – csauve

+1

또한 원하지 않는 부작용을 초래하지 않으면 서 어떻게 대기열의 항목을 재정렬 할 수 있다고 생각하는지 설명하십시오. 예 : 1 = CreateFile (A, "이봐!"), 2 = SendEmail ([email protected], ContentsOf (A)), 3 = DeleteFile (A). # 1과 # 3이 실제로 결합되기를 원한다면 (정의에 따라) # 2를 깨뜨릴 것입니다. – csauve