분할 가능한 스택


22

다음 두 가지 작업을 수행하는 일련의 항목을 유지할 수있는 데이터 구조에 대해 알려진 것은 무엇입니까?

  • 푸시 (x) : 시퀀스의 끝에 x를 추가하고 시퀀스에서 해당 위치의 식별자를 반환합니다.
  • 추출 (S) : 순서가 지정되지 않은 식별자 세트가 주어지면 해당 위치의 항목을 순서에서 제거하고 제거 된 항목의 목록을 순서대로 리턴하십시오.

원하는 경우 이것을 스택 또는 두 스택으로 분할하는 분할 작업이있는 대기열이라고 생각할 수 있습니다. 추출 작업을 사용하여 팝 또는 대기열 제거 작업을 구현할 수 있으며 추출 된 항목 시퀀스를 넣을 수도 있습니다. 다른 스택이나 대기열로 다시 돌아갑니다.

내가 이미 알고있는 것 : 시퀀스를 이중 연결 목록으로 유지할 수 있습니다. 여기서 각 식별자는 연결된 목록 노드에 대한 포인터 일 뿐이며 각 노드는 두 개의 관련없는 요소의 위치를 ​​빠르게 비교할 수있는 위치 번호를 저장합니다 순서대로. 데이터 구조가 진행됨에 따라 위치 번호를 업데이트하여 최대 값 의 양의 정수가되도록하는 것은 어렵지 않습니다 . 여기서 은 목록의 현재 항목 수입니다. 이 데이터 구조를 사용하면 추출 작업에서 어려운 부분은 추출 된 항목을 위치 번호별로 정렬하는 것입니다. 항목을 추출하려면O(n)nkO(kloglogk) 예를 들어, FOCS 2002의 Han 및 Thorup의 정수 정렬 알고리즘을 사용하여 예상되는 임의의 시간이며 푸시 작업에는 일정한 시간이 걸립니다.

내가 모르는 것 : 시간으로 추출을 처리 하고 일정한 시간을 푸시 할 수 있습니까? 이 문제에 관한 문헌이 있습니까? 정수 정렬만큼 어렵습니까?O(k)

동기 부여 : 이것은 Coffman-Graham 스케줄링 알고리즘에서 항목을 주문하는 데 필요한 기본 단계이며 그래프 그리기에도 응용 프로그램이 있습니다. Coffman-Graham의 어려운 부분은 사전 식의 순서입니다. 이것은 각각의 다른 정도에 대해 나머지 정점에 의해 유도 된 하위 그래프에서 그 정도가 정점의 순서를 유지함으로써 수행 될 수있다. 그런 다음 0이 아닌 정점 순서에서 첫 번째 정점 를 반복적으로 제거 하여 위상 순서에 추가합니다. 이전에 속한 정도에서 의 이웃을 추출하고 다음 작은 정도의 시퀀스로 밀어 넣습니다. 그래서vvO(k) 이 데이터 구조에서 추출 작업 시간은 Coffman-Graham 알고리즘의 선형 시간 구현으로 이어집니다.

원래 이것을 요구 한 이래로 1976 년부터 Setoff 가 Coffman-Graham 알고리즘을 선형 시간으로 구현할 수 있는 논문을 발견 했고 , Wikipedia 기사에 Coffman-Graham 알고리즘에 포함 시켰 으므로, 원래의 동기는 덜 의미가 있습니다. 그래도 여전히 답이 궁금합니다.


시퀀스의 끝에서만 삽입이 발생하면 이중 링크 목록과 항목 위치의 해시 테이블을 모두 관리 할 수 ​​있습니다. 삽입 : 상각 O (1) (마지막 항목에 대한 포인터를 유지하십시오). k 항목 추출 : 상각 된 O (k) (S의 각 요소에 대해 포인터를 가져 와서 해시 테이블에서 제거하고 목록에서 항목을 가져 와서 제거하여 추출 결과에 추가)
Marzio De Biasi

3
시간이 걸리는 목록에서 항목을 추출하는 것이 아니라 인수의 정렬되지 않은 순서에서 올바른 순서로 추출하기 위해 항목을 다시 정렬하는 것입니다.
David Eppstein

답변:


1

