다음 두 가지 작업을 수행하는 일련의 항목을 유지할 수있는 데이터 구조에 대해 알려진 것은 무엇입니까?
- 푸시 (x) : 시퀀스의 끝에 x를 추가하고 시퀀스에서 해당 위치의 식별자를 반환합니다.
- 추출 (S) : 순서가 지정되지 않은 식별자 세트가 주어지면 해당 위치의 항목을 순서에서 제거하고 제거 된 항목의 목록을 순서대로 리턴하십시오.
원하는 경우 이것을 스택 또는 두 스택으로 분할하는 분할 작업이있는 대기열이라고 생각할 수 있습니다. 추출 작업을 사용하여 팝 또는 대기열 제거 작업을 구현할 수 있으며 추출 된 항목 시퀀스를 넣을 수도 있습니다. 다른 스택이나 대기열로 다시 돌아갑니다.
내가 이미 알고있는 것 : 시퀀스를 이중 연결 목록으로 유지할 수 있습니다. 여기서 각 식별자는 연결된 목록 노드에 대한 포인터 일 뿐이며 각 노드는 두 개의 관련없는 요소의 위치를 빠르게 비교할 수있는 위치 번호를 저장합니다 순서대로. 데이터 구조가 진행됨에 따라 위치 번호를 업데이트하여 최대 값 의 양의 정수가되도록하는 것은 어렵지 않습니다 . 여기서 은 목록의 현재 항목 수입니다. 이 데이터 구조를 사용하면 추출 작업에서 어려운 부분은 추출 된 항목을 위치 번호별로 정렬하는 것입니다. 항목을 추출하려면 예를 들어, FOCS 2002의 Han 및 Thorup의 정수 정렬 알고리즘을 사용하여 예상되는 임의의 시간이며 푸시 작업에는 일정한 시간이 걸립니다.
내가 모르는 것 : 시간으로 추출을 처리 하고 일정한 시간을 푸시 할 수 있습니까? 이 문제에 관한 문헌이 있습니까? 정수 정렬만큼 어렵습니까?
동기 부여 : 이것은 Coffman-Graham 스케줄링 알고리즘에서 항목을 주문하는 데 필요한 기본 단계이며 그래프 그리기에도 응용 프로그램이 있습니다. Coffman-Graham의 어려운 부분은 사전 식의 순서입니다. 이것은 각각의 다른 정도에 대해 나머지 정점에 의해 유도 된 하위 그래프에서 그 정도가 정점의 순서를 유지함으로써 수행 될 수있다. 그런 다음 0이 아닌 정점 순서에서 첫 번째 정점 를 반복적으로 제거 하여 위상 순서에 추가합니다. 이전에 속한 정도에서 의 이웃을 추출하고 다음 작은 정도의 시퀀스로 밀어 넣습니다. 그래서 이 데이터 구조에서 추출 작업 시간은 Coffman-Graham 알고리즘의 선형 시간 구현으로 이어집니다.
원래 이것을 요구 한 이래로 1976 년부터 Setoff 가 Coffman-Graham 알고리즘을 선형 시간으로 구현할 수 있는 논문을 발견 했고 , Wikipedia 기사에 Coffman-Graham 알고리즘에 포함 시켰 으므로, 원래의 동기는 덜 의미가 있습니다. 그래도 여전히 답이 궁금합니다.