나는이 정수의 집합 정렬로 열심히 적어도 생각 의 크기 다항식의 "임의 조언"와 . 임의의 조언에 의해 내 말은 어떤을위한 것으로 고정 분포가 (따라 에 크기의 폴리 (문자열 이상) A와 랜덤 액세스를 부여)와 (램 기계에 의해 모델링) 알고리즘 단일 샘플 . 은 을 순서대로 누른 후 예상 시간 내에 정수를 식별자에 매핑하는 해시 테이블과 함께 (임의 화 된) 데이터 구조 입니다.S[n]nnDnnnDnDn[n]O(1)

해당 설정을 고려 하면 정수 정렬 문제 의 인스턴스 에 대해 extract ( )를 발행 할 수 있습니다 (실제로 의 식별자가 필요 하지만이 맵핑은 항목을 사용하여 항목 당 시간에 수행 할 수 있음 조언의 일부인 해시 테이블) 및 입력은 추출을 실행하는 데 걸리는 시간에 따라 정렬됩니다.S[n]SSO(1)

따라서 정수의 상한에만 의존하는 "자유로운"부가 정보가 정수 정렬을 더 쉽게 만들 수 없다면 추출은 정수 정렬만큼 어렵습니다.

이것이 이상한 모델이없는 두 문제 사이의 관계를 의미합니까? 이 임의의 조언 개념이 알려진 것입니까? 이것은 일종의 MA 프로토콜과 비슷하지만 Merlin의 메시지는 입력에 의존 할 수 없으며 Arthur의 실행 시간에 관심이 있습니다.


밀기 에 필요 너무 자유로운 접근을 가지는 시간에 갖는 같다 이미 알고리즘의 시작에서 행해진 계산. 당신이 일종의 수 있듯이 에서 가져온 정수 에 시간이 데이터 구조에 무료로 액세스 할 수있는 정렬하는 것보다 더 걸릴 것이라고 예상 할 이유가 없다 시간. [n]DnΩ(n)DnΩ(n)k[n]O(n+k)O(k)
Dave

당신이해야합니까 계산이 무료로 제공하지만 액세스는 무료되지 않습니다 : 각 쿼리는 시간 단계로 청구됩니다. 에서 쿼리를 사용하여 정수 를 에서 가져온 문자열로 정렬 할 수 있도록 을 설계 할 수 있습니까? Ω(n)DnkO(k)Dn
Sasho Nikolov

이 답변을 완전히 확신 할 수없는 이유는 다음과 같습니다. 정렬하려는 정수 세트 S가 하나만있는 경우 모든 것이 선형 시간입니다 (O (n + k)로 정렬을 계산하십시오). 그러나이 데이터 구조를 사용하여 많은 작은 정렬 시퀀스를 시뮬레이트하려고하면 (카운팅 정렬이 충분하지 않음)이 작은 정렬 중 첫 번째 만 완전히 제약되지 않습니다. 그 후 일부를 제거했습니다. 정렬하는 각 시퀀스는 이전 시퀀스와 분리되어야합니다. 따라서 분류 작업을 줄이는 것이 어려운 것 같습니다.
David Eppstein

@David Eppstein : 정렬 의 경우 초기 데이터 구조의 사본을 가져올 수 있습니다 . 물론 이상한 "무작위 조언"모델이 완전히 설득력있는 것은 아니며 일반적인 의미의 축소를 원합니다. 그러나 내가 전달 한 메시지는 쿼리 시간이 정수 정렬 알고리즘이 메모리 액세스 효율적인 방식으로 입력과 독립적 인 조언의 이점을 누릴 수 있음을 의미합니다. 이것은 나에게 반 직관적이지만 내 직감은 약합니다. BTW, 나는 가 당신이 만족하는 선형 시간이 아니라고 생각 했습니까? O(k)O(n+k)
Sasho Nikolov

매번 사용하기 위해 데이터 구조를 한 번 복사하는 경우 시간을 사용하여 각 정렬마다 복사를 수행하므로 정렬 속도가 빨라지지 않습니다. 제안한 것처럼 을 나타내는 문자열의 위치 만 쿼리하는 경우 시간 으로 정렬하기에 충분하지 않습니다 . 추출 조작 중에 데이터 구조가 변경 될 수 있으며 정적 버전에서 실행하면 런타임이 증가 할 수 있습니다. Ω(n)DnO(k)
Dave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.